Files
stack/agents/darkwing/work/queue-63/r2/build.md
T
jason.woltjeandClaude Opus 5.5 557b28fb84 darkwing: row 63 round 2 packet, rebased onto cca5f23e, candidate 2a22fd3f (#1556)
Four child-path tests in verbs.test.mjs for Dewey's and Filbert's round 1
survivors; the task.create README paragraph rewrapped. Code unchanged.
Row 89 (ce104b27) edited tools.mjs and tools.test.mjs after round 1's
base, so this round is built on cca5f23e. Mutants 25 of 25 killed; gate
15 of 15 green.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 17:41:25 -05:00

5.9 KiB

Row 63, task verbs across the tree (row B), round 2 build (Darkwing)

Issue #1556. Round 1 packet: agents/darkwing/work/queue-63/ (candidate manifest ec28d736…). Round 1 verdicts: Filbert approved with notes (comment 27846), Dewey asked for changes (comment 27847). Sage's word for round 2: add Dewey's five proof tests and Filbert's N1 child-path tests, code stays as is, both build.md choices stand.

Base cca5f23e. Round 1 was built on 08941d8b. Row 89 landed at ce104b27 after that and edits packages/harness/src/tools.mjs and packages/harness/tests/tools.test.mjs, two of the six paths. It adds list_tasks arguments and a get_task tool; none of them is named project, so round 1's assertion that only task_create takes project still holds. I applied the full diff to a detached worktree of cca5f23e (it applied cleanly) and ran the mutants and the gate there. My added and removed lines in both harness files are the same as round 1's; only the context around them moved. No other commit since 08941d8b touches the six paths or packages/tasks/tests/fake.mjs.

build.patch is git diff --cached --binary cca5f23e of the six paths. Apply it with git apply --index to a detached worktree of cca5f23e, and sha256sum -c candidate-manifest.sha256 then gives 6/6 OK (checked on a fresh worktree).

What changed since round 1

verbs.mjs and tree.test.mjs are byte for byte round 1's. In tools.mjs and tools.test.mjs my lines are round 1's, on row 89's base. Two files moved:

  • packages/tasks/tests/verbs.test.mjs: four tests, and two helpers gain a parameter. thenFailRead(trigger, id = 1) faults the final read of task id, not always task 1. tree(t, edit = {}) passes edit to world() with TREE, so a tree world can take thenFailRead's fetch.
  • packages/tasks/README.md: the task.create paragraph is rewrapped. Its line 194 was 118 characters (Dewey's non-blocking note). The words are the same.

The four tests

Each is a child version of a root path the round 1 suite already covered.

Test What it pins From
a verb and a create in the child record the final read of the child's board the final read after a create and after a verb on a child task has an etag, so it read the child's project and view and didn't fall back Dewey's test 1
a create in the child whose final read fails records the child's todo bucket the fallback snapshot's bucket is the child's todo, its etag is null, and the next tick finds no external change on the new task Dewey's test 2 and Filbert's Q2
a lost answer in the child is settled by a re-read of the child's board a state move and a close that each landed but answered 500 succeed, with the child's in-progress and then done bucket in the snapshot, and nothing is retried Dewey's test 3 and Filbert's Q1
every related task is read before authority, not only the first a schedule whose second relation names the wrong project refuses task-moved and writes nothing Dewey's test 4

Two of Dewey's and Filbert's tests asked for the same thing, so I merged each pair into one test. Sage's message said five proof tests. proof-tests.mjs holds four, which kill Dewey's five survivors. The four here kill those five and Filbert's four bucket survivors, two of which are the same sites as Dewey's.

One change from the proof tests: tree() makes a task in the grandchild before the start, and the start's reconcile records it as task.changed.external. Filbert's Q2 expected no external change after the tick, so the test asserts the only one is that grandchild task's, not the count. Dewey's treeWith helper isn't needed: tree(t, edit) does the same with the grandchild in place.

Mutants

mutants.sh here is round 1's 18, then 7 more: one for each survivor in Dewey's and Filbert's round 1 runs, each sending a child path back to the root's project or view, or cutting the relation read to the first relation. It ran with a copy of agents/darkwing/work/queue-59-review/r1/mut.mjs (sha256 a1ed6bca…, round 1's helper) on the rebased tree, 22:35:31Z to 22:37:06Z, after a check that exits on another seat's gate or mutant run. 25 of 25 killed (mutants.txt). Every file was restored and still matches the manifest.

Each of the 7 dies in the test written for it, and in no other:

Mutant Killed by
located-first-only every related task is read before authority, not only the first
step-reread-root a lost answer in the child is settled by a re-read of the child's board
handle-final-root a verb and a create in the child record the final read of the child's board
create-final-root a verb and a create in the child record the final read of the child's board
create-fallback-root-todo a create in the child whose final read fails records the child's todo bucket
read-done-root a lost answer in the child is settled by a re-read of the child's board
close-done-root a lost answer in the child is settled by a re-read of the child's board

Round 1's 18 are still killed, some now by more tests than before.

Gate

gate.sh, run sequentially in ~/darkwing-scratch/r63/wt2 (cca5f23e plus this patch, node_modules symlinked), 22:37:42Z to 22:40:57Z, after the same busy check (gate-summary.txt). All 15 suites exited 0, 0 skipped:

  • node: tasks 84 (round 1's 80 plus the four tests), harness 65, business 60, bus 108, cli 120, webui 86. Round 1 ran tasks, harness, business and bus. I added cli and webui because both import from packages/tasks. Harness and bus counts are row 89's and the rows before it; the harness count doesn't move for this row, since its assertions sit inside an existing test;
  • scripts: auth 15, conductor 17, config 24, discord 66, extension-package 18, foundation 44, queue 27, release 14, task 26 (DOCKER_HOST at a dead socket).

test-release left an empty wt2_default network of mine, and I removed it.