a2a_proxy: canvas-user requests bypass token validation regardless of live tokens (fixes #1673) #1944

Closed
agent-pm wants to merge 3 commits from fix/canvas-chat-poll-mode-1673 into main
Member

Summary

validateCallerToken checked HasAnyLiveToken before IsSameOriginCanvas. When a canvas-user identity workspace (RFC#637) acquired live tokens, canvas requests fell into the hasLive=true branch, which demands a bearer token the canvas frontend never sends. This produced a silent 401 that dropped the message before logA2AReceiveQueued could write the activity_logs row — breaking canvas chat for all poll-mode workspaces using that identity.

Root cause

  1. Canvas FE sends X-Workspace-ID set to the canvas-user identity workspace (e.g. 344a2623-...).
  2. ProxyA2A calls validateCallerToken because callerID != "".
  3. validateCallerToken queries HasAnyLiveToken.
  4. If the workspace has live tokens → hasLive=true → function falls through to bearer-token validation.
  5. Canvas requests use cookies, not bearer tokens → tok == "" → 401.
  6. ProxyA2A returns early. proxyA2ARequest is never called.
  7. Poll-mode short-circuit never runs → logA2AReceiveQueued never fires → no activity_logs row.

Changes

  • Move IsSameOriginCanvas check to the top of validateCallerToken so same-origin canvas requests always bypass token validation, regardless of the caller workspace's token state.
  • Add subprocess-based handler test (TestProxyA2A_PollMode_CanvasUserWithLiveToken) that runs with CANVAS_PROXY_URL set so canvasProxyActive is true at package init, verifying the fix end-to-end.

Test plan

  • go test -run TestProxyA2A_PollMode_CanvasUserWithLiveToken passes
  • go test -run 'TestProxyA2A|TestValidateCallerToken' passes (all related tests green)
  • Monitor Hongming's tenant (30ba7f0b) for canvas message delivery recovery

Tracking

Closes #1673

## Summary `validateCallerToken` checked `HasAnyLiveToken` before `IsSameOriginCanvas`. When a canvas-user identity workspace (RFC#637) acquired live tokens, canvas requests fell into the `hasLive=true` branch, which demands a bearer token the canvas frontend never sends. This produced a silent 401 that dropped the message before `logA2AReceiveQueued` could write the `activity_logs` row — breaking canvas chat for all poll-mode workspaces using that identity. ## Root cause 1. Canvas FE sends `X-Workspace-ID` set to the canvas-user identity workspace (e.g. `344a2623-...`). 2. `ProxyA2A` calls `validateCallerToken` because `callerID != ""`. 3. `validateCallerToken` queries `HasAnyLiveToken`. 4. If the workspace has live tokens → `hasLive=true` → function falls through to bearer-token validation. 5. Canvas requests use cookies, not bearer tokens → `tok == ""` → 401. 6. `ProxyA2A` returns early. `proxyA2ARequest` is never called. 7. Poll-mode short-circuit never runs → `logA2AReceiveQueued` never fires → no `activity_logs` row. ## Changes - Move `IsSameOriginCanvas` check to the **top** of `validateCallerToken` so same-origin canvas requests always bypass token validation, regardless of the caller workspace's token state. - Add subprocess-based handler test (`TestProxyA2A_PollMode_CanvasUserWithLiveToken`) that runs with `CANVAS_PROXY_URL` set so `canvasProxyActive` is true at package init, verifying the fix end-to-end. ## Test plan - [x] `go test -run TestProxyA2A_PollMode_CanvasUserWithLiveToken` passes - [x] `go test -run 'TestProxyA2A|TestValidateCallerToken'` passes (all related tests green) - [ ] Monitor Hongming's tenant (30ba7f0b) for canvas message delivery recovery ## Tracking Closes #1673
agent-pm added 2 commits 2026-05-27 11:47:09 +00:00
watchdog: close stale [main-red] issues when contexts recover on red (mc#1789)
ci-arm64-advisory / fast-checks (pull_request) Waiting to run
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 11s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 4s
CI / Python Lint & Test (pull_request) Successful in 5s
CI / Detect changes (pull_request) Successful in 7s
E2E API Smoke Test / detect-changes (pull_request) Successful in 9s
CI / all-required (pull_request) Successful in 1m30s
E2E Chat / detect-changes (pull_request) Successful in 10s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 10s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 5s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 5s
Lint no tenant GITEA or GITHUB token write / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 6s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 7s
qa-review / approved (pull_request) Failing after 4s
gate-check-v3 / gate-check (pull_request) Successful in 9s
security-review / approved (pull_request) Failing after 5s
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-checklist / all-items-acked (pull_request) Successful in 4s
sop-checklist / review-refire (pull_request) Has been skipped
sop-tier-check / tier-check (pull_request) Successful in 4s
CI / Platform (Go) (pull_request) Successful in 2s
CI / Canvas (Next.js) (pull_request) Successful in 2s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 2s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 2s
E2E Chat / E2E Chat (pull_request) Successful in 3s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 59s
Ops Scripts Tests / Ops scripts (unittest) (pull_request) Failing after 1m4s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 2s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 2s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
c272eeae94
When main stays red across consecutive SHAs for *different* causes,
close_open_red_issues_for_other_shas never fires (it only runs when
main is green). This leaves stale issues open indefinitely — e.g.
#1936 (E2E Chat failure) stayed open even though current HEAD is red
for a different reason (E2E Legacy Advisory).

Add close_stale_red_issues():
  1. List all open [main-red] issues.
  2. For each issue on an OLD SHA, query that SHA's commit status.
  3. Compare the old failed contexts against current HEAD.
  4. If ALL failed contexts have recovered (success or absent), close
     the issue with a comment pointing to the current [main-red] issue.
  5. If the old SHA is itself now green, close it too.
  6. Skip issues with combined-red-no-detail (can't verify recovery).

Called from run_once() after file_or_update_red() on the red path.
Emits a main_red_stale_closed Loki event when issues are closed.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
a2a_proxy: canvas-user requests bypass token validation regardless of live tokens (fixes #1673)
ci-arm64-advisory / fast-checks (pull_request) Waiting to run
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 4s
CI / Python Lint & Test (pull_request) Successful in 6s
CI / Detect changes (pull_request) Successful in 9s
E2E API Smoke Test / detect-changes (pull_request) Successful in 8s
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 12s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 11s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 11s
Harness Replays / detect-changes (pull_request) Successful in 9s
E2E Chat / detect-changes (pull_request) Successful in 12s
Lint no tenant GITEA or GITHUB token write / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 4s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 4s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 6s
gate-check-v3 / gate-check (pull_request) Successful in 16s
qa-review / approved (pull_request) Failing after 4s
security-review / approved (pull_request) Failing after 3s
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-checklist / all-items-acked (pull_request) Successful in 4s
sop-checklist / review-refire (pull_request) Has been skipped
sop-tier-check / tier-check (pull_request) Successful in 6s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 1m22s
Ops Scripts Tests / Ops scripts (unittest) (pull_request) Failing after 1m20s
CI / Canvas (Next.js) (pull_request) Successful in 4s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 2s
E2E Chat / E2E Chat (pull_request) Successful in 4s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 4s
Harness Replays / Harness Replays (pull_request) Successful in 10s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 1m15s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 1m39s
CI / Platform (Go) (pull_request) Successful in 5m57s
CI / all-required (pull_request) Successful in 7m12s
7081657ec3
validateCallerToken checked HasAnyLiveToken before IsSameOriginCanvas.
When a canvas-user identity workspace (RFC#637) acquired live tokens,
canvas requests fell into the hasLive=true branch, which demands a
bearer token the canvas frontend never sends. This produced a silent
401 that dropped the message before logA2AReceiveQueued could write
the activity_logs row — breaking canvas chat for all poll-mode
workspaces using that identity.

Fix: move IsSameOriginCanvas to the top of validateCallerToken so
same-origin canvas requests always bypass token validation.

Test: add subprocess-based handler test that runs with
CANVAS_PROXY_URL set (so canvasProxyActive is true at init) and
verifies poll-mode canvas messages are queued even when the caller
workspace has live tokens.

Closes #1673

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
agent-pm force-pushed fix/canvas-chat-poll-mode-1673 from 7081657ec3 to 741737dfad 2026-05-27 11:54:48 +00:00 Compare
agent-reviewer reviewed 2026-05-27 13:18:20 +00:00
agent-reviewer left a comment
Member

HOLD - SECURITY. Explicit security call: this is NOT a safe restoration; moving IsSameOriginCanvas to the TOP of validateCallerToken opens a NEW auth widening. Not approving.

Why it is a real change, not a no-op restore:

  • Pre-fix (main): IsSameOriginCanvas only short-circuits INSIDE the !hasLive (tokenless caller) branch. When the caller workspace HAS a live token (hasLive==true), the code REQUIRES a valid bearer matching callerID, else 401. Same-origin canvas does NOT bypass that.
  • Post-fix: the check returns isCanvasUser=true unconditionally, including when hasLive==true. So a same-origin request that names a token-holding workspace in X-Workspace-ID now (a) skips the previously-mandatory bearer for that caller, and (b) gets isCanvasUser=true, which in proxyA2ARequest BYPASSES registry.CanCommunicate(callerID,target) - i.e. it can reach ANY target workspace.

Why it matters / spoofability:

  • isSameOriginCanvas is documented IN THIS REPO as NOT an auth boundary: wsauth_middleware.go L156-158 says canvasOriginAllowed/isSameOriginCanvas are intentionally NOT used in the strict path because Origin/Referer are 'trivially forgeable by any container'; L286-292 says non-cosmetic routes MUST NOT gate on it (re-opens #164 CRITICAL). A2A dispatch + CanCommunicate bypass is decidedly non-cosmetic. Any non-browser client that can reach /a2a on the tenant origin and set Referer: https:/// passes the check.
  • It only fires when CANVAS_PROXY_URL is set (combined per-tenant image), which narrows the blast radius to that topology - but within it, the bearer path that protected hasLive==true callers is now skipped, and the #761 guard only blocks system-caller prefixes, not arbitrary workspace IDs.

Net: the fix legitimately addresses #1673 (canvas-user with live tokens silently 401s), but the chosen mechanism removes a real bearer check on the hasLive==true path AND grants CanCommunicate bypass behind a forgeable signal. Need a tighter gate before this can land. Options to discuss: (a) keep the top-level bypass ONLY when callerID==workspaceID or callerID is the canvas-user identity that owns the same-origin session (not an arbitrary X-Workspace-ID); (b) require the same-origin AND a session/CSRF token the canvas actually sends (not just Referer/Origin); (c) keep IsSameOriginCanvas inside !hasLive and instead fix #1673 by classifying canvas-user identity workspaces so they are not treated as hasLive peers. Until then: HOLD.

HOLD - SECURITY. Explicit security call: this is NOT a safe restoration; moving IsSameOriginCanvas to the TOP of validateCallerToken opens a NEW auth widening. Not approving. Why it is a real change, not a no-op restore: - Pre-fix (main): IsSameOriginCanvas only short-circuits INSIDE the `!hasLive` (tokenless caller) branch. When the caller workspace HAS a live token (hasLive==true), the code REQUIRES a valid bearer matching callerID, else 401. Same-origin canvas does NOT bypass that. - Post-fix: the check returns isCanvasUser=true unconditionally, including when hasLive==true. So a same-origin request that names a token-holding workspace in X-Workspace-ID now (a) skips the previously-mandatory bearer for that caller, and (b) gets isCanvasUser=true, which in proxyA2ARequest BYPASSES registry.CanCommunicate(callerID,target) - i.e. it can reach ANY target workspace. Why it matters / spoofability: - isSameOriginCanvas is documented IN THIS REPO as NOT an auth boundary: wsauth_middleware.go L156-158 says canvasOriginAllowed/isSameOriginCanvas are intentionally NOT used in the strict path because Origin/Referer are 'trivially forgeable by any container'; L286-292 says non-cosmetic routes MUST NOT gate on it (re-opens #164 CRITICAL). A2A dispatch + CanCommunicate bypass is decidedly non-cosmetic. Any non-browser client that can reach /a2a on the tenant origin and set Referer: https://<host>/ passes the check. - It only fires when CANVAS_PROXY_URL is set (combined per-tenant image), which narrows the blast radius to that topology - but within it, the bearer path that protected hasLive==true callers is now skipped, and the #761 guard only blocks system-caller prefixes, not arbitrary workspace IDs. Net: the fix legitimately addresses #1673 (canvas-user with live tokens silently 401s), but the chosen mechanism removes a real bearer check on the hasLive==true path AND grants CanCommunicate bypass behind a forgeable signal. Need a tighter gate before this can land. Options to discuss: (a) keep the top-level bypass ONLY when callerID==workspaceID or callerID is the canvas-user identity that owns the same-origin session (not an arbitrary X-Workspace-ID); (b) require the same-origin AND a session/CSRF token the canvas actually sends (not just Referer/Origin); (c) keep IsSameOriginCanvas inside !hasLive and instead fix #1673 by classifying canvas-user identity workspaces so they are not treated as hasLive peers. Until then: HOLD.
agent-pm added 1 commit 2026-05-27 13:43:22 +00:00
fix(a2a): classify canvas-user by delivery_mode, not forgeable Origin (#1944)
ci-arm64-advisory / fast-checks (pull_request) Waiting to run
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 6s
CI / Python Lint & Test (pull_request) Successful in 4s
CI / Detect changes (pull_request) Successful in 9s
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 11s
E2E API Smoke Test / detect-changes (pull_request) Successful in 10s
E2E Chat / detect-changes (pull_request) Successful in 10s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 9s
Harness Replays / detect-changes (pull_request) Successful in 5s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 8s
Lint curl status-code capture / Scan workflows for curl status-capture pollution (pull_request) Successful in 6s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 5s
Lint no tenant GITEA or GITHUB token write / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 5s
lint-continue-on-error-tracking / lint-continue-on-error-tracking (pull_request) Successful in 1m16s
Lint pre-flip continue-on-error / Verify continue-on-error flips have run-log proof (pull_request) Successful in 1m20s
lint-mask-pr-atomicity / lint-mask-pr-atomicity (pull_request) Successful in 1m25s
lint-required-context-exists-in-bp / lint-required-context-exists-in-bp (pull_request) Successful in 1m18s
lint-required-workflows-docker-host-pinned / Lint docker-host pin on docker-touching workflows (pull_request) Successful in 3s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 1m7s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 6s
Lint workflow YAML (Gitea-1.22.6-hostile shapes) / Lint workflow YAML for Gitea-1.22.6-hostile shapes (pull_request) Successful in 1m15s
gate-check-v3 / gate-check (pull_request) Successful in 4s
qa-review / approved (pull_request) Failing after 5s
Ops Scripts Tests / Ops scripts (unittest) (pull_request) Successful in 1m17s
security-review / approved (pull_request) Failing after 4s
sop-checklist / review-refire (pull_request) Has been skipped
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-checklist / all-items-acked (pull_request) Successful in 4s
sop-tier-check / tier-check (pull_request) Successful in 4s
CI / Canvas (Next.js) (pull_request) Successful in 2s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 1s
E2E Chat / E2E Chat (pull_request) Successful in 9s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 15s
Harness Replays / Harness Replays (pull_request) Successful in 4s
E2E Staging External Runtime / E2E Staging External Runtime (pull_request) Successful in 5m18s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 1m27s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 2m29s
CI / Platform (Go) (pull_request) Failing after 5m15s
CI / all-required (pull_request) Failing after 9m48s
f390d1026d
Reverts the top-level IsSameOriginCanvas bypass in validateCallerToken
that allowed any push-mode peer to skip bearer-token checks with a
forged Origin/Referer header (SECURITY HOLD).

Option (c) per PM recommendation: root-fix canvas-user identity
classification.

- lookupDeliveryMode is now called BEFORE HasAnyLiveToken.
- Poll-mode workspaces are canvas-user identities; they bypass the
  hasLive+bearer gate (canvas never sends bearer tokens).
- Push-mode workspaces always go through the standard bearer-token
  validation, regardless of Origin/Referer.

Fixes #1673 without opening the bypass vulnerability.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
agent-pm added 1 commit 2026-05-27 13:58:44 +00:00
test(a2a_proxy): update poll-mode canvas-user test for delivery_mode classification
ci-arm64-advisory / fast-checks (pull_request) Waiting to run
E2E API Smoke Test / E2E API Smoke Test (pull_request) Blocked by required conditions
E2E Chat / E2E Chat (pull_request) Blocked by required conditions
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Blocked by required conditions
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Blocked by required conditions
Harness Replays / Harness Replays (pull_request) Blocked by required conditions
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 12s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 9s
CI / Python Lint & Test (pull_request) Successful in 4s
CI / Detect changes (pull_request) Successful in 10s
E2E API Smoke Test / detect-changes (pull_request) Successful in 9s
E2E Chat / detect-changes (pull_request) Successful in 8s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 14s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 11s
Harness Replays / detect-changes (pull_request) Successful in 8s
Lint curl status-code capture / Scan workflows for curl status-capture pollution (pull_request) Successful in 7s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 5s
Lint no tenant GITEA or GITHUB token write / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 3s
lint-continue-on-error-tracking / lint-continue-on-error-tracking (pull_request) Successful in 1m21s
lint-mask-pr-atomicity / lint-mask-pr-atomicity (pull_request) Successful in 1m27s
Lint pre-flip continue-on-error / Verify continue-on-error flips have run-log proof (pull_request) Successful in 1m2s
lint-required-workflows-docker-host-pinned / Lint docker-host pin on docker-touching workflows (pull_request) Successful in 6s
lint-required-context-exists-in-bp / lint-required-context-exists-in-bp (pull_request) Successful in 1m15s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 6s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 1m4s
gate-check-v3 / gate-check (pull_request) Successful in 11s
qa-review / approved (pull_request) Failing after 5s
audit-force-merge / audit (pull_request) Waiting to run
security-review / approved (pull_request) Successful in 4s
sop-checklist / all-items-acked (pull_request) Successful in 5s
sop-checklist / review-refire (pull_request) Has been skipped
sop-tier-check / tier-check (pull_request) Successful in 8s
Lint workflow YAML (Gitea-1.22.6-hostile shapes) / Lint workflow YAML for Gitea-1.22.6-hostile shapes (pull_request) Successful in 1m33s
Ops Scripts Tests / Ops scripts (unittest) (pull_request) Successful in 1m9s
E2E Staging External Runtime / E2E Staging External Runtime (pull_request) Successful in 5m27s
CI / all-required (pull_request) Failing after 40m12s
CI / Canvas (Next.js) (pull_request) Has been cancelled
CI / Shellcheck (E2E scripts) (pull_request) Has been cancelled
CI / Canvas Deploy Reminder (pull_request) Has been skipped
CI / Platform (Go) (pull_request) Has been cancelled
7c0f1bc128
TestProxyA2A_PollMode_CanvasUserWithLiveToken now mocks the caller's
delivery_mode lookup (validateCallerToken queries it before HasAnyLiveToken
per the option-c security fix). Without this mock, lookupDeliveryMode fails
open to push, the caller falls into the hasLive branch, and the test gets
403 instead of 200 queued.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
agent-pm closed this pull request 2026-05-27 14:03:20 +00:00
Owner

Superseded by #1948 (merged), which fixes #1673 safely — classifies canvas users by a CP-verified session / admin / live-org-token (non-forgeable) instead of the forgeable same-origin signal, keeping registry.CanCommunicate enforced. Closing.

Superseded by #1948 (merged), which fixes #1673 safely — classifies canvas users by a CP-verified session / admin / live-org-token (non-forgeable) instead of the forgeable same-origin signal, keeping registry.CanCommunicate enforced. Closing.
Some required checks failed
ci-arm64-advisory / fast-checks (pull_request) Waiting to run
E2E API Smoke Test / E2E API Smoke Test (pull_request) Blocked by required conditions
Required
Details
E2E Chat / E2E Chat (pull_request) Blocked by required conditions
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Blocked by required conditions
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Blocked by required conditions
Required
Details
Harness Replays / Harness Replays (pull_request) Blocked by required conditions
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 12s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 9s
CI / Python Lint & Test (pull_request) Successful in 4s
CI / Detect changes (pull_request) Successful in 10s
E2E API Smoke Test / detect-changes (pull_request) Successful in 9s
E2E Chat / detect-changes (pull_request) Successful in 8s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 14s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 11s
Harness Replays / detect-changes (pull_request) Successful in 8s
Lint curl status-code capture / Scan workflows for curl status-capture pollution (pull_request) Successful in 7s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 5s
Lint no tenant GITEA or GITHUB token write / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 3s
lint-continue-on-error-tracking / lint-continue-on-error-tracking (pull_request) Successful in 1m21s
lint-mask-pr-atomicity / lint-mask-pr-atomicity (pull_request) Successful in 1m27s
Lint pre-flip continue-on-error / Verify continue-on-error flips have run-log proof (pull_request) Successful in 1m2s
lint-required-workflows-docker-host-pinned / Lint docker-host pin on docker-touching workflows (pull_request) Successful in 6s
lint-required-context-exists-in-bp / lint-required-context-exists-in-bp (pull_request) Successful in 1m15s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 6s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 1m4s
gate-check-v3 / gate-check (pull_request) Successful in 11s
qa-review / approved (pull_request) Failing after 5s
audit-force-merge / audit (pull_request) Waiting to run
security-review / approved (pull_request) Successful in 4s
sop-checklist / all-items-acked (pull_request) Successful in 5s
sop-checklist / review-refire (pull_request) Has been skipped
sop-tier-check / tier-check (pull_request) Successful in 8s
Lint workflow YAML (Gitea-1.22.6-hostile shapes) / Lint workflow YAML for Gitea-1.22.6-hostile shapes (pull_request) Successful in 1m33s
Ops Scripts Tests / Ops scripts (unittest) (pull_request) Successful in 1m9s
E2E Staging External Runtime / E2E Staging External Runtime (pull_request) Successful in 5m27s
CI / all-required (pull_request) Failing after 40m12s
Required
Details
CI / Canvas (Next.js) (pull_request) Has been cancelled
CI / Shellcheck (E2E scripts) (pull_request) Has been cancelled
CI / Canvas Deploy Reminder (pull_request) Has been skipped
CI / Platform (Go) (pull_request) Has been cancelled

Pull request closed

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

No dependencies set.

Reference: molecule-ai/molecule-core#1944