fix(gate): part 1 verifier findings — stop-rule wording, guard tests, unreadable round

- plan-gate: the bare gate's stale-verdict reason no longer says "run the
  next round" once the stop rule fired; it says there is no next round, as
  acceptOpen already does.
- trekplan Phase 9: "REVISE after the last round" (Fix now with
  --extra-round) is qualified "and the stop rule did not fire", pinned in
  review-loop-docs.test.mjs next to the [STP] pins.
- plan-gate-stop-rule tests: a planted stop-rule acceptance claiming an open
  security blocker stays STOP; a planted acceptance without under:
  "stop-rule" stays STOP; the "a blocker -> refused" test now asserts the
  blocker refusal; --accept-open under the stop rule covers an open MAJOR
  and the gate passes with a WARN.
- review-rounds prepare: when the stop rule is judged (P >= 2) and either
  round's JSON block cannot be read, exit 2 (not measured) with "stop rule:
  a round has no readable JSON block" instead of skipping the rule. The
  [RND] differing-archive and [CAP] fixtures now use readable archives; one
  new [STP] test covers an unreadable archive and an unreadable review.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-11-08 07:39:00 +01:00
commit 07a3c06c57
Signed by: ktg
SSH key fingerprint: SHA256:JakMjO6FTBBzN0Bhfj9saOoEjaFxlSdYuZQQpM/lF9Q
6 changed files with 153 additions and 13 deletions

View file

@ -163,6 +163,15 @@ test('[STP] Phase 9: the stop rule gives no new round and asks Known issue or Ne
'the round-3 blocker path says it never offers --extra-round after the stop rule');
});
test('[STP] Phase 9: "REVISE after the last round" (Fix now with --extra-round) is only for a round where the stop rule did not fire', () => {
const at = P9.indexOf('**REVISE after the last round**');
assert.ok(at >= 0, 'Phase 9 has the "REVISE after the last round" bullet');
const bullet = P9.slice(at, P9.indexOf('**The stop rule**', at));
assert.ok(bullet.includes('`--extra-round`'), 'the bullet offers --extra-round');
assert.ok(P9.includes('**REVISE after the last round**, and the stop rule did not fire:'),
'the bullet is qualified as the BLOCK/REVISE bullet is');
});
test('[STP] Phase 10 prints the round of max_rounds + extra_rounds', () => {
assert.ok(P10.includes('**Critic rounds:** {round} of {max_rounds + extra_rounds}'), 'Phase 10 prints round of max_rounds + extra_rounds');
assert.ok(!P10.includes('**Critic rounds:** {N} of {max}'), 'the old "{N} of {max}" is gone');