CedarCopilot wants to merge 10 commits into staging from feat/inbox-client-composed-feed
Live on prod, no production signal yet
Verification reached its budget before a verdict.
Reached the query budget without a verdict.
AgentAvatar is a client-only behavior and the deployed source computes a deterministic negative phase from agentId, but it emits no expected OTEL span. Since 2026-09-08T18:32:07Z, production telemetry contained 0 matching AgentAvatar/phaseFor/animationDelay spans and 0 matching.
Production telemetry since 2026-09-08T18:32:07Z contains no avatar-specific evidence: 0 OTEL spans matched AgentAvatar, AgentFace, avatar routes, or avatar attributes, and 0 CloudWatch log matches covered cedar-agent animation classes or client-rendering errors. General.
Verification reached its budget before a verdict.
Verification reached its budget before a verdict.
Libra has verdicts on 0 of 8 tracked behaviors on prod; 8 are still being checked. Libra checks hourly for 3 days after each deploy.
Three changes on one branch, each independent.
A new board arrived as a blank rectangle , the one thing it failed to teach was that it was a kanban. It is now created on a starter axis (Column 1/2/3): placeholder vocabulary that reads as "rename me" rather than Cedar deciding the board is a work ladder. emptyBoardSchema stays what a board reads as, so a failed parse still invents no fields.
The 20rem schema dropdown becomes two controls , the same split as /tasks/kanban:
CardDocumentView. Identity writes to documents columns (boards.setInfo); shape writes to the Y.Doc, so an agent's edit merges rather than clobbers and shows live while the dialog is open.view half alone: which attribute draws the columns, which ones show on the card face. Regrouping writes no card row, which is the whole reason it is a view.Renaming a column renames the value on every card in it (boards.renameColumnValue) , renaming only the option drew a new empty column beside the old one, still holding every card.
Boards and cards also render in /brain now. A board's content is not its prosemirror fragment, so the prose branch drew an empty editor that wrote prose into the board. Both own their full surface, and the back gutter steps aside for them: at wide widths that invisible ~460px strip lay over the first kanban column, eating clicks and blocking drags.
/brain stops showing the agent's own namespaceuser|organisation/agent-… folders are machine-managed , an agent's output/config/memory head, and the routing surface's instruction documents. There is one per agent, so twenty rows reading "Agent 4008f724 71dc…" sat above the first folder the user actually made.
One rule (isBrainWorkspaceDoc) now gates all three readers , the tree's store, the graph, and both halves of the search , so a row one of them hides cannot walk back in through another. The server still lists those folders: the agent workspace walks the same route.
AgentAvatar gains idle (blinks and glances) and thinking (bobs, and blinks on a quicker cadence , a busy face is a more awake one). The timings are measured frame by frame off a reference clip rather than eyeballed, because what makes that motion read as alive is the intervals, not the poses: the body holds perfectly still, the eye pair is rigid and orbits about the point between the eyes, a blink is a ~70ms vertical collapse that reopens ~18% too tall before settling, and every move is followed by real stillness. Amplitudes are sized for the smallest place they run , the 16px rail icon , where a tasteful 2° sway is a third of a pixel and therefore not an animation at all.
The sidebar's chat rows drop TabBotIcon for the agent's own face; the finished-dot overlays whichever icon the row is wearing.
Not behavioural, but the gate was failing on all three:
pathLeaf used filter(Boolean).pop(), which oxlint's prefer-array-find denies. findLast(Boolean) is the same value.getByText('Gmail') began matching two nodes the moment GmailColor was given the <title> its role="img" needs , the glyph and the row label beside it , taking eight AgentConnectionsSection tests with it. An SVG title is an accessible name, not page text, so it is now globally ignored by text queries; reach for it with getByTitle or a role+name query.board's tool description sat ~12 chars under Claude Code's 2048-char truncation, so the starter-axis sentence pushed it 239 over. The fact is now a parenthetical and the icon roster spends spaces instead of interpuncts. 2039.pnpm run autofix:local green on the merge commit: oxlint, deps:check, Jest (429 suites / 4100 tests) and server Vitest (942 files / 11312
Libra has not measured any production surfaces for this change yet.