---
name: cargo-test-tests-stops-at-first-failing-binary
description: "cargo test --tests aborts after the FIRST failing test binary — every suite alphabetically after it silently never runs; a \"clean run\" can be silence over the untested tail. BOTH cargo AND nextest fail-fast by default — nextest needs --no-fail-fast too (measured 2026-09-06)."
metadata: 
  node_type: memory
  type: project
  originSessionId: 4f0b1af3-ab68-4029-ab2c-d0287c0e0fba
  modified: 2026-08-20T00:55:22.988Z
---

`cargo test --tests` (and `--all-targets`) stops launching test binaries after the
first one that FAILS. Every test binary alphabetically after the failure **never
runs at all** — and nothing in the output says so. A sweep that red-ed on
`attach_resize_capture` (early alphabet) never reached `wanmsg`, `twohost`, or
anything later; fixing the early red and re-running "green" would still be
evidence only about the prefix.

**Rule:** any sweep whose verdict claims suite-wide coverage needs
`--no-fail-fast` — **on cargo AND on nextest**. Measured by todlando during the
#170 build (2026-08-19), reported at the W3 gate; same silence-over-the-tail
class as [[exit-code-after-a-pipe-is-the-tails]] and the filter traps in
GATE-TEST-INDEX.

**CORRECTION 2026-09-06 (todlando, releases#276 lane) — this entry used to say
`cargo nextest run` "runs everything by default". THAT IS FALSE, and the sentence
did real damage: I reached for nextest AS the fix for this hazard and it
fail-fasted anyway.** nextest defaults to `max-fail=1`. Measured: `cargo nextest
run -p spt-live -p spt-daemon` reported `1074/1239 tests run ... 1 failed` plus
`warning: 165/1239 tests were not run due to test failure`. It DOES say so — one
warning line under the summary, one more than cargo gives you, and still read
past when the eye goes to the FAIL line above it.

**The compounding face, and the reason this is a double-star correction:** among
those 165 was a test binary that DID NOT COMPILE. A brand-new int test I had just
written never built, and the run reporting "one failure" said nothing about it —
a missing binary is indistinguishable from a merely-unrun one. So a fail-fast
sweep hides not only untested code but a test that DOES NOT EXIST YET, and the
author reads a near-green summary and believes their new cell passed. The
`--no-fail-fast` re-run surfaced it as E0624 (a private method an integration
binary cannot call).

**Detector:** read the RUN COUNT, never the pass count — `1074/1239` is the
finding, `1073 passed` is the distraction. A sweep is suite-wide only when the
two totals match.

**Rider (doyle's W3 rig, same day):** `xtask gen` on an autocrlf=true checkout
leaves regenerated files porcelain-`M` on **EOL alone** — `git status` says
modified, `git diff` (content-normalized) is EMPTY. Measure regen drift by
`git diff`, never by porcelain, or a zero-drift regen reads as a drift finding.
Kin: [[include-str-does-not-normalize-crlf]].
