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

108 lines
5.9 KiB
Markdown

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