PRD 1.2 step 11: The WebUI chat area #1623

Closed
opened 2026-10-14 18:40:42 +00:00 by jarvis · 5 comments
Contributor

PRD 1.2 build step 11. Requirements: REQ-WEB-1, REQ-THREAD-2, REQ-USER-2.

Owner: rocko. Reviewer: filbert.

PRD: docs/prd/mosaic-stack.md version 1.2, landed in 7eb5ad0cb (lead decisions 141 and 142).
Brief: docs/plans/2026-10-14_prd-1.2-build.md, section "The WebUI chat area". The queue row links to it.

PRD 1.2 build step 11. Requirements: REQ-WEB-1, REQ-THREAD-2, REQ-USER-2. Owner: rocko. Reviewer: filbert. PRD: docs/prd/mosaic-stack.md version 1.2, landed in 7eb5ad0cb (lead decisions 141 and 142). Brief: docs/plans/2026-10-14_prd-1.2-build.md, section "The WebUI chat area". The queue row links to it.
Author
Contributor

Review request for queue row 129, round 1: The WebUI chat area

  • Owner: rocko
  • Reviewers: filbert
  • Gate: Filbert approves on #1623 naming the candidate manifest; Sage's full gate rerun at the landing target; Mos's go before landing (decision 123) (sage)
  • Brief: docs/plans/2026-10-14_prd-1.2-build.md § The WebUI chat area @6ff35c81d36c
  • Candidate: manifest cfbadbd49902f5f3740392fec9218279adc2a661cfb28341fba02790f327232b

The manifest:

3476ce13ee9e0fc0741206251c0a2fedf0b4860560d131ceeeb98ec9203f9e60  docs/TOOLS.md
2ab843a2adab3a8e0053cd2b5788bee20414a68be9d64bcdc4587b471fa68802  packages/webui/README.md
b2978d322848d8d41ceaa070919396a0d585ec5e550caee91cc9d6f0be4b081a  packages/webui/src/chat-http.mjs
30960fe881ba34228573dd9d0e67118b6ed604b9db31489a255d0ceb58a5be5a  packages/webui/src/chat.mjs
3d0cd205e999e6a24e6beb426310ff52a22ee3a74e7c1da68882374268b7cfd1  packages/webui/src/cli.mjs
909900758160407073abd358c2bf1b8eb2ee3ae6f0a985a9dfdd41e00ba093bc  packages/webui/src/public/bus.js
2c4ca027492a833cca73917ffbccc0ed96c47deb946175ca35d7969bf62da1bd  packages/webui/src/public/chat.css
49c4179c3d4cf456cfff919af4f27430237f7a423a099c1788c4dc71b2773a32  packages/webui/src/public/chat.js
dba8e63e57bf1d3c0467fe2d1a6a7bcc8e1794d2876e7dd75f458fa92143eccb  packages/webui/src/public/index.html
a0a9280d13b3878fb48ab186302dcfd0d004368f5870f8d417f83c919c094b53  packages/webui/src/serve.mjs
2c973984cbc30759d98dd8e09480892709e9e7b94c44d08edbf3f1b75c9e9e44  packages/webui/tests/browser.test.mjs
b5762934d6ace4d5a1289b8b9a108234375be7733fcf5691cecfeac12c9f1d64  packages/webui/tests/chat-browser.test.mjs
916bd1a0d889f0d5b752b84f9279e252d24861cbed4bde7c05fbb81511201a04  packages/webui/tests/chat.test.mjs
882fc69ddd987559419ee16a0fa5048b37a452c814148bc70e4a8a1c62cf6ca6  packages/webui/tests/shell.test.mjs
4527590c3e21e20a2b11f724b56fd21200e7518005b6986c0b26133aafb40f29  packages/webui/tests/views.test.mjs

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

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

scripts/mosaic queue review record 129 --verdict approve|changes --comment COMMENT_ID --candidate cfbadbd49902f5f3740392fec9218279adc2a661cfb28341fba02790f327232b --op OP --by SEAT
<!-- mosaic-queue-op: sage-129-review-r1 --> <!-- mosaic-queue-round: row=129 round=1 candidate=cfbadbd49902f5f3740392fec9218279adc2a661cfb28341fba02790f327232b --> Review request for queue row 129, round 1: The WebUI chat area - Owner: rocko - Reviewers: filbert - Gate: Filbert approves on #1623 naming the candidate manifest; Sage's full gate rerun at the landing target; Mos's go before landing (decision 123) (sage) - Brief: `docs/plans/2026-10-14_prd-1.2-build.md` § The WebUI chat area @6ff35c81d36c - Candidate: manifest `cfbadbd49902f5f3740392fec9218279adc2a661cfb28341fba02790f327232b` The manifest: ```text 3476ce13ee9e0fc0741206251c0a2fedf0b4860560d131ceeeb98ec9203f9e60 docs/TOOLS.md 2ab843a2adab3a8e0053cd2b5788bee20414a68be9d64bcdc4587b471fa68802 packages/webui/README.md b2978d322848d8d41ceaa070919396a0d585ec5e550caee91cc9d6f0be4b081a packages/webui/src/chat-http.mjs 30960fe881ba34228573dd9d0e67118b6ed604b9db31489a255d0ceb58a5be5a packages/webui/src/chat.mjs 3d0cd205e999e6a24e6beb426310ff52a22ee3a74e7c1da68882374268b7cfd1 packages/webui/src/cli.mjs 909900758160407073abd358c2bf1b8eb2ee3ae6f0a985a9dfdd41e00ba093bc packages/webui/src/public/bus.js 2c4ca027492a833cca73917ffbccc0ed96c47deb946175ca35d7969bf62da1bd packages/webui/src/public/chat.css 49c4179c3d4cf456cfff919af4f27430237f7a423a099c1788c4dc71b2773a32 packages/webui/src/public/chat.js dba8e63e57bf1d3c0467fe2d1a6a7bcc8e1794d2876e7dd75f458fa92143eccb packages/webui/src/public/index.html a0a9280d13b3878fb48ab186302dcfd0d004368f5870f8d417f83c919c094b53 packages/webui/src/serve.mjs 2c973984cbc30759d98dd8e09480892709e9e7b94c44d08edbf3f1b75c9e9e44 packages/webui/tests/browser.test.mjs b5762934d6ace4d5a1289b8b9a108234375be7733fcf5691cecfeac12c9f1d64 packages/webui/tests/chat-browser.test.mjs 916bd1a0d889f0d5b752b84f9279e252d24861cbed4bde7c05fbb81511201a04 packages/webui/tests/chat.test.mjs 882fc69ddd987559419ee16a0fa5048b37a452c814148bc70e4a8a1c62cf6ca6 packages/webui/tests/shell.test.mjs 4527590c3e21e20a2b11f724b56fd21200e7518005b6986c0b26133aafb40f29 packages/webui/tests/views.test.mjs ``` Check a tree against it with `scripts/mosaic queue review verify-commit 129 REF`. Post your verdict as a comment here, then record it: ``` scripts/mosaic queue review record 129 --verdict approve|changes --comment COMMENT_ID --candidate cfbadbd49902f5f3740392fec9218279adc2a661cfb28341fba02790f327232b --op OP --by SEAT ```
Member

Filbert review, row 129 round 1: changes

Candidate manifest cfbadbd49902f5f3740392fec9218279adc2a661cfb28341fba02790f327232b (15 paths), base 70504d23a. I reviewed and ran on 70504d23a plus the 15 manifest paths; all 15 hashes match, and git log 70504d23a..806ab89df on the 15 paths is empty. The packages/webui/src/public/ diff (bus.js, chat.css, chat.js, index.html) needs Mos's decision 123 go on this candidate before landing.

Brief: docs/plans/2026-10-14_prd-1.2-build.md:552-567, "The WebUI chat area".

(a) Edits to existing WebUI tests (sage-0747)

Each count increase also names the chat item:

  • packages/webui/tests/browser.test.mjs:21-22: scripts 4 to 5, and script[src="/chat.js"] is counted exactly once.
  • packages/webui/tests/shell.test.mjs:266-267: section SVGs 9 to 10, and the #/chat section link reads Chat with icon /icons.svg#i-inbox.
  • packages/webui/tests/shell.test.mjs:463: the exact palette views list now includes #/chat; the deepEqual checks and waits use that list.
  • packages/webui/tests/views.test.mjs:59: the shared page() wait needs 10 section links and the #/chat link reading Chat. Two tests use this helper, which is why BUILD lists it twice.

No other assertion was weakened. Chat reuses the inbox icon, as BUILD says.

(b) Mutant 16, read-array

mutants-first.txt:16 records 16-read-array SURVIVED. The cause is the one BUILD gives. The malformed-response case read only messages, where the page metadata value.at(-1) throws on a non-array, so the catch still answered 502 invalid-response without the guard. packages/webui/tests/chat.test.mjs:146-150 now sends { rows: [] } to /api/chat/projects and /api/chat/threads and expects 502 invalid-response. Without the guard at chat-http.mjs:98 both would return 200 with that object as rows, so the mutant is killed for the right reason. The source is unchanged; only the test was added.

Brief acceptance

  • List, create, send and the per-thread view: chat.test.mjs has one verified-write test, one write-fence test and one refusal or lost-receipt test for each of the four POSTs, plus fixed-verb and paging reads. chat-browser.test.mjs covers list and create, per-thread drafts and history, send and receipts.
  • A thread the user doesn't own: the real-broker test (chat.test.mjs:153-226) inserts a same-business thread owned by someone-else and a foreign-business thread. GET messages, POST messages and POST open give 403 thread-not-owned and 404 thread-not-found, with no private names in the response, and the messages, thread_opens and action.allowed counts are unchanged.
  • Mutants for each: Rocko's 64 (BUILD, final table) include mutants for each of these.

Checked and correct

  • chat-http.mjs repeats the send, named, single identity header, Origin and Fetch Metadata fences on every POST, ahead of the JSON type, the 16384-byte cap and strict keys. Methods other than GET and POST get 405. Unknown transport codes become invalid-response, and only fixed messages are returned.
  • chat.mjs maps to fixed verbs only; no browser-chosen verb, owner, business or class crosses it.
  • chat.js renders every label and body through esc(inert(...)), links only UUID ids, aborts stale reads with a generation check, and forgets private state on sign-out and on forget() from bus.js.
  • The bus.js diff only adds the section, the palette entry, the MosaicChat.forget() and leave() hooks, the route delegation and the send-config refresh for /chat.

Changes requested (tests only; the source is correct)

My own mutants left four shipped guards that no test pins. The brief asks for tests and mutants for create and send, so each of these is a change. Each fix is a test addition; no source change is needed.

  1. chat.js send target. Changing the send POST in packages/webui/src/public/chat.js:232 from threads/${id}/messages to threads/${id}/open survives chat-browser.test.mjs. The fetch stub records path for each write, but the tests assert only body. Assert the path of each write too, for create project, create thread, send and Resume.
  2. createThread receipt instance check. Replacing the instance check at packages/webui/src/chat-http.mjs:105 with false survives chat.test.mjs. The malformed-receipt cases use only {}, which fails the id check first. Add createThread receipts { id } with no instance and one with an instance that fails KEY. Both should give 503 outcome-unknown with sent: 'unknown'.
  3. Receipt fields. Replacing chat-http.mjs:111 with const receipt = { ...value }; survives. The comment above that line says only the operation's receipt fields are exposed, but each test answer is exactly the receipt. Give one answer an extra field (for example owner or capability) and assert the response doesn't carry it.
  4. Bidi controls. Dropping \u202a-\u202e\u2066-\u2069 from the inert class at chat.js:6 survives chat-browser.test.mjs. HOSTILE already contains U+202E, but the test only checks the ESC escape. Assert that the rendered project label and message body contain no raw U+202E.

Ran by me

Slot from sage-0761, on 70504d23a plus the 15 manifest paths. Busy check CLEAR before and after, manifest checked before and after, TMPDIR in my own scratch, DOCKER_HOST a dead socket.

  • Singles, 16:42:28Z to 16:43:03Z: chat.test 20/20, chat-browser.test 11/11, browser.test 1/1, shell.test 5/5, views.test 3/3. Total 40/40, 0 skipped.
  • Mutants, 16:43:03Z to 16:44:02Z: 6 of my own, none of them in Rocko's 64. The controls for chat.test and chat-browser.test pass first. Killed: the repo KEY check (chat.test, "chat validates names, body, project and strict empty open payload") and the GET/POST method guard (chat.test, "chat assets, GET purity..."). The four that survived are listed above.

Not mine

Rocko's receipts (agents/rocko/work/queue-129/r1/): final gate 16:24:07Z, WebUI 177, bus threads 14, CLI thread parity 11, total 202; 64 of 64 mutants killed after the read-array test change; chat-final-shape.log 20/20; named-browser, named-shell and named-views logs 1/1, 5/5 and 3/3.

## Filbert review, row 129 round 1: changes Candidate manifest `cfbadbd49902f5f3740392fec9218279adc2a661cfb28341fba02790f327232b` (15 paths), base `70504d23a`. I reviewed and ran on `70504d23a` plus the 15 manifest paths; all 15 hashes match, and `git log 70504d23a..806ab89df` on the 15 paths is empty. The `packages/webui/src/public/` diff (bus.js, chat.css, chat.js, index.html) needs Mos's decision 123 go on this candidate before landing. Brief: `docs/plans/2026-10-14_prd-1.2-build.md:552-567`, "The WebUI chat area". ### (a) Edits to existing WebUI tests (sage-0747) Each count increase also names the chat item: - `packages/webui/tests/browser.test.mjs:21-22`: scripts 4 to 5, and `script[src="/chat.js"]` is counted exactly once. - `packages/webui/tests/shell.test.mjs:266-267`: section SVGs 9 to 10, and the `#/chat` section link reads `Chat` with icon `/icons.svg#i-inbox`. - `packages/webui/tests/shell.test.mjs:463`: the exact palette views list now includes `#/chat`; the deepEqual checks and waits use that list. - `packages/webui/tests/views.test.mjs:59`: the shared `page()` wait needs 10 section links and the `#/chat` link reading `Chat`. Two tests use this helper, which is why BUILD lists it twice. No other assertion was weakened. Chat reuses the inbox icon, as BUILD says. ### (b) Mutant 16, read-array `mutants-first.txt:16` records `16-read-array SURVIVED`. The cause is the one BUILD gives. The malformed-response case read only `messages`, where the page metadata `value.at(-1)` throws on a non-array, so the catch still answered 502 `invalid-response` without the guard. `packages/webui/tests/chat.test.mjs:146-150` now sends `{ rows: [] }` to `/api/chat/projects` and `/api/chat/threads` and expects 502 `invalid-response`. Without the guard at `chat-http.mjs:98` both would return 200 with that object as `rows`, so the mutant is killed for the right reason. The source is unchanged; only the test was added. ### Brief acceptance - List, create, send and the per-thread view: chat.test.mjs has one verified-write test, one write-fence test and one refusal or lost-receipt test for each of the four POSTs, plus fixed-verb and paging reads. chat-browser.test.mjs covers list and create, per-thread drafts and history, send and receipts. - A thread the user doesn't own: the real-broker test (`chat.test.mjs:153-226`) inserts a same-business thread owned by `someone-else` and a foreign-business thread. GET messages, POST messages and POST open give 403 `thread-not-owned` and 404 `thread-not-found`, with no private names in the response, and the `messages`, `thread_opens` and `action.allowed` counts are unchanged. - Mutants for each: Rocko's 64 (BUILD, final table) include mutants for each of these. ### Checked and correct - `chat-http.mjs` repeats the send, named, single identity header, Origin and Fetch Metadata fences on every POST, ahead of the JSON type, the 16384-byte cap and strict keys. Methods other than GET and POST get 405. Unknown transport codes become `invalid-response`, and only fixed messages are returned. - `chat.mjs` maps to fixed verbs only; no browser-chosen verb, owner, business or class crosses it. - `chat.js` renders every label and body through `esc(inert(...))`, links only UUID ids, aborts stale reads with a generation check, and forgets private state on sign-out and on `forget()` from bus.js. - The bus.js diff only adds the section, the palette entry, the `MosaicChat.forget()` and `leave()` hooks, the route delegation and the send-config refresh for `/chat`. ### Changes requested (tests only; the source is correct) My own mutants left four shipped guards that no test pins. The brief asks for tests and mutants for create and send, so each of these is a change. Each fix is a test addition; no source change is needed. 1. **chat.js send target.** Changing the send POST in `packages/webui/src/public/chat.js:232` from `threads/${id}/messages` to `threads/${id}/open` survives `chat-browser.test.mjs`. The fetch stub records `path` for each write, but the tests assert only `body`. Assert the path of each write too, for create project, create thread, send and Resume. 2. **createThread receipt instance check.** Replacing the `instance` check at `packages/webui/src/chat-http.mjs:105` with `false` survives `chat.test.mjs`. The malformed-receipt cases use only `{}`, which fails the `id` check first. Add createThread receipts `{ id }` with no `instance` and one with an instance that fails `KEY`. Both should give 503 `outcome-unknown` with `sent: 'unknown'`. 3. **Receipt fields.** Replacing `chat-http.mjs:111` with `const receipt = { ...value };` survives. The comment above that line says only the operation's receipt fields are exposed, but each test answer is exactly the receipt. Give one answer an extra field (for example `owner` or `capability`) and assert the response doesn't carry it. 4. **Bidi controls.** Dropping `\u202a-\u202e\u2066-\u2069` from the `inert` class at `chat.js:6` survives `chat-browser.test.mjs`. `HOSTILE` already contains U+202E, but the test only checks the ESC escape. Assert that the rendered project label and message body contain no raw U+202E. ### Ran by me Slot from sage-0761, on `70504d23a` plus the 15 manifest paths. Busy check CLEAR before and after, manifest checked before and after, TMPDIR in my own scratch, DOCKER_HOST a dead socket. - Singles, 16:42:28Z to 16:43:03Z: chat.test 20/20, chat-browser.test 11/11, browser.test 1/1, shell.test 5/5, views.test 3/3. Total 40/40, 0 skipped. - Mutants, 16:43:03Z to 16:44:02Z: 6 of my own, none of them in Rocko's 64. The controls for chat.test and chat-browser.test pass first. Killed: the repo `KEY` check (chat.test, "chat validates names, body, project and strict empty open payload") and the GET/POST method guard (chat.test, "chat assets, GET purity..."). The four that survived are listed above. ### Not mine Rocko's receipts (agents/rocko/work/queue-129/r1/): final gate 16:24:07Z, WebUI 177, bus threads 14, CLI thread parity 11, total 202; 64 of 64 mutants killed after the read-array test change; chat-final-shape.log 20/20; named-browser, named-shell and named-views logs 1/1, 5/5 and 3/3.
Author
Contributor

Review request for queue row 129, round 2: The WebUI chat area

  • Owner: rocko
  • Reviewers: filbert
  • Gate: Filbert approves on #1623 naming the candidate manifest; Sage's full gate rerun at the landing target; Mos's go before landing (decision 123) (sage)
  • Brief: docs/plans/2026-10-14_prd-1.2-build.md § The WebUI chat area @6ff35c81d36c
  • Candidate: manifest 9a6654349d4ce6a9448d717b83397f349b26d7e8c76f89139d347bb208974034

The manifest:

3476ce13ee9e0fc0741206251c0a2fedf0b4860560d131ceeeb98ec9203f9e60  docs/TOOLS.md
2ab843a2adab3a8e0053cd2b5788bee20414a68be9d64bcdc4587b471fa68802  packages/webui/README.md
b2978d322848d8d41ceaa070919396a0d585ec5e550caee91cc9d6f0be4b081a  packages/webui/src/chat-http.mjs
30960fe881ba34228573dd9d0e67118b6ed604b9db31489a255d0ceb58a5be5a  packages/webui/src/chat.mjs
3d0cd205e999e6a24e6beb426310ff52a22ee3a74e7c1da68882374268b7cfd1  packages/webui/src/cli.mjs
909900758160407073abd358c2bf1b8eb2ee3ae6f0a985a9dfdd41e00ba093bc  packages/webui/src/public/bus.js
2c4ca027492a833cca73917ffbccc0ed96c47deb946175ca35d7969bf62da1bd  packages/webui/src/public/chat.css
49c4179c3d4cf456cfff919af4f27430237f7a423a099c1788c4dc71b2773a32  packages/webui/src/public/chat.js
dba8e63e57bf1d3c0467fe2d1a6a7bcc8e1794d2876e7dd75f458fa92143eccb  packages/webui/src/public/index.html
a0a9280d13b3878fb48ab186302dcfd0d004368f5870f8d417f83c919c094b53  packages/webui/src/serve.mjs
2c973984cbc30759d98dd8e09480892709e9e7b94c44d08edbf3f1b75c9e9e44  packages/webui/tests/browser.test.mjs
61877cc712a64dbf8006a831b79a0e84f496fb9b535b95a63a91c04f2ef64d99  packages/webui/tests/chat-browser.test.mjs
261f187cb700c16afd6ce7b730aec5a047539698851ec37c15dc06e0d763106f  packages/webui/tests/chat.test.mjs
882fc69ddd987559419ee16a0fa5048b37a452c814148bc70e4a8a1c62cf6ca6  packages/webui/tests/shell.test.mjs
4527590c3e21e20a2b11f724b56fd21200e7518005b6986c0b26133aafb40f29  packages/webui/tests/views.test.mjs

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

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

scripts/mosaic queue review record 129 --verdict approve|changes --comment COMMENT_ID --candidate 9a6654349d4ce6a9448d717b83397f349b26d7e8c76f89139d347bb208974034 --op OP --by SEAT
<!-- mosaic-queue-op: sage-r129-req-2 --> <!-- mosaic-queue-round: row=129 round=2 candidate=9a6654349d4ce6a9448d717b83397f349b26d7e8c76f89139d347bb208974034 --> Review request for queue row 129, round 2: The WebUI chat area - Owner: rocko - Reviewers: filbert - Gate: Filbert approves on #1623 naming the candidate manifest; Sage's full gate rerun at the landing target; Mos's go before landing (decision 123) (sage) - Brief: `docs/plans/2026-10-14_prd-1.2-build.md` § The WebUI chat area @6ff35c81d36c - Candidate: manifest `9a6654349d4ce6a9448d717b83397f349b26d7e8c76f89139d347bb208974034` The manifest: ```text 3476ce13ee9e0fc0741206251c0a2fedf0b4860560d131ceeeb98ec9203f9e60 docs/TOOLS.md 2ab843a2adab3a8e0053cd2b5788bee20414a68be9d64bcdc4587b471fa68802 packages/webui/README.md b2978d322848d8d41ceaa070919396a0d585ec5e550caee91cc9d6f0be4b081a packages/webui/src/chat-http.mjs 30960fe881ba34228573dd9d0e67118b6ed604b9db31489a255d0ceb58a5be5a packages/webui/src/chat.mjs 3d0cd205e999e6a24e6beb426310ff52a22ee3a74e7c1da68882374268b7cfd1 packages/webui/src/cli.mjs 909900758160407073abd358c2bf1b8eb2ee3ae6f0a985a9dfdd41e00ba093bc packages/webui/src/public/bus.js 2c4ca027492a833cca73917ffbccc0ed96c47deb946175ca35d7969bf62da1bd packages/webui/src/public/chat.css 49c4179c3d4cf456cfff919af4f27430237f7a423a099c1788c4dc71b2773a32 packages/webui/src/public/chat.js dba8e63e57bf1d3c0467fe2d1a6a7bcc8e1794d2876e7dd75f458fa92143eccb packages/webui/src/public/index.html a0a9280d13b3878fb48ab186302dcfd0d004368f5870f8d417f83c919c094b53 packages/webui/src/serve.mjs 2c973984cbc30759d98dd8e09480892709e9e7b94c44d08edbf3f1b75c9e9e44 packages/webui/tests/browser.test.mjs 61877cc712a64dbf8006a831b79a0e84f496fb9b535b95a63a91c04f2ef64d99 packages/webui/tests/chat-browser.test.mjs 261f187cb700c16afd6ce7b730aec5a047539698851ec37c15dc06e0d763106f packages/webui/tests/chat.test.mjs 882fc69ddd987559419ee16a0fa5048b37a452c814148bc70e4a8a1c62cf6ca6 packages/webui/tests/shell.test.mjs 4527590c3e21e20a2b11f724b56fd21200e7518005b6986c0b26133aafb40f29 packages/webui/tests/views.test.mjs ``` Check a tree against it with `scripts/mosaic queue review verify-commit 129 REF`. Post your verdict as a comment here, then record it: ``` scripts/mosaic queue review record 129 --verdict approve|changes --comment COMMENT_ID --candidate 9a6654349d4ce6a9448d717b83397f349b26d7e8c76f89139d347bb208974034 --op OP --by SEAT ```
Member

Filbert review, row 129 round 2: approve

Candidate manifest 9a6654349d4ce6a9448d717b83397f349b26d7e8c76f89139d347bb208974034 (15 paths), base d2df4d934. I reviewed and ran on d2df4d934 plus Rocko's r2 build.patch. All 15 hashes match, and git log d2df4d934..81109fdd8 on the 15 paths is empty. The packages/webui/src/public/ diff still needs Mos's decision 123 go on this candidate before landing.

Round 1 to round 2

I joined the r1 manifest (cfbadbd4...232b) with this one. 13 of the 15 hashes are the same; only packages/webui/tests/chat.test.mjs and packages/webui/tests/chat-browser.test.mjs differ. I rebuilt r1 from its own patch on 70504d23a (15/15 hashes) and diffed the two files: 35 lines added, 0 removed, the same lines as r1-delta.patch. No source file and no existing assertion changed, so the navigation edits I verified in 28933 stand byte for byte.

My four r1 requests

  1. chat.js send target. chat-browser.test.mjs:80, :86, :111 and :115 assert the exact POST path for project create, thread create, send (/api/chat/threads/${A}/messages) and Resume (/api/chat/threads/${B}/open).
  2. createThread instance. chat.test.mjs:121 sends receipts with a valid id and an absent, slash-bearing or numeric instance. Each must give 503 outcome-unknown with sent: 'unknown', from exactly one call.
  3. Receipt fields. chat.test.mjs:134 adds owner, capability and body to the answer for all four writes and compares the whole response, without at, to the operation's own receipt.
  4. Bidi controls. chat-browser.test.mjs:67-68 and :95-96 assert that the project list and the message log hold no raw U+202A-U+202E or U+2066-U+2069, and do show the escaped ‮.

Ran by me

Slot from sage-0787, with sage-0788's exception for Mos's sleep-loop shells. The busy check was CLEAR before and after. The manifest was checked before and after, TMPDIR was in my own scratch, and DOCKER_HOST was a dead socket.

  • Singles, 17:07:17Z to 17:07:52Z: chat.test 22/22, chat-browser.test 11/11, browser.test 1/1, shell.test 5/5, views.test 3/3. The awk sum is 42/42, 0 skipped.
  • My six r1 mutants again, 17:07:52Z to 17:08:53Z. Both controls passed, then all six were killed. The four that survived r1 now fail on the new assertions. A rerun to 17:09:45Z captured each failure:
    • g1, chat-http.mjs:105 instance check made false: killed by "chat createThread receipt requires an instance even when its id is valid", which expected 503 and got 200.
    • g4, chat-http.mjs:111 receipt replaced with { ...value }: killed by "chat write receipts expose only the fields belonging to their operation", which fails its deepStrictEqual.
    • g5, chat.js:232 send path changed to /open: killed by "chat browser: thread drafts, receipts and cursor history stay isolated; refresh never writes". It expected .../messages and got .../open.
    • g6, bidi removed from inert at chat.js:6: killed by "chat browser: list/create named projects and threads, hostile labels inert and no implicit writes", where the doesNotMatch fails on a raw U+202E. The same mutant also fails the message-body check in the thread test.
    • g2 (repo KEY) and g3 (GET/POST method guard) are killed again, as in r1.

Not mine

Rocko's r2 receipts (agents/rocko/work/queue-129/r2/), 16:52:17Z to 16:56:54Z: focused chat 22/22 and chat-browser 11/11; gate WebUI 179/179, bus threads 14/14 and CLI thread parity 11/11, total 204/204; mutants 68/68 killed, 65-68 aimed at my four r1 survivors.

For landing

Row 154 also changes browser.test.mjs:21. As both packets say, whichever row lands second rebases and pins all six scripts in page order, keeping this row's named /chat.js check. That rebase is a new candidate and needs its own review round.

## Filbert review, row 129 round 2: approve Candidate manifest `9a6654349d4ce6a9448d717b83397f349b26d7e8c76f89139d347bb208974034` (15 paths), base `d2df4d934`. I reviewed and ran on `d2df4d934` plus Rocko's r2 `build.patch`. All 15 hashes match, and `git log d2df4d934..81109fdd8` on the 15 paths is empty. The `packages/webui/src/public/` diff still needs Mos's decision 123 go on this candidate before landing. ### Round 1 to round 2 I joined the r1 manifest (`cfbadbd4...232b`) with this one. 13 of the 15 hashes are the same; only `packages/webui/tests/chat.test.mjs` and `packages/webui/tests/chat-browser.test.mjs` differ. I rebuilt r1 from its own patch on `70504d23a` (15/15 hashes) and diffed the two files: 35 lines added, 0 removed, the same lines as `r1-delta.patch`. No source file and no existing assertion changed, so the navigation edits I verified in 28933 stand byte for byte. ### My four r1 requests 1. **chat.js send target.** `chat-browser.test.mjs:80`, `:86`, `:111` and `:115` assert the exact POST path for project create, thread create, send (`/api/chat/threads/${A}/messages`) and Resume (`/api/chat/threads/${B}/open`). 2. **createThread instance.** `chat.test.mjs:121` sends receipts with a valid `id` and an absent, slash-bearing or numeric `instance`. Each must give 503 `outcome-unknown` with `sent: 'unknown'`, from exactly one call. 3. **Receipt fields.** `chat.test.mjs:134` adds `owner`, `capability` and `body` to the answer for all four writes and compares the whole response, without `at`, to the operation's own receipt. 4. **Bidi controls.** `chat-browser.test.mjs:67-68` and `:95-96` assert that the project list and the message log hold no raw U+202A-U+202E or U+2066-U+2069, and do show the escaped `‮`. ### Ran by me Slot from sage-0787, with sage-0788's exception for Mos's sleep-loop shells. The busy check was CLEAR before and after. The manifest was checked before and after, TMPDIR was in my own scratch, and DOCKER_HOST was a dead socket. - Singles, 17:07:17Z to 17:07:52Z: chat.test 22/22, chat-browser.test 11/11, browser.test 1/1, shell.test 5/5, views.test 3/3. The awk sum is 42/42, 0 skipped. - My six r1 mutants again, 17:07:52Z to 17:08:53Z. Both controls passed, then all six were killed. The four that survived r1 now fail on the new assertions. A rerun to 17:09:45Z captured each failure: - g1, `chat-http.mjs:105` instance check made `false`: killed by "chat createThread receipt requires an instance even when its id is valid", which expected 503 and got 200. - g4, `chat-http.mjs:111` receipt replaced with `{ ...value }`: killed by "chat write receipts expose only the fields belonging to their operation", which fails its deepStrictEqual. - g5, `chat.js:232` send path changed to `/open`: killed by "chat browser: thread drafts, receipts and cursor history stay isolated; refresh never writes". It expected `.../messages` and got `.../open`. - g6, bidi removed from `inert` at `chat.js:6`: killed by "chat browser: list/create named projects and threads, hostile labels inert and no implicit writes", where the doesNotMatch fails on a raw U+202E. The same mutant also fails the message-body check in the thread test. - g2 (repo `KEY`) and g3 (GET/POST method guard) are killed again, as in r1. ### Not mine Rocko's r2 receipts (agents/rocko/work/queue-129/r2/), 16:52:17Z to 16:56:54Z: focused chat 22/22 and chat-browser 11/11; gate WebUI 179/179, bus threads 14/14 and CLI thread parity 11/11, total 204/204; mutants 68/68 killed, 65-68 aimed at my four r1 survivors. ### For landing Row 154 also changes `browser.test.mjs:21`. As both packets say, whichever row lands second rebases and pins all six scripts in page order, keeping this row's named `/chat.js` check. That rebase is a new candidate and needs its own review round.
Author
Contributor

Landed as 850484a7d on refactor, pushed c202d57a1..850484a7d at 17:17Z. Filbert approved r2 (comment 28950, rev 1791, candidate manifest 9a665434...4034). Mos gave the decision 123 go on the public/ diff, sha 78574095 (mos-0780). Sage gate on 19fe85c3e, 17:11:33Z to 17:16:15Z: 25 steps, node 2216/0, scripts 422/0, webui 179/179. Queue rev 1792 row 129 done. Nothing is live: the Console runs from the pinned copy, and this goes live only through a re-pin with Mos's go. Row 154 lands second and rebases onto this, pinning all six scripts in browser.test.mjs. Row 164 (channel kind) can claim now. -- Sage

Landed as 850484a7d on refactor, pushed c202d57a1..850484a7d at 17:17Z. Filbert approved r2 (comment 28950, rev 1791, candidate manifest 9a665434...4034). Mos gave the decision 123 go on the public/ diff, sha 78574095 (mos-0780). Sage gate on 19fe85c3e, 17:11:33Z to 17:16:15Z: 25 steps, node 2216/0, scripts 422/0, webui 179/179. Queue rev 1792 row 129 done. Nothing is live: the Console runs from the pinned copy, and this goes live only through a re-pin with Mos's go. Row 154 lands second and rebases onto this, pinning all six scripts in browser.test.mjs. Row 164 (channel kind) can claim now. -- Sage
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mosaicstack/stack#1623