diff --git a/agents/herb/work/queue-214/BUILD.md b/agents/herb/work/queue-214/BUILD.md new file mode 100644 index 000000000..866b2720e --- /dev/null +++ b/agents/herb/work/queue-214/BUILD.md @@ -0,0 +1,52 @@ +# Row214 C2-11a work record + +Assignment sage-2794 at2026-10-22T16:33:20Z, Q220/mos-1301, issue#1715. +New isolated branch herb/row214 on aca16404c. The earlier197/215 worktrees +and their dirty/untracked historical packets are untouched. node_modules is +the required plain symlink to /mnt/storage/src/mosaic-stack/node_modules. + +Read C2-11a in both pinned briefs. The section is unchanged at51cc0445c; +Q222 changes C2-06's reply-limit settings, not wikilinks. The editor model, +entry, view, existing model/browser/provenance tests, build/toolchain and +vendored markdown parser/serializer were read. No third_party source changes. + +## Static finding and authored work + +model.mjs stores a canonical sig and the raw original block, and serialise +returns raw when the sig matches. The vendored text writer escapes brackets +(to_markdown.ts:433-437). It is therefore possible for no-edit round-trips +to pass while dirty-block output escapes a wikilink. This is a source-based +hypothesis, not a measured result. Both outcomes are in DESIGN.md. + +Authored, unrun: the pinned-bundle measurement; eight fixture round-trips; +three browser regressions; inert wikilink schema/tokenizer/serializer. The +schema includes headings, and front matter remains raw. The serializer +validates its spelling before bypassing escaping. HTML/entity-like targets +stay text under the existing escaping rules. No clicking or resolution. + +Local static git diff --check is clean. No Node, npm, compiler, browser, +measurement, test, Docker, HTTPS Git or push has run. The queue claim waits +for a gap because scripts/mosaic invokes Node. No candidate or pass claim. +Only design/path documents may be committed before the granted red/green +checks; product, tests and measurement remain uncommitted until validated. + +## Next granted steps + +1. Claim from canonical during a CLEAR/gap. +2. Run measure.mjs against aca16404c's pinned Git blobs; save JSON unchanged. +3. Run the structural/edit regression alone on the baseline bundle (red). +4. Install the already-pinned esbuild0.28.2 in this worktree's packages/webui + with npm ci --ignore-scripts --no-audit --no-fund; no root install or lock edit. +5. Build with the existing editor/build.mjs, then the whole new test file and + existing editor, editor-browser and editor-provenance files, each singly. +6. Kill the serializer-removal mutant, restore, rebuild, focused green. +7. Commit only after the applicable checks, push only when Sage clears HTTPS + Git, send Filbert and Mos the candidate SHA/hash manifest directly, cc Sage. +8. After253 lands, new branch on its tip preserving all landed changes. +9. Filbert and Sage's whole webui and scripts gate finish the row. + +All runs wait for explicit Sage CLEAR. Gander's row253 run5 owns the slot. +The whole suite gate and any unexpected failure use mos-0823's stop rule. + +Proposed SESSIONS text for Sage's post-253 doc sweep (do not append here): +2026-10-22 | Herb (gpt-6.1-sol, f6cf4287) | row214 C2-11a editor wikilinks authoring | On herb/row214 at aca16404c, authored baseline round-trip measurement, designs for equal/unequal results, inert inline node and regression tests under sage-2794/Q220. Claim, runs and pushes held while253 owns the slot; measurement and test results unavailable. diff --git a/agents/herb/work/queue-214/DESIGN.md b/agents/herb/work/queue-214/DESIGN.md new file mode 100644 index 000000000..b6044e052 --- /dev/null +++ b/agents/herb/work/queue-214/DESIGN.md @@ -0,0 +1,87 @@ +# C2-11a: an inert editor wikilink node + +Base: aca16404c. Owner: Herb. Reviewer: Filbert. Issue: #1715. +Authority: sage-2794, Q220/mos-1301. The assignment permits authoring the +node and tests before the measurement slot. Runs, claim and pushes wait +for Sage's CLEAR. After row253 lands, a new branch will carry the change +onto its landing with every landed hunk retained. + +## Measurement before choosing the explanation + +Run agents/herb/work/queue-214/measure.mjs only on a granted slot. It loads +aca16404c's editor.js and markdown-preview.js directly from local Git +objects. It verifies the editor bundle hash against that base's BUILD.json. +It cannot accidentally measure a candidate rebuild. Its JSON records the +full baseline SHA, bundle hash, timestamp, input, output and equality for +each fixture. The first five are the brief's plain, labelled, heading, +list and front-matter cases; extra cases cover a heading block, combined +heading/label, Unicode/spacing, adjacency and an inert embed. No result is +available yet. Static reasoning is not a measurement. + +Outcome A, every baseline round-trip is equal: record that wikilinks do +not trigger Source fallback for the measured inputs. Do not claim that +bug exists. The source's raw/sig cache explains why an unchanged block can +keep its bytes even when its canonical serializer escapes brackets. Add +the node for structured wikilinks and dirty-block preservation, as the +brief requests. A baseline structural/edit regression must fail even if +all unchanged-file checks pass. + +Outcome B, one or more differ: record the exact differing bytes and affected +contexts. Keep the existing Source fallback fail-closed. The node restores +the required spellings where the block is structured. Retain the same +no-edit and dirty-block regressions. If the mismatch comes from a separate +block, line-ending or front-matter defect, report it before widening scope. + +## Representation and conversion + +The schema gains one inline atom, wikilink, with a single source attribute. +Its source is the complete spelling, not reconstructed target/label parts. +It has no href, navigation, fetch or click behavior. A span with data-source +and a text child displays the spelling. Heading content includes the new +atom; paragraphs, quotes and lists already accept inline content. + +One markdown-it inline rule runs before ordinary links, after escapes and +backticks. A sticky match reads a complete single-line [[...]] or ![[...]] +without copying every suffix or crossing state.posMax. The node writer +writes its validated spelling without bracket escaping, so editing adjacent +text cannot rewrite a wikilink. Front matter remains a raw block. No new +file-read, save, routing, documentPath or target-resolution behavior is added. + +The accepted atom grammar excludes brackets within the body, line breaks, +angle brackets and ampersands. This is an editor representation boundary, +not a library resolver or a refusal to open such a file. Malformed, +HTML/entity-like and code syntax stays under the existing text/raw rules. +This preserves the existing escaping of HTML/entities when a block changes. +DOM paste accepts only that same grammar. Invalid attributes constructed +programmatically are flattened to one line and escaped by the text writer. +No input string is parsed as HTML and embeds never load an image. + +## Acceptance and review + +The measurement JSON goes in BUILD.md and the final manifest packet. +Eight fixture round-trips run with and without a final newline. A browser +test inspects real ProseMirror atom types and attributes, edits the same +block and reparses it, for each fixture. Two more browser tests cover +code/escape/malformed/hostile syntax and DOM/programmatic-attribute safety. +Tests use the existing fixture and Chromium harness and the shipped bundle. +They do not export new production APIs just for testing. + +Before rebuilding, run only the structural regression against the baseline +bundle and observe it fail. Rebuild the candidate with the exact pinned +esbuild0.28.2 binary, run the whole new test file, existing editor tests, +editor browser tests and provenance test. Remove only the wikilink serializer +handler for one mutant; the dirty-block assertion must fail. Restore, rebuild +and rerun the focused regression. All execution needs Sage's CLEAR, including +installation, checks, builds, browser tests and the measurement. + +The checked-in bundle and editor/BUILD.json must be regenerated by the +existing build script. No hand edits of generated JavaScript or provenance. +The current shared esbuild is0.28.1 and the local webui install is absent. +A granted npm ci --ignore-scripts --no-audit --no-fund in packages/webui is +needed before building; the root node_modules remains its plain symlink. +No dependency or lockfile change is planned. + +Final gate: Filbert approves the manifest, then the whole webui suite and +every scripts/test-*.sh on Sage's slot. Two failures stop a gate. A failure +outside this row is reported to Sage before any rerun. Source, generated +output, mode/hash manifest and raw granted logs identify the candidate. diff --git a/agents/herb/work/queue-214/MANIFEST.md b/agents/herb/work/queue-214/MANIFEST.md new file mode 100644 index 000000000..dd23fc458 --- /dev/null +++ b/agents/herb/work/queue-214/MANIFEST.md @@ -0,0 +1,23 @@ +# Row214 implementation manifest, draft before measurement + +Pinned base: aca16404c. Brief: docs/plans/2026-10-20_case2-rows.md, +C2-11a. Also read at gosalyn/case2-06-idea-caps51cc0445c; that section is +unchanged. Q222's reply-limit settings belong to C2-06, not this row. + +| Path | Change | +| --- | --- | +| packages/webui/editor/model.mjs | inert inline atom, heading content, tokenizer rule and serializer | +| packages/webui/tests/editor-wikilink.test.mjs | eight round-trips and three browser regressions | +| packages/webui/tests/helpers/wikilink-cases.mjs | exact fixtures shared with measurement | +| packages/webui/src/public/editor.js | generated by the pinned editor build, pending CLEAR | +| packages/webui/editor/BUILD.json | generated provenance, pending CLEAR | +| agents/herb/work/queue-214/measure.mjs | baseline Git-object measurement, authored and unrun | +| agents/herb/work/queue-214/DESIGN.md | both measurement outcomes, implementation and acceptance | +| agents/herb/work/queue-214/BUILD.md | rulings and receipts, pending runs | +| agents/herb/work/queue-214/MANIFEST.md | this reviewed path list | + +editor.css is an unchanged build output; no source CSS is touched. No +entry/view, library, route, save, click, documentPath or dependency changes. +Generated changes do not exist yet. This is a design/path manifest, not a +frozen tested candidate. Candidate hashes and measurement results follow +only after the granted runs. Filbert reviews the plan before the build.