CedarCopilot wants to merge 4 commits into staging from fix/crm-duplicate-conversation-contact-crosscheck
Live on prod, 0 of 3 surfaces degraded
Verification reached its 130s outer budget before the verifier returned. Libra is keeping this intent verifying until the next check.
Strict CloudWatch fallback found 30 prod failure log lines for [UpdateExternalCrmWorkflow] Driver update failed (Value \) in the last 24h while checking extractcorroboratedcontactdomains, contactcount, corroborateddomaincount, assigneventtoconversationtool.
Strict CloudWatch fallback found 31 prod failure log lines for [UpdateExternalCrmWorkflow] Driver update failed (Value \) in the last 24h while checking assigneventtoconversation, assigneventtoconversationtool, outcome":"ambiguous_multi_domain", outcome":"no_corroboration".
Strict CloudWatch fallback found 31 prod failure log lines for [UpdateExternalCrmWorkflow] Driver update failed (Value \) in the last 24h while checking assigneventtoconversation, contactcount, assigneventtoconversationtool, external_crm_contact_crosscheck.
Strict CloudWatch fallback found 30 prod failure log lines for [UpdateExternalCrmWorkflow] Driver update failed (Value \) in the last 24h while checking /domain-identification, assigneventtoconversation, assigneventtoconversationtool, record with, ; empty results report, up.
Strict CloudWatch fallback found 31 prod failure log lines for [UpdateExternalCrmWorkflow] Driver update failed (Value \) in the last 24h while checking selectprimarycompany, builddomainidentificationprompt, assigneventtoconversation, assigneventtoconversationtool.
internal_only
internal_only
internal_only
internal_only
internal_only
internal_only
internal_only
internal_only
Libra measured 1 of 3 production surfaces on prod. Libra checks hourly for 3 days after each deploy.
Company.domain isn't always the domain its real contacts email from , Vooma's Dynamic Logistix deal lists dynamiclogistix.com on the HubSpot Company object, but all 5 of its actual associated contacts are @shipdlx.com. assignEventToConversation's external_crm branch trusted Company.domain alone, so the email/meeting side of an account and the CRM-sync side could mint two separate Cedar conversations for the same real company. Confirmed and merged 9 such split pairs for Vooma this session.matchGlobalCompanyByAnyDomain , exact domain match only, no fuzzy/LLM judgment) before ever asking the domain-identification agent. On a miss, the real contacts are passed to the agent as participants (previously always []) plus a hint naming the CRM's own company record, so it has a reason to actually verify via lookup-company-fuzzy instead of assuming the participant domain is a brand-new company.crm-known-deal-hint-eval.ts, 10 trials/variant against the real system prompt + model): 2/10 correct without the hint vs. 7/10 with it, tool invoked 10/10 vs. 6/10.crm-fetch-deals-by-ids is a hosted tool, not a repo file): already built, tested live against real connected accounts on all three providers (HubSpot: the real Vooma deal; Salesforce and Attio: separate live-connected test accounts), and published to production ahead of this PR. It's additive only , a new contacts field nothing reads yet , so merging this PR is what activates the cross-check, not a prerequisite for the tool change being safe.pnpm --filter @zero/server run types , cleanpnpm deps:check , 0 violationspnpm --filter @zero/server exec vitest run on all 3 touched/new test files , 14/14 passing, re-verified from a clean install in an isolated worktreecontacts output against real connected deals: HubSpot (Vooma, 5/5 correct), Salesforce (correct positive match + correct null-email filtering, confirmed against raw SOQL), Attio (correct match)getDealsByIds result now matched by id instead of array position)🤖 Generated with Claude Code
This PR augments first-sighting external CRM deal assignment with associated-contact domain checks and an agent hint intended to avoid duplicate conversations.
The PR is not safe to merge until deterministic routing distinguishes account contacts from unrelated associated contacts and the explicit no-cast repository requirement is satisfied.
The new first-match shortcut can bypass company identification and permanently link a CRM deal to an unrelated contact’s
| Surface | Requests | Errors | p95 | Users | Verdict |
|---|---|---|---|---|---|
| db.getConnectionRecord | 3452 → 3081 | 7 → 10 (0.3%) | 102 ms → 94 ms | 0 | Working 3,081 requests since the deploy with 10 errors (7 errors in the 3,452-request baseline before it). p95 94 ms, was 102 ms. |
| gmail.users.threads.get | 396 → 507 | 10 → 9 (2%) | 466 ms → 453 ms | 95 | Pre-existing 9 of 507 requests failed (1.8%) since the deploy, matching the 2.5% baseline error rate before it. Not attributable to this change. |
| aws-primary.syncThread | 14 → 21 | 7 → 10 (48%) | 804 ms → 550 ms | 0 | Pre-existing 10 of 21 requests failed (47.6%) since the deploy, matching the 50% baseline error rate before it. Not attributable to this change. |