canvas chat messages stop appearing in target workspace activity_logs — channel push silently breaks #1674

Closed
opened 2026-05-22 06:00:44 +00:00 by cp-be · 0 comments
Member

Symptom

User typed canvas messages addressed to CEO Assistant (workspace 30ba7f0b) at ~05:33Z UTC on 2026-05-22. None reached the bound Claude Code session via channel plugin poll path. Earlier canvas messages from same user (e.g. 4e623e5f at 02:43:50Z) did arrive. Regression appeared between those timestamps.

Root cause (confirmed)

The target workspace's activity_logs has NO row for the recent canvas sends. Hitting the platform feed directly: most recent inbound (non-notify) is 4e623e5f at 02:43:50Z — anything after is missing. The bot polls correctly. It cannot deliver what the table doesn't contain.

Peer-agent A2A from PM still arrives fine — the regression is canvas-specific.

Likely cause

Missing rows all originate from source_id 344a2623 (the canvas user's identity workspace per RFC#637). Earlier rows from same source landed; regression appeared between batches. Suspects:

  1. logA2AReceiveQueued (a2a_proxy_helpers.go:567) skipped for canvas-user callers — some condition suppresses the activity write.
  2. Canvas FE switched from POST /workspaces/:id/a2a to a new chat endpoint that doesn't write activity_logs.
  3. proxyA2ARequest returns 4xx early for canvas-user callers, silently — UI still shows bubble but row never lands.

Reproduction

  1. SaaS tenant with one external/poll-mode workspace.
  2. Type and send canvas message.
  3. Query GET /workspaces/:id/activity with workspace bearer.
  4. Expected: new a2a_receive | message/send row with source_id = canvas-user-ws.
  5. Actual: no row.

Reno-Stars / Hongming's tenant 30ba7f0b reproduces empirically.

Test coverage required (CTO 2026-05-22)

  • E2E: POST /workspaces/:id/a2a with canvas-user-shaped callerID (UUID, not empty), assert a2a_receive | message/send row in /workspaces/:id/activity within 5s with source_id matching.
  • Unit (sqlmock): pin logA2AReceiveQueued INSERT synchronous before 200.
  • Hit production /workspaces/:id/a2a route per feedback_no_dev_only_routes_in_e2e.

Impact

  • Canvas chat silently broken for poll-mode workspaces (= Hongming's entire tenant). User types, sees bubble, bound CC session never receives.
  • chat-history on canvas reopen also broken (history reads activity_logs).
  • Peer-agent A2A unaffected (PM relay works during same window).

Related

  • internal#471 logA2AReceiveQueued must be synchronous
  • internal#1347 push-mode sibling data-loss class
  • RFC#637 canvas-user identity capture
  • feedback_no_dev_only_routes_in_e2e

Generated with Claude Code.

## Symptom User typed canvas messages addressed to CEO Assistant (workspace 30ba7f0b) at ~05:33Z UTC on 2026-05-22. None reached the bound Claude Code session via channel plugin poll path. Earlier canvas messages from same user (e.g. 4e623e5f at 02:43:50Z) did arrive. Regression appeared between those timestamps. ## Root cause (confirmed) The target workspace's activity_logs has NO row for the recent canvas sends. Hitting the platform feed directly: most recent inbound (non-notify) is 4e623e5f at 02:43:50Z — anything after is missing. The bot polls correctly. It cannot deliver what the table doesn't contain. Peer-agent A2A from PM still arrives fine — the regression is canvas-specific. ## Likely cause Missing rows all originate from source_id 344a2623 (the canvas user's identity workspace per RFC#637). Earlier rows from same source landed; regression appeared between batches. Suspects: 1. `logA2AReceiveQueued` (a2a_proxy_helpers.go:567) skipped for canvas-user callers — some condition suppresses the activity write. 2. Canvas FE switched from POST /workspaces/:id/a2a to a new chat endpoint that doesn't write activity_logs. 3. proxyA2ARequest returns 4xx early for canvas-user callers, silently — UI still shows bubble but row never lands. ## Reproduction 1. SaaS tenant with one external/poll-mode workspace. 2. Type and send canvas message. 3. Query GET /workspaces/:id/activity with workspace bearer. 4. Expected: new a2a_receive | message/send row with source_id = canvas-user-ws. 5. Actual: no row. Reno-Stars / Hongming's tenant 30ba7f0b reproduces empirically. ## Test coverage required (CTO 2026-05-22) - E2E: POST /workspaces/:id/a2a with canvas-user-shaped callerID (UUID, not empty), assert a2a_receive | message/send row in /workspaces/:id/activity within 5s with source_id matching. - Unit (sqlmock): pin logA2AReceiveQueued INSERT synchronous before 200. - Hit production /workspaces/:id/a2a route per feedback_no_dev_only_routes_in_e2e. ## Impact - Canvas chat silently broken for poll-mode workspaces (= Hongming's entire tenant). User types, sees bubble, bound CC session never receives. - chat-history on canvas reopen also broken (history reads activity_logs). - Peer-agent A2A unaffected (PM relay works during same window). ## Related - internal#471 logA2AReceiveQueued must be synchronous - internal#1347 push-mode sibling data-loss class - RFC#637 canvas-user identity capture - feedback_no_dev_only_routes_in_e2e Generated with Claude Code.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: molecule-ai/molecule-core#1674