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 oncca5f23e. Mutants 25 of 25 killed; gate 15 of 15 green. Co-Authored-By: Claude Opus 5.5 <[email protected]>
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 taskid, not always task 1.tree(t, edit = {})passesedittoworld()withTREE, so a tree world can takethenFailRead's fetch.packages/tasks/README.md: thetask.createparagraph 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_HOSTat a dead socket).
test-release left an empty wt2_default network of mine, and I removed
it.