CedarCopilot wants to merge 0 commits into staging from feat/canvas-metrics-bar
Live on prod, no production signal yet
OTEL fallback found no prod spans matching ConversationCanvas / crm.aggregateConversations since deploy.
OTEL fallback found no prod spans matching ConversationCanvas Fields popover / canvas viewConfig since deploy.
Since 2026-08-16T02:50:39Z, no OTEL spans, tRPC routes, or span attributes identified crm.aggregateConversations (0 matching rows), and CloudWatch yielded no concrete aggregate-operation or metric/table-mismatch signal. In the same window, crm.listConversations had 9.
Since 2026-08-16T02:50:39Z, production telemetry returned 0 spans matching crm.aggregateConversations/aggregateConversations and 0 CloudWatch log lines matching aggregateConversations, aggregate conversations, or populatedCount. A broader aggregate telemetry search found only.
Only 2 prod OTEL spans matching POST /api/trpc/mastra.chatStream reached Libra since the deploy, below the 20-span floor for calling a change verified. Nothing is failing; there is not yet enough traffic to confirm it.
Only 1 prod OTEL span matching POST /api/trpc/mastra.chatStream reached Libra since the deploy, below the 20-span floor for calling a change verified. Nothing is failing; there is not yet enough traffic to confirm it.
single_user
Libra has verdicts on 0 of 7 tracked behaviors on prod; 7 are still being checked. Libra checks hourly for 3 days after each deploy.
Three independent threads that accumulated on this branch:
Canvas metrics bar (phases 4,5 of pipeline-tabs-and-canvas-aggregates)
viewConfig.summaries on the canvas schema + a useCanvasAggregates hook backed by a new crm tRPC field.CanvasMetricsBar renders the configured cumulative tiles above the canvas.CumulativeFieldsSection), collapsed behind a toggle so it doesn't crowd the default popover.use-canvas-list-variables.ts out of use-canvas-conversations.ts (that file was doing two unrelated jobs).Chat SSE: listener instead of a poll
REDIS_TCP_URL (TCP endpoint for the same database). Set it and chat streams over XREAD BLOCK; leave it unset and the existing REST polling path runs completely unchanged.createBlockingTcpClient() hands out one dedicated connection per in-flight reader, capped at 64 , past the cap callers fall back to polling rather than failing.error listener is attached on every TCP client: an EventEmitter without one rethrows, so a bad REDIS_TCP_URL would have taken the process down instead of degrading to REST.apps/server/docs/design/chat-stream-listener.md.CRM deal age + discovery since
since override with a headless verb on the crm-admin CLI.pnpm run autofix:local , oxlint, deps:check, paraglide compile, and the Jest mail suite all green. The server vitest run reported 5807 passed / 6 failed, every failure a 30s beforeEach hook timeout in the PGlite outbound harness (worker starvation under full-suite parallelism on a loaded local machine).pnpm --filter @zero/server exec vitest run src/services/outbound/ → 73 files / 302 tests passed, 0 failed. No outbound code is touched by this branch.chat-stream-listen.test.ts, chat-stream-writer.test.ts, chat-stream-store.test.ts updates, canvas-view-config-persistence.test.ts, deal-link-metrics.test.ts.origin/staging before pushing (clean merge).🤖 Generated with Claude Code
The PR adds configurable canvas aggregate tiles, an optional TCP-backed Redis listener for chat streams, and CRM deal-discovery and age corrections. It also makes the stage-tab recovery script transactional.
The PR is not safe to merge until capped chat listeners fall back to polling and pinned canvases pass their pinned IDs into aggregate queries.
Under blocking-client saturation, chat SSE responses can close without content, while pinned conversation canvases can render aggregate totals for a broader deal set than the visible rows.
Files Needing Attention: apps/server/src/mastra/routeHandlers/chat/handleChat.ts; apps/mail/modules/crm/hooks/use-canvas-aggregates.ts
| Filename | Overview |
|---|---|
| apps/server/src/mastra/routeHandlers/chat/handleChat.ts | Selects the TCP stream listener but omits the required REST fallback when capped client acquisition returns null. |
| apps/server/src/services/chat/chat-stream-listen.ts | Implements bounded blocking stream reads and |
Libra has not measured any production surfaces for this change yet.