Follow-up from #624 (second observed failure mode, task TP-2019 in the reporter's run).
Problem
A worker implemented Steps 1–4 as one changeset, got the Step-1 code review to APPROVE, then self-attributed that approval to Steps 2–6 and the task finalized (succeeded + .DONE) with Steps 2–6 never independently review-gated. The review gate is currently enforced only by worker-prompt convention — the engine does not verify per-step review coverage before accepting .DONE.
The #624 verdict-extraction fixes (robust parseReviewVerdict, fail-closed review_step tool, file-authoritative disposition) close the mis-read verdict path, but nothing prevents a worker from simply not calling review_step for a step, or reusing one step's approval for others.
Proposed direction
A completion-gate assertion at task finalization (lane-runner, where .DONE is validated): for each step requiring review under the task's Review Level, verify .reviews/ contains a review file for that step whose verdict (via parseReviewVerdict) is APPROVE. On violation: refuse finalization, log the gap to STATUS.md, and surface a review-intervention-needed (order-violation) alert so the supervisor adjudicates.
Design questions to settle before building:
References
Follow-up from #624 (second observed failure mode, task TP-2019 in the reporter's run).
Problem
A worker implemented Steps 1–4 as one changeset, got the Step-1 code review to APPROVE, then self-attributed that approval to Steps 2–6 and the task finalized (
succeeded+.DONE) with Steps 2–6 never independently review-gated. The review gate is currently enforced only by worker-prompt convention — the engine does not verify per-step review coverage before accepting.DONE.The #624 verdict-extraction fixes (robust
parseReviewVerdict, fail-closedreview_steptool, file-authoritative disposition) close the mis-read verdict path, but nothing prevents a worker from simply not callingreview_stepfor a step, or reusing one step's approval for others.Proposed direction
A completion-gate assertion at task finalization (lane-runner, where
.DONEis validated): for each step requiring review under the task's Review Level, verify.reviews/contains a review file for that step whose verdict (viaparseReviewVerdict) is APPROVE. On violation: refuse finalization, log the gap to STATUS.md, and surface areview-intervention-needed(order-violation) alert so the supervisor adjudicates.Design questions to settle before building:
maxReviewCycles(soft cap) and the bug: review-boundary path emits spurious "Reviewer unavailable" (review_failed) on every successful review (0.30.5) #624 spiral escalation.References
parseReviewVerdict(extensions/taskplane/review-analysis.ts) — the shared verdict parser the gate should reuse.isStepMarkedComplete— the existing narrow order-of-operations guard this generalizes.