# 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.