Files
stack/agents/darkwing/work/queue-48-review/review-r1.md
T
2026-10-10 03:49:12 -05:00

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 same docker info test, and the skip line follows the same skip ... (docker daemon unavailable) form.
  • Detached worktree at 5e87c41f, with the two files copied from a snapshot of the canonical tree, then sha256sum -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) answers info with exit 0 and passes every other call to the real client, with DOCKER_HOST pointing at a socket that doesn't exist. The guard sees Docker, and docker compose run in mosaic-task.mjs fails 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 on exit and then on close. Then the unchanged candidate tests ten times in a row, to check that close never 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)

  1. 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.
  2. The guard asks docker info, but the run uses docker 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.
  3. Dewey's two follow-ups stand. The fake-Docker run shows the second one: "no agent identity on headless run" printed OK after a run that never started. The first one (FR picks 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 and summary.txt.
  • r1/mut/: variant definitions, runner, fake docker, outputs, summary.txt, and the manifest check after the runs.