474 lines
31 KiB
Markdown
474 lines
31 KiB
Markdown
# Row 225 (C2-10b) Console chat: replies, citations, write notices, status line
|
|
|
|
Owner: Morgana, from sage-3582 (18:53Z 10-23). Base: origin/refactor 45dca69f6. Branch: morgana/row225.
|
|
Brief: docs/plans/2026-10-20_case2-rows.md, C2-10b. Design: agents/gosalyn/work/case2/DESIGN.md 7.4,
|
|
5.2 (the reply schema and the check result) and the write notice and `library.revert` (about line 286).
|
|
|
|
## Ruling on the dependency gap (sage-3591)
|
|
|
|
225 builds against the design contracts. `renderReply` stays pure, and the caller supplies the answers
|
|
it can't know. The revert route proxies to the bus verb and shows the refusal code until the verb
|
|
exists. Landing order: 225 lands after 217 (C2-06), not after 288 (C2-02). Sage adds `after 217` to
|
|
row 225. Before 288 lands, the Revert button gets the bus's refusal and shows its code, as the brief
|
|
allows.
|
|
|
|
## A1. The check result I assume (to 217, Launchpad)
|
|
|
|
The broker stores one check result with each agent-to-human message the guard passes. The Console reads
|
|
it on the message row that `/api/chat/threads/<id>/messages` returns, under the key `check`:
|
|
|
|
```json
|
|
{
|
|
"check": {
|
|
"citations": [
|
|
{ "scope": "canon", "agent": null },
|
|
{ "scope": "supporting", "agent": "acme/scribe" },
|
|
{ "scope": "web", "agent": null }
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
- `check` is `null` or absent on a message the guard didn't check: a human's message, a free-text reply,
|
|
a notice, or a message from before 217.
|
|
- `check.citations` has one entry per entry of the body's `citations`, in the same order.
|
|
- `scope` is one of `canon`, `playground`, `supporting` and `web`. A url cite is `web`.
|
|
- `agent` is the `Mosaic-Agent` trailer value, `<business>/<instance>`, from
|
|
`git log -1 --format=%(trailers:key=Mosaic-Agent,valueonly) <commit> -- <path>`, or `null` when the
|
|
file's last commit at `commit` carries none. A url cite has `agent: null`. The Console shows the
|
|
agent-written label when `agent` is a nonempty string, and names the agent.
|
|
|
|
The Console trusts nothing in the body for scope or label. A cite with no matching check entry renders
|
|
with no badge and no label. It doesn't fall back to a scope it worked out itself.
|
|
|
|
If 217 uses other names, I change mine to theirs before either of us pushes (sage-3591 item 1).
|
|
|
|
## A2. The revert verb I assume (to 288, Honker)
|
|
|
|
- Verb: `library.revert`. A human verb (design M4): from an agent session it refuses `human-required`,
|
|
like `library.status` (`broker.mjs:5133`).
|
|
- Args: `{ "project": <business project name>, "commit": <40 lowercase hex> }`. The design writes
|
|
`library.revert {commit}`. `project` is added to match the other library verbs, and like theirs it is the
|
|
key of `business.projects` (`mirror.mjs:31`), which is the chat project's `repo` link, not its UUID. Both are required, and no other key
|
|
is allowed (`invalid-request`), as the other library verbs check with `keys(args, ...)`.
|
|
- Result: `{ "project", "path", "reverted": <the commit given>, "commit": <the new commit> }`.
|
|
- Refusal codes the Console shows by name:
|
|
- `library-revert-not-agent`: `commit` has no `Mosaic-Agent` trailer for this business, or isn't
|
|
reachable from the served commit.
|
|
- `stale-base`: a later commit changed that path.
|
|
- `human-required`, `invalid-request`, `project-not-configured`.
|
|
- Before 288 lands, the bus refuses the verb (expected `unknown-verb`, `broker.mjs:6578`), and the Console
|
|
shows that code.
|
|
- HTTP status in the Console (`packages/webui/src/bus.mjs` `busStatus`): `stale-base` and
|
|
`library-revert-not-agent` map to 409. Every other code keeps the existing mapping.
|
|
|
|
## A3. The status line
|
|
|
|
`GET /api/library/status?project=<id>` proxies `library.status {project}` through the existing
|
|
`libraryStatus` option. `cli.mjs:110` already passes that option, but `startServer` doesn't read it.
|
|
The status line shows:
|
|
|
|
- the served commit (7 characters) and its age;
|
|
- `library-diverged` when the sync state names it;
|
|
- the fetch error code;
|
|
- the reply limits in force, and the keys that fell back;
|
|
- the count of R-problems, linking to the list.
|
|
|
|
It reads the fields `readSyncState` returns at the base (`packages/library/src/mirror.mjs:232`). It shows
|
|
any field 217 adds (the limits) only when present.
|
|
|
|
## A4. "Changed since" (ruled sage-3596)
|
|
|
|
Sage ruled that 217 supplies `last`. On a `thread.messages` row that carries `check`, each path cite's
|
|
entry gets `last`, the file's last commit at the served tip, read when the message is read. When `last`
|
|
is absent the Console marks nothing changed, and a test pins that.
|
|
|
|
One more field is needed, raised in morgana-0200. The cited `commit` is a library commit, not the
|
|
file's own last commit, so a cite made at a commit that didn't touch the file would differ from `last`
|
|
while the file is unchanged. I asked 217 to also store `file`, the file's last commit at the cited
|
|
commit. That's `%H` from the same `git log -1 <commit> -- <path>` call that reads the trailer, so it
|
|
costs no extra git call. The Console marks a cite changed when both `file` and `last` are 40-hex and
|
|
differ. The cited commit is reachable from the served one (5.2), so `file` is an ancestor of `last`,
|
|
and differing means newer. A missing or malformed `file` or `last` marks nothing.
|
|
|
|
The entry the Console reads, in full: `{ scope, agent, file?, last? }`.
|
|
|
|
## A5. `no-cited-answer` retires
|
|
|
|
`renderItems` and its `NOTICES` (`no-cited-answer`, `no-answer`, `turn-failed`) go. 217 sends the
|
|
runner's fixed texts as plain bodies (design 5.2, "Runner texts"), and renderReply shows those as free
|
|
text. Design 7.4 names no other notice than `library-write`, so nothing is lost (sage-3596 item 3).
|
|
|
|
## Files
|
|
|
|
Both deviations below were accepted in sage-3596 and are named in the manifest for Dewey. The brief owns these:
|
|
|
|
- `packages/library/src/render.mjs`: `renderReply` replaces `renderItems`.
|
|
- `packages/library/src/index.mjs`: the export.
|
|
- `packages/library/README.md`: the section.
|
|
- `packages/library/tests/render.test.mjs`.
|
|
|
|
It also owns `bus.js`, its stylesheet, `serve.mjs` (only the two routes) and new webui tests. Two
|
|
deviations, both recorded here:
|
|
|
|
- The chat view's message list is `packages/webui/src/public/chat.js:85` (`window.MosaicChat`), not
|
|
`bus.js`. The reply, notice and Revert rendering goes in `chat.js` and `chat.css`. The status line
|
|
goes in the chat thread view, so it is also in `chat.js`.
|
|
- `packages/webui/src/console-bus.mjs` and `cli.mjs` each get one `libraryRevert` line, beside the
|
|
existing `libraryStatus` wiring.
|
|
|
|
## Overlap with row 220 (C2-10a, Researcher, 3ef6da90d)
|
|
|
|
220 changes one line each in the webui tests discord.test.mjs, fixture.mjs, history-fixture.mjs,
|
|
relaunch.test.mjs and return-flow.test.mjs. Its other paths are in control-board, conversation, discord
|
|
and business. 225 doesn't touch those five files or those packages. Its webui tests are new files.
|
|
|
|
## Handoff to Fethry (mos-1501, Q245)
|
|
|
|
The row moved to Fethry (Codex, fethry/row225). Everything below is **untested**: no suite or single file
|
|
has run on it, since a run needs Sage's CLEAR. Each changed file passes `node --check`.
|
|
|
|
Done in the handoff commit:
|
|
|
|
- `render.mjs` `renderReply(body, {check, changed, name})`; index export; README section;
|
|
`render.test.mjs` rewritten. `renderItems` is gone from every package.
|
|
- `serve.mjs`: `/render.mjs` static entry (owner and user file maps), `GET /api/library/status`
|
|
(one `project` query, answer must name that project), `POST /api/library/revert` (save's boundary,
|
|
strict `{project, commit}`, refusal shows the code, lost or unusable answer is `outcome-unknown`,
|
|
never retried). Both are nulled for a granted user, and `userRoute` keeps them owner-only. The tester
|
|
listener refuses `libraryRevert`.
|
|
- `bus.mjs`: `library-revert-not-agent: 409`. That re-pins `packages/webui/src/bus.mjs` in
|
|
`packages/bus/tests/channel-proof.test.mjs`, with a comment line, as row 254 did. It's a third deviation,
|
|
in another package's test.
|
|
- `console-bus.mjs` and `cli.mjs`: `libraryRevert`, beside `libraryStatus`.
|
|
- `chat.js`: dynamic `import('/render.mjs')` (CSP is `script-src 'self'`); body text until it loads.
|
|
Cites with a scope badge, the agent-written label, "changed since" from `file`/`last`, links only for
|
|
https with `rel="noopener noreferrer"`. A notice gets a Revert button behind `confirm()`. The library
|
|
status line goes under the thread heading.
|
|
- `chat.css`: cite, badge, notice and status styles.
|
|
- New tests: `packages/webui/tests/library-routes.test.mjs` and
|
|
`packages/webui/tests/chat-replies-browser.test.mjs`. 220's five files are untouched.
|
|
|
|
Decisions made in the build:
|
|
|
|
- The library name is the chat project's `repo`. A project with no repo reads no status and its
|
|
Revert does nothing.
|
|
- These codes hide the status line: `project-not-declared`, `library-mapping-invalid`,
|
|
`project-not-configured`, `not-configured` and `owner-only`.
|
|
- Otherwise every code-repo thread, and every granted user, would show "unavailable".
|
|
- Cost: a broken library mapping also hides the line. `library.status` from the CLI still shows it.
|
|
- "Age" is the time since `lastFetch` ("fetched 5 min ago"), not the served commit's age, which the
|
|
status doesn't carry.
|
|
- The limits fields are assumed to be `replyLimits {requireCitation, citationsPerReply}` and
|
|
`replyLimitsFallback [keys]`, and are shown only when present. **Not agreed with 217.** Confirm with
|
|
Beakley and rename.
|
|
- Correction (dewey-0937 B1, sage-3669): shape alone cannot authenticate a notice. An agent in a
|
|
library business could name another agent's real reachable commit while claiming a fake path,
|
|
misleading the human into reverting a different file. The renderer must require no stored check
|
|
result before treating a notice-shaped body as a broker notice. A checked body stays plain text.
|
|
Pre-217 messages have no check, so a notice-shaped legacy body still renders as a notice; Sage
|
|
accepts that residual in this test system with no real agent history and owns the later positive
|
|
broker-marker follow-up after10-27. No marker or row288 dependency is added by225.
|
|
|
|
Left:
|
|
|
|
1. Get CLEAR and run the webui and library suites, `channel-proof.test.mjs`, and the two new files whole.
|
|
The browser test's selectors and waits have never run.
|
|
2. Agree the limits field names with 217 (Beakley).
|
|
3. Granted-user R6 G5 (`granted-user.test.mjs:252`) lists owner verbs by hand. Add `library.revert`
|
|
once 288 lands.
|
|
4. BUILD.md: the mutant list and the mos-1275 timeout plan.
|
|
5. The manifest names the three deviations: chat.js and chat.css in place of bus.js, the console-bus and
|
|
cli lines, and the channel-proof re-pin.
|
|
|
|
## Fethry continuation (2026-10-23, Q245)
|
|
|
|
Owner: Fethry, thread 14f80e3c-ace7-4793-a577-e1275ca09b0b. Branch fethry/row225.
|
|
This file carries Morgana's complete BUILD.md above unchanged, recovered from 9a131e956
|
|
(base 45dca69f6). Morgana stopped editing 225 at that handoff. Issue #1726; Dewey reviews.
|
|
Sage owns queue moves, test slots, gate and landing. No Node/tests until Sage CLEAR
|
|
(sage-3611); commits/pushes before the gate are explicitly Untested. No credential files read.
|
|
|
|
### Confirmed interfaces and rulings
|
|
|
|
- Beakley beakley-0004 confirms ordered check.citations {scope, agent, file, last}; a missing
|
|
or malformed file/last means no changed marker. Fetched age accurately describes lastFetch.
|
|
- Beakley's concrete library.status shape is replyLimits:
|
|
{requireCitation, citationsPerReply, fallback: [keys], problem: 'reply-limits-unreadable' | null}.
|
|
The inherited top-level replyLimitsFallback assumption is superseded. Show nested fallback and
|
|
problem, with a browser regression test for each. No broker or policy change in this row.
|
|
- Bubba bubba-0002 confirms A2 and the exact broker notice shape. fethry-0005 forwards the
|
|
project-key correction: project is chat project.repo, not the chat UUID.
|
|
- Keep the inherited ordinary-code-repo/granted-user status hiding behavior for now, but a
|
|
library-mapping-invalid error should stay visible: hiding an invalid mapping hides diagnosis.
|
|
Confirm this local UI choice through regression coverage and tell Sage/Dewey.
|
|
|
|
### Continuation plan and acceptance evidence
|
|
|
|
Spec: docs/plans/2026-10-20_case2-rows.md C2-10b; design 5.2 and 7.4;
|
|
standing rulings sage-3591, sage-3596 and sage-3611. Implement inline in this existing isolated
|
|
T3 worktree; use the existing candidate and tests, never restart the implementation.
|
|
|
|
1. Static audit the handoff against the contracts and inherited tests. Add failing coverage for
|
|
nested limits fallback/problem, wrong-project revert receipts, missing file/last and invalid
|
|
mapping visibility. Existing tests require Mos approval through Sage before further edits.
|
|
2. On Sage CLEAR, run the new files whole and library renderer tests with per-test deadlines;
|
|
record RED before changing uncovered behavior. Fix only demonstrated local defects. Run
|
|
targeted GREEN, then the full relevant suites only within the authorized slot.
|
|
3. Record exact commands, timings and output paths. Prepare mutant kill list below; run only on
|
|
CLEAR, using isolated copies so the candidate is never temporarily changed for mutation.
|
|
4. Freeze a manifest containing all source/test/doc changes and all three handoff deviations.
|
|
Push only fethry/*, as additional commits. Send exact head/results to Dewey and Sage; cc Mos
|
|
on pushes/blockers. Sage performs queue moves, gate and landing. No merge/release/live changes.
|
|
|
|
### Existing test changes requiring Mos OK through Sage (mos-1272)
|
|
|
|
Diff against 45dca69f6, inherited from Morgana 9a131e956:
|
|
|
|
| File | Added | Removed | Reason |
|
|
| --- | ---: | ---: | --- |
|
|
| packages/library/tests/render.test.mjs | 80 | 66 | Brief requires retiring renderItems and replacing its tests with renderReply coverage |
|
|
| packages/bus/tests/channel-proof.test.mjs | 3 | 1 | bus.mjs gains library-revert-not-agent:409; refresh that source hash and document why |
|
|
|
|
No further edits to these files pending approval. No edits to row220's five tests.
|
|
The new webui test files are additions against the row base.
|
|
|
|
### Timeout plan (mos-1275)
|
|
|
|
Every Node test run uses --test-concurrency=1 and --test-timeout=30000, under an outer timeout.
|
|
New library/route files: outer 120s each; new browser file: outer 240s. Full library and channel-proof:
|
|
outer 180s; full webui: outer 900s, MOSAIC_REQUIRE_EDITOR_BUILD=1. Full webui requires its own
|
|
packages/webui npm ci per agents/README.md and Sage CLEAR. Output redirects to an evidence log;
|
|
inspect tail, failure names and summary, never claim green from an exit alone. A timeout is a
|
|
failed run: stop, report the exact command/phase/last output, and diagnose before retrying.
|
|
Sage's gate owns every scripts/test-*.sh; no implicit slot or test authority from this plan.
|
|
|
|
### Mutant plan (pending CLEAR)
|
|
|
|
- M1: drop a path badge or the supporting label; cite browser assertions must fail.
|
|
- M2: allow http/javascript links; renderer and browser safe-link assertions must fail.
|
|
- M3: compare cited library commit to last instead of file to last, or treat a missing file/last as
|
|
changed; changed-since assertions must fail, including same-file/different-library-commit.
|
|
- M4: ignore nested fallback/problem; status browser tests must fail.
|
|
- M5: remove a revert fence (send, identity, exact Origin or Fetch Metadata), strict key/commit
|
|
validation or wrong-project receipt validation; route tests must fail with zero unexpected calls.
|
|
- M6: retry a refused/unknown revert; single-call route/browser assertions must fail.
|
|
- M7: remove granted-user library-route fence; owner-only route coverage must fail.
|
|
|
|
Progress: handoff and interfaces recovered; candidate untested. No completion claim.
|
|
|
|
Static evidence correction: the first pushed patch artifact used ordinary context lines, whose
|
|
single-space blank context lines make git diff --check report whitespace in the artifact. Regenerated
|
|
inherited-old-tests.patch with --unified=0; it is the same exact two-file change, applicable with
|
|
git apply --unidiff-zero. No source or existing test changed for this correction.
|
|
|
|
Mutation kit authored at mutants.py (11 concrete mutations across M1-M7), Python AST parse only.
|
|
It archives the committed packages plus their tracked fixture dependencies into disposable snapshots,
|
|
links the existing dependency install read-only in practice (tests do not install), enforces exactly
|
|
one mutation anchor and requires an assertion failure for a kill. It records source hashes before
|
|
and after. It has not run; anchors for the planned fixes intentionally require those fixes first.
|
|
No Node/tests/build/browser work has run in Fethry's session pending Sage CLEAR.
|
|
|
|
### Old-test approval and preservation condition (mos-1510, sage-3623)
|
|
|
|
Mos approves render.test.mjs +80/-66 and channel-proof.test.mjs +3/-1 exactly. No additional edits
|
|
are permitted to either file without a new Mos OK through Sage. The condition on the renderer:
|
|
|
|
- The old malformed-body fixed-line behavior no longer applies. Design 5.2 now says any body
|
|
outside the cited-object schema is free text whose text is the whole body. Rejecting it into a
|
|
fixed line would hide human/free-text/older messages and the four fixed runner texts. The new
|
|
render.test.mjs tests “free text renders as itself with no citations” and “a body without the
|
|
reply or notice shape is free text: the whole body, no citations” explicitly cover this new rule.
|
|
- The old no-options path-badge behavior still applies. The new render.test.mjs test “without a
|
|
check result a path cite has no badge, no label and is never changed” covers it, and the browser
|
|
test checks an unchecked path cite has no badge/label. No path inference fallback was added.
|
|
|
|
Dewey checks both against the frozen old-test delta. The two numstats remain 80/66 and 3/1.
|
|
|
|
### Test slot and shared protocol (sage-3623, beakley-0006)
|
|
|
|
Targeted lane A slot is planned around 19:47Z, after Gosalyn's 226 run and Sage's queue gap.
|
|
Wait for explicit CLEAR; the scheduled time alone grants nothing. Hard stop 20:00Z for Sage's
|
|
226 gate. Boyd's lane B bus/cli/business work is disjoint and does not count as a busy lane A.
|
|
The three requested files are the library renderer test and the two new webui files, whole/serial.
|
|
|
|
Beakley confirms reply-protocol.mjs exports only GUARD_CODES (the seven guard refusal codes) and
|
|
FIXED_TEXTS {empty, failed, uncited, tooLong}. It has no scope/notice constants or validator.
|
|
renderReply defines none of those codes or runner texts: it already renders the fixed bodies as free
|
|
text. It therefore needs no protocol import and no extra browser module route (beakley-0006).
|
|
Do not add unused imports or redefine those shared codes/texts later.
|
|
|
|
2026-10-23T19:21:07Z dependency update (bubba-0006): Bubba's first static row288 push is
|
|
origin/bubba/row288 c867cada9, explicitly Untested with no Node run. A2 library.revert uses the
|
|
business.projects key; broker notice retains the exact agreed body. Bubba adds librarySave only
|
|
in console-bus.mjs/cli.mjs and leaves libraryRevert wiring owned by 225. Preserve both callback
|
|
changes when Sage integrates. No dependency merge or test run performed here; 225 still lands
|
|
after 217 and may show unknown-verb until 288 lands.
|
|
|
|
## T1 targeted RED to GREEN (sage-3641, 2026-10-23T19:23Z)
|
|
|
|
All three files ran whole and serial, with TMPDIR=/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2,
|
|
--test-concurrency=1 --test-timeout=30000 and outer timeout -k 10 (120s renderer, 120s routes,
|
|
240s browser). Initial renderer 9/0 (0.105s), routes 9/3 (0.226s), browser 5/3 (5.630s).
|
|
Final renderer 9/0 (0.105s), routes 12/0 (0.212s), browser 8/0 (5.284s). Logs in evidence/.
|
|
|
|
Production fixes after RED:
|
|
- Reject a library.revert receipt with the wrong project as outcome-unknown; no retry.
|
|
- Read replyLimits.fallback and display replyLimits.problem per beakley-0004/0006.
|
|
- Show library-mapping-invalid in the status line; its hidden-status branch is covered by the
|
|
browser refusal matrix once the nested-limits assertion passes. This diagnosis was made statically;
|
|
the first RED exits that matrix at the preceding fallback assertion, so visibility itself has only
|
|
a GREEN run, unlike the fallback/problem and wrong-project fixes.
|
|
|
|
Three assertion corrections in NEW handoff files (not pre-existing tests, per sage-3647):
|
|
1. library-routes.test.mjs: POST /api/library/status in preview mode expects 403, because the existing
|
|
global preview write fence runs before the GET-only route and returns read-only. The route remains
|
|
GET-only and no callback fires on that POST. Do not weaken or bypass the fence to get 405.
|
|
2. library-routes.test.mjs: project-not-declared expects 400, which busStatus already maps at the
|
|
row base. The inherited 502 expectation contradicted that existing map. No production map change.
|
|
3. chat-replies-browser.test.mjs: coerce the whole “img element OR window.injected” expression to a
|
|
Boolean. With no injected node/code the old expression returns undefined, not false. Assertions
|
|
still require neither DOM injection nor executed handler. All preceding cite/link assertions pass.
|
|
|
|
Frozen pre-existing test deltas still render.test.mjs 80/66 and channel-proof.test.mjs 3/1.
|
|
No Node/Chromium process with this slot TMPDIR remained after targeted tests (checked /proc).
|
|
|
|
Expanded CLEAR sage-3647: full library, then channel-proof whole, then isolated mutants that fit;
|
|
still hard stop 19:38Z. No full webui suite, npm ci or editor build authorized in this window.
|
|
|
|
Expanded-slot evidence: full library 81/0 (9.179s), channel-proof 2/0 (0.573s), whole/serial,
|
|
--test-timeout=30000, outer timeout -k 10 180, same TMPDIR. Logs copied to evidence/.
|
|
To exercise invalid-mapping visibility independently, added its own browser case and temporarily
|
|
restored only the hidden-mapping branch. Whole browser RED: 7/2 (8.810s); the direct assertion sees
|
|
null instead of the diagnostic, and the refusal-matrix wait also fails. Finally restored the exact
|
|
corrected source before the next run. This supersedes the earlier visibility “GREEN only” note.
|
|
|
|
Final targeted coverage before mutation: browser 9/0 (6014.970ms runner duration), routes 13/0.
|
|
Added an independent send-off test with a configured libraryRevert callback: absence of --send
|
|
still refuses with zero callback calls. This makes the send fence independently mutation-testable.
|
|
The kit now has 14 concrete mutations, including agent-label, unreadable-limits problem and send.
|
|
Each isolated target is restored to its candidate SHA256, and worktree hashes are checked before
|
|
continuing to the next mutant (sage-3647). Runner uses TAP so assertion failures can be distinguished
|
|
from timeouts/import/process failures. Full webui/build and the integration gate remain pending.
|
|
|
|
Dependency update beakley-0008: row217 first push origin/beakley/row217 c25f5b8da is UNTESTED,
|
|
continued from Launchpad e25ef0373. No dependency merge here; its protocol/module mount belongs to
|
|
217 and renderReply needs none of those codes/texts. Integration acceptance remains Sage's gate.
|
|
|
|
First isolated-mutant attempt stopped honestly at M3-wrong-commit: M1 badge, M1 agent label and M2
|
|
https-only link mutants were killed by assertions; M3 failed via the browser's expected-state wait,
|
|
so the strict runner did NOT count it as a kill. Every target restored/hash-checked and candidate
|
|
hashes unchanged. Logs retained in evidence/mutants-attempt1/. Corrected the new browser test to wait
|
|
for a completed repaint (independent of desired output), then assert changed-marker count. Whole
|
|
browser baseline remains 9/0. No production change. Re-run the whole isolated kit against this test.
|
|
|
|
## T1 complete: isolated mutants and source-review handoff
|
|
|
|
sage-3647 final kit on source candidate 507901277: 14/14 assertion kills, no timeout/import/process
|
|
failure counted. Each mutant matched one anchor, restored the target SHA256 and checked the three
|
|
candidate source hashes before the next. evidence/mutants-final/summary.json records every result;
|
|
final worktreeUnchanged=true. Logs name the failing tests, including M3's direct assertion after the
|
|
refresh wait correction. /proc inspection found no remaining Node/Chromium process with the slot
|
|
TMPDIR. Returned lane A to Sage as fethry-0016 at about19:29Z, before the19:38Z hard stop.
|
|
|
|
Checked-in TAP display copies remove trailing whitespace so the diff is clean. Their raw SHA256
|
|
values are recorded in evidence/raw-log-provenance.json; original byte-for-byte logs remain under
|
|
/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2. This changes evidence presentation only, never tests.
|
|
|
|
MANIFEST.md and manifest.r1.sha256 freeze the13 changed package files for Dewey. All three handoff
|
|
deviations and Mos1510's two preservation conditions are explicit. Old-test numstats remain80/66 and3/1.
|
|
No full webui/npm ci/build was run; Sage explicitly reserved it for a later window. Full package/script
|
|
and dependency integration gate remains required before landing. No queue move, merge or live action.
|
|
|
|
|
|
## Dewey static CHANGES B1, N1 (dewey-0937; ruling sage-3669)
|
|
|
|
Static verification confirms renderReply currently takes exact notice shape as sufficient provenance.
|
|
The previous handoff explanation above is corrected: a reachable agent commit can be reverted while
|
|
its body claims another path. Sage directs a row225 fix, not a broker marker in288.
|
|
|
|
Regression tests authored first in the NEW chat-replies-browser.test.mjs:
|
|
- A checked agent notice-shaped body names the genuine notice's commit with an invented delete path.
|
|
It must render the whole body as plain text and have no notice styling or Revert, while the real
|
|
unchecked broker notice remains actionable.
|
|
- A403 owner-only receipt with no sent field must say Not reverted (owner-only), exactly one POST.
|
|
|
|
Planned B1 production change after RED: pure renderReply recognizes a notice only when options.check
|
|
is null/absent; chat already supplies the stored check. This protects the shared renderer rather than
|
|
only one DOM caller. Planned mutant: remove that check condition; browser B1 must assert-fail.
|
|
N1 is small: treat a4xx refusal with a code as definite without requiring a sent field, preserving
|
|
401 sign-out and503/network outcome-unknown behavior. Add its missing-condition mutant too.
|
|
No pre-existing test edit is needed; keep approved80/66 and3/1. No production fixes or Node runs yet.
|
|
|
|
Test window: after217 in T3, roughly20:25-20:55Z (sage-3663/3669). Wait for explicit CLEAR; then
|
|
worktree-local packages/webui npm ci, editor build, whole webui suite with
|
|
MOSAIC_REQUIRE_EDITOR_BUILD=1, and Chromium cleanup sweep. Stay out of library/bus/cli runs during
|
|
Researcher's216 lane. Ask Sage to include the browser RED/GREEN and two new mutants before that
|
|
whole-suite run. T1 slot was already returned; no further tests under its old CLEAR.
|
|
|
|
## Round2 recovery and review fixes (2026-10-24, sage-4119/4120)
|
|
|
|
CLEAR resumed this row after217/285/286 landed; new base963303403. Created fethry/row225-r2 from
|
|
7590cf633; original fethry/row225 and all published history retained. Rebased all nine commits.
|
|
Conflicts resolved in chat.js/serve.mjs by preserving sharing, threadWrites, chatGrants and225's
|
|
render/status/revert callbacks. Both append-only logs retain963303403 byte-for-byte as their prefix.
|
|
The channel-proof conflict retains239's comments/transport changes and re-pins the merged bus.mjs
|
|
hash4ebf6c2b5d71c23d85cbde83f69aa671058dc2195c9ae4bdda624f6940729d1b; delta still3/1.
|
|
render.test.mjs remains80/66 relative the new base. No published commit amended or force-pushed.
|
|
The first local conflict-resolution attempt hit a script assertion; aborted that unfinished rebase
|
|
and restarted before any publication, then checked all conflict markers were gone.
|
|
|
|
Canonical start op fethry-225-start by fethry completed rev3946 (briefed→in-progress), no timeout.
|
|
Removed our canonical node_modules symlink only; root and packages/webui now each have local
|
|
npm ci --ignore-scripts --no-audit --no-fund installs (mos1575). TMPDIR from mktemp is
|
|
/mnt/storage/scratch/tmp/rbCdM2. MOSAIC_REQUIRE_EDITOR_BUILD=1 throughout gate.
|
|
|
|
Whole NEW browser file first RED8/3,6755.602ms: B1 forged notice fails its own whole-body assertion
|
|
and the existing one-Revert count (2vs1); N1 sees outcome-unknown instead of definite refusal.
|
|
Placed all three as expected first-run failures (fethry0021); no old test red. Then changed
|
|
renderReply to recognize a notice only when options.check is null/absent, and chat's4xx coded
|
|
refusal path to be definite even without sent.401 still signs out;503/network remains unknown.
|
|
Whole-file GREEN11/0,7244.663ms. Approved existing renderer test is unchanged, including unchecked
|
|
notice text. The pre217 no-check residual remains accepted under sage3669, with positive-marker
|
|
follow-up owned by Sage after10-27. No288 dependency/marker introduced.
|
|
|
|
Next: whole webui/library/bus and channel-proof, then all14 original mutants and new B1/N1 mutants;
|
|
all serialized under timeout -k10 with per-test30s deadlines. Any old-test red or second red must
|
|
reach Sage before changing it, per sage4119. Full gate results and replacement manifest to follow.
|
|
|
|
Round2 worktree gate GREEN (sage4119): editor-build0/0.288s, webui442/0/274.272s,
|
|
library149/0/14.981s, bus981/0/125.727s, whole channel-proof2/0/0.503s. No skip/cancel in any suite.
|
|
Each command runs serially with TMPDIR=/mnt/storage/scratch/tmp/rbCdM2,
|
|
MOSAIC_REQUIRE_EDITOR_BUILD=1, --test-concurrency=1 --test-timeout=30000, outer timeout -k10
|
|
(editor120s, webui900s, library300s, bus1200s, channel120s). Exact commands/timings recorded in
|
|
evidence/r2/gate-summary.json. Root/webui installs and editor source/assets are worktree-local;
|
|
generated editor.js/editor.css/BUILD.json stayed identical to the base. Raw scratch logs retained;
|
|
display copies trim trailing whitespace, with raw SHA256 provenance in evidence/r2/raw-provenance.json.
|
|
No old-test red and no unexpected second red; no additional existing-test edits. All requested source
|
|
suites passed before committing this B1/N1 source candidate. Isolated16-mutant run follows (14 originals
|
|
plus B1 and N1); no final mutation claim yet.
|
|
|
|
## Round2 final mutation evidence and slot return
|
|
|
|
Sourcec010dfd85; all16 unique mutants now have clean assertion kills (14 originals plus B1 and N1).
|
|
Initial run produced6 clean kills, then M3-missing-file exited124 at the240s outer deadline. Its
|
|
new-file status-case after-hook failed at30643ms; the intended missing-file assertion1!=0 did fail,
|
|
but the process never exited normally. NOT counted as a kill. Reported to Sage as fethry0022 before
|
|
any change, verified13 candidate hashes/restoration and no scratch-owned leftover processes.
|
|
Retried only that mutant unchanged, plus the remaining9; all10 clean assertion kills. No source,
|
|
test or helper edit, no weakened deadline/kill criterion.17 attempts total;1 timeout retained and
|
|
excluded,16 clean unique kills. Final selected logs have zero cancellations/skips and no hook/timeout
|
|
failures. Both attempt sets and combined result are in evidence/r2/.
|
|
|
|
Final sweep at2026-10-24T15:02:21Z found no scratch-owned Node/Chromium descendants, no signals needed.
|
|
Both dependency roots are real local directories, not symlinks. All13 package pins reverified.
|
|
manifest.r2.sha256 file digest:517af41b26cd44abe4a103a048cac8ec3a4fd2a9dc0f2f3f74b5699af7289d64.
|
|
MANIFEST.r2.md describes the B1/N1/rebase delta, preserves the accepted pre217 residual, and names
|
|
this timeout/retry honestly. Original packet, old source branch and evidence retained.
|
|
|
|
Requested worktree gate: webui442/0, library149/0, bus981/0, channel-proof2/0, editor-build exit0;
|
|
new review browser RED8/3→GREEN11/0; isolated16/16 clean unique kills. Existing-test deltas unchanged
|
|
at80/66 and3/1 relative963303403. No old-test failure. No queue move after the owner start, no merge,
|
|
release, deployment or real library write/revert. Ready to return the slot and send Dewey the new
|
|
branch pin/manifest delta; his formal record and Sage's integration/landing remain separate gates.
|