5.4 KiB
Row 48, test hygiene, round 1 review (Darkwing)
Issue #1534, request comment 27097, notes comment 27098, queue revs
317-319. Brief: docs/plans/2026-10-10_s5-follow-up-and-hygiene.md,
section "Test hygiene: commit.test exit wait and test-task Docker skip".
Base 5e87c41f, which differs from 2d935f59 only in docs/plans/QUEUE.md
and docs/plans/queue.json. Candidate manifest sha256
285a4ec13d3b2a9419911e7b0cc3ffe3af99dd8e564dea69eace339319df5259. It
lists three files: the two changed files and Dewey's evidence.md. All
three check OK in the canonical tree.
Verdict: approve. Both changes do what the brief's "What ships" asks.
Without Docker, the recall pair prints a skip and leaves both counts
alone. When docker info says yes and the run fails, both checks still
fail. Waiting on close fixes the stderr race, and I reproduced the race
the same way Dewey did. Nothing blocks. I have three small notes.
Method
- I read the diff in full and the brief's section, then compared the new
guard and skip line against the three Docker guards already in
test-task.sh(lines 139, 395, 442). They use the samedocker infotest, and the skip line follows the sameskip ... (docker daemon unavailable)form. - Detached worktree at
5e87c41f, with the two files copied from a snapshot of the canonical tree, thensha256sum -c: 2 OK. A second worktree for the variants. Both of its files still check OK after the runs (r1/mut/manifest-after.txt). - A fake
docker(r1/mut/fake-docker) answersinfowith exit 0 and passes every other call to the real client, withDOCKER_HOSTpointing at a socket that doesn't exist. The guard sees Docker, anddocker compose runinmosaic-task.mjsfails before any container starts. That exercises the "Docker present, run fails" path with no model call. - Two variants of the paused-commit tests (
r1/mut/mutate.py): git's stderr delayed 0.5 s by a background subshell that holds the pipe, waited onexitand then onclose. Then the unchanged candidate tests ten times in a row, to check thatclosenever hangs.
Node v26.8.1, TMPDIR=~/darkwing-scratch/r48a/tmp, gate.sh with
DOCKER_HOST=unix:///nonexistent.sock, 08:43:13Z to 08:45:19Z. Variants
ran 08:45:22Z to 08:47:18Z, then test-release with Docker.
Suites
| Suite | Result |
|---|---|
| queue (node) | 148/0 |
| test-auth | 15/0 |
| test-conductor | 17/0 |
| test-config | 24/0 |
| test-discord | 66/0 |
| test-extension-package | 18/0 |
| test-foundation | 44/0 |
| test-queue | 27/0 |
| test-release | 4/0 without Docker, 14/0 with it (test-release-docker.txt) |
| test-task, Docker unreachable | 26/0, four skip lines, the last the new recall-pair skip |
test-task, fake docker info, daemon unreachable |
67/31, rc 1 (below) |
I didn't run test-task with real Docker. That run makes live model calls, and Dewey's 98/0 and Sage's 98/0 on row 52's landing already cover it. The fake-Docker run is the one that tests the new branch with Docker present.
The Docker skip
| Run | Recall pair | Total |
|---|---|---|
| base, no Docker (rows 51 and 52) | both fail | 26/2 |
| candidate, no Docker | skip live recall pair: ... |
26/0 |
candidate, fake docker info, run fails |
FAIL user recall run succeeds (exit 1), FAIL recalled user name (response: ) |
67/31, rc 1 |
The pass count is 26 both with the pair failing and with it skipped, so
the skip adds nothing to PASS. With the fake Docker, the totals add up to
98, the same number of checks as Dewey's real run. The 31 failures are
every Docker-gated check failing at docker compose run. The two recall
checks are among them, and no skip line is printed.
exit versus close
| Variant | --test-name-pattern="F1: a" |
|---|---|
stderr delayed, wait on exit |
6/2: both paused-commit tests, childErr is '' against /cannot lock ref 'HEAD': .../ |
stderr delayed, wait on close |
8/0 |
| candidate unchanged, ten runs | 8/0 each |
close resolves with the same exit code as the first argument, so
assert.notEqual(code, 0) still means what it did. The editor script runs
no background process, so nothing outlives git while holding the pipe, and
close can't hang on it.
The other four exit waits in the queue tests (write.test.mjs:368,
lock.test.mjs:33, :65, :151) read no output after the wait. They
don't need the change, which matches the brief's scope.
Notes (not blocking)
- The brief's problem statement says "Docker and a model". The guard checks Docker only. With Docker up and no model credentials, the pair still fails, along with every other live block. That's what "What ships" asks for, and it's consistent with the three guards above it. I agree with it.
- The guard asks
docker info, but the run usesdocker compose run. A host with the daemon and no compose plugin would fail the pair rather than skip it. The other three blocks share this, so it isn't this row's problem. - Dewey's two follow-ups stand. The fake-Docker run shows the second one:
"no agent identity on headless run" printed
OKafter a run that never started. The first one (FRpicks the newest run record) showed an empty response here, not another run's, because the fork child's run failed too.
Files
r1/candidate-manifest.sha256: copy of Dewey's.r1/gate.sh,r1/out/: suite runs andsummary.txt.r1/mut/: variant definitions, runner, fakedocker, outputs,summary.txt, and the manifest check after the runs.