Skip to content

Migrate the pair runner to go test -json event verdicts - #7

Merged
joshft merged 1 commit into
masterfrom
pair-event-verdicts
Aug 17, 2026
Merged

Migrate the pair runner to go test -json event verdicts#7
joshft merged 1 commit into
masterfrom
pair-event-verdicts

Conversation

@joshft

@joshft joshft commented Aug 17, 2026

Copy link
Copy Markdown
Owner

Closes the deferred backlog item and a live defect found on the way: the pair runner's err != nil branch trusted the exit status to mint a refutation, so an infra failure outside the couldNotRun marker list recorded Ran=true/Passed=false — a false refutation that would block a merge over a broken fixture. This is the reverse of the skip-laundering class the single runner's event-stream migration fixed; the pair kept the old trust surface.

Both runners now share one verdict discipline (go test -json events, exit status deliberately unused):

  • pair passes only on an explicit pass event for each exact name — a skipped side and a single-matching pattern both exit 0 and must not confer T2;
  • a failing side refutes with that side's own output, dominating the other side's state;
  • skip / missing side / build failure / cancellation are all Ran=false.

The verbose text path (runGoTest, couldNotRun markers, testPassedIn) is deleted rather than kept as a spare: dead code in a verdict path is a trust hazard. The deleted helpers' protective tests are re-expressed at the event layer (exact-name matching, build-failure-is-not-a-refutation).

Measured live: the real corpus's pair probe produces byte-identical evidence old-vs-new; new real-module tests pin pass/pass, fail-side, skip-side, renamed-away-side, and non-compiling-package outcomes.

🤖 Generated with Claude Code

https://claude.ai/code/session_015GeUG1gboWiZSnFyzQghyp

The pair runner was the last text-output parser, and it carried a live
false-refutation path: "err != nil" trusted the exit status, so an
infra failure outside the couldNotRun marker list was recorded as
Ran=true/Passed=false — a refutation that would block a merge over a
broken fixture. The single runner's migration fixed exactly this class;
the pair kept the old trust surface.

Both runners now share one discipline: the pair passes only on an
explicit pass event for EACH name (a skipped or single-matching side
exits 0 and must not confer T2), a failing side refutes with that
side's own output (refutation dominates the other side's state), and
skip/missing/build-failure/cancellation are all Ran=false. The verbose
text path (runGoTest, couldNotRun markers, testPassedIn) is deleted —
dead code in a verdict path is a trust hazard, not a spare part.

Measured on the live pair corpus: evidence byte-identical old-vs-new.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015GeUG1gboWiZSnFyzQghyp
@joshft
joshft merged commit ea2a528 into master Aug 17, 2026
1 check passed
@joshft
joshft deleted the pair-event-verdicts branch August 17, 2026 18:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant