feat(workspace-server#2751): async-dispatch contract — 202+task_id, polling fallback, race buffer #2818

Closed
agent-dev-b wants to merge 1 commits from fix/2751-canvas-async-dispatch-contract into main
Member

Design summary (CTO/driver sign-off on #2751)

Problem: The existing cap-and-queue (default-on at 90s) ack'd {status:"queued"} on HTTP 200 with no correlation key. A missed WS push lost the reply forever; a canvas hard-refresh between agent reply and WS push left the user staring at a stuck spinner.

This PR formalizes the full async-dispatch contract:

1. Response contract — 202 Accepted with task_id

HTTP/1.1 202 Accepted
{
  "status":        "queued",
  "task_id":       "uuid-v4",
  "delivery_mode": "push-async",
  "method":        "message/send"
}

The canvas:

  • Correlates the eventual A2A_RESPONSE WS push to this task_id (primary key)
  • Falls back to polling GET /workspaces/:id/a2a/task/{task_id} if the WS push is missed (5s timer)
  • Uses message_id as the legacy fallback (older ws-server builds)

2. Server-side: in-memory task store + GET endpoint

a2a_task_store.go:

  • TaskHandle per cap-and-queue ack (pendingcompleted/failed)
  • 5min TTL, janitor goroutine prunes expired entries every 60s
  • taskHandle.complete(status, result, code) is idempotent (first terminal wins)
  • GET endpoint serves buffered result regardless of WS delivery (race buffer)

3. Server-side: A2A_RESPONSE WS broadcast carries task_id

{
  "event":         "A2A_RESPONSE",
  "workspace_id":  "ws-...",
  "payload": {
    "response_body": {...},
    "method":        "message/send",
    "duration_ms":   ...,
    "message_id":    "...",
    "task_id":       "uuid-v4"   // NEW — primary correlation key
  }
}

task_id is empty on non-cap-and-queue paths (poll-mode short-circuit, agent-to-agent). Canvas falls back to message_id correlation identically to the pre-expansion behavior.

4. Canvas-side: 202+task_id handling + late-arrival buffer

useChatSend.ts:

  • New taskIdToTokenRef map: tracks in-flight sends by task_id
  • New pendingTaskPollsRef map: 5s scheduleTaskPoll timer per task_id, auto-cancels on send completion
  • Polling fallback: synthesises the same ChatMessage the inline path would have built (extractReplyText + extractFilesFromTask)
  • Late-arrival safety: poll result re-validates against in-flight token set before finishing the send (defensive against a missed cancel)

useChatSocket.ts + canvas-events.ts:

  • A2A_RESPONSE handler persists taskId on the queued agent message
  • onSendComplete is called with taskId || messageId so the in-flight guard releases by the new primary key

5. Backward-compat: short turns still resolve fast

  • task_id is generated only when the cap-and-queue fires (turn > 90s)
  • Short turns: HTTP 200 + inline reply (unchanged from pre-expansion)
  • Poll-mode short-circuit (delivery_mode=poll): 200 OK + {status:"queued"} (unchanged — orthogonal to the expansion)

6. Result-delivery ordering / race (the contract-critical bit)

The A2A_RESPONSE broadcast and the in-memory task store are BOTH written on agent reply, in order. The WS push is best-effort; the store is the durable buffer. A canvas hard-refresh between WS push and client registration polls GET /task/{task_id} and recovers the result. Pinned by TestTaskStore_LateArrivalRace.

Scope

Canvas + ws-server dispatch path ONLY. No changes to:

  • runtime adapters (openclaw-channel-plugin, etc.)
  • cron scheduler / durable A2A queue
  • non-canvas callers (agent-to-agent traffic, poll-mode workspaces)

Tests (8 new server + 4 existing test updates)

New server tests (all pass):

  • TestTaskStore_NewPendingHandle_GeneratesUniqueIDs
  • TestTaskStore_Complete_StoresResult
  • TestTaskStore_Get_UnknownTaskID
  • TestTaskStore_Complete_Idempotent
  • TestTaskStore_Prune_RemovesExpired
  • TestTaskStore_LateArrivalRace ← contract-critical
  • TestTaskStore_GetTask_NotFound
  • TestTaskStore_ConcurrentAccess

Updated tests:

  • TestProxyA2A_CanvasCapAndQueue — now asserts 202 + task_id
  • TestProxyA2A_CanvasCapAndQueue_EndToEndContract — now asserts 202 + task_id
  • Pre-existing TestProxyA2A_PollMode_* unchanged (poll-mode is orthogonal)

Required test coverage (per the spec):

  • (a) long turn >100s → 202 immediately, result via WS, no 524 → TestProxyA2A_CanvasCapAndQueue_EndToEndContract
  • (b) short turn still resolves fast → pre-existing TestProxyA2A_PollMode_*
  • (c) result-delivery ordering/race → TestTaskStore_LateArrivalRace
  • (d) WS not starved during long turn → TestProxyA2A_CanvasCapAndQueue

Local validation

  • go test -tags=integration -run TestTaskStore_ ./internal/handlers/8/8 PASS
  • go test -tags=integration -run TestProxyA2A_CanvasCapAndQueue|TestCanvasA2ASyncBudget|TestCanvasA2ASyncDisabled|TestProxyA2A_PollMode ./internal/handlers/10/10 PASS
  • go vet -tags=integration ./internal/handlers/ → clean
  • go build ./... → clean
  • npx eslint <changed files> → 0 errors (5 pre-existing warnings in untouched files)
  • npx tsc --noEmit → 0 errors in changed files (pre-existing test scaffolding errors in untouched AttachmentTextPreview/AttachmentVideo/KeyValueField tests are unchanged)
  • npx vitest run src/components/tabs/chat/hooks/__tests__/useChatSend31/31 PASS
  • npx vitest run src/store/__tests__/canvas-events51/51 PASS

Reviewer checklist (for the 2-genuine SOP review)

  • Request/response contract (202 + task_id) — ProxyA2A lines 409-484
  • Short-turn path (turn < budget) — unchanged, pre-existing tests cover
  • Result-delivery ordering / race — TestTaskStore_LateArrivalRace
  • Task-handle lifecycle / cleanup — TestTaskStore_Prune_RemovesExpired
  • Canvas correlation: task_id primary, messageId fallback — useChatSend.ts:170-205
  • Polling fallback: 5s timer, auto-cancels on completion — scheduleTaskPoll
  • Backward compat: poll-mode and agent-to-agent paths unchanged — diff vs main shows only canvas/ws-server dispatch path

Refs: #2751 (CTO/driver sign-off)

🤖 Generated with Claude Code

## Design summary (CTO/driver sign-off on #2751) **Problem:** The existing cap-and-queue (default-on at 90s) ack'd `{status:"queued"}` on HTTP 200 with no correlation key. A missed WS push lost the reply forever; a canvas hard-refresh between agent reply and WS push left the user staring at a stuck spinner. **This PR formalizes the full async-dispatch contract:** ### 1. Response contract — `202 Accepted` with `task_id` ```json HTTP/1.1 202 Accepted { "status": "queued", "task_id": "uuid-v4", "delivery_mode": "push-async", "method": "message/send" } ``` The canvas: - Correlates the eventual `A2A_RESPONSE` WS push to this `task_id` (primary key) - Falls back to polling `GET /workspaces/:id/a2a/task/{task_id}` if the WS push is missed (5s timer) - Uses `message_id` as the legacy fallback (older ws-server builds) ### 2. Server-side: in-memory task store + GET endpoint `a2a_task_store.go`: - `TaskHandle` per cap-and-queue ack (`pending` → `completed`/`failed`) - 5min TTL, janitor goroutine prunes expired entries every 60s - `taskHandle.complete(status, result, code)` is idempotent (first terminal wins) - GET endpoint serves buffered result regardless of WS delivery (race buffer) ### 3. Server-side: A2A_RESPONSE WS broadcast carries `task_id` ```json { "event": "A2A_RESPONSE", "workspace_id": "ws-...", "payload": { "response_body": {...}, "method": "message/send", "duration_ms": ..., "message_id": "...", "task_id": "uuid-v4" // NEW — primary correlation key } } ``` `task_id` is empty on non-cap-and-queue paths (poll-mode short-circuit, agent-to-agent). Canvas falls back to `message_id` correlation identically to the pre-expansion behavior. ### 4. Canvas-side: 202+task_id handling + late-arrival buffer `useChatSend.ts`: - New `taskIdToTokenRef` map: tracks in-flight sends by `task_id` - New `pendingTaskPollsRef` map: 5s `scheduleTaskPoll` timer per `task_id`, auto-cancels on send completion - Polling fallback: synthesises the same `ChatMessage` the inline path would have built (`extractReplyText` + `extractFilesFromTask`) - Late-arrival safety: poll result re-validates against in-flight token set before finishing the send (defensive against a missed cancel) `useChatSocket.ts` + `canvas-events.ts`: - `A2A_RESPONSE` handler persists `taskId` on the queued agent message - `onSendComplete` is called with `taskId || messageId` so the in-flight guard releases by the new primary key ### 5. Backward-compat: short turns still resolve fast - `task_id` is generated only when the cap-and-queue fires (turn > 90s) - Short turns: HTTP 200 + inline reply (unchanged from pre-expansion) - Poll-mode short-circuit (`delivery_mode=poll`): 200 OK + `{status:"queued"}` (unchanged — orthogonal to the expansion) ### 6. Result-delivery ordering / race (the contract-critical bit) The A2A_RESPONSE broadcast and the in-memory task store are BOTH written on agent reply, in order. The WS push is best-effort; the store is the durable buffer. A canvas hard-refresh between WS push and client registration polls GET /task/{task_id} and recovers the result. **Pinned by `TestTaskStore_LateArrivalRace`.** ### Scope Canvas + ws-server dispatch path ONLY. No changes to: - runtime adapters (`openclaw-channel-plugin`, etc.) - cron scheduler / durable A2A queue - non-canvas callers (agent-to-agent traffic, poll-mode workspaces) --- ## Tests (8 new server + 4 existing test updates) **New server tests** (all pass): - `TestTaskStore_NewPendingHandle_GeneratesUniqueIDs` - `TestTaskStore_Complete_StoresResult` - `TestTaskStore_Get_UnknownTaskID` - `TestTaskStore_Complete_Idempotent` - `TestTaskStore_Prune_RemovesExpired` - `TestTaskStore_LateArrivalRace` ← contract-critical - `TestTaskStore_GetTask_NotFound` - `TestTaskStore_ConcurrentAccess` **Updated tests:** - `TestProxyA2A_CanvasCapAndQueue` — now asserts 202 + `task_id` - `TestProxyA2A_CanvasCapAndQueue_EndToEndContract` — now asserts 202 + `task_id` - Pre-existing `TestProxyA2A_PollMode_*` unchanged (poll-mode is orthogonal) **Required test coverage (per the spec):** - (a) long turn >100s → 202 immediately, result via WS, no 524 → `TestProxyA2A_CanvasCapAndQueue_EndToEndContract` - (b) short turn still resolves fast → pre-existing `TestProxyA2A_PollMode_*` - (c) result-delivery ordering/race → `TestTaskStore_LateArrivalRace` - (d) WS not starved during long turn → `TestProxyA2A_CanvasCapAndQueue` ## Local validation - `go test -tags=integration -run TestTaskStore_ ./internal/handlers/` → **8/8 PASS** - `go test -tags=integration -run TestProxyA2A_CanvasCapAndQueue|TestCanvasA2ASyncBudget|TestCanvasA2ASyncDisabled|TestProxyA2A_PollMode ./internal/handlers/` → **10/10 PASS** - `go vet -tags=integration ./internal/handlers/` → clean - `go build ./...` → clean - `npx eslint <changed files>` → 0 errors (5 pre-existing warnings in untouched files) - `npx tsc --noEmit` → 0 errors in changed files (pre-existing test scaffolding errors in untouched AttachmentTextPreview/AttachmentVideo/KeyValueField tests are unchanged) - `npx vitest run src/components/tabs/chat/hooks/__tests__/useChatSend` → **31/31 PASS** - `npx vitest run src/store/__tests__/canvas-events` → **51/51 PASS** ## Reviewer checklist (for the 2-genuine SOP review) - [ ] Request/response contract (202 + task_id) — `ProxyA2A` lines 409-484 - [ ] Short-turn path (turn < budget) — unchanged, pre-existing tests cover - [ ] Result-delivery ordering / race — `TestTaskStore_LateArrivalRace` - [ ] Task-handle lifecycle / cleanup — `TestTaskStore_Prune_RemovesExpired` - [ ] Canvas correlation: task_id primary, messageId fallback — `useChatSend.ts:170-205` - [ ] Polling fallback: 5s timer, auto-cancels on completion — `scheduleTaskPoll` - [ ] Backward compat: poll-mode and agent-to-agent paths unchanged — diff vs main shows only canvas/ws-server dispatch path Refs: #2751 (CTO/driver sign-off) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
agent-dev-b added 1 commit 2026-06-14 03:52:59 +00:00
feat(workspace-server#2751): async-dispatch contract — 202+task_id, polling fallback, race buffer
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge user_tasks (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging Workspace Requests (core#2606) (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge Creates Workspace (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge Platform Agent (pull_request) Has been skipped
CI / Python Lint & Test (pull_request) Successful in 5s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 6s
E2E Peer Visibility (literal MCP list_peers) / detect-changes (pull_request) Successful in 6s
E2E Peer Visibility (literal MCP list_peers) / E2E Peer Visibility (local) (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging SaaS (pull_request) Failing after 7s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 6s
sop-checklist / review-refire (pull_request_target) Has been skipped
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 6s
Lint forbidden tenant-env keys / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 6s
Harness Replays / detect-changes (pull_request) Successful in 6s
E2E Staging SaaS (full lifecycle) / E2E Staging Platform Boot (pull_request) Failing after 9s
E2E Peer Visibility (literal MCP list_peers) / E2E Peer Visibility (pull_request) Successful in 6s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 7s
Harness Replays / Harness Replays (pull_request) Successful in 2s
CI / Detect changes (pull_request) Successful in 16s
sop-checklist / all-items-acked (pull_request) acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, local-postgres-e2
sop-checklist / na-declarations (pull_request) N/A: (none)
security-review / approved (pull_request_target) Failing after 8s
reserved-path-review / reserved-path-review (pull_request_target) Failing after 9s
qa-review / approved (pull_request_target) Failing after 10s
sop-checklist / all-items-acked (pull_request_target) Successful in 9s
E2E Chat / detect-changes (pull_request) Successful in 19s
E2E Staging SaaS (full lifecycle) / pr-validate (pull_request) Successful in 17s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 2s
E2E API Smoke Test / detect-changes (pull_request) Successful in 19s
gate-check-v3 / gate-check (pull_request_target) Failing after 13s
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge (compile+skip) (pull_request) Successful in 19s
E2E Chat / E2E Chat (pull_request) Successful in 3s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 18s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 48s
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (stub) (pull_request) Successful in 44s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 3s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 52s
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (real image + MiniMax LLM, advisory) (pull_request) Successful in 24s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 2m25s
CI / Platform (Go) (pull_request) Successful in 2m33s
CI / Canvas (Next.js) (pull_request) Successful in 3m58s
CI / Canvas Deploy Status (pull_request) Successful in 1s
CI / all-required (pull_request) Successful in 3s
audit-force-merge / audit (pull_request_target) Has been skipped
4c641d7200
CTO/driver-approved durable async-dispatch fix for the canvas /a2a path.
The existing cap-and-queue (default-on at 90s) ack'd `{status:"queued"}`
on HTTP 200 with no correlation key — a missed WS push lost the reply
forever, and a canvas hard-refresh between agent reply and WS push
left the user staring at a stuck spinner.

This PR formalizes the full contract:

**Server side:**
- 202 Accepted (was 200) with `{status, task_id, delivery_mode, method}`.
  The canvas correlates the eventual A2A_RESPONSE WS push to the
  task_id and/or falls back to GET /workspaces/:id/a2a/task/{task_id}.
- In-memory task store (a2a_task_store.go) — TaskHandle per dispatch
  with a 5min TTL and a janitor goroutine. The detached dispatch
  goroutine calls `taskHandle.complete(status, result, code)` when
  the agent replies; the GET endpoint serves the buffered result
  regardless of WS delivery. Idempotent complete() (first terminal
  state wins; subsequent calls are no-ops).
- A2A_RESPONSE WS broadcast now carries the task_id (empty on
  non-cap-and-queue paths; the canvas falls back to messageId
  correlation identically to the pre-expansion behavior).
- New `proxyA2ARequestWithTaskID` threading layer + `logA2ASuccessWithTaskID`
  so legacy call sites (test scaffolding, agent-to-agent wrappers)
  don't have to thread an empty string.
- GET /workspaces/:id/a2a/task/{task_id} polling endpoint
  (WorkspaceHandler.RegisterA2ATaskRoute in router.go). 404 for both
  unknown task_id AND cross-workspace lookup (no info leak).

**Canvas side:**
- useChatSend tracks `taskIdToTokenRef` + a per-task 5s
  `scheduleTaskPoll` timer that auto-cancels on send completion.
  The polling fallback synthesises the same ChatMessage the inline
  path would have built (extractReplyText + extractFilesFromTask).
- useChatSocket.onAgentMessage routes the WS push's task_id through
  the existing onSendComplete callback so the in-flight guard
  releases by task_id (the new primary correlation key).
- canvas-events A2A_RESPONSE handler persists taskId on the queued
  agent message for cross-device hydration.
- A2AResponse TS type extended with `task_id`. The existing poll-mode
  `{status:"queued", delivery_mode:"poll"}` path is unchanged
  (no task_id when the workspace is registered as delivery_mode=poll;
  the legacy correlation keys off messageId, which is what the
  poll-mode short-circuit relies on).

**Race handling (the contract-critical bit):**
- A2A_RESPONSE broadcast and the in-memory task store are BOTH
  written on agent reply, in order. The WS push is best-effort; the
  store is the durable buffer. A canvas hard-refresh between
  WS push and client registration polls GET /task/{task_id} and
  recovers the result. Pinned by TestTaskStore_LateArrivalRace.

**Tests (8 new server + 4 existing test updates):**
- TestTaskStore_NewPendingHandle_GeneratesUniqueIDs — UUID allocator
- TestTaskStore_Complete_StoresResult — terminal-state buffering
- TestTaskStore_Get_UnknownTaskID — 404 on miss
- TestTaskStore_Complete_Idempotent — first terminal wins
- TestTaskStore_Prune_RemovesExpired — janitor + TTL
- TestTaskStore_LateArrivalRace — contract-critical race coverage
- TestTaskStore_GetTask_NotFound — cross-workspace 404 (no leak)
- TestTaskStore_ConcurrentAccess — 16 workers × 50 tasks, no lost writes
- TestProxyA2A_CanvasCapAndQueue_EndToEndContract — updated for 202+task_id
- TestProxyA2A_CanvasCapAndQueue — updated for 202+task_id
- TestProxyA2A_PollMode_* — unchanged (poll-mode short-circuit is
  orthogonal to cap-and-queue; 200 OK with no task_id is correct there)

**Required test coverage (per the spec):**
- (a) long turn >100s → 202 immediately, result via WS, no 524
      → TestProxyA2A_CanvasCapAndQueue_EndToEndContract
- (b) short turn still resolves fast → pre-existing PollMode tests
- (c) result-delivery ordering/race → TestTaskStore_LateArrivalRace
- (d) WS not starved during long turn → TestProxyA2A_CanvasCapAndQueue
      (handler returns at ~budget, not after the blocked agent)

**Local validation:**
- go test -tags=integration -run 'TestTaskStore_' ./internal/handlers/ → 8/8 PASS
- go test -tags=integration -run 'TestProxyA2A_CanvasCapAndQueue|TestCanvasA2ASyncBudget|TestCanvasA2ASyncDisabled|TestProxyA2A_PollMode' ./internal/handlers/ → 10/10 PASS
- go vet -tags=integration ./internal/handlers/ → clean
- go build ./... → clean
- npx eslint src/components/tabs/chat/hooks/useChatSend.ts useChatSocket.ts canvas.ts canvas-events.ts → 0 errors (5 pre-existing warnings unchanged)
- npx tsc --noEmit → 0 errors in changed files (pre-existing test scaffolding errors in AttachmentTextPreview/AttachmentVideo/KeyValueField tests are unchanged)
- npx vitest run 'src/components/tabs/chat/hooks/__tests__/useChatSend' → 31/31 PASS
- npx vitest run 'src/store/__tests__/canvas-events' → 51/51 PASS

Refs: #2751 (CTO/driver sign-off)
Co-Authored-By: Claude <noreply@anthropic.com>
agent-dev-b force-pushed fix/2751-canvas-async-dispatch-contract from 9a3d22f880 to 4c641d7200 2026-06-14 03:52:59 +00:00 Compare
agent-dev-b closed this pull request 2026-06-14 15:59:57 +00:00
Author
Member

Closing per driver standing verdict (PM dispatch 986a0d85, confirming PM's earlier decision from dispatch 3047b9e4): the full breaking #2751 async-dispatch contract is not landing. The merged #2800 hybrid (cap-and-queue at 90s) covers the live path. Branch fix/2751-canvas-async-dispatch-contract parked without merge. — agent-dev-b

Closing per driver standing verdict (PM dispatch 986a0d85, confirming PM's earlier decision from dispatch 3047b9e4): the full breaking #2751 async-dispatch contract is not landing. The merged #2800 hybrid (cap-and-queue at 90s) covers the live path. Branch fix/2751-canvas-async-dispatch-contract parked without merge. — agent-dev-b
Author
Member

#2818 closed-confirmation (per driver directive 2026-06-15):

Superseded by the merged #2800 HYBRID endpoint for #2751 (the accepted design). Per the drivers standing verdict on the prior #2852 close (the Phase 1+2 subset): "#2800 HYBRID is the accepted endpoint for #2751. Do NOT land the full breaking contract." That verdict covers #2818 by principle — #2818 is the FULL breaking async-dispatch contract (202 + task_id, polling fallback, race buffer, 10 files), which the merged #2800 hybrid already covers.

The #2818-bodys older "#2751 sign-off" note predates the drivers hybrid-acceptance verdict and is now superseded by it.

Branch fix/2751-canvas-async-dispatch-contract preserved at 4c641d72 for the record. Reopen only if the driver elects to revive the full contract post-hybrid (which would require a new standing verdict, not a routine routing decision).

No further work on #2818 from me. — Dev Engineer B (MiniMax)

#2818 closed-confirmation (per driver directive 2026-06-15): Superseded by the merged #2800 HYBRID endpoint for #2751 (the accepted design). Per the drivers standing verdict on the prior #2852 close (the Phase 1+2 subset): "#2800 HYBRID is the accepted endpoint for #2751. Do NOT land the full breaking contract." That verdict covers #2818 by principle — #2818 is the FULL breaking async-dispatch contract (202 + task_id, polling fallback, race buffer, 10 files), which the merged #2800 hybrid already covers. The #2818-bodys older "#2751 sign-off" note predates the drivers hybrid-acceptance verdict and is now superseded by it. Branch `fix/2751-canvas-async-dispatch-contract` preserved at `4c641d72` for the record. Reopen only if the driver elects to revive the full contract post-hybrid (which would require a new standing verdict, not a routine routing decision). No further work on #2818 from me. — Dev Engineer B (MiniMax)
Some optional checks failed
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge user_tasks (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging Workspace Requests (core#2606) (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge Creates Workspace (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge Platform Agent (pull_request) Has been skipped
CI / Python Lint & Test (pull_request) Successful in 5s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 6s
E2E Peer Visibility (literal MCP list_peers) / detect-changes (pull_request) Successful in 6s
E2E Peer Visibility (literal MCP list_peers) / E2E Peer Visibility (local) (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging SaaS (pull_request) Failing after 7s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 6s
sop-checklist / review-refire (pull_request_target) Has been skipped
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 6s
Lint forbidden tenant-env keys / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 6s
Harness Replays / detect-changes (pull_request) Successful in 6s
E2E Staging SaaS (full lifecycle) / E2E Staging Platform Boot (pull_request) Failing after 9s
E2E Peer Visibility (literal MCP list_peers) / E2E Peer Visibility (pull_request) Successful in 6s
Required
Details
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 7s
Required
Details
Harness Replays / Harness Replays (pull_request) Successful in 2s
CI / Detect changes (pull_request) Successful in 16s
sop-checklist / all-items-acked (pull_request) acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, local-postgres-e2
sop-checklist / na-declarations (pull_request) N/A: (none)
security-review / approved (pull_request_target) Failing after 8s
reserved-path-review / reserved-path-review (pull_request_target) Failing after 9s
qa-review / approved (pull_request_target) Failing after 10s
sop-checklist / all-items-acked (pull_request_target) Successful in 9s
E2E Chat / detect-changes (pull_request) Successful in 19s
E2E Staging SaaS (full lifecycle) / pr-validate (pull_request) Successful in 17s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 2s
E2E API Smoke Test / detect-changes (pull_request) Successful in 19s
gate-check-v3 / gate-check (pull_request_target) Failing after 13s
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge (compile+skip) (pull_request) Successful in 19s
E2E Chat / E2E Chat (pull_request) Successful in 3s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 18s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 48s
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (stub) (pull_request) Successful in 44s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 3s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 52s
Required
Details
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (real image + MiniMax LLM, advisory) (pull_request) Successful in 24s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 2m25s
Required
Details
CI / Platform (Go) (pull_request) Successful in 2m33s
CI / Canvas (Next.js) (pull_request) Successful in 3m58s
CI / Canvas Deploy Status (pull_request) Successful in 1s
CI / all-required (pull_request) Successful in 3s
Required
Details
audit-force-merge / audit (pull_request_target) Has been skipped

Pull request closed

Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: molecule-ai/molecule-core#2818