darkwing: row 61 follow-up item list (Dewey 1-2, Filbert N1-N5, fields.mjs header)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-12 14:07:17 -05:00
co-authored by Claude Opus 5.5
parent c0d0308f41
commit 140fe923b1
@@ -0,0 +1,68 @@
# Row 61 follow-up, the item list (Darkwing)
Row 61 (#1550) landed in `6c42344d`. Both reviewers approved with notes
that needed nothing that round: Dewey in comment 27776, Filbert in comment
27785. This list collects them with my own, so Sage can brief one row.
Line numbers are at `6c42344d`. None of it changes who may write a field,
`fields.json` or a role file.
## Code and docs
1. **The writers table's aria-label lacks the suffix** (Dewey 1).
`packages/webui/src/public/bus.js:364` has
`aria-label="Who may write each field"`. Every other scrolling table
on the page ends its label with ", scroll for all columns" (lines 333,
399, 432, 476, 478). Add it.
2. **The webui README says the refusal names the file** (Filbert N1).
`packages/webui/README.md:447`: "the loader's message, which names the
file and never a path". A schema refusal names a key
(`fields[3].label: ...`, `verbs.task.close: ...`); only the read and
parse failures say `fields.json`. Say the message names the file or
the key at fault, never a path.
3. **The fields.mjs header says the test checks the prose** (mine).
`packages/tasks/src/fields.mjs:3-5`: "The prose in
docs/plans/2026-10-04_slice-1.md stays the reviewed source;
tests/fields.test.mjs checks both against what the verbs do." The test
checks the table, not the prose. If item 5 lands, the sentence becomes
true for the prose too and needs only to say how; if not, it says the
test checks the table. (`packages/tasks/README.md:129-130`, "checks
both", means the two layers and is right as it stands.)
4. **The test header overstates the role-file claim** (Filbert N2).
`packages/tasks/tests/fields.test.mjs:12-16` says a change to a role
file that leaves the table and the verbs disagreeing fails the file.
The walk reads `roles/*.json` both for what it expects and through the
broker for what happens, so a role-file change moves both sides
together. What the file catches is the table against `verbs.mjs`, with
the role files as given. Reword to say so.
## Tests
5. **No test checks the prose against `fields.json`** (Dewey 2). The
field table section of `docs/plans/2026-10-04_slice-1.md` (`### Field
table`, line 58) and the data agree today on all 11 rows (Dewey checked
by hand). A test that reads that section and checks each field's verbs
against the table would catch a later edit to either. Keep it to the
field and verb columns; the prose's wording around the calls isn't
meant to match the data character for character.
6. **The cto is never an actor in the verb walk** (Filbert N3).
`fields.test.mjs:139` drives pm, coder, reviewer and researcher; the
cto (line 141) only resolves decisions. Add cto to the walk, so a table
or role change that lets the cto write a field it shouldn't fails.
7. **`in` in place of `Object.hasOwn` survives** (Filbert N4).
`fields.mjs:48` checks a write's verb with `Object.hasOwn(table.verbs,
w.verb)`. With `in`, a verb named `constructor` passes through the
prototype. Add a schema case with `"verb": "constructor"` that must
refuse with `not a task verb`.
8. **Dropping `txt()` around the label survives** (Filbert N5).
`bus.js:363` escapes the label and note with `txt()`. The browser test
reads the committed table, whose labels are plain. Give the test's
`fieldsFile` copy a label and note carrying the browser test's
`HOSTILE` string (`packages/webui/tests/bus-browser.test.mjs:19`), then
run its inert check on the task page.
## Owner and size
Mine, as the row 61 author: two small code files, two READMEs, three test
files. The packet should show items 7 and 8 kill the two mutants Filbert
found surviving, item 5 fail on a one-verb edit to the prose, and item 6
fail on a table or role edit that only a cto actor exposes.