simplify-dedup-2

12 task(s) across 7 wave(s).

Generated: 2026-07-17T01:24:57.297Z

Wave 0#1#2#10Wave 1#3#5Wave 2#4#6Wave 3#7#11Wave 4#9Wave 5#8Wave 6#12

Wave 0

#StatusTaskFilesVerifyCodexSpec refs
1pendingRewire all consumers of the retired guard modules to call the new unified lib/reentry-guard.mjs API. Update bin/masterplan.mjs (adversary-review-status subcommand ~line 2528 calls selectCodexReviewForHead; record-gate-review subcommand ~line 2563 uses gateEventTypes + validateGateReceipt) and lib/finish-step.mjs (imports at lines ~56-57, usage at ~466/~564/~659-667) to import from reentry-guard.mjs. Retire lib/gate-review.mjs and lib/review-companion.mjs. Delete test/gate-review.test.mjs and test/review-companion.test.mjs — their behavioral coverage is already preserved in reentry-guard.test.mjs. The full masterplan test suite must pass with zero unexpected failures and zero test-count drop beyond these two intentional removals. PLAN-GATE FOLD R4+R5 (2026-07-16, supersedes the R3 floor placement): V2 TEST-COUNT FLOOR ON THE SURVIVOR — test/gate-review.test.mjs and test/review-companion.test.mjs are DELETED by this task (their behavioral coverage lives in test/reentry-guard.test.mjs), so the floor applies to the survivor: node --test test/reentry-guard.test.mjs must report at least 31 executed tests — the exact count the branch base executes today (verified: `# tests 31` / `# pass 31` at 20f5fa7); the two intentional removals are whole-file deletions, so they justify no reduction within the survivor. A drop below floor fails verify — silent coverage deletion is not a pass. POST-GATE AMENDMENT A1 (2026-07-16, wave-0 execution): lib/reentry-guard.mjs added to files[] — this task's text requires bin/masterplan.mjs to import validateGateReceipt from reentry-guard.mjs, and the unified module carries no receipt validator, so the retirement RELOCATES validateGateReceipt verbatim into lib/reentry-guard.mjs (G5: one guard module home). files[] originally omitted the destination file.bin/masterplan.mjs
lib/finish-step.mjs
lib/gate-review.mjs
lib/review-companion.mjs
test/gate-review.test.mjs
test/review-companion.test.mjs
lib/reentry-guard.mjs
bash -c 'node --test test/reentry-guard.test.mjs && node --test test/*.test.mjs'
bash -c 'N=$(node --test test/reentry-guard.test.mjs 2>&1 | sed -n "s/^# tests \([0-9]*\)$/\1/p" | head -1); [ "${N:-0}" -ge 31 ]'
no
2pendingDesign and implement per-task adversary review in the fabric dispatch-wave path. Insert a review step around the buildWorkItem/translateBrokerResult steps in dispatchWaveViaFabric that covers each task's FULL working diff (not filtered to declared scope), writes the verdict into the task digest, and surfaces blocking verdicts via the wave-completion protocol (blocking_reviews[]). Gate the review step on state.review.adversary exactly as L2 does today. Add a review field to the work-item descriptor in adsp-adapter.mjs. Consume the unified keyed re-entry guard API from the review-hygiene subsystem for review idempotency. PLAN-REVIEW FIX (2026-07-15): REQUIRED NEGATIVE TESTS (V1 adequacy): (a) out-of-scope coverage — a task whose working diff touches a file OUTSIDE its declared scope still has its FULL diff (including the undeclared file) in the review payload; (b) disable path — with state.review.adversary=false the review step is skipped entirely (no review fields in digests, no re-entry guard writes); (c) D6 independence — a task whose review verdict is approve but whose diff includes out-of-scope writes is STILL reverted by the D6 verify-scope check (review approval must not bypass scope enforcement). PLAN-REVIEW FIX R3 (2026-07-15): (F8) The run+task+sha vocabulary consumed here must match the reentry-guard-module task's CHECKED-IN inventory evidence (the legacy-named dual-read test or its empty-proof) — not a shape invented independently.lib/dispatch-wave.mjs
lib/dispatch/adsp-adapter.mjs
lib/wave-commit.mjs
test/dispatch-wave.test.mjs
test/adsp-adapter.test.mjs
bash -c 'node --test test/dispatch-wave.test.mjs'
node --test test/wave-commit.test.mjs
node --test test/adsp-adapter.test.mjs
no
10pendingDesign and implement the skynet dependency inversion for the five masterplan wrapper agents (mp-planner, mp-subsystem-planner, mp-spec-decomposer, mp-plan-reviewer, mp-goal-assessor). Choose ONE dispatch mechanism for all five — the serve-mcp path (mcp__agent-dispatch__dispatch_task for planning wrappers, mcp__agent-dispatch__dispatch_review for review wrappers) — and rewire each agent's frontmatter tools declaration and invocation prose to route judgment through agent-dispatch dispatch lanes with class/model_group resolved by policy instead of declaring mcp__skynet__* tools. Rewrite the invocation sections: planning wrappers (planner, subsystem-planner, spec-decomposer) call dispatch_task with task class `planned-execution`; review wrappers (plan-reviewer, goal-assessor) call dispatch_review with class `critic`. (`dispatch-planned-execution` / `dispatch-critic` are the model_group ALIASES those classes resolve to — they belong in overlay/compiled-frontmatter data, never as the class argument; test/agents.test.mjs gains an assertion that every class token in the five agents' invocation prose is a real, resolvable policy class ID.) Preserve fail-closed semantics: if the agent-dispatch lane is unavailable, the wrapper must surface loudly, never silently fall back to native synthesis. Update test/agents.test.mjs frontmatter tools regex to allow hyphens in serve-mcp tool IDs (mcp__agent-dispatch__dispatch_task contains a hyphen that fails the current pattern). NOTE: the live agents/ surface cannot grep fully clean until fabric-dispatch deletes mp-implementer.md (which still declares mcp__skynet__skynet_edit_*); this task's verify asserts only the five rewired files are clean, NOT a full live-surface scan — that is deferred to rollout-verify V3 after fabric-dispatch completes. PLAN-REVIEW FIX (2026-07-15): Additionally add compiled_frontmatter entries for all five wrapper agents to /srv/dev/ai/agent-dispatch/policy/overlays/masterplan.jsonc carrying their model_group tokens (dispatch-planned-execution for the three planning wrappers, dispatch-critic for the two review wrappers), so the tokens referenced in the rewired invocation prose exist as compiled/lintable data (G6) — the engine-side compile/lint extension is review-hygiene.model-group-compile-lint, which depends on this task; the live-agent frontmatter compile lands via `agent-dispatch sync` at rollout step 4. This adds a same-file overlay edit; the merge serializes it against other overlay-touching tasks on file-collision. PLAN-REVIEW FIX R3 (2026-07-15): (F12) FAIL-CLOSED CONTRACT ASSERTION: test/agents.test.mjs gains a named test (name containing 'fail-closed' or 'lane unavailable') asserting each of the five rewired wrappers DOCUMENTS lane-unavailable behavior: the file matches a fail-closed marker (fail-closed / surface loudly) AND contains no native-fallback language (fall back to native / synthesize natively). The verify commands below anchor both the per-file markers and the named test. WAVE1-REOPEN (2026-07-15): Attempt-1 was recorded done, then REOPENED by USER DECISION (AUQ 2026-07-15) on its own adversary review's ERROR finding — the delivered mechanism cannot carry two of the five wrappers' output contracts, so the task's central claim is false against the engine. EVIDENCE (first-party, read from engine source; the cross-vendor lane itself timed out twice on a 47KB payload — see the review-auto-chunk task, which fixes that transport defect): dispatch_review returns a FIXED record (references/review-findings.schema.json:60) — final_verdict enum [approve, rework, reject, error] plus findings[].severity enum [info, minor, major, blocking]. It has NO per-goal channel. mp-goal-assessor's contract demands a PER-GOAL verdict {achieved|partial|missed} with per-goal evidence and citations; mp-plan-reviewer's demands PASS/REVISE/FAIL. Neither survives that record, and mp-goal-assessor's mechanical downgrade rule (achieved->partial) keys on a per-goal verdict that never arrives, so its 'hard floor' silently never fires. The invocation prose asserting 'the critic returns the per-goal verdicts' must not ship while false. REQUIRED: pick a mechanism per wrapper that actually carries its declared output contract — e.g. route the two REVIEW wrappers through dispatch_task (free-form structured return) rather than dispatch_review, or extend the review record with a typed per-goal channel — and make the invocation prose true against whatever is chosen. The three PLANNING wrappers (planner, subsystem-planner, spec-decomposer) already use dispatch_task and are NOT implicated; their attempt-1 work stands. Keep fail-closed semantics and the G6 overlay/compiled_frontmatter model_group tokens as delivered. ADD A VERIFY that asserts the chosen mechanism's return shape can express each wrapper's declared verdict vocabulary, so prose and engine cannot silently diverge again. Attempt-1 edits are UNCOMMITTED in /srv/dev/ras/masterplan (no feature branch exists yet — see the multi-repo landing investigation); a full snapshot is preserved at scratchpad/mp-repo-snapshot. Verify in place, correct the two review wrappers, re-run the verify chain. --- RUN B SCOPE (masterplan half only) --- This is the MASTERPLAN-REPO HALF of a both-repo task, split per split-spec.md v2 §5. Implement ONLY the /srv/dev/ras/masterplan changes in this task's files[]. IGNORE any instruction above that edits agent-dispatch files (policy/overlays/masterplan.jsonc, test/effective-policy.test.mjs) or runs agent-dispatch verifies — that is the AD half, a SEPARATE Run A task, reconciled by the cross-repo consistency gate at Run A preflight. Cross-repo class/overlay tokens this code references (e.g. 'masterplan-implementation') are provided by that AD half; do not add them here. PLAN-GATE FOLD R2 (2026-07-16): MECHANISM DECISION — the opening instruction 'review wrappers (plan-reviewer, goal-assessor) call dispatch_review with class critic' is SUPERSEDED by the WAVE1-REOPEN evidence above: ALL FIVE wrappers route through mcp__agent-dispatch__dispatch_task (planning wrappers: class planned-execution; review wrappers: class critic), whose free-form structured return carries each wrapper's declared verdict vocabulary (PASS/REVISE/FAIL; per-goal achieved|partial|missed). dispatch_review is NOT used by any wrapper. The reopen's REQUIRED return-shape verify stands unchanged. PLAN-GATE FOLD R3+R4 (2026-07-16): (a) MECHANISM ANCHORS — verify now directly asserts the R2 mechanism decision: no dispatch_review reference in the two review wrappers, dispatch_task present in all five, and test/agents.test.mjs carries a named return-shape test (name matching return-shape / verdict-vocabulary). (b) CONTRACT WITHOUT CROSS-REPO REACH (R4-extended) — both the 'every class token is a real, resolvable policy class ID' assertion AND the return-shape test validate against ONE checked-in frozen fixture, test/fixtures/adsp-contract.json (in files[]), carrying the valid class IDs and the dispatch_task response-shape contract — never an absolute sibling-repo path, and never hard-coded 'free-form' assumptions that an engine schema change would silently invalidate. The fixture's agreement with live agent-dispatch policy/engine is owned by Run A's cross-repo consistency gate (split-spec §5). POST-GATE AMENDMENT A2 (2026-07-16, wave-0 execution): test/register-pi-agents.test.mjs added to files[] — it carries a checked-in MIRROR of the agents.test.mjs frontmatter tools regex (its failure message says 'no longer matches the (widened) agents.test.mjs regex'), so the mandated hyphen widening applies to both copies; files[] originally carried only the agents.test.mjs copy.agents/mp-planner.md
agents/mp-subsystem-planner.md
agents/mp-spec-decomposer.md
agents/mp-plan-reviewer.md
agents/mp-goal-assessor.md
test/agents.test.mjs
test/fixtures/adsp-contract.json
test/register-pi-agents.test.mjs
bash -c '! grep -q "mcp__skynet__" agents/mp-planner.md agents/mp-subsystem-planner.md agents/mp-spec-decomposer.md agents/mp-plan-reviewer.md agents/mp-goal-assessor.md'
node --test test/agents.test.mjs
bash -c 'for f in agents/mp-planner.md agents/mp-subsystem-planner.md agents/mp-spec-decomposer.md agents/mp-plan-reviewer.md agents/mp-goal-assessor.md; do grep -qiE "fail[- ]closed|surface.*loudly" "$f" || exit 1; done'
bash -c 'grep -Eiq "(test|it)\(.*(fail.?closed|lane.unavailable)" test/agents.test.mjs'
bash -c '! grep -q "dispatch_review" agents/mp-plan-reviewer.md agents/mp-goal-assessor.md'
bash -c 'for f in agents/mp-planner.md agents/mp-subsystem-planner.md agents/mp-spec-decomposer.md agents/mp-plan-reviewer.md agents/mp-goal-assessor.md; do grep -q "dispatch_task" "$f" || exit 1; done'
bash -c 'grep -Eiq "(test|it)\(.*(return.?shape|verdict.vocabular)" test/agents.test.mjs'
no

Wave 1

#StatusTaskFilesVerifyCodexSpec refs
3pendingReplace the hardcoded FABRIC_DEFAULT_CLASS='bounded-edit' in lib/wave.mjs with 'masterplan-implementation' so the implementer lane/model is governed by policy/overlays/masterplan.jsonc. Decide whether the masterplan-implementation class chain needs an effort/lane adjustment to resolve the qwen-vs-glm divergence in policy where it belongs. Drop the mp-implementer compiled_frontmatter entry from the overlay since the agent retires. Update the tests that pin the 'bounded-edit' default (wave, dispatch-wave, adsp-adapter, adsp-idempotency) and effective-policy tests accordingly. --- RUN B SCOPE (masterplan half only) --- This is the MASTERPLAN-REPO HALF of a both-repo task, split per split-spec.md v2 §5. Implement ONLY the /srv/dev/ras/masterplan changes in this task's files[]. IGNORE any instruction above that edits agent-dispatch files (policy/overlays/masterplan.jsonc, test/effective-policy.test.mjs) or runs agent-dispatch verifies — that is the AD half, a SEPARATE Run A task, reconciled by the cross-repo consistency gate at Run A preflight. Cross-repo class/overlay tokens this code references (e.g. 'masterplan-implementation') are provided by that AD half; do not add them here.lib/wave.mjs
test/wave.test.mjs
test/dispatch-wave.test.mjs
test/adsp-adapter.test.mjs
test/adsp-idempotency.test.mjs
bash -c 'node --test test/wave.test.mjs test/dispatch-wave.test.mjs test/adsp-adapter.test.mjs test/adsp-idempotency.test.mjs'no
5pendingMove the parallel planning fan-out from the L2 Workflow tool (plan.workflow.js) to the broker. Replace the launch_workflow(plan) arm in lib/continue.mjs with a dispatch_fanout call that sends subsystem-planner work items through a READ-ONLY capability class with explicitly enumerated accessible roots (repo + spec path), OS/broker-level write denial where supported, and pre/post git status --porcelain assertions over those roots as defense in depth. Fragments come back as structured payloads and the shell stages .plan-fragments.json exactly as today; the merge/validate/review gate sequence is unchanged. Update the planning verb in bin/masterplan.mjs and add a dispatch_fanout planning op shape to lib/dispatch/ops.mjs. PLAN-REVIEW FIX (2026-07-15): REQUIRED NEGATIVE TESTS (read-only enforcement is proven, not asserted): (a) a planner work item that attempts a write inside the enumerated roots is denied at the broker capability level where supported, and (b) the pre/post `git status --porcelain` defense-in-depth assertion trips loudly when a fixture dirties an enumerated root mid-fanout — the wave surfaces the breach instead of staging fragments. PLAN-GATE FOLD R6 (2026-07-16, round-5b seg2): BIN COVERAGE — this task edits bin/masterplan.mjs (the planning verb) and its verify must exercise the bin, not only lib suites: test/bin-masterplan.test.mjs (in files[]) gains an assertion, via its existing execFileSync CLI-spawn convention, that the planning verb emits the dispatch_fanout planning op shape and retains no launch_workflow(plan) arm; that suite runs in this task's verify.lib/continue.mjs
bin/masterplan.mjs
lib/dispatch/ops.mjs
test/continue.test.mjs
test/bin-masterplan.test.mjs
bash -c 'node --test test/continue.test.mjs'
node --test test/dispatch.test.mjs
bash -c 'node --test test/bin-masterplan.test.mjs'
no

Wave 2

#StatusTaskFilesVerifyCodexSpec refs
4pendingEstablish the qctl dormant seam reachable from the fabric path. Add a work-item `backend` discriminator to the adsp-adapter descriptor so resolveTaskBackend/qctlEligible can be exercised from the fabric dispatch path (not from the deleted L2 routing brain). Wire the fabric branch in lib/wave.mjs to call resolveTaskBackend when the discriminator is present. Create an EXECUTABLE test that enters through the fabric path and exercises qctl eligibility with a flag-on fixture, plus a negative test proving the shipped flag-off default never selects qctl. Document the seam in docs/design/qctl-multi-repo-apply.md. PLAN-GATE FOLD R7 (2026-07-16, round-6 seg2): REGRESSION SUITES AT TASK TIME — this task edits lib/dispatch/adsp-adapter.mjs (backend discriminator) and lib/dispatch/backend.mjs, so their existing suites run in THIS task's verify: test/adsp-adapter.test.mjs, and test/dispatch.test.mjs (the dispatch facade suite — it imports resolveTaskBackend and covers backend/ops shapes). The new qctl seam test covers only the added path and cannot protect existing adapter behavior.lib/dispatch/adsp-adapter.mjs
lib/dispatch/backend.mjs
lib/wave.mjs
docs/design/qctl-multi-repo-apply.md
test/qctl-fabric-seam.test.mjs
bash -c 'node --test test/qctl-fabric-seam.test.mjs'
node --test test/wave.test.mjs
bash -c 'node --test test/adsp-adapter.test.mjs'
bash -c 'node --test test/dispatch.test.mjs'
no
6pendingAdd legacy active_run marker reconciliation to mp continue. Design a reconcile path that auto-converts stale legacy markers (launch_workflow execute/plan kinds, phase:'launching' markers, probe/reap-expected markers) to the equivalent fabric op where the wave is re-derivable, else surfaces an explicit ask with recovery guidance — never a crash, never silent. Create sanitized legacy-state fixtures in the test suite shaped like the live fanout-durability and pi-intercom-usage bundles' marker shapes, and test reconciliation against them in CI.lib/continue.mjs
lib/resume.mjs
test/continue.test.mjs
test/resume.test.mjs
test/fixtures/legacy-markers/active-run-plan.json
test/fixtures/legacy-markers/active-run-execute-launching.json
test/fixtures/legacy-markers/active-run-fanout-durability.json
test/fixtures/legacy-markers/active-run-pi-intercom.json
bash -c 'node --test test/continue.test.mjs'
node --test test/resume.test.mjs
no

Wave 3

#StatusTaskFilesVerifyCodexSpec refs
7pendingCreate the V1 dogfood proof: an integration test that executes a scratch bundle through one fabric wave and asserts per-task adversary review records appear in task digests (reviewer/verdict/finding count fields), plus exercises a blocking verdict path through dispatch-wave and asserts the wave surfaces it via blocking_reviews[]. This is the gate for L2 deletion — the deletion task depends on this passing.test/fabric-dogfood-v1.test.mjsbash -c 'node --test test/fabric-dogfood-v1.test.mjs'
node --test test/dispatch-wave.test.mjs
no
11pendingDurable fix for the fabric edit-verify transport seam, discovered live 2026-07-15 when wave 0's first fabric contact blocked 13/13 tasks on the gateway verify allowlist (events.jsonl dispatch_degraded entries; plan.md Amendments 2026-07-15). Three evidenced defects: (D1) the adapter forwards verify_commands as bare strings, but the gateway (skynet-mcp.py _parse_verify / its JS port packages/core/gateway-edit.mjs) shlex-parses verify[0] with NO shell — cd-&& first commands ENOENT and $(...) first commands FALSE-FAIL and roll back good edits; (D2) only verify_commands[0] runs anywhere on the fabric path — elements 1+ are unenforced at task time (lib/wave-commit.mjs checks only D6 scope; the mcp.mjs normalizeVerifyForGateway comment explicitly assigns the full list to 'the orchestrator', which today is nobody); (D3) the gateway's default allowlist (py_compile/pytest/node --check) and 60s verify timeout are undocumented operational requirements — this run had to hand-wrap 39 plan tasks in bash -c and inject SKYNET_VERIFY_ALLOWLIST='bash -c' into the dispatch env. FIX entirely in masterplan lib (the orchestrator side of the seam; agent-dispatch packages/core/mcp.mjs is OUT of this task's scope — C1): (a) prepareDispatch in lib/dispatch/adsp-adapter.mjs auto-packages the gateway verify: verify_commands[0] is wrapped bash -c with byte-preserving POSIX single-quote escaping (idempotent — skip when already prefixed 'bash -c '), and sent in the OBJECT form {command, cwd:<the task's worktree/repo>, timeout} with timeout from config (state.dispatch.verify_timeout_s, default 300) — normalizeVerifyForGateway already honors the object form, so no agent-dispatch change is needed; (b) the wave runner (lib/dispatch-wave.mjs record path) executes each task's FULL verify_commands list locally under a real shell (bash -c per command, cwd=worktree, per-command timeout, output captured) AFTER the broker digest returns and BEFORE record-result — any failing command marks the task failed (fail-closed) with per-command {command, passed, output} evidence in digest.verify[], the shape wave-commit already validates; a task the broker reported done but whose local verify fails records FAILED, never done; (c) dispatch-wave sets SKYNET_VERIFY_ALLOWLIST='bash -c' in the serve-mcp child env it spawns (it owns that spawn) unless the caller already set the var, and surfaces the effective value in its dispatch record once per wave; (d) tests in test/verify-transport.test.mjs: wrapper idempotency + quoting round-trip (fixtures with embedded single quotes, double quotes, and $()), object-form verify emission (command/cwd/timeout), full-list local runner pass/fail/timeout paths (timeout via a sleep fixture), fail-closed record on local-verify failure, allowlist env injection incl. caller-override precedence, and a regression fixture reproducing the exact wave-0 rejection (a 'cd X && node --test ...' first command) proving it now packages cleanly. V2 LEDGER: adds tests only (floors are lower bounds). NOTE: this run's remaining waves still execute the 9.5.0 plugin cache, so the orchestrator-side full-verify duty stays with L1 until this ships via the existing release ladder (rollout-verify.plugin-release-install). PLAN-GATE FOLD R2 (2026-07-16): ALLOWLIST-OVERRIDE INTERPLAY — (c) preserves a caller-set SKYNET_VERIFY_ALLOWLIST, but (a) wraps verify[0] in bash -c unconditionally; a caller allowlist lacking 'bash -c' (e.g. 'node --check') would then reject every wrapped verify. prepareDispatch must detect this at PREPARE time and fail loudly with a clear configuration error naming the missing 'bash -c' entry (never dispatch a wave whose wrapped verifies the gateway is guaranteed to reject). test/verify-transport.test.mjs adds a caller-override-without-bash-c case asserting the loud prepare-time failure. PLAN-GATE FOLD R6 (2026-07-16, round-5b seg2+seg5): (i) REGRESSION SUITES AT TASK TIME — this task edits lib/dispatch/adsp-adapter.mjs and lib/dispatch-wave.mjs, so their existing suites (test/adsp-adapter.test.mjs, test/dispatch-wave.test.mjs) run in THIS task's verify against this task's tree (task 7 running one of them in the same wave exercises the pre-task-11 tree and does not count). (ii) RECORD-EVIDENCE TEST — requirement (c)'s 'surfaces the effective value in its dispatch record once per wave' is proven, not asserted: test/verify-transport.test.mjs gains a named test (name containing 'allowlist' and 'record') inspecting emitted dispatch records and asserting the effective SKYNET_VERIFY_ALLOWLIST value appears exactly once per wave in BOTH the default-injection and caller-override cases.lib/dispatch/adsp-adapter.mjs
lib/dispatch-wave.mjs
test/verify-transport.test.mjs
bash -c 'node --test test/verify-transport.test.mjs'
bash -c 'grep -q SKYNET_VERIFY_ALLOWLIST lib/dispatch-wave.mjs && grep -q "verify_timeout_s" lib/dispatch/adsp-adapter.mjs'
bash -c 'node --test test/adsp-adapter.test.mjs'
bash -c 'node --test test/dispatch-wave.test.mjs'
bash -c 'grep -Eiq "(test|it)\(.*(allowlist.*record|record.*allowlist)" test/verify-transport.test.mjs'
heuristic

Wave 4

#StatusTaskFilesVerifyCodexSpec refs
9pendingPLAN-REVIEW FIX (2026-07-15): C4 pre-deletion smoke — prove codex-suppressed / no-Workflow hosts keep working on the fabric path BEFORE the L2 deletion wave is allowed to dispatch (spec C4: deleting L2 removes the Workflow tool dependency entirely; dispatch_foreground dies with L2, so `mp dispatch-wave --codex-suppressed` must be a complete substitute). Create test/fabric-codex-suppressed.test.mjs: drive a scratch-bundle wave through the fabric path with codex-suppressed routing inputs (the --codex-suppressed flag / prepareWave suppressed mode) and assert (a) the returned op / dispatch record is dispatch_fabric-shaped with routing_inputs recording the suppression (never a dispatch_foreground or launch_workflow op), (b) work items build via buildWorkItem with no Workflow-tool dependency, and (c) digests record and the record-result transaction completes. The L2 deletion task depends on this passing. PLAN-GATE FOLD R6 (2026-07-16, round-5b seg4): END-TO-END COMMAND PATH IS MANDATORY — C4's claim is about the released command, so the smoke test MUST invoke the real CLI entrypoint (spawn node bin/masterplan.mjs dispatch-wave --codex-suppressed --state=<scratch bundle>, per the execFileSync convention in test/bin-masterplan.test.mjs) and make assertions (a)-(c) against ITS dispatch record/output. prepareWave-suppressed-mode assertions may supplement but never substitute — a lower-level test passing while the CLI flag parsing/propagation is broken must be impossible.test/fabric-codex-suppressed.test.mjsbash -c 'node --test test/fabric-codex-suppressed.test.mjs'
bash -c 'grep -q "bin/masterplan.mjs" test/fabric-codex-suppressed.test.mjs && grep -q -- "--codex-suppressed" test/fabric-codex-suppressed.test.mjs'
no

Wave 5

#StatusTaskFilesVerifyCodexSpec refs
8pendingDelete the entire L2 surface in one coordinated sweep after V1 dogfood proof passes. Delete workflows/execute.workflow.js, workflows/plan.workflow.js, agents/mp-implementer.md, and their tests (execute-workflow.test.mjs, plan-workflow.test.mjs). Remove the launch_workflow/dispatch_foreground op branches from lib/dispatch/ops.mjs, the L2 arms from lib/continue.mjs (probe alive/reap, recover_and_redispatch, promote-active-run), recover_and_redispatch from lib/resume.mjs, reap machinery from lib/worktree.mjs, the L2-only routing brain from lib/dispatch/routing.mjs plus its facade re-exports in lib/dispatch/index.mjs, the legacy branch from lib/wave.mjs, and L2-only parts of lib/dispatch/backend.mjs (keeping qctlEligible/resolveTaskBackend). Remove L2 verb references from bin/masterplan.mjs. Update every test file carrying L2 symbol references (op-table-parity, routing, worktree, continue, resume, dispatch, wave, wave-commit, dispatch-wave, bin-masterplan, prompt-structure). PLAN-REVIEW FIX (2026-07-15): The V5 grep script is created by fabric-dispatch.v5-tooling (a dependency); this task RUNS it against the live tree post-deletion to verify no orphaned references on live surfaces. PLAN-GATE FOLD R2 (2026-07-16): DELETION SURVIVOR — the legacy active_run marker reconciliation added by fabric-dispatch.marker-reconcile (its parser/conversion branches in lib/continue.mjs and the sanitized legacy-marker fixtures) MUST survive this sweep: it references legacy marker strings (launch_workflow, probe/reap kinds) as serialized DATA it upgrades, not as live L2 surface. Add those reconcile paths + fixtures to the scripts/v5-orphan-grep.sh exclusion list and assert post-deletion that the marker-reconcile tests still pass (test/continue.test.mjs / test/resume.test.mjs run inside this task's npm test). PLAN-GATE FOLD R3+R4 (2026-07-16): (a) scripts/v5-orphan-grep.sh and its self-test are IN this task's files[] — the survivor-clause exclusion-list additions are sanctioned by this plan-level review, satisfying the script's frozen-list covenant (Task 40). (b) R4 — DOC REWRITE ABSORBED: the former cmd-docs task's commands/masterplan.md rewrite is PART OF this task (two review rounds converged: test/op-table-parity.test.mjs reads the doc's §2 op-table region fail-loud, and the v5 orphan grep scans the doc — neither this task's npm test nor the tree-wide gate can pass while the doc still carries L2 rows). Delete code + rewrite the doc + update the parity test ATOMICALLY, then verify: full suite, doctor, the doc negative greps, and the tree-wide orphan gate, all in this one task. --- ABSORBED TASK (R4): fabric-dispatch.cmd-docs --- Rewrite commands/masterplan.md to reflect the fabric-only reality. Remove launch_workflow/probe/dispatch_foreground rows from the op-table, update the launch-half text of the continue-loop and planning sections to describe the fabric dispatch path only, document the qctl dormant seam, and ensure the released plugin's command documentation shows only the fabric path. PLAN-REVIEW FIX (2026-07-15): The negative grep now includes `probe` (word-bounded) and the workflow file names — the rewritten shell doc must not retain probe op rows or prose references to the deleted probe/reap machinery, not just the launch verbs.workflows/execute.workflow.js
workflows/plan.workflow.js
agents/mp-implementer.md
lib/dispatch/ops.mjs
lib/dispatch/index.mjs
lib/continue.mjs
lib/resume.mjs
lib/worktree.mjs
lib/dispatch/routing.mjs
lib/dispatch/backend.mjs
lib/wave.mjs
bin/masterplan.mjs
test/execute-workflow.test.mjs
test/plan-workflow.test.mjs
test/op-table-parity.test.mjs
test/routing.test.mjs
test/worktree.test.mjs
test/continue.test.mjs
test/resume.test.mjs
test/dispatch.test.mjs
test/wave.test.mjs
test/wave-commit.test.mjs
test/dispatch-wave.test.mjs
test/bin-masterplan.test.mjs
test/prompt-structure.test.mjs
scripts/v5-orphan-grep.sh
test/v5-orphan-grep.test.mjs
commands/masterplan.md
bash -c 'npm test'
node bin/doctor.mjs
bash -c 'node --test test/bin-masterplan.test.mjs'
bash -c '! rg -w '\''launch_workflow|dispatch_foreground|promote-active-run|probe|reap'\'' commands/masterplan.md'
bash -c '! rg '\''plan\.workflow|execute\.workflow'\'' commands/masterplan.md'
bash scripts/v5-orphan-grep.sh
no

Wave 6

#StatusTaskFilesVerifyCodexSpec refs
12pendingRelease version bump for the masterplan plugin (the CODE half of the former task 8 'plugin-release-install'; the merge and cache-install halves are Run B finish / orchestrator steps per split-spec.md v2 §3). Bump the plugin version ABOVE 9.5.0 in all four version-bearing files and reconcile the version-string references. VERIFY CORRECTION (split-spec §3): the original task cited masterplan doctor 'check #30 cross_manifest_version_drift', DELETED at the v8 cutover; this task instead asserts a POST-BUMP jq equality across the four version-bearing files and version>9.5.0 directly. Do NOT push, merge, or install to the plugin cache — those are finish/orchestrator actions. PLAN-GATE FOLD R2 (2026-07-16): the bumped version must be a STABLE X.Y.Z (no prerelease/build suffix — sort -V is not SemVer-aware, so 9.5.0-rc.1 could otherwise slip through), and the version-string reconciliation is verified directly: CHANGELOG.md carries an entry for the new version, and commands/masterplan.md retains no stale masterplan/9.5.0 plugin-cache path reference. PLAN-GATE FOLD R3 (2026-07-16): the stable-form regex rejects leading-zero components (09.6.0 / 9.5.00 are not valid SemVer and 9.5.00 defeats the sort -V strict-newer check)..claude-plugin/plugin.json
.claude-plugin/marketplace.json
.codex-plugin/plugin.json
README.md
CHANGELOG.md
commands/masterplan.md
bash -c 'A=$(jq -r .version .claude-plugin/plugin.json); B=$(jq -r .version .codex-plugin/plugin.json); C=$(jq -r ".plugins[0].version // .version" .claude-plugin/marketplace.json); D=$(grep -ioE "current release:[^0-9]*[0-9]+\.[0-9]+\.[0-9]+" README.md | grep -oE "[0-9]+\.[0-9]+\.[0-9]+" | head -1); [ "$A" = "$B" ] && [ "$A" = "$C" ] && [ "$A" = "$D" ] && [ "$A" != "9.5.0" ] && echo "$A" | grep -qE "^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$" && [ "$(printf "9.5.0\n%s\n" "$A" | sort -V | tail -1)" = "$A" ] && echo "all 4 version sources agree, stable form, > 9.5.0: $A"'
bash -c '! grep -l "\"version\": \"9.5.0\"" .claude-plugin/plugin.json .codex-plugin/plugin.json .claude-plugin/marketplace.json 2>/dev/null | grep -q .'
bash -c 'A=$(jq -r .version .claude-plugin/plugin.json); grep -qF "## [$A]" CHANGELOG.md && ! grep -q "masterplan/9\.5\.0" commands/masterplan.md'
node bin/doctor.mjs
npm test
heuristic

Goals