Plan gate — cross-vendor adversarial review digest (intent-to-completion)
Artifacts: spec.md (rev 14) + plan.md + plan.index.json (48 tasks / 11 waves) — bytes embedded verbatim, sha256 f19811e80a746b7aa46704336dda5a07d266db202a6708439dd0dc3e8bd2147c, 264512 chars
Workflow: adversarial-review (wf_d96d8b7e-9fc), intensity standard; cross-vendor lanes: openai/gpt-5.6-sol; degraded: none
Provenance: dispatch-adversary → litellm/gpt-5.6-sol, 292 output tokens; dispatch-adversary → litellm/gpt-5.6-sol, 12232 output tokens
Verdict: revise; findings 6 (2 should-fix, 4 nit); disagreements 4; dropped 3

Summary: The plan is a faithful decomposition of spec rev 14: waves are files-disjoint, the bootstrap stage correctly stays off the task graph per A33, and every G1-G6 is covered. No blocker survives in-tree verification. Two defects need fixing before execution: (1) the normative pre-finish rule — recorded in plan.index.json meta.solution and in the durable pre_finish_stage_required event (events.jsonl:7) — says "mp finish is invoked only after bootstrap-v10.mjs status reports the pass complete", but the spec's step enum ends in `gate`, which §10.2 records inside mp finish's branch_finish handling, so the rule is literally unsatisfiable and must be split into "through surfaces_live before finish" and "gate inside branch_finish"; (2) Task 28 must emit `required_successor {slug, reason}` on intent rejection and Task 40's doctor matches on exact slug + predecessor link, yet the only rejection interface Task 3 wires (`--intent-rejected --class --reason`, plan.md:204) carries no slug and no naming rule exists, so the event cannot be authored deterministically. Reviewer 1's other two "blockers" (no task verifies the live surfaces; the successor run has no task) are spec-inherited, operator-accepted design choices (A33, A35, §10 step 3) — the first is retained as a nit, the second dropped. Reviewer 2's decomposition-risk findings are real but bounded by existing co-ownership fix paths and the files-disjoint rule, so they rank as nits.

Findings (severity-first):
 1. [should-fix] The pre-finish sequencing rule ("mp finish is invoked only after bootstrap-v10.mjs status reports the pass complete") is unsatisfiable because the fixed step enum's terminal step `gate` is recorded inside mp finish's branch_finish handling.
 2. [should-fix] Task 28 requires emitting `required_successor {slug, reason}` on intent rejection, but no CLI flag or naming rule supplies the successor slug, and Task 40's doctor matches obligations by exact slug plus predecessor link.
 3. [nit] The plan carries the spec's soft enforcement of the bootstrap stage: no task's verify command exercises the live Pi root, Claude cache, tag CI, or GitHub main, and the pinned v9.10.0 finish mechanically offers a waiver at goals_unmet.
 4. [nit] Task 29's pushed_base producer does not say whether it also runs on the check-only recovery path Task 25 implements, so a push that succeeded before a crash could be recorded 'recovered' without pushed_base.
 5. [nit] The interview CLI surface is specified only as a verb list in Task 11's integration note and Task 3, whereas the deploy flags are enumerated verbatim in both Task 23 and Task 3.
 6. [nit] Tasks 3 and 44 are single-sitting chokepoints (all CLI wiring into a 4005-line bin/masterplan.mjs; all 15 bootstrap steps' pre/postconditions in one script) verified only by smoke cases, with exhaustive coverage deferred two or more waves.
