Row 88 follow-up: field table header, line length and bidi escapes #1596

Closed
opened 2026-10-13 17:23:50 +00:00 by jarvis · 3 comments
Contributor

Brief: docs/plans/2026-10-13_post-retest-follow-ups.md, section "Row 88 follow-up: field table header, line length and bidi escapes" (refactor, ec6e3988).

Follows #1582 (82414385). Owner researcher; reviewer filbert. The public/ change needs Mos's go. Queued until Jason's PM re-test is finished (Mos).

Problem

Row 88 (82414385, #1582) landed with Filbert's approval (28214) and
four non-blocking notes:

  • N1. The header comment in packages/tasks/src/fields.mjs says the
    test checks the prose against the table, but not how.
  • N2. packages/tasks/tests/fields.test.mjs line 13 is 146 characters.
  • N3. Three files carry literal bidi control characters in source where
    an escape would do: packages/webui/src/public/bus.js line 13 (the
    UNSEEN pattern), packages/webui/tests/bus.test.mjs line 20 and
    packages/conversation/tests/flows.test.mjs line 495.
  • N4. inertCheck in packages/webui/tests/bus-browser.test.mjs
    refuses U+202A-U+202E and U+2066-U+2069 in shown text but not U+200E
    and U+200F.

Owner and reviewer

Owner: Researcher, row 88's owner. Reviewer: Filbert.

Files owned

  • packages/tasks/src/fields.mjs, the header comment only
  • packages/tasks/tests/fields.test.mjs, line 13 only
  • packages/webui/src/public/bus.js, the UNSEEN pattern only
  • packages/webui/tests/bus.test.mjs
  • packages/conversation/tests/flows.test.mjs, line 495 only
  • packages/webui/tests/bus-browser.test.mjs, inertCheck only
  • agents/researcher/work/queue-<row>/

What ships

  • N1: one sentence in the header naming the check the test makes.
  • N2: line 13 wrapped. No other reflow.
  • N3: each literal replaced by its \u escape, with the same code
    points matched before and after. The build notes show each file's
    bidi count going from its current value to zero, and the tests that
    cover each pattern still pass.
  • N4: U+200E and U+200F added to the inertCheck pattern, shown to
    fail when a test injects either.

Suites: the tasks, webui and conversation node suites and every
scripts/test-*.sh.

Out of scope

Any behaviour change in bus.js beyond the escape. Restarting the
Console.

Gate

Filbert approves on the row's issue, naming the candidate manifest, and
the suites above pass on Sage's gate rerun. The public/ change needs
Mos's go before landing (decision 123), and the decision 109 notices go
to Mos before and after.

Brief: docs/plans/2026-10-13_post-retest-follow-ups.md, section "Row 88 follow-up: field table header, line length and bidi escapes" (refactor, ec6e3988). Follows #1582 (82414385). Owner researcher; reviewer filbert. The public/ change needs Mos's go. Queued until Jason's PM re-test is finished (Mos). ### Problem Row 88 (82414385, #1582) landed with Filbert's approval (28214) and four non-blocking notes: - N1. The header comment in `packages/tasks/src/fields.mjs` says the test checks the prose against the table, but not how. - N2. `packages/tasks/tests/fields.test.mjs` line 13 is 146 characters. - N3. Three files carry literal bidi control characters in source where an escape would do: `packages/webui/src/public/bus.js` line 13 (the UNSEEN pattern), `packages/webui/tests/bus.test.mjs` line 20 and `packages/conversation/tests/flows.test.mjs` line 495. - N4. `inertCheck` in `packages/webui/tests/bus-browser.test.mjs` refuses U+202A-U+202E and U+2066-U+2069 in shown text but not U+200E and U+200F. ### Owner and reviewer Owner: Researcher, row 88's owner. Reviewer: Filbert. ### Files owned - `packages/tasks/src/fields.mjs`, the header comment only - `packages/tasks/tests/fields.test.mjs`, line 13 only - `packages/webui/src/public/bus.js`, the UNSEEN pattern only - `packages/webui/tests/bus.test.mjs` - `packages/conversation/tests/flows.test.mjs`, line 495 only - `packages/webui/tests/bus-browser.test.mjs`, `inertCheck` only - `agents/researcher/work/queue-<row>/` ### What ships - N1: one sentence in the header naming the check the test makes. - N2: line 13 wrapped. No other reflow. - N3: each literal replaced by its `\u` escape, with the same code points matched before and after. The build notes show each file's bidi count going from its current value to zero, and the tests that cover each pattern still pass. - N4: U+200E and U+200F added to the `inertCheck` pattern, shown to fail when a test injects either. Suites: the tasks, webui and conversation node suites and every `scripts/test-*.sh`. ### Out of scope Any behaviour change in `bus.js` beyond the escape. Restarting the Console. ### Gate Filbert approves on the row's issue, naming the candidate manifest, and the suites above pass on Sage's gate rerun. The `public/` change needs Mos's go before landing (decision 123), and the decision 109 notices go to Mos before and after.
Author
Contributor

Review request for queue row 102, round 1: Row 88 follow-up: field table header, line length and bidi escapes

  • Owner: researcher
  • Reviewers: filbert
  • Gate: Filbert approves on #1596 naming the manifest; tasks, webui, conversation suites and every scripts/test-*.sh on Sage's rerun; public/ needs Mos's go; after the re-test (sage)
  • Brief: docs/plans/2026-10-13_post-retest-follow-ups.md § Row 88 follow-up: field table header, line length and bidi escapes @7741f0144790
  • Candidate: manifest 8dedcec601ee79a08b4421842af694c0acdae6af3da31b26505c581d3dbc5558

The manifest:

8f635ce5d4d831f577a71e1ac008ef61addc611effdca65719da3fe472bb4a94  agents/researcher/work/queue-102/bidi-count.mjs
436b4027f7cdaa7b137683cc0df37d086c175df9772ffc9f32ae1807a3210b4c  agents/researcher/work/queue-102/bidi-counts.txt
18bdcce101ed088be039d14b5c72b568b9b0d1199e0f65bb3c38f141ae0b2be6  agents/researcher/work/queue-102/build.md
9a16aad451073620df5fa77bacd0b17bc9f02cfae6ea5ffbe6bbb17b819ac1dd  agents/researcher/work/queue-102/escape-bidi.mjs
e96df5f216bdd50b2ee1ef4b6891c86d1f3553100d3881733431f3527ce1136f  agents/researcher/work/queue-102/n4-evidence.sh
fe0b880929c1545958a4a6e62359edec7eb0f39c1799eb75fda1cb2d2604abb5  agents/researcher/work/queue-102/n4-out/control.out
9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa  agents/researcher/work/queue-102/n4-out/control.rc
f6524214bfd82630244339bf0250c9bb727b4b1ebac4af31eeddf09d9940d90e  agents/researcher/work/queue-102/n4-out/gap.out
9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa  agents/researcher/work/queue-102/n4-out/gap.rc
dfaa9dfecbc67f28cc1a55444c2e3e6d98452137da8b108c40a5ae64a388f6ea  agents/researcher/work/queue-102/n4-out/mutant.out
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865  agents/researcher/work/queue-102/n4-out/mutant.rc
1d1a343cddd4c66a8c4b6dfbb38abf38edc1b784222ebd52c9a0ab4ac49d45d8  agents/researcher/work/queue-102/row102.patch
1ac26ddd849e6705d69e537d70b2150aa9f8aee11a6521bf4ad93fa765b04c6b  agents/researcher/work/queue-102/same-code-points.mjs
e85f81733f717e4e4b9f37cc20aaff3b33a60671974e9e4a755ec5bd55e1f106  agents/researcher/work/queue-102/same-code-points.out
75e0d4d8f3de54cdada686a99863e3e999d7ea35c57104958c928c43f62ffd74  agents/researcher/work/queue-102/test-out/bus-browser.out
998c71967664d4f4c3d083c8dcf641e00497bcfe49c242147cb65dc191fcc3da  agents/researcher/work/queue-102/test-out/bus.out
684c3d21aeccea1f6d7a6ce22a8632594505ad7365e6d4b91951828135763125  agents/researcher/work/queue-102/test-out/fields.out
81ee7eb7b36290a177bc11a6b312e550d0e66696dc41a205f4afec85e6d25ff2  agents/researcher/work/queue-102/test-out/flows.out

Check a tree against it with scripts/mosaic queue review verify-commit 102 REF.

Post your verdict as a comment here, then record it:

scripts/mosaic queue review record 102 --verdict approve|changes --comment COMMENT_ID --candidate 8dedcec601ee79a08b4421842af694c0acdae6af3da31b26505c581d3dbc5558 --op OP --by SEAT
<!-- mosaic-queue-op: sage-102-review-r1b --> <!-- mosaic-queue-round: row=102 round=1 candidate=8dedcec601ee79a08b4421842af694c0acdae6af3da31b26505c581d3dbc5558 --> Review request for queue row 102, round 1: Row 88 follow-up: field table header, line length and bidi escapes - Owner: researcher - Reviewers: filbert - Gate: Filbert approves on #1596 naming the manifest; tasks, webui, conversation suites and every scripts/test-*.sh on Sage's rerun; public/ needs Mos's go; after the re-test (sage) - Brief: `docs/plans/2026-10-13_post-retest-follow-ups.md` § Row 88 follow-up: field table header, line length and bidi escapes @7741f0144790 - Candidate: manifest `8dedcec601ee79a08b4421842af694c0acdae6af3da31b26505c581d3dbc5558` The manifest: ```text 8f635ce5d4d831f577a71e1ac008ef61addc611effdca65719da3fe472bb4a94 agents/researcher/work/queue-102/bidi-count.mjs 436b4027f7cdaa7b137683cc0df37d086c175df9772ffc9f32ae1807a3210b4c agents/researcher/work/queue-102/bidi-counts.txt 18bdcce101ed088be039d14b5c72b568b9b0d1199e0f65bb3c38f141ae0b2be6 agents/researcher/work/queue-102/build.md 9a16aad451073620df5fa77bacd0b17bc9f02cfae6ea5ffbe6bbb17b819ac1dd agents/researcher/work/queue-102/escape-bidi.mjs e96df5f216bdd50b2ee1ef4b6891c86d1f3553100d3881733431f3527ce1136f agents/researcher/work/queue-102/n4-evidence.sh fe0b880929c1545958a4a6e62359edec7eb0f39c1799eb75fda1cb2d2604abb5 agents/researcher/work/queue-102/n4-out/control.out 9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa agents/researcher/work/queue-102/n4-out/control.rc f6524214bfd82630244339bf0250c9bb727b4b1ebac4af31eeddf09d9940d90e agents/researcher/work/queue-102/n4-out/gap.out 9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa agents/researcher/work/queue-102/n4-out/gap.rc dfaa9dfecbc67f28cc1a55444c2e3e6d98452137da8b108c40a5ae64a388f6ea agents/researcher/work/queue-102/n4-out/mutant.out 4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 agents/researcher/work/queue-102/n4-out/mutant.rc 1d1a343cddd4c66a8c4b6dfbb38abf38edc1b784222ebd52c9a0ab4ac49d45d8 agents/researcher/work/queue-102/row102.patch 1ac26ddd849e6705d69e537d70b2150aa9f8aee11a6521bf4ad93fa765b04c6b agents/researcher/work/queue-102/same-code-points.mjs e85f81733f717e4e4b9f37cc20aaff3b33a60671974e9e4a755ec5bd55e1f106 agents/researcher/work/queue-102/same-code-points.out 75e0d4d8f3de54cdada686a99863e3e999d7ea35c57104958c928c43f62ffd74 agents/researcher/work/queue-102/test-out/bus-browser.out 998c71967664d4f4c3d083c8dcf641e00497bcfe49c242147cb65dc191fcc3da agents/researcher/work/queue-102/test-out/bus.out 684c3d21aeccea1f6d7a6ce22a8632594505ad7365e6d4b91951828135763125 agents/researcher/work/queue-102/test-out/fields.out 81ee7eb7b36290a177bc11a6b312e550d0e66696dc41a205f4afec85e6d25ff2 agents/researcher/work/queue-102/test-out/flows.out ``` Check a tree against it with `scripts/mosaic queue review verify-commit 102 REF`. Post your verdict as a comment here, then record it: ``` scripts/mosaic queue review record 102 --verdict approve|changes --comment COMMENT_ID --candidate 8dedcec601ee79a08b4421842af694c0acdae6af3da31b26505c581d3dbc5558 --op OP --by SEAT ```
Member

Row 102 round 1 (#1596), Filbert: approve.

Candidate manifest SHA-256: 8dedcec601ee79a08b4421842af694c0acdae6af3da31b26505c581d3dbc5558. It covers the packet in agents/researcher/work/queue-102/, including row102.patch (sha256 1d1a343cddd4c66a8c4b6dfbb38abf38edc1b784222ebd52c9a0ab4ac49d45d8). Base: 587e64a27. Packet commit: 486c4aad3. This answers request 28249.

All 19 manifest entries verify against the packet files, and the manifest at 486c4aad3 hashes to the same value. 587e64a27 differs from 79e126be0 only under agents/, and none of the six code paths changed from 587e64a27 to the current head. I applied row102.patch in my own worktree at 587e64a27. It applies cleanly, git diff --check is clean, the tree shows exactly the six files (+10 -6), and git diff reproduces the patch byte for byte.

N3: same code points, checked from the files

I wrote my own check rather than reuse same-code-points.mjs. It takes the old line from git show 587e64a27:<path> and the new line from the worktree, and evaluates each literal.

  • UNSEEN in bus.js: I tested old and new against every code point from U+0000 to U+10FFFF, lone surrogates included. 44 match under both, 0 differ, and both have the g flag. The old class's non-ASCII members are U+061C, U+200E, U+200F, U+202A, U+202E, U+2066 and U+2069, as range ends and singles, which is exactly the new \u061c\u200e\u200f\u202a-\u202e\u2066-\u2069.
  • HOSTILE in webui/tests/bus.test.mjs:20 and the engine.script text in conversation/tests/flows.test.mjs:495: old and new evaluate to identical strings.
  • Literal bidi count (U+061C, U+200E, U+200F, U+202A-U+202E, U+2066-U+2069) in all six candidate files: 0.

N4: the inertCheck mutant

I ran bus-browser.test.mjs alone with my own script, injecting U+200E and U+200F separately after the existing \u202e in its HOSTILE:

  • control (real bus.js, new inertCheck): 2 pass, 0 fail, for each character.
  • mutant (bus.js UNSEEN without \u200e\u200f): exit 1, 1 fail, for each character. The stack is inertCheck at bus-browser.test.mjs:111, operator doesNotMatch, from the inbox page call at :148.
  • gap (same mutant, inertCheck as at the base): 2 pass, 0 fail, for each character. That is the hole N4 closes.
    My script restored both files, and the worktree diff matched the patch afterwards.

N1, N2 and bus.js

  • N1: the new header sentence matches the test at fields.test.mjs:91-117. Every name in a Field table row must be a fields.json label, and the task.* verbs a row names must equal, as a set, the verbs fields.json lists for that field.
  • N2: only line 13 is split into two lines, and no other line moves. The continuation line is short (51 characters) because the next line was left alone, which is what the brief asks.
  • bus.js: the one changed line differs only inside the UNSEEN class. CONTROL and the rest of the file are unchanged, so there is no behaviour change beyond the escape. It sits under public/, so it needs Mos's go before landing (decision 123).

Tests run

Each covering file run alone on the candidate: tasks/tests/fields.test.mjs 5/0, webui/tests/bus.test.mjs 10/0, conversation/tests/flows.test.mjs 28/0, webui/tests/bus-browser.test.mjs 2/0, none skipped. I ran no full suite and no queue-commit.sh; Sage's gate rerun covers the suites.

No notes.

Row 102 round 1 (#1596), Filbert: **approve**. Candidate manifest SHA-256: `8dedcec601ee79a08b4421842af694c0acdae6af3da31b26505c581d3dbc5558`. It covers the packet in `agents/researcher/work/queue-102/`, including `row102.patch` (sha256 `1d1a343cddd4c66a8c4b6dfbb38abf38edc1b784222ebd52c9a0ab4ac49d45d8`). Base: `587e64a27`. Packet commit: `486c4aad3`. This answers request 28249. All 19 manifest entries verify against the packet files, and the manifest at 486c4aad3 hashes to the same value. 587e64a27 differs from 79e126be0 only under `agents/`, and none of the six code paths changed from 587e64a27 to the current head. I applied `row102.patch` in my own worktree at 587e64a27. It applies cleanly, `git diff --check` is clean, the tree shows exactly the six files (+10 -6), and `git diff` reproduces the patch byte for byte. ### N3: same code points, checked from the files I wrote my own check rather than reuse `same-code-points.mjs`. It takes the old line from `git show 587e64a27:<path>` and the new line from the worktree, and evaluates each literal. - UNSEEN in `bus.js`: I tested old and new against every code point from U+0000 to U+10FFFF, lone surrogates included. 44 match under both, 0 differ, and both have the `g` flag. The old class's non-ASCII members are U+061C, U+200E, U+200F, U+202A, U+202E, U+2066 and U+2069, as range ends and singles, which is exactly the new `\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069`. - `HOSTILE` in `webui/tests/bus.test.mjs:20` and the `engine.script` text in `conversation/tests/flows.test.mjs:495`: old and new evaluate to identical strings. - Literal bidi count (U+061C, U+200E, U+200F, U+202A-U+202E, U+2066-U+2069) in all six candidate files: 0. ### N4: the inertCheck mutant I ran `bus-browser.test.mjs` alone with my own script, injecting U+200E and U+200F separately after the existing `\u202e` in its `HOSTILE`: - control (real bus.js, new inertCheck): 2 pass, 0 fail, for each character. - mutant (bus.js UNSEEN without `\u200e\u200f`): exit 1, 1 fail, for each character. The stack is `inertCheck` at `bus-browser.test.mjs:111`, operator `doesNotMatch`, from the inbox page call at :148. - gap (same mutant, inertCheck as at the base): 2 pass, 0 fail, for each character. That is the hole N4 closes. My script restored both files, and the worktree diff matched the patch afterwards. ### N1, N2 and bus.js - N1: the new header sentence matches the test at `fields.test.mjs:91-117`. Every name in a Field table row must be a fields.json label, and the `task.*` verbs a row names must equal, as a set, the verbs fields.json lists for that field. - N2: only line 13 is split into two lines, and no other line moves. The continuation line is short (51 characters) because the next line was left alone, which is what the brief asks. - bus.js: the one changed line differs only inside the UNSEEN class. `CONTROL` and the rest of the file are unchanged, so there is no behaviour change beyond the escape. It sits under `public/`, so it needs Mos's go before landing (decision 123). ### Tests run Each covering file run alone on the candidate: `tasks/tests/fields.test.mjs` 5/0, `webui/tests/bus.test.mjs` 10/0, `conversation/tests/flows.test.mjs` 28/0, `webui/tests/bus-browser.test.mjs` 2/0, none skipped. I ran no full suite and no queue-commit.sh; Sage's gate rerun covers the suites. No notes.
Author
Contributor

Done (queue row 102). Landed as 2a9b77b56 on refactor, pushed with 817ddfea6. Manifest 8dedcec6. Filbert approved in 28251. The public/ change was one line, per Mos sage-0140. Sage gate on 3a1e11b83+85+102+103 was all green. Closed by Sage.

Done (queue row 102). Landed as 2a9b77b56 on refactor, pushed with 817ddfea6. Manifest 8dedcec6. Filbert approved in 28251. The public/ change was one line, per Mos sage-0140. Sage gate on 3a1e11b83+85+102+103 was all green. Closed by Sage.
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mosaicstack/stack#1596