CedarCopilot wants to merge 4 commits into staging from fix/attio-link-and-task-due-date
Live on prod, 0 of 12 surfaces degraded
Verification reached its budget before a verdict.
Verification reached its 120s wall-clock budget before a tied verdict. Libra is keeping this intent verifying until the next check.
Since 2026-09-18T19:21:06Z, production has positive traffic on /api/conversations.list (208 spans, 6 traces, p95 117 ms) and /api/users.conversations (27 spans, 5 traces, p95 79 ms), with one /api/conversations.list OTEL error. No matching OTEL spans, attributes, or CloudWatch.
Post-deploy production logs show substantial linked-operation activity: 2,291 completion messages across worker/API streams versus 2,242 starts, including 2,185 HubSpot, 51 Attio, and 54 Salesforce completions. However, telemetry does not expose workspaceSlug, instanceUrl, or.
Verification reached its budget before a verdict.
Since the 2026-09-18T19:21:06Z deploy, production has 0 OTEL spans for `/api/trpc/userTasks.updateTask` and 0 userTasks-related route/span matches. CloudWatch has 0 entries for `userTasks.updateTask`, `optimisticUpdateTaskDueDate`, or `Task not found`. There are 279.
Libra measured 3 of 12 production surfaces on prod. 6 surfaces had under 20 requests, so Libra has not judged them; 3 surfaces had no requests at all. Libra has 3 low-confidence degraded verdicts it is still confirming. Libra checks hourly for 3 days after each deploy.
Two bugs reported by Christopher Grittner (Hey Telo) in #cedar-heytelo, 2026-09-16, production:
/v2/self read the wrong response shape (nested data.workspace.slug instead of the actual flat workspace_slug field), so it silently failed for every Attio-connected account, not just this one. Fixed the response-shape bug, stamp the slug onto deals at write-time (getAllDeals/getDealsByIds/getAccountByEmail), and added a read-time self-heal (fetches + persists live via the existing token, no reconnect needed) so already-broken links fix themselves on next hydration. Frontend no longer renders a dead link when no URL resolves.conversationId through so both branches share the same resolution.apps/server/src/services/integrations/crm/__tests__/attio.test.ts (new) , pins computeAttioUrls against real deal data, with/without a resolved slugapps/mail/tests/modules/crm/crm-sync-href.test.ts (new) , proves the frontend never renders a dead # linkapps/mail/tests/modules/userTasks/optimisticUpdateTaskDueDateConversationOnly.test.tsx (new) , reproduces "Task not found" pre-fix, passes post-fixsrc/services/crm, src/trpc/routes, src/services/integrations/crm/__tests__, src/mastra/tools/conversation)crm, userTasks, conversations module suites passingpnpm --filter @zero/server run types cleanš¤ Generated with Claude Code
The PR is not yet safe to merge because the previous shared-conversation CRM attribution issue remains partly unresolved and the explicit no-cast requirement is still violated.
### Issue 1
apps/server/src/services/crm
| Surface | Requests | Errors | p95 | Users | Verdict |
|---|---|---|---|---|---|
| db.getConversationIdForThread | 234 ā 379 | 0 ā 0 (0%) | 56 ms ā 100 ms | 0 | Working 379 requests since the deploy with 0 errors (0 errors in the 234-request baseline before it). p95 100 ms, was 56 ms. |
| /api/trpc/crm.getConversation | 30 ā 32 | 0 ā 0 (0%) | 12120 ms ā 9532 ms | 0 | Working 32 requests since the deploy with 0 errors (0 errors in the 30-request baseline before it). p95 9532 ms, was 12120 ms. |
| POST /api/trpc/crm.getConversation | 19 ā 21 | 0 ā 0 (0%) | 12120 ms ā 9519 ms | 0 | Working 21 requests since the deploy with 0 errors (0 errors in the 19-request baseline before it). p95 9519 ms, was 12120 ms. |
| trpc.crm.getConversation | 9 ā 10 | 0 ā 0 (0%) | 11396 ms ā 9438 ms | 3 | Insufficient traffic 10 requests, under the 20 Libra needs |
| crm.getConversation | 9 ā 10 | 0 ā 0 (0%) | 11316 ms ā 9392 ms | 3 | Insufficient traffic 10 requests, under the 20 Libra needs |
| enrichment.enrichConversationContacts | 32 ā 7 | 0 ā 0 (0%) | 2443 ms ā 571 ms | 7 | Insufficient traffic 7 requests, under the 20 Libra needs |
| execute_tool update-conversation-fields | 16 ā 3 | 0 ā 0 (0%) | 11244 ms ā 5230 ms | 0 | Insufficient traffic 3 requests, under the 20 Libra needs |
| /api/trpc/crm.searchConversationsMinimal | 0 ā 3 | 0 ā 0 (0%) | not measured ā 9572 ms | 0 | Insufficient traffic 3 requests, under the 20 Libra needs |
| model_chunk Conversation Field Updater | 43 ā 2 | 0 ā 0 (0%) | 1 ms ā 1 ms | 0 | Insufficient traffic 2 requests, under the 20 Libra needs |
| /api/trpc/crm.getConversations | 0 ā 0 | 0 ā 0 (0%) | not measured | 0 | No traffic No requests recorded since this deploy. |
| /api/trpc/crm.listConversationDocs | 0 ā 0 | 0 ā 0 (0%) | not measured | 0 | No traffic No requests recorded since this deploy. |
| /api/trpc/crm.getConversationFieldDefinitions | 0 ā 0 | 0 ā 0 (0%) | not measured | 0 | No traffic No requests recorded since this deploy. |