CedarCopilot wants to merge 0 commits into main from staging
Live on prod, no production signal yet
Strict CloudWatch fallback found 1 prod failure log lines for [MEETING_NOTES_WEBHOOK] Error processing webhook (AskElephant webhook payload must contain at least one attendee with a valid email address), but this domain-wide failure family is not tied to this intent.
Strict CloudWatch fallback found 3 prod failure log lines for mirror.upsertEmailThread failed (write CONNECT_TIMEOUT aws-1-us-east-2.pooler.supabase.com:6543), but this domain-wide failure family is not tied to this intent.
Strict CloudWatch fallback found 47 prod failure log lines for [UpdateExternalCrmWorkflow] Driver update failed (Value \), up from 1 in the comparable baseline, but this domain-wide failure family is not tied to this intent.
Strict CloudWatch fallback found 3 prod failure log lines for mirror.upsertEmailThread failed (write CONNECT_TIMEOUT aws-1-us-east-2.pooler.supabase.com:6543), but this domain-wide failure family is not tied to this intent.
Strict CloudWatch fallback found 16 prod failure log lines for [backfillSlackChannelHistory] Backfill failed (Superglue workflow failed: fetch failed), but this domain-wide failure family is not tied to this intent.
customer_facing
Libra has verdicts on 0 of 5 tracked behaviors on prod; 5 are still being checked. Libra attributed 1 failure to this change at medium confidence and is still confirming it. Libra checks hourly for 3 days after each deploy.
This staging merge adds Slack parity and history synchronization, resumable Redis-backed chat streaming, canvas aggregates, MCP OAuth providers, inbox improvements, schema migrations, and supporting tests and documentation.
The PR should not merge until the outbound DDL drift and mixed-transport chat-stream race are fixed.
DDL-provisioned environments can lack columns required by the new Slack history code, and rolling deployments can attach a TCP reader to a REST-written generation before its first list event, delaying or dropping the visible reply.
Files Needing Attention: apps/server/src/db/outbound-schema.ts, apps/server/src/db/outbound-ddl.sql, apps/server/src/mastra/routeHandlers/chat/handleChat.ts
| Filename | Overview |
|---|---|
| apps/server/src/db/outbound-schema.ts | Adds backward Slack-history cursor state but does not update the independently applied outbound DDL mirror. |
| apps/server/src/mastra/routeHandlers/chat/handleChat.ts | Adds TCP stream listening and reconnect transport selection, with a mixed-deployment race before the first REST append. |
| apps/server/src/services/chat/chat-stream-listen.ts | Implements blocking Redis stream delivery, retries, keepalives, generation boundaries, and an idle completion backstop. |
| apps/server/src/db/migrations/unknown_conversation_removal.sql | Removes synthetic Unknown conversations while explicitly unlinking nullable children and intentionally cascading conversation-owned rows. |
| apps/server/src/services/integrations/slack/slack-sync.ts | Substantially expands Slack synchronization and history behavior; no publishable defect was established. |
| apps/mail/modules/conversations/components/timeline/SlackStructuredBody.tsx | Adds defensive rendering for Slack blocks and legacy attachments. |
| apps/mail/modules/conversations/components/timeline/SlackStructuredBody.test.tsx | Adds structured Slack rendering coverage but violates the absolute-import convention. |
### Issue 1
apps/server/src/db/outbound-schema.ts:1395-1396
**Outbound DDL misses history columns**
If an environment provisions outbound tables through `apps/server/src/db/outbound-ddl.sql`, the new `history_oldest_ts` and `history_complete` columns are absent, causing Slack history queries to fail with missing-column errors. Add these columns to the hand-maintained DDL mirror with the schema change.
### Issue 2
apps/server/src/mastra/routeHandlers/chat/handleChat.ts:457-458
**Transport probe misroutes chat streams**
During a rolling deployment, when a REST-only task owns a generation but has not written its first list entry, this one-time probe selects the TCP listener. That listener never reads the REST list, leaving the generated reply blank or delayed until the completion backstop.
### Issue 3
apps/mail/modules/conversations/components/timeli
Libra has not measured any production surfaces for this change yet.