CedarCopilot wants to merge 3 commits into staging from feat/inbox-client-composed-feed
Libra ran this behavior against the change and confirmed the check detects when it breaks.
Changed code: EmbeddedCedarChat.tsx.
Live on prod, 2 of 10 surfaces working, 2 days left
Libra measured 2 of 10 production surfaces on prod. 3 surfaces had under 20 requests, so Libra has not judged them; 4 surfaces had no requests at all. Libra checks hourly for 3 days after each deploy.
Five pieces of work, plus what three review gates turned up on them.
Chat durability. A turn persisted its transcript once, at the end , so a process death between the question and the answer took the whole conversation with it, leaving a titled thread holding nothing and no log line anywhere. The user's message is now written the moment the turn starts (same row id, so the end-of-turn compile upserts rather than duplicates), and a turn that ends without persisting says so.
Switching chats no longer hands the new chat the last chat's deal. An artifact the app puts on a chat (LayoutUrlSync keeping the page's deal on screen through a tab switch) is marked ambient, so it earns no committed primary and no server-side display memory.
Cross-mailbox drafts fail honestly. A thread living in another connected mailbox has no RFC822 message to pair against, so the existing recovery ladder always misses it and the composer told the user to try again , forever. It now says the thread lives in a different mailbox and that retrying won't help. Retrying the write on the owning connection was built and then removed during review: createDraft returns only a provider draft id, so autosave, send and delete all resolve the active connection again , the draft saved into the other mailbox and then couldn't be sent from the one you were writing in. A failure that looks like success is worse than an honest one; carrying the effective connection through the draft lifecycle is its own change.
Agent-created documents attach to chat context via one shared server-side helper, replacing a frontend hack special-cased on a tool name. Boards get a field-level default, so a card filed with no status is a Backlog card on disk rather than one that merely draws there.
listMeetingProviderPresence got an indexed path. crm_meeting_events carries no user_id, so Postgres scanned the whole table and looked each row back up in crm_events. Adding the redundant-on-results eventType predicate gives the planner a second selective index: 865 ms → 6.2 ms, 94,097 buffers → 354 on the heaviest account. Verified against production that all 22,977 rows are event_type = 'meeting', so it drops nothing.
| Gate | Outcome |
|---|---|
/review | 2 blocking, 2 should-fix, 4 broken suites , all fixed (5bda47d6d) |
/thermo-review | 1 structural regression, 2 false invariants, 1 missed reuse , all fixed (9b070ca1b) |
| Greptile CLI (local) | Did not run , service-side failure on 3 attempts, each stuck on a stale base sha |
| Greptile (PR review) | 6 P1 + 2 P2 → 5 fixed, 1 declined with reason, 2 were other sessions' commits (efccd8141, 09fd56d0a) |
The two blocking findings were both in the chat-switch fix, and both let the bug it targets survive:
EmbeddedCedarChat cleared the ambient mark from the commit before the one that reads it. LayoutUrlSync is a sibling whose effects flush first, but its store write isn't visible until the next render , so the promote effect saw an unwritten slot, wiped the mark, and then committed the app's deal as the chat's own. The slot is now read uncollapsed: undefined (never written) no longer clears; null (displaying nothing) still does.applyOwnThreadContext's conversation branch never wrote the display slot, so chatStillHolds read a deliberate tab switch as hydration and re-asserted the previous chat's deal over the one the chat owns.Thermo found the consolidation had taken the attach half out of three tools and left the detach half inline in documentTool, carrying both of the same bugs , createStructuredLog formats a line without emitting one, so failures were invisible, and the DB handle sat outside the guard. boardTool had no detach at all, so archiving a card add_card had filed as a chip left a tombstone the agent is handed on every later turn. Both directions now share one plumbing path.
It also caught a regression against sta
| Surface | Requests | Errors | p95 | Users | Verdict |
|---|---|---|---|---|---|
| / | 23970 → 13362 | 2 → 0 (0%) | 20026 ms → 20029 ms | 0 | Working 13,362 requests since the deploy with 0 errors (2 errors in the 23,970-request baseline before it). p95 20029 ms, was 20026 ms. |
| db.insert | 919 → 1060 | 0 → 0 (0%) | 34 ms → 35 ms | 0 | Working 1,060 requests since the deploy with 0 errors (0 errors in the 919-request baseline before it). p95 35 ms, was 34 ms. |
| /api/trpc/documents.getDoc | 0 → 3 | 0 → 0 (0%) | not measured → 200 ms | 0 | Insufficient traffic 3 requests, under the 20 Libra needs |
| POST /api/trpc/documents.getDoc | 0 → 2 | 0 → 0 (0%) | not measured → 200 ms | 0 | Insufficient traffic 2 requests, under the 20 Libra needs |
| trpc.documents.getDoc | 0 → 1 | 0 → 0 (0%) | not measured → 177 ms | 1 | Insufficient traffic 1 request, under the 20 Libra needs |
| execute_tool read-document | 0 → 0 | 0 → 0 (0%) | not measured | 0 | No traffic No requests recorded since this deploy. |
| execute_tool write-document | 0 → 0 | 0 → 0 (0%) | not measured | 0 | No traffic No requests recorded since this deploy. |
| execute_tool list-documents | 0 → 0 | 0 → 0 (0%) | not measured | 0 | No traffic No requests recorded since this deploy. |
| /api/trpc/boards.listCards | 0 → 0 | 0 → 0 (0%) | not measured | 0 | No traffic No requests recorded since this deploy. |
| /home chat tabs and thread picker | no baseline → 0 | no baseline → 0 (0%) | not measured | not counted | Unavailable ClickHouse reads are unavailable, so Libra could not measure this surface. |