Skip to content

Commit eaedaf0

Browse files
copeusclaude
andcommitted
orchestrate(v3.0): partition FAIL #3 closed — the receipt had no producer
Round 3 found four judgment-layer defects the validator cannot see, and one of them would have deadlocked every run: - The gate receipt had a home (task-6's schema) and a consumer (task-17's postcondition) and NO PRODUCER. With no writer, every receipt is missing, the authority re-derives for every job, and integration never completes. task-9's Gate stage now emits the six fields and Record persists them. - task-17's own acceptance contradicted itself on the missing case -- 're-derive and that verdict wins' beside 'refuse until every job has a valid receipt'. MISSING now means RE-DERIVE (derived verdict authoritative); only a PRESENT receipt whose digests disagree is refused outright, because that is a forged claim rather than an absent one. - The declared waves lied: round 2 added task-16 depends_on task-4 without moving task-16 out of wave 2, ahead of its own prerequisite. Recomputed to seven waves. - Manifest AC-02 still demanded the mode-scoped default the spec had deleted, and two jobs explicitly disclaim it -- the reviewer would have been asked to rule on a deliberately unimplemented requirement. - AC-06's repo-wide sweep was contradicted by task-14, which correctly leaves the unamended invariant in CHANGELOG history. Scoped to live files. Also: task-17 drops write access to scope-check.py (invoking needs none, and task-15 consumes that matcher one wave earlier); AC-24 and AC-25 give the integration authority and the cross-vendor path feature-level criteria they lacked; task-0 names the third target its CI glob activates; the plan's partition map is refreshed for tasks 15-17. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 23c659a commit eaedaf0

2 files changed

Lines changed: 44 additions & 30 deletions

File tree

docs/superpowers/execution/2026-09-01-v3.0-triage-tests-orchestration/manifest.yaml

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ audits:
2424

2525
acceptance_criteria:
2626
- "AC-01: `compound-v-preeval.py` emits three decision values; a selftest covers all 9 matrix cells, the unknown/fail-closed case, and that **any fired override forces FULL** even when the bands read `low`/`low`."
27-
- "AC-02: `compound-v-validate-manifest.py` FAILS on a missing or malformed `triage` block and on a `taxonomy_digest` mismatch. The flag ships default-off in every mode (turning it on before the materializer emits the block would red the e2e suite inside the task that adds it), is flipped on for `--mode pre-dispatch` only once the materializer lands, and **`/v:dispatch` passes it in every mode** so no future run repeats 3.0's bootstrap exemption. A planted violation is shown to fail."
27+
- "AC-02: `compound-v-validate-manifest.py` FAILS on a missing or malformed `triage` block and on a `taxonomy_digest` mismatch. The flag ships default-off in every mode (turning it on before the materializer emits the block would red the e2e suite inside the task that adds it), **`/v:dispatch` passes it in every mode** so no future run repeats 3.0's bootstrap exemption. A planted violation is shown to fail."
2828
- "AC-03: `compound-v-fastpath-materialize.py` emits a `triage` block and its own selftest passes; the 11 historical files are allowlisted by id, never back-filled."
2929
- "AC-04: `/v:triage` exists, writes and commits a record, and `/v:orchestrate` obtains one when absent."
3030
- "AC-05: The auto-route class implements all nine predicates of A4, including floor-passed and full post-diff re-validation of predicates 2/5/6/line-budget. A test proves a change that outgrows the class is demoted and the demotion recorded. The `sensitive` set is read from the taxonomy, never hardcoded, and this repo's taxonomy lists `skills|agents|commands` markdown. A selftest proves the circuit breaker disarms auto-route once the rolling demotion rate exceeds the threshold, and that it never delays the first decision."
31-
- "AC-06: `phase-preeval.md`, `SKILL.md`, `rationalization-table.md` and `routing-policy.md` all carry the amended Iron Invariant #4; no file still asserts the unamended form."
31+
- "AC-06: `phase-preeval.md`, `SKILL.md`, `rationalization-table.md` and `routing-policy.md` all carry the amended Iron Invariant #4; no LIVE file still asserts the unamended form — the four prose files plus `preeval.py`, the record schema and `pre-eval-config.md`. CHANGELOG history and archived run artifacts under `docs/superpowers/execution/**/jobs/` are history and are NOT rewritten."
3232
- "AC-07: `triage-outcomes.jsonl` receives `predicted` and `actual` events, and SCOPED is its own cohort in `compound-v-triage-outcomes.py`."
3333
- "AC-08: `.claude/compound-v-impact-taxonomy.yaml` exists here, produced by `/v:onboard draft-taxonomy`, and a live `--score-only` probe returns a non-`unknown` band."
3434
- "AC-09: `run_test_floor` gains a producer, returns below the `changed_paths` computation, and runs impacted ∪ previously-failing ∪ newly-added. No second floor is introduced."
@@ -45,6 +45,8 @@ acceptance_criteria:
4545
- "AC-20: `hooks/lane-guard.sh` denies a `Write`/`Edit`/`Bash` write outside the acting job's `write_allowed`, resolving the job from `agent_id` with a `cwd`-to-worktree fallback, and reusing `compound-v-scope-check.py`'s matcher rather than a second glob engine. A test proves a planted out-of-lane write is denied, and a second proves a shell write via `sed -i` is caught by the `Bash` matcher."
4646
- "AC-21: The git-derived verdict is retained and still authoritative; no document claims the deny replaces it."
4747
- "AC-22: `UserPromptSubmit` invokes triage, and `PostCompact` supplies resume context using the summary it receives."
48+
- "AC-24: the D1 integration authority exists as code — every job carries exactly one gate receipt bound to baseline commit, realised commit and diff digest; a forged receipt is rejected and a missing one triggers re-derivation, both proven on planted cases."
49+
- "AC-25: the cross-vendor path survives the engine swap — a non-`claude` job's clamp admits its worker script, the lane guard does not deny that invocation, and its workflow agent runs `isolation: direct` so the worker owns its own worktree."
4850
- "AC-23: README, CHANGELOG and `AGENTS.md` state the Claude Code ≥ 2.1.219 floor and that Feature B's defaults are principle-derived, the '20,000 tests' observation being unreproduced."
4951

5052
routing_stance: balanced
@@ -57,9 +59,12 @@ max_parallel: 5
5759
# in wave 2 -- see its acceptance line about preserving the commit-before-dependent rule.
5860
# wave 0 : task-0-contract (serial)
5961
# wave 1 : task-1, task-5, task-6, task-8, task-10, task-11, task-12, task-15
60-
# wave 2 : task-2, task-3, task-7, task-16, task-17, then task-9 last
61-
# wave 3 : task-4
62-
# wave 4 : task-13-review (serial) -> task-14-release (serial)
62+
# wave 2 : task-2, task-3, task-7, task-17, then task-9 last
63+
# wave 3 : task-4 (needs task-1, task-2, task-3, task-12)
64+
# wave 4 : task-16 (needs task-4 — added in round 2, which is
65+
# what moved it out of wave 2)
66+
# wave 5 : task-13-review (serial)
67+
# wave 6 : task-14-release (serial)
6368

6469
jobs:
6570
- id: task-0-contract
@@ -88,7 +93,7 @@ jobs:
8893
- "the historical 11 manifests are allowlisted by id, never back-filled"
8994
- "test_contract and per-job test_scope validated; floor_only never empty"
9095
- "CI executes tests/ RECURSIVELY and for both extensions — a flat tests/*.sh glob misses tests/v2.9-e2e/*.py, which has never run in CI"
91-
- "the two tests the glob newly activates (test-codex-review-schema-default.sh, test-session-banner-staleness.sh) are verified green BEFORE wiring it — neither is in this lane and a red one would fail this job for reasons it cannot fix"
96+
- "the THREE targets the recursive glob newly activates (test-codex-review-schema-default.sh, test-session-banner-staleness.sh, and tests/v2.9-e2e/test_fastpath_and_escalation.py — the last is task-3 lane, concurrently modified) are verified green BEFORE wiring it — neither is in this lane and a red one would fail this job for reasons it cannot fix"
9297
- "the new step is proven to fail on a planted violation"
9398

9499
- id: task-1-preeval
@@ -323,6 +328,7 @@ jobs:
323328
- "the emitted script USES the native budget global: it guards its fan-out on budget.remaining() and stops spawning rather than running past the ceiling. We are handing execution to a runtime that HAS a spend ceiling; not taking it would be leaving the only real cost control on the table"
324329
- "the emitted script USES phase() and log() so the native progress tree and narrator line are populated — progress visibility stops being something we render from our own state after the fact"
325330
- "whatever replaces the deleted batching prose PRESERVES the commit-before-dependent rule — a prerequisite merge-back only STAGES, so a dependent worktree created at HEAD would not see it. Deleting that rule mid-run breaks the very ordering this run depends on"
331+
- "the Gate stage PRODUCES the receipt: it returns baseline_commit, realised_commit, diff_digest, verdict, raw_stdout and exit_code, and Record persists them into the job result. With no producer every receipt is missing, task-17 re-derives for every job, and integration never completes for any run"
326332
- "compound-v-emit-workflow.py carries --selftest and is found by the CI sweep over scripts/*.py"
327333
- "/v:dispatch invokes the validator WITH --require-triage in EVERY mode — this is the mechanism that stops a future run repeating 3.0 own bootstrap exemption"
328334
- "task-6 job_spec test_contract slice propagated into the dispatcher canonical field list"
@@ -462,7 +468,6 @@ jobs:
462468
timeout_sec: 5400
463469
write_allowed:
464470
- "scripts/compound-v-integration-gate.py"
465-
- "scripts/compound-v-scope-check.py"
466471
- "tests/test-integration-gate.sh"
467472
read_allowed:
468473
- "docs/superpowers/specs/**"
@@ -474,10 +479,11 @@ jobs:
474479
acceptance:
475480
- "implements spec D1: every original job must have exactly ONE gate receipt bound to its baseline commit, its realised commit and a diff digest"
476481
- "where a receipt is MISSING, null, or its digests disagree with the tree, this gate runs compound-v-scope-check.py ITSELF and that verdict wins — a workflow Gate agent returns a schema-valid verdict that proves JSON shape, never that the check ran"
477-
- "integration is REFUSED until every job has a valid receipt; a job that vanished to null is treated exactly like a failed one"
482+
- "MISSING is not INVALID: a missing or null receipt makes this gate RE-DERIVE from git, and the derived verdict is authoritative — a clean re-derivation lets integration proceed, a violation BLOCKS it. Only a PRESENT receipt whose digests disagree with the tree is refused outright, because that is a forged claim rather than an absent one"
483+
- "INVOKES scripts/compound-v-scope-check.py as a subprocess and does NOT modify it — that matcher is consumed by task-15's lane guard, which merges first, and re-derivation needs no write access to it"
478484
- "carries --selftest and is picked up by the CI sweep over scripts/*.py"
479485
- "a planted forged receipt (valid shape, wrong digest) is REJECTED — proven, not asserted"
480-
- "a planted missing receipt causes the gate to re-derive and BLOCK — proven, not asserted"
486+
- "a planted missing receipt causes RE-DERIVATION, and a BLOCK only where that re-derivation finds a real violation. Both branches proven, not asserted"
481487

482488
- id: task-13-review
483489
title: "Three-pass Review Gate over the composite"
@@ -508,7 +514,7 @@ jobs:
508514
read_allowed:
509515
- "**"
510516
acceptance:
511-
- "reports a verdict for EVERY criterion by its AC-NN id, ALL TWENTY-THREE, not a blanket 'criteria met' — the ids are copied verbatim from the spec so the two lists cannot drift"
517+
- "reports a verdict for EVERY criterion by its AC-NN id, ALL TWENTY-FIVE, not a blanket 'criteria met' — the ids are copied verbatim from the spec so the two lists cannot drift"
512518
- "no write outside any job's partitioned set"
513519
- "no fabricated metric anywhere in the diff"
514520

docs/superpowers/plans/2026-09-01-v3.0-triage-tests-orchestration.md

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -155,23 +155,31 @@ Version `3.0.0` in lockstep across plugin.json, marketplace.json and the CHANGEL
155155

156156
## Partition Map
157157

158-
| Task | Writes | Reads |
159-
|---|---|---|
160-
| 0 | `compound-v-validate-manifest.py`, `execution-manifest.md`, `manifest.example.yaml`, `validate.yml` | spec |
161-
| 1 | `compound-v-preeval.py` | spec, task 0 output |
162-
| 2 | `compound-v-triage-outcomes.py` | spec, task 1 docstring |
163-
| 3 | `compound-v-fastpath-materialize.py`, `compound-v-fastpath-run.py` | spec, task 0, task 1 |
164-
| 4 | `commands/v-triage.md`, `commands/v-orchestrate.md` | spec, tasks 0–3 |
165-
| 5 | `phase-preeval.md`, `SKILL.md`, `rationalization-table.md`, `routing-policy.md` | spec |
166-
| 6 | `job_result.schema.json`, `backend-launcher/*.md`, `compound-v-run-*-worker.sh` | spec, task 0 |
167-
| 7 | `agents/spec-reviewer.md` | spec, task 6 schema |
168-
| 8 | `hooks/epic-goal-stop.sh`, `tests/test-epic-goal-stop.sh` | spec, task 0 CI step |
169-
| 9 | `compound-v-emit-workflow.py`, `v-dispatch.md`, `parallel-dispatcher.md`, `workflows-accelerator.md` | spec, task 0 |
170-
| 10 | `adr/0003-*.md`, `adr/0004-*.md` | spec |
171-
| 11 | `v-epic.md`, `v-status.md`, `v-init.md`, `epic-mode.md` | v2.18 spec |
172-
| 12 | `.claude/compound-v-impact-taxonomy.yaml` | spec |
173-
| Z | `CHANGELOG.md`, `plugin.json`, `marketplace.json`, `README.md`, `AGENTS.md` | everything |
174-
175-
**Disjointness:** every write path appears exactly once. `compound-v-validate-manifest.py` and `validate.yml` are the only genuine shared resources and belong to Task 0 alone, which runs serially first. Tasks 2, 3 and 4 depend on Task 1's new decision constant but do not write its file — they consume it as a documented interface.
176-
177-
**Ordering:** 0 → {1, 5, 6, 8, 9, 10, 11, 12} in parallel → {2, 3, 7} (need 1 or 6) → 4 (needs 0–3) → Review Gate → Z.
158+
> **The manifest is dispatch authority.** This map is kept for readers; where it and
159+
> `docs/superpowers/execution/2026-09-01-v3.0-triage-tests-orchestration/manifest.yaml`
160+
> disagree, the manifest wins. Three jobs were added after this plan was first written
161+
> (15 lane-guard, 16 native-points, 17 integration-authority) and "Task Z" is now
162+
> `task-14-release`.
163+
164+
| Task | Writes |
165+
|---|---|
166+
| 0 | `compound-v-validate-manifest.py`, `execution-manifest.md`, `manifest.example.yaml`, `validate.yml` |
167+
| 1 | `compound-v-preeval.py`, `compound-v-postdiff-reclassify.py`, `compound-v-classify-request.py`, `compound-v-localize.py`, `schemas/pre-eval-record.schema.json` |
168+
| 2 | `compound-v-triage-outcomes.py` |
169+
| 3 | `compound-v-fastpath-materialize.py`, `compound-v-fastpath-run.py`, `tests/v2.9-e2e/**` |
170+
| 4 | `commands/v-triage.md`, `commands/v-orchestrate.md`, `docs/superpowers/pre-eval/**` |
171+
| 5 | the four Iron-Invariant prose files, `compound-v-project-config.py`, `architecture.md`, `pre-eval-config.md` |
172+
| 6 | `job_result.schema.json`, `backend-launcher/*.md`, `compound-v-run-*-worker.sh` |
173+
| 7 | `agents/spec-reviewer.md` |
174+
| 8 | `hooks/epic-goal-stop.sh`, `tests/test-epic-goal-stop.sh` |
175+
| 9 | `compound-v-emit-workflow.py`, `v-dispatch.md`, `v-resume.md`, `parallel-dispatcher.md`, `workflows-accelerator.md`, `state-machine.md`, `phase-3-parallel-opus-dispatch.md`, `phase-0-recon.md`, `TROUBLESHOOTING.md` |
176+
| 10 | `adr/0003-*.md`, `adr/0004-*.md` |
177+
| 11 | `v-epic.md`, `v-status.md`, `v-init.md`, `epic-mode.md` |
178+
| 12 | `.claude/compound-v-impact-taxonomy.yaml`, `compound-v-taxonomy.py` |
179+
| 15 | `hooks/lane-guard.sh`, `tests/test-lane-guard.sh` |
180+
| 16 | `hooks/triage-prompt-nudge.sh`, `hooks/postcompact-resume.sh`, `hooks/hooks.json` |
181+
| 17 | `compound-v-integration-gate.py`, `tests/test-integration-gate.sh` |
182+
| 13 | — (review, `write_allowed: []`) |
183+
| 14 | `CHANGELOG.md`, `plugin.json`, `marketplace.json`, `README.md`, `AGENTS.md` |
184+
185+
**Waves** (recomputed from `depends_on`, matching the manifest header): 0 → {1,5,6,8,10,11,12,15} → {2,3,7,17, then 9 last} → 4 → 16 → review → release.

0 commit comments

Comments
 (0)