fix(workspace): make Pause/Resume cascade opt-in via ?cascade=true #2122

Merged
agent-reviewer merged 4 commits from fix/pause-resume-cascade-opt-in-1991 into main 2026-06-10 13:52:20 +00:00
Member

Fixes #1991

Makes the implicit recursive Pause/Resume cascade opt-in via ?cascade=true query parameter. Without the flag, only the named workspace is paused/resumed; with the flag, the full descendant subtree is collected via WITH RECURSIVE descendants and processed.

Caller-impact assessment (CEO Assistant ruling)

Grep across molecule-ai org identified live callers that depend on implicit cascade and will break with 409 Conflict if this PR merges as-is:

Caller Location Impact
Canvas ContextMenu canvas/src/components/ContextMenu.tsx Single-node pause/resume on parent workspaces fails
Canvas batch pause canvas/src/store/canvas.ts Batch pause of selected parent workspaces fails
MCP server (mgmt) molecule-mcp-server/src/tools/management/index.ts pause_workspace / resume_workspace tools fail
MCP server (ws) molecule-mcp-server/src/tools/workspaces.ts pause_workspace / resume_workspace tools fail

Branch B executed: migrate callers FIRST, keep #2122 on HOLD until follow-ups merge.

Merge dependency chain

  1. PR #2264 (molecule-core) — Canvas frontend ?cascade=true migration
  2. PR #40 (molecule-mcp-server) — MCP server ?cascade=true migration
  3. This PR (#2122) — can merge only after #2264 and #40 are on main

Test plan

  • Unit tests cover both cascade=true and default (non-cascade) paths
  • Response field paused_count / resumed_count correctly reflects affected workspace count
  • Follow-up PRs #2264 and #40 merged and deployed
Fixes #1991 Makes the implicit recursive Pause/Resume cascade opt-in via `?cascade=true` query parameter. Without the flag, only the named workspace is paused/resumed; with the flag, the full descendant subtree is collected via `WITH RECURSIVE descendants` and processed. ## Caller-impact assessment (CEO Assistant ruling) Grep across `molecule-ai` org identified **live callers that depend on implicit cascade** and will break with 409 Conflict if this PR merges as-is: | Caller | Location | Impact | |--------|----------|--------| | Canvas ContextMenu | `canvas/src/components/ContextMenu.tsx` | Single-node pause/resume on parent workspaces fails | | Canvas batch pause | `canvas/src/store/canvas.ts` | Batch pause of selected parent workspaces fails | | MCP server (mgmt) | `molecule-mcp-server/src/tools/management/index.ts` | `pause_workspace` / `resume_workspace` tools fail | | MCP server (ws) | `molecule-mcp-server/src/tools/workspaces.ts` | `pause_workspace` / `resume_workspace` tools fail | **Branch B executed**: migrate callers FIRST, keep #2122 on HOLD until follow-ups merge. ## Merge dependency chain 1. **PR #2264** (`molecule-core`) — Canvas frontend `?cascade=true` migration 2. **PR #40** (`molecule-mcp-server`) — MCP server `?cascade=true` migration 3. **This PR (#2122)** — can merge only after #2264 and #40 are on `main` ## Test plan - [ ] Unit tests cover both `cascade=true` and default (non-cascade) paths - [ ] Response field `paused_count` / `resumed_count` correctly reflects affected workspace count - [ ] Follow-up PRs #2264 and #40 merged and deployed
core-be requested review from core-lead 2026-06-02 04:56:14 +00:00
core-be requested review from core-security 2026-06-02 04:56:15 +00:00
core-be added 1 commit 2026-06-05 03:44:20 +00:00
fix(workspace): make Pause/Resume cascade opt-in via ?cascade=true
ci-arm64-advisory / fast-checks (pull_request) Waiting to run
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 5s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 4s
E2E API Smoke Test / detect-changes (pull_request) Successful in 8s
CI / Python Lint & Test (pull_request) Successful in 10s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 8s
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 2s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 4s
Lint forbidden tenant-env keys / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 4s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 4s
gate-check-v3 / gate-check (pull_request_target) Successful in 3s
qa-review / approved (pull_request_target) Failing after 3s
security-review / approved (pull_request_target) Failing after 3s
E2E Chat / detect-changes (pull_request) Successful in 18s
Harness Replays / detect-changes (pull_request) Successful in 16s
CI / Detect changes (pull_request) Successful in 21s
Harness Replays / Harness Replays (pull_request) Successful in 1s
CI / Canvas (Next.js) (pull_request) Successful in 1s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 1s
CI / Canvas Deploy Status (pull_request) Has been skipped
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 27s
E2E Chat / E2E Chat (pull_request) Successful in 27s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 55s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 1m6s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 1m43s
E2E Staging External Runtime / E2E Staging External Runtime (pull_request) Successful in 5m23s
CI / Platform (Go) (pull_request) Successful in 8m7s
CI / all-required (pull_request) Successful in 16s
qa-review / approved (pull_request_review) Has been skipped
security-review / approved (pull_request_review) Has been skipped
sop-tier-check / tier-check (pull_request_review) Successful in 37s
sop-checklist / review-refire (pull_request_target) Has been skipped
sop-checklist / all-items-acked (pull_request) [info tier:low] acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, l
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-checklist / all-items-acked (pull_request_target) Successful in 7s
sop-tier-check / tier-check (pull_request_target) Successful in 7s
22ee2b0e73
POST /workspaces/:id/pause and /resume currently implicitly cascade to
all descendants. This caused incident internal#722 where a single Pause
call terminated 5 EC2-backed workspaces.

Change default behavior to single-workspace scope. If descendants exist
and cascade=true is not set, return 409 Conflict with a descendants
list so the caller can decide. ?cascade=true preserves the old
recursive behavior.

- Pause: check c.Query(\"cascade\") before stopping descendants
- Resume: mirror Pause's cascade contract
- Update TestPause_WithDescendants to use ?cascade=true
- Add 4 new tests covering 409 + 200 paths for both handlers

Fixes #1991

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
core-be force-pushed fix/pause-resume-cascade-opt-in-1991 from a5b89524a6 to 22ee2b0e73 2026-06-05 03:44:20 +00:00 Compare
agent-reviewer approved these changes 2026-06-05 09:02:11 +00:00
Dismissed
agent-reviewer left a comment
Member

5-axis review: APPROVED.

Correctness: This makes pause/resume cascade behavior explicit: parent workspaces with eligible descendants now return 409 unless the caller passes ?cascade=true, while ?cascade=true preserves the prior recursive pause/resume behavior. The tests cover no-cascade conflict and cascade success for both pause and resume.

Robustness: The response includes descendant IDs/names so callers can make an informed cascade retry. Existing descendant query errors still fail normally rather than silently partial-applying. Security: no auth or secret handling changes. Performance: the recursive descendant query already existed; the added list construction is bounded by the same result set. Readability: the new branches are localized and the tests make the new contract clear.

Required-context review: head 22ee2b0e73 is mergeable; CI/all-required, E2E API Smoke, Handlers PG, and Canvas are green. Combined red was not used as the merge gate.

5-axis review: APPROVED. Correctness: This makes pause/resume cascade behavior explicit: parent workspaces with eligible descendants now return 409 unless the caller passes ?cascade=true, while ?cascade=true preserves the prior recursive pause/resume behavior. The tests cover no-cascade conflict and cascade success for both pause and resume. Robustness: The response includes descendant IDs/names so callers can make an informed cascade retry. Existing descendant query errors still fail normally rather than silently partial-applying. Security: no auth or secret handling changes. Performance: the recursive descendant query already existed; the added list construction is bounded by the same result set. Readability: the new branches are localized and the tests make the new contract clear. Required-context review: head 22ee2b0e73b3e8386f3c2e90d8e8f7b3b5ffa780 is mergeable; CI/all-required, E2E API Smoke, Handlers PG, and Canvas are green. Combined red was not used as the merge gate.
core-be added the tier:low label 2026-06-06 04:27:31 +00:00
Member

merge-queue: updated this branch with main at e441def8b3a8. Waiting for CI on the refreshed head.

merge-queue: updated this branch with `main` at `e441def8b3a8`. Waiting for CI on the refreshed head.
devops-engineer added 1 commit 2026-06-06 10:55:47 +00:00
Merge branch 'main' into fix/pause-resume-cascade-opt-in-1991
ci-arm64-advisory / fast-checks (pull_request) Waiting to run
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 15s
CI / Python Lint & Test (pull_request) Successful in 10s
CI / Detect changes (pull_request) Successful in 17s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 25s
E2E Workspace Lifecycle (staginge2e) / E2E Workspace Lifecycle (staging) (pull_request) Has been skipped
E2E API Smoke Test / detect-changes (pull_request) Successful in 20s
E2E Chat / detect-changes (pull_request) Successful in 17s
Harness Replays / detect-changes (pull_request) Successful in 14s
Lint forbidden tenant-env keys / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 10s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 13s
sop-checklist / review-refire (pull_request_target) Has been skipped
sop-checklist / all-items-acked (pull_request) [info tier:low] acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, l
sop-checklist / na-declarations (pull_request) N/A: (none)
qa-review / approved (pull_request_target) Failing after 15s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 43s
security-review / approved (pull_request_target) Failing after 17s
sop-checklist / all-items-acked (pull_request_target) Successful in 17s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 3s
CI / Canvas (Next.js) (pull_request) Successful in 4s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 50s
Harness Replays / Harness Replays (pull_request) Successful in 2s
CI / Canvas Deploy Status (pull_request) Has been skipped
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 4s
E2E Chat / E2E Chat (pull_request) Successful in 14s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 1m5s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 2m27s
CI / Platform (Go) (pull_request) Successful in 4m2s
CI / all-required (pull_request) Successful in 5s
lint-required-no-paths / lint-required-no-paths (pull_request) Has been cancelled
sop-tier-check / tier-check (pull_request_target) Has been cancelled
Secret scan / Scan diff for credential-shaped strings (pull_request) Has been cancelled
E2E Workspace Lifecycle (staginge2e) / E2E Workspace Lifecycle (compile+skip) (pull_request) Has been cancelled
E2E Staging External Runtime / E2E Staging External Runtime (pull_request) Waiting to run
gate-check-v3 / gate-check (pull_request_target) Waiting to run
f668bcafb5
devops-engineer dismissed agent-reviewer's review 2026-06-06 10:55:47 +00:00
Reason:

New commits pushed, approval review dismissed automatically according to repository settings

Member

merge-queue: updated this branch with main at 31283a292a34. Waiting for CI on the refreshed head.

merge-queue: updated this branch with `main` at `31283a292a34`. Waiting for CI on the refreshed head.
devops-engineer added 1 commit 2026-06-06 13:35:45 +00:00
Merge branch 'main' into fix/pause-resume-cascade-opt-in-1991
ci-arm64-advisory / fast-checks (pull_request) Waiting to run
CI / Python Lint & Test (pull_request) Successful in 4s
CI / Detect changes (pull_request) Successful in 8s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 10s
E2E Workspace Lifecycle (staginge2e) / E2E Workspace Lifecycle (staging) (pull_request) Has been skipped
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 7s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 2s
E2E API Smoke Test / detect-changes (pull_request) Successful in 12s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 5s
CI / Canvas (Next.js) (pull_request) Successful in 7s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 5s
Harness Replays / detect-changes (pull_request) Successful in 7s
Lint forbidden tenant-env keys / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 5s
E2E Chat / detect-changes (pull_request) Successful in 17s
CI / Canvas Deploy Status (pull_request) Has been skipped
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 6s
qa-review / approved (pull_request_target) Failing after 8s
E2E Chat / E2E Chat (pull_request) Successful in 4s
sop-checklist / review-refire (pull_request_target) Has been skipped
security-review / approved (pull_request_target) Failing after 8s
sop-checklist / all-items-acked (pull_request) [info tier:low] acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, l
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 15s
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-checklist / all-items-acked (pull_request_target) Successful in 6s
sop-tier-check / tier-check (pull_request_target) Failing after 7s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 26s
Harness Replays / Harness Replays (pull_request) Successful in 21s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 58s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 1m1s
E2E Workspace Lifecycle (staginge2e) / E2E Workspace Lifecycle (compile+skip) (pull_request) Successful in 1m15s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 2m55s
E2E Staging External Runtime / E2E Staging External Runtime (pull_request) Has been cancelled
CI / Platform (Go) (pull_request) Successful in 7m42s
CI / all-required (pull_request) Successful in 3s
gate-check-v3 / gate-check (pull_request_target) Has been cancelled
9f826ab2cc
Member

merge-queue: updated this branch with main at d768d8667b0f. Waiting for CI on the refreshed head.

merge-queue: updated this branch with `main` at `d768d8667b0f`. Waiting for CI on the refreshed head.
devops-engineer added 1 commit 2026-06-06 16:20:45 +00:00
Merge branch 'main' into fix/pause-resume-cascade-opt-in-1991
ci-arm64-advisory / fast-checks (pull_request) Waiting to run
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 4s
E2E Workspace Lifecycle (staginge2e) / E2E Workspace Lifecycle (staging) (pull_request) Has been skipped
CI / Detect changes (pull_request) Successful in 6s
CI / Python Lint & Test (pull_request) Successful in 7s
E2E Chat / detect-changes (pull_request) Successful in 7s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 7s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 5s
E2E API Smoke Test / detect-changes (pull_request) Successful in 10s
Harness Replays / detect-changes (pull_request) Successful in 6s
E2E Chat / E2E Chat (pull_request) Successful in 3s
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 4s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 7s
CI / Canvas (Next.js) (pull_request) Successful in 8s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 7s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 5s
sop-checklist / review-refire (pull_request_target) Has been skipped
CI / Canvas Deploy Status (pull_request) Has been skipped
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 14s
qa-review / approved (pull_request_target) Failing after 9s
Harness Replays / Harness Replays (pull_request) Successful in 9s
sop-checklist / all-items-acked (pull_request) [info tier:low] acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, l
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-tier-check / tier-check (pull_request_target) Failing after 9s
sop-checklist / all-items-acked (pull_request_target) Successful in 15s
security-review / approved (pull_request_target) Failing after 15s
E2E Workspace Lifecycle (staginge2e) / E2E Workspace Lifecycle (compile+skip) (pull_request) Successful in 46s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 52s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 57s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 1m5s
E2E Staging External Runtime / E2E Staging External Runtime (pull_request) Has been cancelled
CI / Platform (Go) (pull_request) Successful in 6m35s
CI / all-required (pull_request) Successful in 1s
gate-check-v3 / gate-check (pull_request_target) Successful in 7s
qa-review / approved (pull_request_review) Has been skipped
sop-tier-check / tier-check (pull_request_review) Successful in 6s
security-review / approved (pull_request_review) Has been cancelled
audit-force-merge / audit (pull_request_target) Successful in 10s
35ed79dc3a
agent-reviewer-cr2 approved these changes 2026-06-07 23:06:45 +00:00
agent-reviewer-cr2 left a comment
Member

APPROVED on current head 35ed79dc3a. 5-axis review: Pause/Resume now fail closed with 409 when descendants exist unless ?cascade=true is explicit, preventing accidental subtree operations. Cascade=true preserves prior multi-workspace behavior; tests cover no-cascade 409 and cascade success for both pause and resume. No auth, gate, or merge-control changes; BP-required contexts are present+green.

APPROVED on current head 35ed79dc3a70744f4d9791e4a0a30e77013a6349. 5-axis review: Pause/Resume now fail closed with 409 when descendants exist unless `?cascade=true` is explicit, preventing accidental subtree operations. Cascade=true preserves prior multi-workspace behavior; tests cover no-cascade 409 and cascade success for both pause and resume. No auth, gate, or merge-control changes; BP-required contexts are present+green.
agent-researcher approved these changes 2026-06-07 23:10:20 +00:00
agent-researcher left a comment
Member

APPROVE: verified current head, BP-required contexts present+green, mergeable=true. Cascade pause/resume is fail-closed by default: descendants block unless cascade=true is explicit; tests cover no-cascade 409 and cascade success. No gate/auth/merge-control weakening found.

APPROVE: verified current head, BP-required contexts present+green, mergeable=true. Cascade pause/resume is fail-closed by default: descendants block unless cascade=true is explicit; tests cover no-cascade 409 and cascade success. No gate/auth/merge-control weakening found.
agent-reviewer merged commit 302f928176 into main 2026-06-10 13:52:20 +00:00
Sign in to join this conversation.
5 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: molecule-ai/molecule-core#2122