CedarCopilot wants to merge 4 commits into staging from fix/meeting-conversation-ambiguity
Live on prod, 3 of 10 surfaces working, less than a day left
Libra measured 3 of 10 production surfaces on prod. 2 surfaces had under 20 requests, so Libra has not judged them; 5 surfaces had no requests at all. Libra checks hourly for 3 days after each deploy.
Three confirmed Pirros/Vooma incidents where meeting recordings got misrouted or silently discarded when Cedar couldn't confidently attribute them to a conversation:
pre-execution-setup.ts threw before createAndLinkEvents() ever ran, so a meeting Cedar couldn't attribute left no crm_events row at all , nothing to notify about, nothing to fix later. Extended the nullable-conversation_id model email already uses (docs/unknown-removal.md) to meetings: the event is now recorded unattributed, and a single-button Slack ping lets the rep resolve it (reusing the existing move_event mutation and the existing agent_prompt/operation-registry machinery , no new plumbing).Two real Pirros meetings (Reza/K2M Design, JEO Consulting) that were sitting on the generic "Fathom" vendor bucket were moved to their correct conversations as a worked example of the resolution path.
Full design doc: apps/server/docs/design/ambiguous-meeting-company-assignment.md.
calendar-events.ts , 2min → 7min matching window + decision-point logging.domain-identification.ts , two instructions (competitor/tool-role rule, meeting-has-no-sender rule), validated via the playbook-instruction-eval harness against real production transcripts (both went from ~4-12% failure to 0/8-24 trials).meeting-events.ts , findOrCreateMeetingEvent accepts conversationId: string | null; never downgrades an already-linked event to unattributed on a failed re-resolution (shouldUpdateEventConversationId).pre-execution-setup.ts , records the meeting unattributed and pings before the (unchanged) ExpectedTerminationError throw, meetings only.meeting-ambiguity-ping{,-message}.ts , decision (dedupe on new-event-only, no kill switch) + message/send, mirroring the existing services/aop/ambiguity-ping{,-message}.ts pattern.Ran this repo's thermo-review skill against the full diff. One real bug found and fixed during review: the ping rendered meeting times in the server's local timezone instead of the recipient's own (every other time-formatting call site in this codebase resolves slackNotifications.digestTimezone) , fixed, with a deterministic test proving the same UTC instant renders correctly in two different timezones. Also added the dependency-direction justification comment the AOP-ping file carries for its equivalent type-only import. No blocking issues.
Two open questions from the review, left to reviewer judgment rather than answered unilaterally:
crm_events without filtering on conversation_id IS NOT NULL wasn't traced , if one exists, an unattributed meeting could surface somewhere unexpected before a human resolves it.pnpm --filter @zero/server run types , cleanpnpm --filter @zero/server run types:test , clean except pre-existing unrelated failures (confirmed via git show HEAD:... predate this branch)pnpm deps:check , 0 violationsmeeting-ambiguity-ping.test.ts, meeting-ambiguity-ping-message.test.ts, `meeting-events.shouldUp| Surface | Requests | Errors | p95 | Users | Verdict |
|---|---|---|---|---|---|
| orchestrator_agent_step | 43 → 96 | 0 → 0 (0%) | 128144 ms → 247979 ms | 37 | Working 96 requests since the deploy with 0 errors (0 errors in the 43-request baseline before it). p95 247979 ms, was 128144 ms. |
| model_chunk On-Event Execution Agent (Understudy) | 31 → 59 | 0 → 0 (0%) | 1 ms → 1 ms | 0 | Working 59 requests since the deploy with 0 errors (0 errors in the 31-request baseline before it). p95 1 ms, was 1 ms. |
| model_chunk Automation Agent (Understudy) | 11 → 23 | 0 → 0 (0%) | 1 ms → 1 ms | 0 | Working 23 requests since the deploy with 0 errors (0 errors in the 11-request baseline before it). p95 1 ms, was 1 ms. |
| model_step On-Event Execution Agent (Understudy) | 10 → 19 | 0 → 0 (0%) | 23743 ms → 32412 ms | 0 | Insufficient traffic 19 requests, under the 20 Libra needs |
| /api/trpc/agentExecutions.getAgentExecutions | 0 → 6 | 0 → 0 (0%) | not measured → 12142 ms | 0 | Insufficient traffic 6 requests, under the 20 Libra needs |
| model_chunk Automation Agent (Sol experiment) | 0 → 0 | 0 → 0 (0%) | not measured | 0 | No traffic No requests recorded since this deploy. |
| /api/trpc/agentExecutions.findRecentTrees | 0 → 0 | 0 → 0 (0%) | not measured | 0 | No traffic No requests recorded since this deploy. |
| /api/trpc/agent.list | 0 → 0 | 0 → 0 (0%) | not measured | 0 | No traffic No requests recorded since this deploy. |
| /api/trpc/agent.getInvocationSources | 0 → 0 | 0 → 0 (0%) | not measured | 0 | No traffic No requests recorded since this deploy. |
| /api/trpc/agentExecutions.executeFromClientSend | 0 → 0 | 0 → 0 (0%) | not measured | 0 | No traffic No requests recorded since this deploy. |