Files
stack/agents/researcher/work/queue-102/build.md
T
jason.woltjeandClaude Sonnet 5.5 486c4aad34 research: row 102 build packet, row 88 follow-up N1-N4 (#1596)
Header sentence, line 13 wrap, bidi escapes in three files, inertCheck U+200E/U+200F. Patch and evidence only; the change is not applied to the tree.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-13 16:12:24 -05:00

60 lines
3.8 KiB
Markdown

# Row 102 (#1596): row 88 follow-up, build notes
Built 2026-10-13T21:12:10Z by the Researcher seat. Base: 587e64a27 (refactor, unpushed), in the worktree
/mnt/storage/scratch/researcher/q102 (detached). The change is row102.patch (sha256 1d1a343cddd4c66a8c4b6dfbb38abf38edc1b784222ebd52c9a0ab4ac49d45d8):
6 files, +10 -6. Apply with `git apply row102.patch` at the repository root.
## What changed
- N1, packages/tasks/src/fields.mjs: the header comment gains one sentence naming the check. The
test reads the rows of the Field table and requires that every field name in a row is a label in
fields.json and that the task.* verbs a row names are exactly the verbs fields.json lists for that
field (fields.test.mjs lines 91-117).
- N2, packages/tasks/tests/fields.test.mjs: the 146-character line 13 is split in two. No other reflow.
- N3, three files, each literal bidi character replaced by its lowercase \uXXXX escape:
- packages/webui/src/public/bus.js:13, the UNSEEN pattern
- packages/webui/tests/bus.test.mjs:20, HOSTILE
- packages/conversation/tests/flows.test.mjs:495
- N4, packages/webui/tests/bus-browser.test.mjs, inertCheck only: U+200E and U+200F added to the
refused pattern, beside U+202A-U+202E and U+2066-U+2069.
No behaviour change in bus.js beyond the escape.
## Evidence (all in this directory)
- bidi-counts.txt: literal bidi characters per file, HEAD then now. bus.js 7 to 0, bus.test.mjs 1 to 0,
flows.test.mjs 1 to 0; the other three files 0 and 0. A text-file scan of packages, scripts, adapters,
roles and contracts at the worktree finds none left. Counter: bidi-count.mjs (U+061C, U+200E, U+200F,
U+202A-U+202E, U+2066-U+2069). Escaper used: escape-bidi.mjs.
- same-code-points.out (script same-code-points.mjs, run from the worktree root against HEAD):
the old and new UNSEEN regexes agree on all 65536 code units (44 match, 0 differ); the HOSTILE
string in bus.test.mjs:20 and the string in flows.test.mjs:495 are identical before and after.
- N4, n4-evidence.sh with output in n4-out/, running only bus-browser.test.mjs three times:
- control: HOSTILE also carries U+200E U+200F, real bus.js, new inertCheck: 2 of 2 pass.
- mutant: same HOSTILE, bus.js UNSEEN no longer strips U+200E U+200F, new inertCheck: exit 1,
1 of 2 fails at inertCheck (the inbox page, bus-browser.test.mjs:111, doesNotMatch). The mutant
is the injection: the character reaches shown text and the new pattern refuses it.
- gap: same mutant with inertCheck as it was at HEAD: 2 of 2 pass. That is the hole N4 closes.
The script restores every file it edits; the worktree diff is the same after it as before.
- test-out/: the four covering files, each run alone with node --test from the worktree, on the final
tree: fields.test.mjs 5 of 5, bus.test.mjs 10 of 10, flows.test.mjs 28 of 28, bus-browser.test.mjs 2 of 2.
## What was not run
The full tasks, webui and conversation suites and scripts/test-*.sh. Darkwing held the test slot for
row 103 and Sage ruled that phase A runs no full suite; those are for Sage's gate rerun.
## Environment notes
- flows.test.mjs refuses without node_modules/.package-lock.json at the tree root (the pi pin check,
pi-pin.mjs). The worktree has no node_modules, so the first run failed 16 of 28 with the
pin-check refusal. I linked the canonical checkout's node_modules into the worktree (read only),
reran, and removed the link afterwards. The 16 failures were that, not the change.
- An earlier loop of mine launched node --test through setsid without -w, so its first exit codes were
not the tests' own. The numbers above are from the rerun with setsid -w; the n4 script uses -w too.
## Landing
packages/webui/src/public/bus.js is under public/: it needs Mos's go (decision 123) and the decision
109 notices before and after. Nothing here is pushed.