You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#381 was a required status check that spent four months reading a path that never existed, scoring every run as 0 survivors, and reporting green. The property that made it invisible was not that it was wrong — it was that its failure mode produced the flattering reading. 0 is the best possible survivor count. Nothing about a broken run looked different from a good one.
That is not a property of mutation testing. It is a property of any gate whose "nothing happened" renders identically to "it worked". So all 18 required contexts were audited against one question:
Can this check report success without having measured the thing its name claims?
Three clean-room agents, no shared framing, each given a slice. Every verdict below was reached by executing the gate's own logic against constructed inputs — mutating each guard to a no-op and checking whether CI would notice. Where something was reasoned rather than executed, it says so.
Result
11 of 18 have a path to green without measuring. Four are live today.
#
Required context
Verdict
Mechanism
1
Bench compile smoke
✅ sound
declared [[bench]] targets make a missing file exit 101
10× cases is real; degrades silently to 100 on a bad env var. Incidentally the only job that runs doctests
14
Rivet validate (artifacts)
⚠️ narrow
passes on an empty artifact set (881 → 0 is indistinguishable); duplicate IDs, missing title, typo'd field names are all non-fatal in the pinned v0.4.3
15
Security Audit (RustSec)
✅ sound
engine mutation-proved; the rustsec/audit-check@v2 wrapper was reasoned, not executed
16
Supply Chain (cargo-vet)
✅ sound
mechanically fail-closed (exit 255 proved); 207 exemptions vs 4 audits + empty imports.lock is a policy weakness, not a gate defect
17
Test
❌ vacuous for doctests
cargo nextest has no doctest support at all; ~25 executable doctests never run under this name
18
Verification Gate
❌ vacuous on demand
skip-as-pass + author-controlled Verify-Filter: — see #358
LSP: code actions, formatting, and rename refactoring #17Test doctests — covered only because Proptest (extended) happens to run cargo test --workspace. Switching that one job to nextest would silently delete doctest coverage with nothing noticing.
Absence renders as success. Zero survivors, zero sorrys, zero artifacts, zero matched tests, an empty report — every one is the ideal reading.
A gate with no configured failure mode.multiple-versions = "warn". cargo llvm-cov with no threshold. A check that runs, costs money, and is structurally incapable of red.
The general fix
Every gate should print a positive count of what it examined, and fail when that count is implausible:
Surviving mutants: 210 (caught 603, unviable 793, timeout 2) # not "0"
0 sorrys found, 0 allowlisted, 47 files scanned # not "gate green"
4 workspaces formatted # not silence
881 artifacts validated # not "PASS"
A count cannot be produced by a broken read. That is the whole trick, and it is what tools/check_mutants_report.py now does for #381 — including a cross-check of its own number against a second, independent derivation.
The second half is the tools/check_*.py convention already in use: put the logic in a script with a --self-test decision table, run the self-test as a step before the real check, and include the historical regression as a table row. Inline workflow shell is only testable by pushing, and a log cannot distinguish "0 findings" from "0 files read".
Remaining work (split into issues as they are picked up)
cargo test <substring> in 13 of 20 verification artifacts → --exact or assert a count
Rivet validate: artifact-count floor; duplicate-ID check until the rivet pin can advance
Cargo Deny: decide whether multiple-versions should be deny (6 duplicates today) or drop the pretence
Fuzz smoke: assert the hard-coded target list equals cargo fuzz list
Codegen compile oracle / Miri: assert -- --ignored --list and -- <filter> --list are non-empty
Honest scope
This audit covers the 18 required contexts on main. It does not cover nightly workflows, release workflows, or the release-tag path — #366 and #372 came from the same species of question and are already filed. Nothing here says the code is bad; it says the evidence is thinner than the green ticks imply. Several gates (Codegen compile oracle in particular) were actively hardened against exactly this and held up under attack.
#381 was a required status check that spent four months reading a path that never existed, scoring every run as 0 survivors, and reporting green. The property that made it invisible was not that it was wrong — it was that its failure mode produced the flattering reading.
0is the best possible survivor count. Nothing about a broken run looked different from a good one.That is not a property of mutation testing. It is a property of any gate whose "nothing happened" renders identically to "it worked". So all 18 required contexts were audited against one question:
Three clean-room agents, no shared framing, each given a slice. Every verdict below was reached by executing the gate's own logic against constructed inputs — mutating each guard to a no-op and checking whether CI would notice. Where something was reasoned rather than executed, it says so.
Result
11 of 18 have a path to green without measuring. Four are live today.
[[bench]]targets make a missing file exit 101[bans] multiple-versions = "warn",wildcards = "allow"→check banscannot fail;advisoriesskipped (documented, covered by RustSec job)--workspacemisses the 3 nested workspaces — see #383cargo llvm-covwith no--fail-under-*; upload isfail_ci_if_error: false. Cannot fail for a coverage reason — it duplicatesTestassert!(status.success()), per-field distinct sentinels,if n != 1 { bail! }on the source patchcargo fuzz listlake builditself is soundspar-hir-def, the one crate with zerounsafe; the 6 crates that have it are never Miri-checked. Filter-- instance::exits 0 if renamedtitle, typo'd field names are all non-fatal in the pinned v0.4.3rustsec/audit-check@v2wrapper was reasoned, not executedimports.lockis a policy weakness, not a gate defectcargo nextesthas no doctest support at all; ~25 executable doctests never run under this nameVerify-Filter:— see #358The four that are live
Format—cargo fmt --allcovers 1 of 4 workspaces;fuzz/fuzz_targets/fuzz_codegen_roundtrip.rs:32is unformatted onmainand the check is green.sorrygate — 12 bare sorrys, all exempted by a self-service-- TODOsuffix. Prints "No sorrys — gate green."Testdoctests — covered only becauseProptest (extended)happens to runcargo test --workspace. Switching that one job to nextest would silently delete doctest coverage with nothing noticing.The recurring shapes
Four distinct mechanisms, one symptom:
--all≠ the repo (Format check is green on unformatted tracked code: cargo fmt --all covers 1 of the repo's 4 workspaces #383).--workspace≠ the repo.-p one-crate≠ Miri coverage.cargo test <substring>exits 0 on zero matches — 13 of the 20 verification artifacts rely on exactly that.|| true+set -ebeing inert inside anif(Detect changed paths fails open two ways, skipping 11 of 18 required contexts (cloned into proofs.yml) #384).grepfailing into a default. Mutation Testing gate reads a path cargo-mutants never writes — 4 months of vacuous green (210 survivors reported as 0) #381 itself.multiple-versions = "warn".cargo llvm-covwith no threshold. A check that runs, costs money, and is structurally incapable of red.The general fix
Every gate should print a positive count of what it examined, and fail when that count is implausible:
A count cannot be produced by a broken read. That is the whole trick, and it is what
tools/check_mutants_report.pynow does for #381 — including a cross-check of its own number against a second, independent derivation.The second half is the
tools/check_*.pyconvention already in use: put the logic in a script with a--self-testdecision table, run the self-test as a step before the real check, and include the historical regression as a table row. Inline workflow shell is only testable by pushing, and a log cannot distinguish "0 findings" from "0 files read".Remaining work (split into issues as they are picked up)
Format/Clippyworkspace scopesorrygate +MinPlusPwa.leanin no build target--fail-under-linesat the measured floor, or stop requiring itTest: addcargo test --workspace --docunsafe; assert a test countreturn 1whenpassed_count == 0; drop author-controlled scope (Verification Gate scope is stale: 20 of 161 feature artifacts checked, per-PR override never used #358)cargo test <substring>in 13 of 20 verification artifacts →--exactor assert a countRivet validate: artifact-count floor; duplicate-ID check until the rivet pin can advanceCargo Deny: decide whethermultiple-versionsshould bedeny(6 duplicates today) or drop the pretenceFuzz smoke: assert the hard-coded target list equalscargo fuzz listCodegen compile oracle/Miri: assert-- --ignored --listand-- <filter> --listare non-emptyHonest scope
This audit covers the 18 required contexts on
main. It does not cover nightly workflows, release workflows, or the release-tag path — #366 and #372 came from the same species of question and are already filed. Nothing here says the code is bad; it says the evidence is thinner than the green ticks imply. Several gates (Codegen compile oracle in particular) were actively hardened against exactly this and held up under attack.Refs #381, #382, #358, #366, #372.