Unclaimed files left in the canonical checkout. Inventory: canonical-cleanup-inventory.md (commit-as-evidence groups). detect-secrets scan clean on 2026-11-02: hits are sha256 pins, git object ids, test sentinels already in tracked tests and unit-file lines.
13 KiB
Row 129 / #1623 — round 2, test gaps only
Brief and approved behavior are unchanged from ../r1/BUILD.md and ../DESIGN.md.
Reviewer Filbert, gate owner Sage; public/ landing still needs Mos's decision 123 go.
Responds to Filbert comment 28933 and sage-0768; row reopened at rev 1781.
Base d2df4d934, the current origin/refactor when rebuilt. No candidate path drift
from r1's 70504d23a base. All product/docs/navigation-test hashes match r1 exactly;
source-parity.json lists the only two changed files. Source remains staged and
uncommitted in /mnt/storage/src/mosaic-stack-rocko-129-r2.
Review mapping
| Finding | Test addition | Mutant / exact killing test prefix |
|---|---|---|
| 1, send target | chat-browser.test.mjs now asserts exact project-create, thread-create, send /messages and Resume /open POST paths alongside the existing payload checks | 65-send-post-path; chat browser: thread drafts, receipts and cursor history |
| 2, createThread instance | chat.test.mjs adds valid-id receipts with absent, slash-bearing and numeric instances; each must be outcome-unknown, HTTP 503, sent unknown, exactly one call | 66-instance-receipt; chat createThread receipt requires an instance even when its id is valid |
| 3, receipt fields | chat.test.mjs gives all four write operations extra owner/capability/body fields and compares the full non-timestamp receipt with that operation's expected receipt | 67-receipt-fields; chat write receipts expose only the fields belonging to their operation |
| 4, bidi | chat-browser.test.mjs asserts no raw bidi controls and a literal escaped U+202E in both the project label and message body | 68-bidi-controls; chat browser: list/create named projects |
Existing assertions remain. No production source was changed or needed fixing. The original 64 exact-once mutants and their killing names are retained unchanged in mutants.py, alongside the four additions. Read-only preflight found 68/68 unique sites; its initial new send-path typo was corrected before any mutation.
Run plan and boundaries
Sage approved the plan in sage-0773 and granted the slot in sage-0776. The busy check was gated with && before the focused files. Order: focused chat.test and chat-browser; original targeted gate (WebUI including browser files, bus threads, CLI thread parity); all 68 mutants. TMPDIR=/mnt/storage/scratch/rocko-129-r2/tmp; DOCKER_HOST=unix:///nonexistent.sock. No Docker, shell suites or live actions. Sage retains full landing gate. Pipefail/exit status gate every step. Mutants use start_new_session, kill process groups/descendants on timeout, restore bytes in finally and reject syntax errors, missing imports or timeouts as kills. Sweep own cwd-scoped node/chromium processes before returning the slot.
Existing navigation edits, retained byte-for-byte from r1
Sage-0747 approved and Filbert verified these exact named assertions in 28933:
| File:line | Old | New | Reason |
|---|---|---|---|
| packages/webui/tests/browser.test.mjs:21 | 4 scripts | 5, with /chat.js exactly once | index adds Chat script |
| packages/webui/tests/shell.test.mjs:266 | 9 section SVGs | 10, named Chat href and inbox icon | Chat section |
| packages/webui/tests/shell.test.mjs:463 | 9 palette hrefs | 10, exact list includes #/chat | Chat destination |
| packages/webui/tests/views.test.mjs:59 | 9-link wait | 10 plus Chat href/name | shared Queue/Business/Settings readiness |
| packages/webui/tests/views.test.mjs:59 | same shared 9-link wait | same named 10-link wait | shared secrets/refusals readiness |
Observed results and the complete mutant table are recorded below after the authorized run.
Row 154 landing overlap (sage-0776)
Row 154 is landing next and also changes browser.test.mjs:21: it replaces the script count with a pinned list of script names ending /bus.js. Whichever row lands second rebases and pins all six scripts, retaining the named Chat script assertion. Recheck the landing base and this exact hunk before review/landing; this r2 retains r1's existing navigation test bytes until that rebase is directed.
Observed round-2 results
Span 2026-10-18T16:52:17Z–16:56:54Z, slot clear sent after the sweep. Focused files: chat 22/22, chat-browser 11/11, awk sum 33/33 (subsets of gate). Targeted gate: WebUI 179/179, bus threads 14/14, CLI thread parity 11/11, awk sum 204/204. Every log has zero fail/cancelled/skipped; see gate-counts.txt, focused-counts.txt and suite-counts.json. The gate ended 16:55:27Z.
Mutants: all original 64 and review additions 65–68 killed, 68/68; zero survivor, invalid or timeout. Each mutant log names the intended failing test (verified in mutant-killers-verified.json). No tracked flake recurrence. Product source was already correct; only the two test files differ from round 1.
verify.py reconstructed all 15 paths from base+patch and checked every worktree and staged hash. Its final cwd-scoped node/chromium sweep was empty at 16:56:54Z. No Docker, shell suite or live action.
Complete kill table
| Mutant | Owning test file | Killing test name/prefix | Result |
|---|---|---|---|
| 01-project-list | packages/webui/tests/chat.test.mjs | chat reads map only fixed verbs | KILLED |
| 02-thread-filter | packages/webui/tests/chat.test.mjs | chat reads map only fixed verbs | KILLED |
| 03-project-repo | packages/webui/tests/chat.test.mjs | chat project.create: one verified write | KILLED |
| 04-thread-name | packages/webui/tests/chat.test.mjs | chat thread.create: one verified write | KILLED |
| 05-request-class | packages/webui/tests/chat.test.mjs | chat thread.send: one verified write | KILLED |
| 06-thread-target | packages/webui/tests/chat.test.mjs | chat thread.send: one verified write | KILLED |
| 07-resume-verb | packages/webui/tests/chat.test.mjs | chat thread.open: one verified write | KILLED |
| 08-owner-status | packages/webui/tests/chat.test.mjs | REQ-USER-2 real broker | KILLED |
| 09-foreign-status | packages/webui/tests/chat.test.mjs | REQ-USER-2 real broker | KILLED |
| 10-strict-query | packages/webui/tests/chat.test.mjs | chat refuses malformed and repeated query/id values | KILLED |
| 11-uuid | packages/webui/tests/chat.test.mjs | chat refuses malformed and repeated query/id values | KILLED |
| 12-page-limit | packages/webui/tests/chat.test.mjs | chat refuses malformed and repeated query/id values | KILLED |
| 13-default-page | packages/webui/tests/chat.test.mjs | chat reads map only fixed verbs | KILLED |
| 14-cursor | packages/webui/tests/chat.test.mjs | chat reads map only fixed verbs | KILLED |
| 15-more-metadata | packages/webui/tests/chat.test.mjs | chat reads map only fixed verbs | KILLED |
| 16-read-array | packages/webui/tests/chat.test.mjs | chat read failures redact ownership | KILLED |
| 17-send-mode | packages/webui/tests/chat.test.mjs | chat repeats every POST boundary | KILLED |
| 18-named-host | packages/webui/tests/chat.test.mjs | chat repeats every POST boundary | KILLED |
| 19-single-identity | packages/webui/tests/chat.test.mjs | chat repeats every POST boundary | KILLED |
| 20-origin | packages/webui/tests/chat.test.mjs | chat repeats every POST boundary | KILLED |
| 21-fetch-metadata | packages/webui/tests/chat.test.mjs | chat repeats every POST boundary | KILLED |
| 22-json-type | packages/webui/tests/chat.test.mjs | chat project.create: each existing Console write fence | KILLED |
| 23-json-byte-bound | packages/webui/tests/chat.test.mjs | chat thread.send: each existing Console write fence | KILLED |
| 24-strict-shape | packages/webui/tests/chat.test.mjs | chat validates names, body, project | KILLED |
| 25-name-length | packages/webui/tests/chat.test.mjs | chat validates names, body, project | KILLED |
| 26-nonempty-body | packages/webui/tests/chat.test.mjs | chat validates names, body, project | KILLED |
| 27-verified-ack | packages/webui/tests/chat.test.mjs | chat project.create: refusal or lost/malformed receipt | KILLED |
| 28-opened-ack | packages/webui/tests/chat.test.mjs | chat thread.open: refusal or lost/malformed receipt | KILLED |
| 29-no-retry | packages/webui/tests/chat.test.mjs | chat project.create: refusal or lost/malformed receipt | KILLED |
| 30-uncertain-state | packages/webui/tests/chat.test.mjs | chat project.create: refusal or lost/malformed receipt | KILLED |
| 31-private-errors | packages/webui/tests/chat.test.mjs | chat project.create: refusal or lost/malformed receipt | KILLED |
| 32-dispatch | packages/webui/tests/chat.test.mjs | chat reads map only fixed verbs | KILLED |
| 33-cli-adapter | packages/webui/tests/chat.test.mjs | configured Console process injects chat | KILLED |
| 34-static-script | packages/webui/tests/chat.test.mjs | chat assets, GET purity | KILLED |
| 35-nav | packages/webui/tests/chat-browser.test.mjs | chat browser: list/create named projects | KILLED |
| 36-inert-bodies | packages/webui/tests/chat-browser.test.mjs | chat browser: thread drafts, receipts and cursor history | KILLED |
| 37-thread-drafts | packages/webui/tests/chat-browser.test.mjs | chat browser: thread drafts, receipts and cursor history | KILLED |
| 38-submit-once | packages/webui/tests/chat-browser.test.mjs | chat browser: page forward and deduplicate replies | KILLED |
| 39-browser-byte-bound | packages/webui/tests/chat-browser.test.mjs | chat browser: page forward and deduplicate replies | KILLED |
| 40-manual-redirect | packages/webui/tests/chat-browser.test.mjs | chat browser: thread drafts, receipts and cursor history | KILLED |
| 41-stale-read-refusal | packages/webui/tests/chat-browser.test.mjs | chat browser: a late read from A cannot paint B | KILLED |
| 42-owner-cache | packages/webui/tests/chat-browser.test.mjs | chat browser: uncertain writes retain draft | KILLED |
| 43-bounded-display | packages/webui/tests/chat-browser.test.mjs | chat browser: display stays bounded | KILLED |
| 44-no-write-get | packages/webui/tests/chat.test.mjs | chat reads map only fixed verbs | KILLED |
| 45-inert-labels | packages/webui/tests/chat-browser.test.mjs | chat browser: list/create named projects | KILLED |
| 46-thread-repo-ui | packages/webui/tests/chat-browser.test.mjs | chat browser: list/create named projects | KILLED |
| 47-abort-old-reads | packages/webui/tests/chat-browser.test.mjs | chat browser: a late read from A cannot paint B | KILLED |
| 48-forget-private-cache | packages/webui/tests/chat-browser.test.mjs | chat browser: a refusal elsewhere forgets private chat drafts | KILLED |
| 49-polling | packages/webui/tests/chat-browser.test.mjs | chat browser: automatic polling follows a reply | KILLED |
| 50-control-visibility | packages/webui/tests/chat-browser.test.mjs | chat browser: list/create named projects | KILLED |
| 51-safe-link-id | packages/webui/tests/chat-browser.test.mjs | chat browser: list/create named projects | KILLED |
| 52-name-controls | packages/webui/tests/chat.test.mjs | chat validates names, body, project | KILLED |
| 53-after-id | packages/webui/tests/chat.test.mjs | chat refuses malformed and repeated query/id values | KILLED |
| 54-readonly-controls | packages/webui/tests/chat-browser.test.mjs | chat browser: uncertain writes retain draft | KILLED |
| 55-ui-ack | packages/webui/tests/chat-browser.test.mjs | chat browser: a confirmed visible message replaces its pending receipt | KILLED |
| 56-explicit-tail | packages/webui/tests/chat-browser.test.mjs | chat browser: scrolled history stays put | KILLED |
| 57-own-send-tail | packages/webui/tests/chat-browser.test.mjs | chat browser: scrolled history stays put | KILLED |
| 58-shown-receipt | packages/webui/tests/chat-browser.test.mjs | chat browser: a confirmed visible message replaces its pending receipt | KILLED |
| 59-late-create | packages/webui/tests/chat-browser.test.mjs | chat browser: a late project creation receipt | KILLED |
| 60-static-style | packages/webui/tests/chat.test.mjs | chat assets, GET purity | KILLED |
| 61-cli-adapter-option | packages/webui/tests/chat.test.mjs | configured Console process injects chat | KILLED |
| 62-palette | packages/webui/tests/chat-browser.test.mjs | chat browser: list/create named projects | KILLED |
| 63-caret | packages/webui/tests/chat-browser.test.mjs | chat browser: thread drafts, receipts and cursor history | KILLED |
| 64-readonly-submit | packages/webui/tests/chat-browser.test.mjs | chat browser: uncertain writes retain draft | KILLED |
| 65-send-post-path | packages/webui/tests/chat-browser.test.mjs | chat browser: thread drafts, receipts and cursor history | KILLED |
| 66-instance-receipt | packages/webui/tests/chat.test.mjs | chat createThread receipt requires an instance even when its id is valid | KILLED |
| 67-receipt-fields | packages/webui/tests/chat.test.mjs | chat write receipts expose only the fields belonging to their operation | KILLED |
| 68-bidi-controls | packages/webui/tests/chat-browser.test.mjs | chat browser: list/create named projects | KILLED |