Libra CodeHub

CedarCopilot/cedar-mail

Branch: staging

AOP confidence bands + ambiguity ping, frontend load perf, LinkedIn cold-reach quarantine

merged#2519CedarCopilot

CedarCopilot wants to merge 0 commits into staging from feat/slack-style-reactions

Live on prod, no production signal yetTimeline and evidence
  1. Opened
    Aug 18, 2026, 12:23 AM
  2. Merged
    Aug 18, 2026, 4:46 PM
  3. Live on staging
    Aug 18, 2026, 4:46 PM
  4. Live on prod
    Aug 18, 2026, 4:46 PM
  5. Observed 2 days
    Aug 18, 2026, 4:46 PM
  6. Pipelines steady after this deploy
    Aug 18, 2026, 4:46 PM
  7. Pipelines steady after this deploy
    Aug 18, 2026, 4:46 PM
  8. Unobserved

    Live on prod, no production signal yet

    Aug 21, 2026, 2:21 AM

Behaviors Libra is checking

Ambiguous AOP outcomes trigger an ambiguity ping for follow-up instead of being presented as decisive.Inconclusivelow confidence

OTEL fallback found no prod spans matching AOP analysis since deploy.

prod, checked Aug 20, 2026, 6:37 PM
AOP results expose confidence bands so users can distinguish high-confidence conclusions from uncertain ones.Inconclusivelow confidence

OTEL fallback found no prod spans matching AOP analysis since deploy.

prod, checked Aug 20, 2026, 7:37 PM
Card-list canvases render their own ordered conversations without replacing the global conversation list or leaking a Top Deals row into a new chat's context.Inconclusivelow confidence

OTEL fallback found no prod spans matching CardListCanvasView / `useCanvasConversations` since deploy.

prod, checked Aug 20, 2026, 7:37 PM
Chat messages continue to use built-in renderers when no custom renderer is registered, including after a custom renderer is removed.Inconclusivelow confidence

OTEL fallback found no prod spans matching ChatRenderer / ChatBubbles since deploy.

prod, checked Aug 20, 2026, 8:37 PM
Cmd/Ctrl+N starts a visible, pinned new chat with an independent copy of the current chat context, while Compose moves to Cmd/Ctrl+Shift+N in the desktop app.Inconclusivelow confidence

OTEL fallback found no prod spans matching global shortcut `newChat` / desktop File menu since deploy.

prod, checked Aug 20, 2026, 11:38 PM
Opening or changing tracking state on a tracked email no longer crashes the mail app due to conditional React hooks.Inconclusivelow confidence

OTEL fallback found no prod spans matching GET mail.getThread / mail inbox thread rendering since deploy.

prod, checked Aug 20, 2026, 11:38 PM

Libra has verdicts on 0 of 12 tracked behaviors on prod; 12 are still being checked. Libra checks hourly for 3 days after each deploy.

Four independent workstreams that accumulated on this branch after #2513 merged, plus a review pass over all of them and the fixes it turned up.

AOP classification , confidence bands and an ambiguity ping

The classifier used to be told to self-apply a 0.75 threshold it was never asked to emit, while the context builder simultaneously told it "select EXACTLY ONE". The imperative won, so coin flips came back looking confident , median 190 hours from a wrong assignment to a human noticing.

The model now reports a calibrated confidence and every alternative it weighed; code applies the policy (HIGH ≥ 0.75 assign silently, MEDIUM ≥ 0.5 assign and ask, LOW do not assign and let the next event re-classify). A stated uncertaintyReason demotes an otherwise-HIGH answer, because the model recognises ambiguity reliably and prices it badly.

On MEDIUM , or a close call, or a flip-flopping conversation , Cedar can DM the user a "here's what I did, here's what I almost did" ping whose buttons are the AOPs it actually considered. Two gates: it only fires if a wrong pick would do something (some candidate has AI execution on), and at most once per conversation per 30 days.

This is default-OFF behind cedar-aop-ambiguity-ping. The decision is computed and logged regardless, so ping volume is measurable before any customer receives a DM. A dry-run harness reports what would have been sent, over live data, without sending.

Headless throughout: crmAdmin.classifycrm-admin classify <id> --explain runs the real classifier read-only. Wiki at apps/server/docs/wiki/aop-classification.md.

Frontend load performance

Five heavy libraries were reachable from the eagerly-registered root store, so every route paid for them , /login and /calendar included:

  • @xyflow/react via outboundFlowSlice → the appliers moved to FlowCanvas, which already has React Flow loaded
  • chrono-node + fuse.js via one pure date helper in the crm/utils barrel → split into date-format.ts
  • DOMPurify via email-utilscleanHtml split into html-sanitize.ts
  • the GitHub emoji dataset (~580 KB) via the cedar-os barrel's useCedarEditor re-export → import the component directly
  • react-markdown via messagesSlice seeding the message-renderer registry in its slice initializer → the built-ins are now reached through resolveMessageRenderer from the already-lazy chat chunk

Sentry Session Replay (rrweb, ~136 KB) attaches on an idle frame behind its own dynamic-import module , importing @sentry/react dynamically from lib/sentry.ts does nothing, since that file already imports it statically and Rollup has nothing to split.

Measured on the real bundle, index.html's modulepreload set: 2.43 MB / 77 chunks → 1.82 MB / 64 chunks. All five libraries are absent from it.

Also: a preconnect to the API origin, and the FCP-gaming skeleton is reverted , it moved the metric ~2 s without making the page usable any sooner.

LinkedIn cold-reach quarantine

The InMail check read Unipile's folder for "INMAIL". Measured over 400 live chats, folder is ["INBOX","INBOX_LINKEDIN_CLASSIC"] on 399 of them regardless of origin , so the check never once fired, linkedin_chats held zero rows with chat_type='inmail', and 51 of those 400 cold InMail / sponsored / offer chats sat in the unibox as ordinary DMs.

The real markers are content_type on the chat and message_type on the message. Quarantine now covers all three kinds on every surface , unless the seat has engaged, since answering a cold reach is what makes it a real conversation.

Separately, the LinkedIn ingest dual-wrote the shared container but never its participants, so every chat created after the 2026-08-09 backfill showed "LinkedIn member" with no avatar. 250 of 545 containers had zero participants; a seat onboarded after that date saw the placeholder on its entire inbox. Ingest-side write plus a catch-up migration.

Assorted fixes

  • Rows with s
Show production surfaces and changed-file mapping

Production surfaces

Libra has not measured any production surfaces for this change yet.

Changed files → surfaces

  • .github/workflows/ci.ymlno production surface mapped
  • .oxlintrc.jsonno production surface mapped
  • apps/desktop/package.jsonno production surface mapped
  • apps/desktop/src/main/services/menuService.tsno production surface mapped
  • apps/mail/app/(full-width)/SunlitBackground/SunlitBackground.tsxno production surface mapped
  • apps/mail/app/(full-width)/SunlitBackground/sunlit.cssno production surface mapped
  • apps/mail/app/entry.client.tsxno production surface mapped
  • apps/mail/app/root.tsxno production surface mapped
  • apps/mail/config/shortcuts.tsno production surface mapped
  • apps/mail/docs/bug-email-tracking-indicator-conditional-hooks.mdno production surface mapped
  • apps/mail/lib/hotkeys/global-hotkeys.tsxno production surface mapped
  • apps/mail/lib/sentry-replay.tsno production surface mapped
  • apps/mail/lib/sentry.tsno production surface mapped
  • apps/mail/modules/aop/components/CustomFieldsEditor.tsxno production surface mapped
  • apps/mail/modules/aop/components/TriggerConfigEditor.tsxno production surface mapped
  • apps/mail/modules/canvas/components/CardListCanvasView.tsxno production surface mapped
  • apps/mail/modules/canvas/types/canvas-types.tsno production surface mapped
  • apps/mail/modules/cedar-os/src/cedar-os-components/chatComponents/EmbeddedCedarChat.tsxno production surface mapped
  • apps/mail/modules/cedar-os/src/cedar-os-components/chatComponents/newChatWithSameContext.tsno production surface mapped
  • apps/mail/modules/cedar-os/src/cedar-os-components/chatComponents/welcomeShortcuts.tsno production surface mapped
  • apps/mail/modules/cedar-os/src/cedar-os-components/chatMessages/ChatBubbles.tsxno production surface mapped
  • apps/mail/modules/cedar-os/src/cedar-os-components/chatMessages/ChatRenderer.tsxno production surface mapped
  • apps/mail/modules/cedar-os/src/chat-extras.tsno production surface mapped
  • apps/mail/modules/cedar-os/src/store/agentConnection/agentConnectionSlice.tsno production surface mapped
  • apps/mail/modules/cedar-os/src/store/messages/messagesSlice.tsno production surface mapped
  • apps/mail/modules/cedar-os/src/store/messages/renderers/initializeMessageRendererRegistry.tsxno production surface mapped
  • apps/mail/modules/company/components/CompanyExplorer.tsxno production surface mapped
  • apps/mail/modules/company/components/CompanyGTMPanel.tsxno production surface mapped
  • apps/mail/modules/conversations/components/ConversationProfile.tsxno production surface mapped
  • apps/mail/modules/conversations/components/ConversationTabContent.tsxno production surface mapped
  • apps/mail/modules/conversations/components/strategicOverview/StrategicOverviewTab.test.tsxno production surface mapped
  • apps/mail/modules/conversations/components/strategicOverview/StrategicOverviewTab.tsxno production surface mapped
  • apps/mail/modules/conversations/slice/conversationsSlice.tsno production surface mapped
  • apps/mail/modules/conversationsPage/components/SidebarGroupByPicker.tsxno production surface mapped
  • apps/mail/modules/crm/components/conversation-canvas/ColumnConfigurationItem.tsxno production surface mapped
  • apps/mail/modules/crm/components/conversation-canvas/CreateConversationDialog.tsxno production surface mapped
  • apps/mail/modules/crm/components/task-column-popover.tsxno production surface mapped
  • apps/mail/modules/crm/config/conversation-columns.tsno production surface mapped
  • apps/mail/modules/crm/hooks/use-canvas-conversations.tsno production surface mapped
  • apps/mail/modules/crm/store/crmSlice.tsno production surface mapped
  • apps/mail/modules/crm/types/index.tsno production surface mapped
  • apps/mail/modules/crm/utils/compute-canvas-filters.tsno production surface mapped
  • apps/mail/modules/crm/utils/date-format.tsno production surface mapped
  • apps/mail/modules/crm/utils/filter-sort-helpers.tsno production surface mapped
  • apps/mail/modules/crm/utils/index.tsno production surface mapped
  • apps/mail/modules/crm/utils/relative-dates.tsno production surface mapped
  • apps/mail/modules/crm/utils/time.tsno production surface mapped
  • apps/mail/modules/onboarding/components/crm/crm-table-preview.tsxno production surface mapped
  • apps/mail/modules/outbound/components/flow-canvas/FlowCanvas.tsxno production surface mapped
  • apps/mail/modules/outbound/store/outboundFlowSlice.tsno production surface mapped
  • apps/mail/modules/threads/common/utils/email-utils.tsno production surface mapped
  • apps/mail/modules/threads/common/utils/html-sanitize.tsno production surface mapped
  • apps/mail/modules/threads/components/email-tracking-indicator.tsxno production surface mapped
  • apps/mail/modules/threads/thread/components/mail-display.tsxno production surface mapped
  • apps/mail/modules/threads/thread/utils/thread-display-utils.tsno production surface mapped
  • apps/mail/modules/userTasks/components/TaskListRow.tsxno production surface mapped
  • apps/mail/package.jsonno production surface mapped
  • apps/mail/providers/client-providers.tsxno production surface mapped
  • apps/mail/tests/modules/crm/filter-sort-display.test.tsno production surface mapped
  • apps/mail/tests/modules/crm/utils/compute-canvas-filters.test.tsno production surface mapped
  • apps/mail/tests/modules/thread/inbox-conversation-filter.test.tsxno production surface mapped
  • apps/mail/tests/modules/threads/email-tracking-indicator.test.tsxno production surface mapped
  • apps/server/docs/wiki/aop-calibration-2026-08-17-after-0a0b.jsonno production surface mapped
  • apps/server/docs/wiki/aop-calibration-2026-08-17-final.jsonno production surface mapped
  • apps/server/docs/wiki/aop-calibration-2026-08-17-multiway.jsonno production surface mapped
  • apps/server/docs/wiki/aop-calibration-2026-08-17-repeat.jsonno production surface mapped
  • apps/server/docs/wiki/aop-calibration-2026-08-17.jsonno production surface mapped
  • apps/server/docs/wiki/aop-classification.mdno production surface mapped
  • apps/server/docs/wiki/aop-ping-dryrun-2026-08-17.jsonno production surface mapped
  • apps/server/src/crm-admin/cli.tsno production surface mapped
  • apps/server/src/db/crm-schema.tsno production surface mapped
  • apps/server/src/db/migrations/drop_calendar_events_conversation_fk.sqlno production surface mapped
  • apps/server/src/db/migrations/linkedin_container_participants_backfill.sqlno production surface mapped
  • apps/server/src/mastra/skills/aop/aop-selection.tsno production surface mapped
  • apps/server/src/mastra/tools/config/reassignAopTool.tsno production surface mapped
  • apps/server/src/mastra/utils/__tests__/aop-band.test.tsno production surface mapped
  • apps/server/src/mastra/utils/__tests__/aop-ping-dryrun.test.tsno production surface mapped
  • apps/server/src/mastra/utils/__tests__/aop-selection.live.test.tsno production surface mapped
  • apps/server/src/mastra/utils/aop-selection.tsno production surface mapped
  • apps/server/src/mastra/utils/classify-conversation-aop.tsno production surface mapped
  • apps/server/src/mastra/workflows/event-execution/pre-execution-setup.tsno production surface mapped
  • apps/server/src/scripts/backfill-linkedin-chat-kind.tsno production surface mapped
  • apps/server/src/services/aop/__tests__/ambiguity-ping-message.test.tsno production surface mapped
  • apps/server/src/services/aop/__tests__/ambiguity-ping.test.tsno production surface mapped
  • apps/server/src/services/aop/ambiguity-ping-message.tsno production surface mapped
  • apps/server/src/services/aop/ambiguity-ping.tsno production surface mapped
  • apps/server/src/services/aop/template-loader.tsno production surface mapped
  • apps/server/src/services/crm-admin/conversations.tsno production surface mapped
  • apps/server/src/services/crm/conversations.tsno production surface mapped
  • apps/server/src/services/file-system/__tests__/renameNode-keeps-parent.test.tsno production surface mapped
  • apps/server/src/services/file-system/index.tsno production surface mapped
  • apps/server/src/services/inbox/feed-containers.tsno production surface mapped
  • apps/server/src/services/inbox/feed.tsno production surface mapped
  • apps/server/src/services/integrations/linkedin/__test__/unconnected-classification.test.tsno production surface mapped
  • apps/server/src/services/integrations/linkedin/messaging.tsno production surface mapped
  • apps/server/src/services/integrations/linkedin/unipile-client.tsno production surface mapped
  • apps/server/src/trpc/routes/__tests__/user-tasks-conversation-scope.test.tsno production surface mapped
  • apps/server/src/trpc/routes/crm-admin.tsno production surface mapped
  • apps/server/src/trpc/routes/crm.tsno production surface mapped
  • apps/server/src/trpc/routes/user-tasks.tsno production surface mapped
  • apps/server/src/trpc/session-org.tsno production surface mapped
  • docs/design/ambiguous-aop-classification-escalation.mdno production surface mapped
  • docs/design/frontend-load-performance.mdno production surface mapped
  • docs/design/ssr-app-shell.mdno production surface mapped
  • package.jsonno production surface mapped