3d1430110c
ChatGPT Codex on PR #159: both formatter invocations end `|| rc=1`, so any failure after the rustfmt probe was reported as "misformatted" although no verdict was produced. Correct, and the narrower form of the bug this gate exists for. Measured: an unparseable source exits 1, identical to a diff; an unknown rustfmt.toml option is only a warning (exit 0). Narrowed rather than re-classified, because telling a diff from a parse error means parsing rustfmt's prose, which is the check-adjacent-to-its-subject this repo keeps getting wrong. The line the split needs is "did the gate run": exit 1 names a file and blames the tree; exit 2 names none and blames the invocation, and every exit-2 cause is checked above the loop. Two more rivals injected: deleting the `cargo fmt --version` probe, and turning `|| rc=1` into `|| return 2`. The first exposed a vacuous test -- a cargo stub that failed for every argument also breaks `cargo metadata`, so the run exited 2 on the metadata arm and the probe could be deleted with the suite green. The stub now delegates every subcommand but `fmt`, which is the shape a missing rustfmt component actually has. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FC2jVn8Au7E9JPkw6bwXXH