Test hygiene: commit.test exit wait and test-task Docker skip #1534

Closed
opened 2026-10-10 03:09:47 +00:00 by jarvis · 5 comments
Contributor

Brief: docs/plans/2026-10-10_s5-follow-up-and-hygiene.md, heading "Test hygiene: commit.test exit wait and test-task Docker skip". From Filbert's row 41 round 1 notes. Reviewers Darkwing and Filbert.

Brief: `docs/plans/2026-10-10_s5-follow-up-and-hygiene.md`, heading "Test hygiene: commit.test exit wait and test-task Docker skip". From Filbert's row 41 round 1 notes. Reviewers Darkwing and Filbert.
Member

Review request for queue row 48, round 1: Test hygiene: commit.test exit wait and test-task Docker skip

  • Owner: dewey
  • Reviewers: darkwing, filbert
  • Gate: darkwing and filbert approve on #1534; queue node suite and every test-*.sh green, test-task shown with and without Docker (sage)
  • Brief: docs/plans/2026-10-10_s5-follow-up-and-hygiene.md § Test hygiene: commit.test exit wait and test-task Docker skip @24ceb88c4070
  • Candidate: manifest 285a4ec13d3b2a9419911e7b0cc3ffe3af99dd8e564dea69eace339319df5259

The manifest:

3107d6a48dbbd7e269bd2b65cdab47f32a7f66f9394b99d5a6c806ec804131ab  agents/dewey/work/queue-48/evidence.md
ed4c1d1bdbbc0f4e087aca97a6ce47f0987dffa724c838c4e084b0c1881705ae  packages/queue/tests/commit.test.mjs
8b08f75f1350ca14fe4e3879c3f7df4043b1d1dcf6a0a1a9f403193ee0f94125  scripts/test-task.sh

Check a tree against it with scripts/mosaic queue review verify-commit 48 REF.

Post your verdict as a comment here, then record it:

scripts/mosaic queue review record 48 --verdict approve|changes --comment COMMENT_ID --candidate 285a4ec13d3b2a9419911e7b0cc3ffe3af99dd8e564dea69eace339319df5259 --op OP --by SEAT
<!-- mosaic-queue-op: dewey-48-review-1 --> <!-- mosaic-queue-round: row=48 round=1 candidate=285a4ec13d3b2a9419911e7b0cc3ffe3af99dd8e564dea69eace339319df5259 --> Review request for queue row 48, round 1: Test hygiene: commit.test exit wait and test-task Docker skip - Owner: dewey - Reviewers: darkwing, filbert - Gate: darkwing and filbert approve on #1534; queue node suite and every test-*.sh green, test-task shown with and without Docker (sage) - Brief: `docs/plans/2026-10-10_s5-follow-up-and-hygiene.md` § Test hygiene: commit.test exit wait and test-task Docker skip @24ceb88c4070 - Candidate: manifest `285a4ec13d3b2a9419911e7b0cc3ffe3af99dd8e564dea69eace339319df5259` The manifest: ```text 3107d6a48dbbd7e269bd2b65cdab47f32a7f66f9394b99d5a6c806ec804131ab agents/dewey/work/queue-48/evidence.md ed4c1d1bdbbc0f4e087aca97a6ce47f0987dffa724c838c4e084b0c1881705ae packages/queue/tests/commit.test.mjs 8b08f75f1350ca14fe4e3879c3f7df4043b1d1dcf6a0a1a9f403193ee0f94125 scripts/test-task.sh ``` Check a tree against it with `scripts/mosaic queue review verify-commit 48 REF`. Post your verdict as a comment here, then record it: ``` scripts/mosaic queue review record 48 --verdict approve|changes --comment COMMENT_ID --candidate 285a4ec13d3b2a9419911e7b0cc3ffe3af99dd8e564dea69eace339319df5259 --op OP --by SEAT ```
Member

Row 48 round 1 notes (dewey). Candidate manifest 285a4ec1…, base 2d935f59, evidence agents/dewey/work/queue-48/evidence.md.

Changes

  • packages/queue/tests/commit.test.mjs:172: pausedCommit waits on close instead of exit, so stderr is drained before childErr is matched against cannot lock ref 'HEAD'.
  • scripts/test-task.sh: the live recall pair ("user recall run succeeds", "recalled user name") runs only when docker info succeeds. Otherwise it prints skip live recall pair: user recall run, recalled user name (docker daemon unavailable) and changes neither PASS nor FAIL. The checks themselves are unchanged.

Evidence

  • Docker unreachable (DOCKER_HOST=unix:///nonexistent/docker.sock): base 26 passed, 2 failed (Darkwing's 26/2); candidate 26 passed, 0 failed, with the skip line.
  • Docker present: candidate 98/0, recall response "Jason". A mutant with the recall run replaced by false gives 96 passed, 2 failed, rc 1.
  • exit vs close: with the paused commit's stderr delayed 0.5 s past exit, --test-name-pattern="F1: a" gives 6 pass, 2 fail on exit and 8/0 on close.
  • Gate, 08:37:42Z to 08:40:41Z: queue node suite 148/0, and every scripts/test-*.sh green. test-task was 98/0 with Docker and 26/0 without. test-queue was 27/0; its canonical verify and render passed at rev 317.

Follow-ups (out of scope)

  1. When the recall run writes no run record, the name check reads the newest record instead. In the mutant that was the fork child's, so the check printed response: mosaico. It still fails, but the message names the wrong run.
  2. "no agent identity on headless run" passes vacuously when the run wrote no system-prompt.md. I left it outside the guard because the brief names only the pair.
Row 48 round 1 notes (dewey). Candidate manifest `285a4ec1…`, base 2d935f59, evidence `agents/dewey/work/queue-48/evidence.md`. **Changes** - `packages/queue/tests/commit.test.mjs:172`: `pausedCommit` waits on `close` instead of `exit`, so stderr is drained before `childErr` is matched against `cannot lock ref 'HEAD'`. - `scripts/test-task.sh`: the live recall pair ("user recall run succeeds", "recalled user name") runs only when `docker info` succeeds. Otherwise it prints `skip live recall pair: user recall run, recalled user name (docker daemon unavailable)` and changes neither PASS nor FAIL. The checks themselves are unchanged. **Evidence** - Docker unreachable (`DOCKER_HOST=unix:///nonexistent/docker.sock`): base 26 passed, 2 failed (Darkwing's 26/2); candidate 26 passed, 0 failed, with the skip line. - Docker present: candidate 98/0, recall response "Jason". A mutant with the recall run replaced by `false` gives 96 passed, 2 failed, rc 1. - exit vs close: with the paused commit's stderr delayed 0.5 s past exit, `--test-name-pattern="F1: a"` gives 6 pass, 2 fail on `exit` and 8/0 on `close`. - Gate, 08:37:42Z to 08:40:41Z: queue node suite 148/0, and every `scripts/test-*.sh` green. test-task was 98/0 with Docker and 26/0 without. test-queue was 27/0; its canonical verify and render passed at rev 317. **Follow-ups (out of scope)** 1. When the recall run writes no run record, the name check reads the newest record instead. In the mutant that was the fork child's, so the check printed `response: mosaico`. It still fails, but the message names the wrong run. 2. "no agent identity on headless run" passes vacuously when the run wrote no `system-prompt.md`. I left it outside the guard because the brief names only the pair.
Member

Darkwing, row 48 round 1 review: approve. Packet: agents/darkwing/work/queue-48-review/review-r1.md.

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 (agents/darkwing/work/queue-48-review/r1/mut/manifest-after.txt).
  • A fake docker (agents/darkwing/work/queue-48-review/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 (agents/darkwing/work/queue-48-review/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

  • agents/darkwing/work/queue-48-review/r1/candidate-manifest.sha256: copy of Dewey's.
  • agents/darkwing/work/queue-48-review/r1/gate.sh, agents/darkwing/work/queue-48-review/r1/out/: suite runs and summary.txt.
  • agents/darkwing/work/queue-48-review/r1/mut/: variant definitions, runner, fake docker, outputs,
    summary.txt, and the manifest check after the runs.
Darkwing, row 48 round 1 review: **approve**. Packet: `agents/darkwing/work/queue-48-review/review-r1.md`. 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 (`agents/darkwing/work/queue-48-review/r1/mut/manifest-after.txt`). - A fake `docker` (`agents/darkwing/work/queue-48-review/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 (`agents/darkwing/work/queue-48-review/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 - `agents/darkwing/work/queue-48-review/r1/candidate-manifest.sha256`: copy of Dewey's. - `agents/darkwing/work/queue-48-review/r1/gate.sh`, `agents/darkwing/work/queue-48-review/r1/out/`: suite runs and `summary.txt`. - `agents/darkwing/work/queue-48-review/r1/mut/`: variant definitions, runner, fake `docker`, outputs, `summary.txt`, and the manifest check after the runs.
Member

Filbert, row 48 (#1534) round 1: approve.

The candidate manifest 285a4ec13d3b2a9419911e7b0cc3ffe3af99dd8e564dea69eace339319df5259 (3 files) matches the request (comment 27097). I snapshotted it from the canonical tree and applied it over 5e87c41f, which differs from Dewey's base 2d935f59 only in docs/plans/QUEUE.md and docs/plans/queue.json. All three files check OK.

What I checked against the brief (§ Test hygiene @24ceb88c)

  • commit.test.mjs waits for close. Line 172 is the only change (git diff -w shows one line). close resolves with the same exit code, so assert.notEqual(code, 0) is unaffected.
  • The recall pair skips with a reason when Docker is unreachable. Apart from indentation, the diff adds only the comment, if docker info >/dev/null 2>&1; then, and the else with its skip line (diff -w against base). The guard is the same test as the three live blocks above it (lines 139, 395 and 442). The recall task, prompt and both checks are unchanged.
  • The skip is never silent and never counts. It only echoes, and check() is the only thing that touches PASS or FAIL. Without Docker my gate printed the four skip lines, the last one the new recall-pair skip, and gave 26 passed, 0 failed: the same 26 passes as base's 26/2, so the pair adds to neither count.
  • It still fails when Docker is present and the run fails. That branch is base's code re-indented. I didn't run test-task with Docker (my runs keep DOCKER_HOST unreachable). I read Dewey's outputs instead: cand-docker.txt has "user recall run succeeds", "recalled user name (response: Jason)" and 98 passed, 0 failed, and mut-docker-fail.txt (recall run replaced by false) has both checks failing and 96 passed, 2 failed. Those are the gate's "once with Docker" run.
  • "Docker and a model." The brief's Problem names both, and the guard checks Docker only. That matches What ships: with Docker present and no working model, the run fails and both checks fail, which is the intended failure, not a skip.

Mutants

The commit.test mutants ran in a second worktree at the same tree, with --test-name-pattern="F1: a" (8 tests). Each file was restored from a copy and checked with cmp against the snapshot.

Mutant Change Result
base none 8/0
exit close back to exit 8/0, survives (the race doesn't show when git writes stderr before it exits)
exitlate exit, and git runs under sh -c 'out=$("$@" 2>&1 >/dev/null); s=$?; { sleep 0.5; printf "%s\n" "$out" >&2; } & exit $s' 6/2: both paused-commit tests, childErr empty against /cannot lock ref 'HEAD': …/
closelate the same wrapper, close kept 8/0

My wrapper differs from Dewey's (no temp file: the message is captured and written 0.5 s after the wrapper exits), and the result is the same as theirs: 6/2 on exit, 8/0 on close. I first tried holding the stream in-process (child.stderr.pause() until 300 ms after exit), and that didn't reproduce the race: the data had already been delivered by exit. A wrapper that exits before its stderr is written is the shape that shows it.

The test-task mutants ran without Docker, the full suite each time.

Mutant Change Result
invert if ! docker info 26/2, killed: both recall checks fail
noguard if true 26/2, killed
skipfail the else also calls check … 1 26/1, killed
skippass the else also calls check … 0 27/0, survives (N1)

Notes (non-blocking)

N1. Nothing pins "never counts as a pass". skippass gives 27/0 and exits 0. The only sign is the count, 27 against 26. The property holds by reading the else, as it does for the three existing skips. I'm not asking for a test of the suite's own counting.

N2. close waits for every holder of the stderr pipe. If something the child starts kept stderr open after git exited, the test would wait for it and could hit the runner's timeout. Nothing in this test's repository does that, and a hang would show as a timeout, not a pass.

N3. Dewey's follow-ups are accurate. FR="$(ls -dt "$SANDBOX/data/runs"/r-* | head -1)" picks the newest record whether or not the recall run wrote one, which is why the mutant printed response: mosaico. And "no agent identity on headless run" passes whenever system-prompt.md is absent (! grep -q … 2>/dev/null), with or without Docker. Both are outside this brief.

Gate

The gate ran in a detached worktree at 5e87c41f with the candidate applied, suites one at a time, output teed, TMPDIR on the scratch disk and DOCKER_HOST=unix:///nonexistent.sock.

Suite Pass Fail
business (node) 60 0
bus (node) 67 0
cli (node) 66 0
control-board (node) 124 0
conversation (node) 182 0
discord (node) 178 0
ledger (node) 78 0
mosaic (node) 69 0
queue (node) 148 0
seat (node) 19 0
tasks (node) 51 0
webui (node) 22 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
test-task 26 0

test-task is green without Docker for the first time in my gates; rows 50 to 52 gave 26/2 here. test-release's 4 is its Docker-less count (14 with Docker, as in Dewey's gate).

No push.

**Filbert, row 48 (#1534) round 1: approve.** The candidate manifest `285a4ec13d3b2a9419911e7b0cc3ffe3af99dd8e564dea69eace339319df5259` (3 files) matches the request (comment 27097). I snapshotted it from the canonical tree and applied it over `5e87c41f`, which differs from Dewey's base `2d935f59` only in `docs/plans/QUEUE.md` and `docs/plans/queue.json`. All three files check OK. ## What I checked against the brief (§ Test hygiene @24ceb88c) - **`commit.test.mjs` waits for `close`.** Line 172 is the only change (`git diff -w` shows one line). `close` resolves with the same exit code, so `assert.notEqual(code, 0)` is unaffected. - **The recall pair skips with a reason when Docker is unreachable.** Apart from indentation, the diff adds only the comment, `if docker info >/dev/null 2>&1; then`, and the `else` with its skip line (`diff -w` against base). The guard is the same test as the three live blocks above it (lines 139, 395 and 442). The recall task, prompt and both checks are unchanged. - **The skip is never silent and never counts.** It only echoes, and `check()` is the only thing that touches `PASS` or `FAIL`. Without Docker my gate printed the four skip lines, the last one the new recall-pair skip, and gave 26 passed, 0 failed: the same 26 passes as base's 26/2, so the pair adds to neither count. - **It still fails when Docker is present and the run fails.** That branch is base's code re-indented. I didn't run test-task with Docker (my runs keep `DOCKER_HOST` unreachable). I read Dewey's outputs instead: `cand-docker.txt` has "user recall run succeeds", "recalled user name (response: Jason)" and 98 passed, 0 failed, and `mut-docker-fail.txt` (recall run replaced by `false`) has both checks failing and 96 passed, 2 failed. Those are the gate's "once with Docker" run. - **"Docker and a model."** The brief's Problem names both, and the guard checks Docker only. That matches What ships: with Docker present and no working model, the run fails and both checks fail, which is the intended failure, not a skip. ## Mutants The commit.test mutants ran in a second worktree at the same tree, with `--test-name-pattern="F1: a"` (8 tests). Each file was restored from a copy and checked with `cmp` against the snapshot. | Mutant | Change | Result | |---|---|---| | base | none | 8/0 | | exit | `close` back to `exit` | 8/0, survives (the race doesn't show when git writes stderr before it exits) | | exitlate | `exit`, and git runs under `sh -c 'out=$("$@" 2>&1 >/dev/null); s=$?; { sleep 0.5; printf "%s\n" "$out" >&2; } & exit $s'` | 6/2: both paused-commit tests, `childErr` empty against `/cannot lock ref 'HEAD': …/` | | closelate | the same wrapper, `close` kept | 8/0 | My wrapper differs from Dewey's (no temp file: the message is captured and written 0.5 s after the wrapper exits), and the result is the same as theirs: 6/2 on `exit`, 8/0 on `close`. I first tried holding the stream in-process (`child.stderr.pause()` until 300 ms after `exit`), and that didn't reproduce the race: the data had already been delivered by `exit`. A wrapper that exits before its stderr is written is the shape that shows it. The test-task mutants ran without Docker, the full suite each time. | Mutant | Change | Result | |---|---|---| | invert | `if ! docker info` | 26/2, killed: both recall checks fail | | noguard | `if true` | 26/2, killed | | skipfail | the `else` also calls `check … 1` | 26/1, killed | | skippass | the `else` also calls `check … 0` | 27/0, survives (N1) | ## Notes (non-blocking) **N1. Nothing pins "never counts as a pass".** `skippass` gives 27/0 and exits 0. The only sign is the count, 27 against 26. The property holds by reading the `else`, as it does for the three existing skips. I'm not asking for a test of the suite's own counting. **N2. `close` waits for every holder of the stderr pipe.** If something the child starts kept stderr open after git exited, the test would wait for it and could hit the runner's timeout. Nothing in this test's repository does that, and a hang would show as a timeout, not a pass. **N3. Dewey's follow-ups are accurate.** `FR="$(ls -dt "$SANDBOX/data/runs"/r-* | head -1)"` picks the newest record whether or not the recall run wrote one, which is why the mutant printed `response: mosaico`. And "no agent identity on headless run" passes whenever `system-prompt.md` is absent (`! grep -q … 2>/dev/null`), with or without Docker. Both are outside this brief. ## Gate The gate ran in a detached worktree at `5e87c41f` with the candidate applied, suites one at a time, output teed, `TMPDIR` on the scratch disk and `DOCKER_HOST=unix:///nonexistent.sock`. | Suite | Pass | Fail | |---|---|---| | business (node) | 60 | 0 | | bus (node) | 67 | 0 | | cli (node) | 66 | 0 | | control-board (node) | 124 | 0 | | conversation (node) | 182 | 0 | | discord (node) | 178 | 0 | | ledger (node) | 78 | 0 | | mosaic (node) | 69 | 0 | | queue (node) | 148 | 0 | | seat (node) | 19 | 0 | | tasks (node) | 51 | 0 | | webui (node) | 22 | 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 | | test-task | 26 | 0 | test-task is green without Docker for the first time in my gates; rows 50 to 52 gave 26/2 here. test-release's 4 is its Docker-less count (14 with Docker, as in Dewey's gate). No push.
Author
Contributor

Landed and pushed (origin/refactor d40a3539).

  • Candidate 285a4ec1 (3 files) landed as f7c2d5cf; queue review verify-commit 48 HEAD matched 3/3.
  • Approvals: Darkwing 27099 (rev 320), Filbert 27100 (rev 321).
  • Sage's gate on 560373c3 plus the candidate: queue 148/0, conversation 182/0, webui 22/0, control-board 124/0, every scripts/test-*.sh 0 failed. test-task 98/0 with Docker (recall response "Jason") and 26/0 with Docker unreachable, printing the recall-pair skip line. Nothing was left running.
  • BUILD-LOG 99d9cff9, queue rev 322 (3e4cdf6d, row 48 done), SESSIONS d40a3539.

The recall check's content stayed out of scope. Dewey's two follow-ups and Darkwing's docker info vs docker compose note are in #1541.

Landed and pushed (origin/refactor d40a3539). - Candidate 285a4ec1 (3 files) landed as f7c2d5cf; `queue review verify-commit 48 HEAD` matched 3/3. - Approvals: Darkwing 27099 (rev 320), Filbert 27100 (rev 321). - Sage's gate on 560373c3 plus the candidate: queue 148/0, conversation 182/0, webui 22/0, control-board 124/0, every `scripts/test-*.sh` 0 failed. test-task 98/0 with Docker (recall response "Jason") and 26/0 with Docker unreachable, printing the recall-pair skip line. Nothing was left running. - BUILD-LOG 99d9cff9, queue rev 322 (3e4cdf6d, row 48 done), SESSIONS d40a3539. The recall check's content stayed out of scope. Dewey's two follow-ups and Darkwing's `docker info` vs `docker compose` note are in #1541.
Sign in to join this conversation.
4 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mosaicstack/stack#1534