Haiku subagent build under decision 129. Candidate manifest 9ac3a56e names packages/tasks/src/fake.mjs and packages/tasks/tests/tree.test.mjs. Gate and both named mutants ran in Sage's slot. Co-Authored-By: Claude Opus 5.5 <[email protected]>
6.0 KiB
Row 71 (#1565) build, round 1
Phase B done. Gate passed; both mutants killed. Nothing committed, queue row not moved, no Gitea or tracker writes.
Identity
- Row 71: tree read follow-up, confirm-read tests and the fake's view 404.
- Brief:
docs/plans/2026-10-11_tree-read-follow-up.md(not edited; blob499c6cdc). - Owner: researcher (queue owner; decisions 122 and 129). Reviewers: Dewey and Filbert. Sage runs the landing gate.
- Base:
ac6b56ee55278077d61f39e6ca42513725427154(base.txt). - Worktree:
.claude/worktrees/agent-a44468a48c485520e, detached at the base, candidate uncommitted.
Changes
packages/tasks/src/fake.mjs
- A missing kanban view answers 404 with code 3014, not 13001, in both
_bucketsand_board. The detail string is unchanged. - The
deleteViewcomment cites the live recordagents/sage/work/vikunja-setup/2026-10-11_tick-62.json(deletedViewProbe).
packages/tasks/tests/tree.test.mjs
- Test 18 comment says 3014 and cites the same record.
- Three steps added after the existing "404 on the list, 503 on the project read" step. Each sets the child's task list to 404, then the confirm read to one of three answers. Each expects
tracker-not-foundand a refused tick with the child kept:- confirm read 429 (Filbert N3,
r3-confirm-4xx) - confirm read 401 (Filbert N3)
- confirm read status 0, a failed call (Dewey,
r3-confirm-error-on-throw)
- confirm read 429 (Filbert N3,
build.patch covers these two paths only (64 lines, git diff --binary against the base). It applies cleanly to the base with git apply --cached --check on a temporary index.
Rulings applied
- Dewey's mutant is the status-0 form. Both mutants were defined from the brief; neither text exists in the repo. They are in
mutants.py. - Owner: built as researcher. The brief names Darkwing as owner. The brief is not edited, and the mismatch is recorded here.
- The fake keeps the existing detail string.
- A view under another project: the fake returns 3014 for both cases. That case was never read live, and the fake does not separate it.
Deviations and notes
- Rebase: the two edits were set aside as a tagged stash entry, checked out at the base, reapplied by SHA, and the entry was dropped by its ref. Other stash entries were not touched.
- Node suites run with
--test-reporter=tapso the counts parse. They are otherwise the commands Sage named. - Only
test-task.shgetsDOCKER_HOST=unix:///nonexistent.sock. The node suites get it too, as ruled. - Test 18 stops at its first failing assertion. The 401 step is not isolated by a named mutant. The 4xx mutant would also fail it, but the run stopped at the 429 step.
- The deleted-view case itself was not read live. The probe in tick-62 used a view id that no view has, as the brief notes.
- No baseline run against the pre-change tests. The claim that the two mutants survive the old tests is Filbert's and Dewey's, not reproduced here.
Gate (steps 1 and 2)
Run by gate.sh from the worktree root, chained by chain.sh. Each child ran in its own session, under run_group.py, which kills the process group on timeout. No timeouts occurred. Manifest check at gate start: both files OK.
| step | command | result | UTC start-end |
|---|---|---|---|
| node tasks | node --test packages/tasks/tests/*.test.mjs |
89 tests, 89 pass, 0 fail, rc 0 | 14:46:36-14:46:37 |
| node bus | node --test packages/bus/tests/*.test.mjs |
115 tests, 115 pass, 0 fail, rc 0 | 14:46:37-14:46:38 |
| test-auth | scripts/test-auth.sh |
selftest 15 passed, 0 failed | 14:46:38 |
| test-conductor | scripts/test-conductor.sh |
selftest 17 passed, 0 failed | 14:46:38-14:46:44 |
| test-config | scripts/test-config.sh |
selftest 24 passed, 0 failed | 14:46:44-14:46:46 |
| test-discord | scripts/test-discord.sh |
discord suite 66 passed, 0 failed | 14:46:46-14:46:53 |
| test-extension-package | scripts/test-extension-package.sh |
selftest 18 passed, 0 failed | 14:46:53-14:46:54 |
| test-foundation | scripts/test-foundation.sh |
selftest 44 passed, 0 failed | 14:46:54-14:47:32 |
| test-queue | scripts/test-queue.sh |
queue suite 27 passed, 0 failed | 14:47:32-14:47:52 |
| test-release | scripts/test-release.sh |
selftest 14 passed, 0 failed | 14:47:52-14:48:02 |
| test-task | scripts/test-task.sh (DOCKER_HOST dead) |
selftest 26 passed, 0 failed | 14:48:02-14:48:04 |
Gate PASS at 14:48:04 UTC. The script suites print their own pass lines, not TAP, so the summary holds only the exit status for them. The full logs are in out/.
Mutants (steps 3, after gate PASS)
Each mutant was applied alone to packages/tasks/src/sync.mjs, then the tasks suite ran. The file was restored from bytes held in memory and checked after each restore.
| mutant | edit to sync.mjs | result | killing test | failing assertion |
|---|---|---|---|---|
r3-confirm-4xx |
return r.status >= 400 && r.status < 500; |
killed (rc 1; 89 run, 88 pass, 1 fail) | test 18, "a child whose kanban view is deleted still refuses the tick, and the reconcile reads it watch-only" | tree.test.mjs:465, the 429 confirm step |
r3-confirm-error-on-throw |
return r.status === 403 || r.status === 404 || r.status === 0; |
killed (rc 1; 89 run, 88 pass, 1 fail) | same test | tree.test.mjs:472, the status-0 confirm step |
Mutant window: 14:48:04-14:48:06 UTC. After restore, sync.mjs sha256 is 35e79dc2ac56af8047bef11a5aaf5f1d37ce3e11513f9968454053068f59ebcf, the original, and git diff shows no change to it.
Files in this packet
base.txt,build.patch,files.txt,candidate-manifest.sha256run_group.py(process-group runner),gate.sh(steps 1 and 2),chain.sh(gate, then mutants on pass),mutants.py(steps 3)out/:gate-summary.txt,gate-stdout.txt,manifest-check.txt,node-tasks.log,node-bus.log,test-*.log,mutant-*.log,mutants-summary.txt,mutants-stdout.txt,chain-start.txt,chain-rc.txt
Process check
No test, node or chromium process of mine remains. Checked at 14:48 UTC by scanning /proc cwd links inside this worktree. The one leftover was my own tail -F monitor, stopped.