Notes: Copy link to heading corrupts the saved body (duplicated links) #1440

Closed
opened 2026-10-08 04:15:58 +00:00 by kayg · 27 comments
Owner

Problem (data corruption, in production d395b6e25)

Copy link to a heading corrupts the saved Note body about 1–2 s later. Reproduced twice by bug bash round 3 (#1396) on fresh API-created Notes, Chromium, production build.

Note body: a Links heading; a paragraph with a Markdown link and a bare URL; a next paragraph with an autolink and a [[wikilink]].

Steps: open the Note, click Copy link to Links once, wait 1–2 s, do not edit.

Expected: only the heading gains its stable ^block-id; nothing else changes.

Actual: body intact at 500 ms; by 1.5–2 s the saved body merged the next paragraph into the first and duplicated the autolink and wikilink content (8 autolink references and 4 wikilink references, from one each). The screenshot shows https://example.org/barehttps://example.org/autolink, Bash3 wiki target./example.org/autolink, repeated runs. Evidence: worktree bash3-notes, artifacts/bash3-notes/copy-link-before-same-1440-light.png, copy-stage-after-pointer-1440.png; comments on #1371.

This likely explains the owner's report of "multiple link icons" in Notes and may relate to #1384 (deleted link blocks coming back).

Expected fix

  • Find the transaction chain: the block-id write (Copy link, #1125, DESIGN §33), then whatever runs after it (autolink / linkify appendTransaction, wikilink conversion on flush in packages/editor/src/wikilinks.ts, the Markdown serializer/parser round trip on save, or the collab server baseline). Name the root cause in the commit and at the fix.
  • Fix so that assigning a block anchor never changes any other content, and no input rule / appendTransaction re-processes unchanged text.
  • Regression tests: (1) unit: serialize→parse round trip of this exact body is identity, including after adding ^id to the heading; (2) real-browser: the exact steps above, then read the API body at 0.5, 2, 5 s and after reload; it must equal the source plus the anchor only. Also run it for: Copy link on a paragraph, a list item and a Task; two links in one paragraph; a link at paragraph end.
  • Repair: check whether any existing Note on a production-shaped fixture can be detected as already corrupted (duplicate adjacent link runs); report only, do not auto-rewrite user content.

Gates: bun run check, bun run test (apps/web and packages/editor), cargo gates for any crate touched. Quote verbatim.

## Problem (data corruption, in production d395b6e25) Copy link to a heading corrupts the saved Note body about 1–2 s later. Reproduced twice by bug bash round 3 (#1396) on fresh API-created Notes, Chromium, production build. Note body: a `Links` heading; a paragraph with a Markdown link and a bare URL; a next paragraph with an autolink and a `[[wikilink]]`. Steps: open the Note, click **Copy link to Links** once, wait 1–2 s, do not edit. Expected: only the heading gains its stable `^block-id`; nothing else changes. Actual: body intact at 500 ms; by 1.5–2 s the saved body merged the next paragraph into the first and duplicated the autolink and wikilink content (8 autolink references and 4 wikilink references, from one each). The screenshot shows `https://example.org/barehttps://example.org/autolink`, `Bash3 wiki target./example.org/autolink`, repeated runs. Evidence: worktree bash3-notes, `artifacts/bash3-notes/copy-link-before-same-1440-light.png`, `copy-stage-after-pointer-1440.png`; comments on #1371. This likely explains the owner's report of "multiple link icons" in Notes and may relate to #1384 (deleted link blocks coming back). ## Expected fix - Find the transaction chain: the block-id write (Copy link, #1125, DESIGN §33), then whatever runs after it (autolink / linkify appendTransaction, wikilink conversion on flush in packages/editor/src/wikilinks.ts, the Markdown serializer/parser round trip on save, or the collab server baseline). Name the root cause in the commit and at the fix. - Fix so that assigning a block anchor never changes any other content, and no input rule / appendTransaction re-processes unchanged text. - Regression tests: (1) unit: serialize→parse round trip of this exact body is identity, including after adding `^id` to the heading; (2) real-browser: the exact steps above, then read the API body at 0.5, 2, 5 s and after reload; it must equal the source plus the anchor only. Also run it for: Copy link on a paragraph, a list item and a Task; two links in one paragraph; a link at paragraph end. - Repair: check whether any existing Note on a production-shaped fixture can be detected as already corrupted (duplicate adjacent link runs); report only, do not auto-rewrite user content. Gates: bun run check, bun run test (apps/web and packages/editor), cargo gates for any crate touched. Quote verbatim.
Author
Owner

Started #1440 on job/linkdup-1440, base d395b6e25da20d8c67b8b9fc1a593b813939c8a7. Tracing the Block ID transaction, live editor link processing, and the Markdown save path. Will add lossless round-trip and real-browser API persistence regressions. No user-content repair will be applied.

Started #1440 on `job/linkdup-1440`, base `d395b6e25da20d8c67b8b9fc1a593b813939c8a7`. Tracing the Block ID transaction, live editor link processing, and the Markdown save path. Will add lossless round-trip and real-browser API persistence regressions. No user-content repair will be applied.
Author
Owner

Production Chromium probe reproduced data loss with the screenshot-shaped single-line-break link body. The Block ID transaction retained the complete link paragraph. A later unmarked ReplaceStep removed its first character (Markdown link became arkdown link), and the API persisted the change at 2 s and 5 s. Two separate paragraphs did not reproduce in the first probe. Tracing the caller of the later replacement; Markdown round-trip tests currently pass for both shapes.

Production Chromium probe reproduced data loss with the screenshot-shaped single-line-break link body. The Block ID transaction retained the complete link paragraph. A later unmarked ReplaceStep removed its first character (`Markdown link` became `arkdown link`), and the API persisted the change at 2 s and 5 s. Two separate paragraphs did not reproduce in the first probe. Tracing the caller of the later replacement; Markdown round-trip tests currently pass for both shapes.
Author
Owner

Root cause: the read-only inline-link plugin dispatched metadata transactions synchronously from focusin/focusout. Copy link replaces the focused heading action during ProseMirror updateState. Its focus event re-entered updateState while the DOM was incomplete; the DOM observer subsequently emitted an unmarked ReplaceStep and the live room saved it. The trace records the DOM-observer caller, not an autolink/input-rule or Markdown-converter caller. The fix queues/coalesces focus presentation updates in a microtask before paint and skips unchanged state. A regression that emits the focus pair inside view.update fails with the old handlers and passes with the fix. Markdown round-trip suite: 130 passed; complete editor suite: 447 passed. Production browser cases and final gates follow.

Root cause: the read-only inline-link plugin dispatched metadata transactions synchronously from focusin/focusout. Copy link replaces the focused heading action during ProseMirror updateState. Its focus event re-entered updateState while the DOM was incomplete; the DOM observer subsequently emitted an unmarked ReplaceStep and the live room saved it. The trace records the DOM-observer caller, not an autolink/input-rule or Markdown-converter caller. The fix queues/coalesces focus presentation updates in a microtask before paint and skips unchanged state. A regression that emits the focus pair inside view.update fails with the old handlers and passes with the fix. Markdown round-trip suite: 130 passed; complete editor suite: 447 passed. Production browser cases and final gates follow.
Author
Owner

The real-browser paragraph case found a second byte-preservation defect: assigning the Block ID canonicalized an existing <https://example.org/autolink> to [https://example.org/autolink](<https://example.org/autolink>). The heading cases now preserve their bodies; this paragraph case changes syntax beyond the anchor. Extending the existing source patch in packages/editor/src/markdown.ts and crates/calternal-collab/src/markdown.rs: a verified first-anchor-only delta appends the suffix to the raw source span instead of serializing unchanged prose. Canonical parser/writer behavior is unchanged. New tests cover paragraph, list and Task prefixes, source separators and LF/CRLF; the focused TypeScript suite now passes 135 tests. Rust compilation and crate gates are running.

The real-browser paragraph case found a second byte-preservation defect: assigning the Block ID canonicalized an existing `<https://example.org/autolink>` to `[https://example.org/autolink](<https://example.org/autolink>)`. The heading cases now preserve their bodies; this paragraph case changes syntax beyond the anchor. Extending the existing source patch in `packages/editor/src/markdown.ts` and `crates/calternal-collab/src/markdown.rs`: a verified first-anchor-only delta appends the suffix to the raw source span instead of serializing unchanged prose. Canonical parser/writer behavior is unchanged. New tests cover paragraph, list and Task prefixes, source separators and LF/CRLF; the focused TypeScript suite now passes 135 tests. Rust compilation and crate gates are running.
Author
Owner

Anchor-only source preservation is committed as c9b2e7070; the reentrant focus fix is 072e64887. The new Rust source tests pass for paragraphs, lists, Tasks, LF/CRLF and sole autolinks. Final editor gates: svelte-check found 0 errors and 0 warnings; Test Files 22 passed (22), Tests 453 passed (453). Final web check: svelte-check found 0 errors and 4 warnings in 2 files; perf-lint: PASS; 0 violations; 22544 scoped exceptions. Full Rust and web suites are still running. The final real-browser probe will use the patched local server. No dependency, UI style or migration changes.

Anchor-only source preservation is committed as `c9b2e7070`; the reentrant focus fix is `072e64887`. The new Rust source tests pass for paragraphs, lists, Tasks, LF/CRLF and sole autolinks. Final editor gates: `svelte-check found 0 errors and 0 warnings`; `Test Files 22 passed (22)`, `Tests 453 passed (453)`. Final web check: `svelte-check found 0 errors and 4 warnings in 2 files`; `perf-lint: PASS; 0 violations; 22544 scoped exceptions`. Full Rust and web suites are still running. The final real-browser probe will use the patched local server. No dependency, UI style or migration changes.
Author
Owner

The full cargo test -p calternal-collab -- --test-threads=4 gate passed, including the cross-language contract, persistence race and untouched-source-byte tests. cargo clippy -p calternal-collab --all-targets -- -D warnings passed. No existing assertion, timeout or fixture was changed.

Verbatim test summaries:

test result: ok. 136 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 346.20s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.97s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.48s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.48s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 125.89s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.31s
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.22s
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.25s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.26s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.81s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 12.31s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.01s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 72.73s
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.24s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.20s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 33.61s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
The full `cargo test -p calternal-collab -- --test-threads=4` gate passed, including the cross-language contract, persistence race and untouched-source-byte tests. `cargo clippy -p calternal-collab --all-targets -- -D warnings` passed. No existing assertion, timeout or fixture was changed. Verbatim test summaries: ```text test result: ok. 136 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 346.20s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.97s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.48s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.48s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 125.89s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.31s test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.22s test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.25s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.26s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.81s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 12.31s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.01s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 72.73s test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.24s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.20s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 33.61s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ```
Author
Owner

Attached 12 actual-size macOS-emulated Chromium captures of the existing heading Copy link action: pointer and keyboard states at 390, 820 and 1440 px, in Mono and Noir. The real Note is loaded. Server and web build identities match; there is no Update available toast.

Download all screenshots

The keyboard captures expose the existing full-editor focus outline. This cosmetic gap is filed as #1448, with the active element and input-modality trace. It is not hidden in the evidence. No UI style or global focus-modality change is part of #1440.

Attached 12 actual-size macOS-emulated Chromium captures of the existing heading Copy link action: pointer and keyboard states at 390, 820 and 1440 px, in Mono and Noir. The real Note is loaded. Server and web build identities match; there is no Update available toast. [Download all screenshots](https://git.kayg.org/attachments/97c3a15c-96c3-4b10-9b0a-94f49f001547) The keyboard captures expose the existing full-editor focus outline. This cosmetic gap is filed as #1448, with the active element and input-modality trace. It is not hidden in the evidence. No UI style or global focus-modality change is part of #1440.
Author
Owner

The live sole-autolink regression found a third chain defect. insertBlockAnchor() used ProseMirror insertText, which inherits marks at the insertion point. When the last text run had a Link mark, the new anchor became part of its label and saved as [https://example.org/autolink \^id](<https://example.org/autolink>). This was an actual saved-body mismatch, not a debounce delay.

The insertion now uses an explicit schema text node with an empty mark set. New tests call the real ensureAnchorAt() transaction after a sole autolink, a paragraph-ending Markdown link and a bold heading. They check the parsed document, the unmarked suffix and exact source-aware bytes. The Task browser case passes all four reads after targeting plain text; the test must avoid the deliberate native menu on link text. Re-running web gates and rebuilding production assets for the new anchor fix.

The live sole-autolink regression found a third chain defect. `insertBlockAnchor()` used ProseMirror `insertText`, which inherits marks at the insertion point. When the last text run had a Link mark, the new anchor became part of its label and saved as `[https://example.org/autolink \^id](<https://example.org/autolink>)`. This was an actual saved-body mismatch, not a debounce delay. The insertion now uses an explicit schema text node with an empty mark set. New tests call the real `ensureAnchorAt()` transaction after a sole autolink, a paragraph-ending Markdown link and a bold heading. They check the parsed document, the unmarked suffix and exact source-aware bytes. The Task browser case passes all four reads after targeting plain text; the test must avoid the deliberate native menu on link text. Re-running web gates and rebuilding production assets for the new anchor fix.
Author
Owner

Head: 52e8dfbee392e6bc9a0cdb4c4c8ebe4eca2a7b7c. Branch: job/linkdup-1440. Base: d395b6e25da20d8c67b8b9fc1a593b813939c8a7.

Fixed the Copy link content corruption in #1440.

Root cause: replacing the focused heading Copy link widget fired focus events during ProseMirror updateState. The Notes link presentation plugin dispatched another transaction inside that DOM update. The DOM observer then read the half-built DOM as an unmarked ReplaceStep. Live save persisted that unintended edit. The original anchor transaction kept the other blocks intact. The local reproduction lost the first letter of a Markdown link at the observer step. The focused unit test fails with the old synchronous handlers and passes with the deferred handlers.

The fix coalesces focus updates in a microtask, after the active DOM update and before paint. It skips unchanged presentation state and ignores destroyed views. The browser probe found a second storage-only change: an anchor on a paragraph canonicalized its autolink spelling. The client and server source patchers now append a first anchor to the original source span. Their existing full-document projection check still verifies the edit. Ordinary text edits use the existing path. The sole-autolink browser case found another defect: ProseMirror insertText inherited the final Link mark and made the anchor part of its label. Anchor insertion now creates an explicitly unmarked text node. The actual transaction is tested after a sole autolink, a paragraph-ending link and a bold heading.

Files:

  • apps/web/src/lib/notes/inlineLinks.ts and inlineLinks.test.ts: focus timing and reentry regression.
  • packages/editor/src/markdown.ts and markdown.test.ts: raw source patch and mixed-link round trips.
  • crates/calternal-collab/src/markdown.rs: server source patch and LF/CRLF, list, Task and sole-autolink tests.
  • apps/web/src/lib/notes/anchors.ts and anchors.svelte.test.ts: unmarked anchor insertion and real-transaction source tests.
  • apps/web/e2e/notes.mjs: focused live-browser persistence probe and report-only duplicate-run scan.

Reuse: existing Notes inline-link plugin, Block ID grammar, source spans, projection checks, editor fixtures and Notes e2e harness. No new visible control or local style. Existing heading Copy link and Block menu actions remain in use.

Expected cost: one coalesced microtask per focus burst, with no IO. Anchor insertion creates one unmarked text node. The existing ID checks scan the document. First-anchor patching adds linear work in the changed block. The rare sole-autolink server case uses two bounded parses of that block. The existing full-source validation remains. No per-row observer, layout read, new query or lock. This is a correctness fix, not a performance job; no perf VM measurement under the verification policy.

UX gaps closed: Copy link preserves unchanged prose, raw link spelling, paragraph boundaries and existing Block IDs. Idle save and reload must retain the same bytes.

Known gaps / UX gaps left: a repeated adjacent link run is a review hint. A User may repeat links on purpose. The fixture scan is report-only; it cannot recover original user text or prove every corruption pattern. No production User content was read or rewritten. The existing editor outline after a block shortcut is filed as #1448 and shown in the captures. No style or global modality change was included. The one cold Note load failure is filed as #1451; the later fresh-case and complete reruns pass. Real Apple-client interop, the full Notes e2e suite and combined adversarial matrices remain for the merge round.

Decisions: use a microtask to avoid reentrant DOM updates without waiting for motion. Preserve source spelling for first-anchor edits and retain the existing projection guard. The 500 ms API read allows the original bytes while the existing 750 ms save debounce is pending; later reads require the anchor-only body. Do not infer or apply a repair from repeated links.

For the merge round: cd apps/web && bun run test:e2e:notes against the combined server/web build must prove the existing Notes workflows still pass. Run the round's combined adversarial matrices and Mac interop as required by its contract. No API endpoint or permission was added.

Browser verification: NOTES_E2E_COPY_LINK_1440_ONLY=1 CALTERNAL_E2E_ASSET_OVERRIDE=1 CALTERNAL_E2E_MAC=1 bun e2e/notes.mjs --screenshots ../../artifacts/copy-link-1440 with the patched local server and no case filter. All nine cases passed: two heading boundaries, paragraph, list item, Task, two links, heading over an ending link, paragraph ending in a link, and sole autolink. Each case checks 500 ms, 2 s, 5 s and reload. The 500 ms result is the original source while debounce is pending; every later result is the exact source plus its anchor.

Verbatim final browser output:

PASS heading-soft-break 500 ms: original bytes pending debounce
PASS heading-soft-break 2000 ms: anchor only
PASS heading-soft-break 5000 ms: anchor only
PASS heading-soft-break reload: anchor only
PASS heading-paragraphs 500 ms: original bytes pending debounce
PASS heading-paragraphs 2000 ms: anchor only
PASS heading-paragraphs 5000 ms: anchor only
PASS heading-paragraphs reload: anchor only
PASS paragraph 500 ms: original bytes pending debounce
PASS paragraph 2000 ms: anchor only
PASS paragraph 5000 ms: anchor only
PASS paragraph reload: anchor only
PASS list-item 500 ms: original bytes pending debounce
PASS list-item 2000 ms: anchor only
PASS list-item 5000 ms: anchor only
PASS list-item reload: anchor only
PASS task 500 ms: original bytes pending debounce
PASS task 2000 ms: anchor only
PASS task 5000 ms: anchor only
PASS task reload: anchor only
PASS two-links 500 ms: original bytes pending debounce
PASS two-links 2000 ms: anchor only
PASS two-links 5000 ms: anchor only
PASS two-links reload: anchor only
PASS link-at-end 500 ms: original bytes pending debounce
PASS link-at-end 2000 ms: anchor only
PASS link-at-end 5000 ms: anchor only
PASS link-at-end reload: anchor only
PASS paragraph-link-at-end 500 ms: original bytes pending debounce
PASS paragraph-link-at-end 2000 ms: anchor only
PASS paragraph-link-at-end 5000 ms: anchor only
PASS paragraph-link-at-end reload: anchor only
PASS standalone-autolink 500 ms: original bytes pending debounce
PASS standalone-autolink 2000 ms: anchor only
PASS standalone-autolink 5000 ms: anchor only
PASS standalone-autolink reload: anchor only
REPAIR REPORT #1440: 10 existing fixture Notes scanned; 1 suspect adjacent link runs; no content rewritten.
CSP REPORTS notes: 0 across 1 pages

Gate output (verbatim summaries; full logs in the evidence archive):

cargo fmt --check — exit 0

No output.

cargo clippy -p calternal-collab --all-targets -- -D warnings — exit 0

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 4m 44s

cargo test -p calternal-collab -- --test-threads=4 — exit 0

test result: ok. 136 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 346.20s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.97s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.48s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.48s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 125.89s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.31s
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.22s
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.25s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.26s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.81s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 12.31s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.01s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 72.73s
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.24s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.20s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 33.61s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

cargo clippy -p calternal-server --all-targets -- -D warnings — exit 0

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 11m 45s

cargo test -p calternal-server -- --test-threads=4 — exit 0

test result: ok. 272 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 195.14s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 46.80s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.24s

cd apps/web && bun run check — exit 0

perf-lint: PASS; 0 violations; 22544 scoped exceptions
svelte-check found 0 errors and 4 warnings in 2 files

cd apps/web && bun run test --maxWorkers=1 — exit 0

 Test Files  297 passed (297)
      Tests  2120 passed (2120)
   Duration  413.70s (transform 39%, environment 22%, import 19%, tests 14%, setup 5%)

cd packages/editor && bun run check — exit 0

svelte-check found 0 errors and 0 warnings

cd packages/editor && bun run test — exit 0

 Test Files  22 passed (22)
      Tests  453 passed (453)
   Duration  43.10s (transform 9.35s, setup 681ms, import 20.16s, tests 20.43s, environment 36.14s)

Earlier verification findings: two 5-second web-test timeouts passed unchanged in focused and full reruns. One Chromium closure interrupted fixture creation; the final complete browser run passed. Task test clicks were corrected to plain text; the app deliberately keeps the native menu on link text. Existing test assertions, timeout values and fixtures were not changed. Three new transaction regression cases were added.

Cleanup: cargo clean removed 19.7 GiB. Ignored web build/output directories were removed after verification. No dependencies, lockfiles or migrations changed. No push or deploy. The required one-time origin/dev fetch/merge was already up to date. Screenshots are uncommitted review artifacts.

Download final evidence: all gate logs, successful browser output, load-failure trace and 12 current actual-size screenshots.

Head: `52e8dfbee392e6bc9a0cdb4c4c8ebe4eca2a7b7c`. Branch: `job/linkdup-1440`. Base: `d395b6e25da20d8c67b8b9fc1a593b813939c8a7`. Fixed the Copy link content corruption in #1440. Root cause: replacing the focused heading Copy link widget fired focus events during ProseMirror updateState. The Notes link presentation plugin dispatched another transaction inside that DOM update. The DOM observer then read the half-built DOM as an unmarked ReplaceStep. Live save persisted that unintended edit. The original anchor transaction kept the other blocks intact. The local reproduction lost the first letter of a Markdown link at the observer step. The focused unit test fails with the old synchronous handlers and passes with the deferred handlers. The fix coalesces focus updates in a microtask, after the active DOM update and before paint. It skips unchanged presentation state and ignores destroyed views. The browser probe found a second storage-only change: an anchor on a paragraph canonicalized its autolink spelling. The client and server source patchers now append a first anchor to the original source span. Their existing full-document projection check still verifies the edit. Ordinary text edits use the existing path. The sole-autolink browser case found another defect: ProseMirror insertText inherited the final Link mark and made the anchor part of its label. Anchor insertion now creates an explicitly unmarked text node. The actual transaction is tested after a sole autolink, a paragraph-ending link and a bold heading. Files: - apps/web/src/lib/notes/inlineLinks.ts and inlineLinks.test.ts: focus timing and reentry regression. - packages/editor/src/markdown.ts and markdown.test.ts: raw source patch and mixed-link round trips. - crates/calternal-collab/src/markdown.rs: server source patch and LF/CRLF, list, Task and sole-autolink tests. - apps/web/src/lib/notes/anchors.ts and anchors.svelte.test.ts: unmarked anchor insertion and real-transaction source tests. - apps/web/e2e/notes.mjs: focused live-browser persistence probe and report-only duplicate-run scan. Reuse: existing Notes inline-link plugin, Block ID grammar, source spans, projection checks, editor fixtures and Notes e2e harness. No new visible control or local style. Existing heading Copy link and Block menu actions remain in use. Expected cost: one coalesced microtask per focus burst, with no IO. Anchor insertion creates one unmarked text node. The existing ID checks scan the document. First-anchor patching adds linear work in the changed block. The rare sole-autolink server case uses two bounded parses of that block. The existing full-source validation remains. No per-row observer, layout read, new query or lock. This is a correctness fix, not a performance job; no perf VM measurement under the verification policy. UX gaps closed: Copy link preserves unchanged prose, raw link spelling, paragraph boundaries and existing Block IDs. Idle save and reload must retain the same bytes. Known gaps / UX gaps left: a repeated adjacent link run is a review hint. A User may repeat links on purpose. The fixture scan is report-only; it cannot recover original user text or prove every corruption pattern. No production User content was read or rewritten. The existing editor outline after a block shortcut is filed as #1448 and shown in the captures. No style or global modality change was included. The one cold Note load failure is filed as #1451; the later fresh-case and complete reruns pass. Real Apple-client interop, the full Notes e2e suite and combined adversarial matrices remain for the merge round. Decisions: use a microtask to avoid reentrant DOM updates without waiting for motion. Preserve source spelling for first-anchor edits and retain the existing projection guard. The 500 ms API read allows the original bytes while the existing 750 ms save debounce is pending; later reads require the anchor-only body. Do not infer or apply a repair from repeated links. For the merge round: `cd apps/web && bun run test:e2e:notes` against the combined server/web build must prove the existing Notes workflows still pass. Run the round's combined adversarial matrices and Mac interop as required by its contract. No API endpoint or permission was added. Browser verification: `NOTES_E2E_COPY_LINK_1440_ONLY=1 CALTERNAL_E2E_ASSET_OVERRIDE=1 CALTERNAL_E2E_MAC=1 bun e2e/notes.mjs --screenshots ../../artifacts/copy-link-1440` with the patched local server and no case filter. All nine cases passed: two heading boundaries, paragraph, list item, Task, two links, heading over an ending link, paragraph ending in a link, and sole autolink. Each case checks 500 ms, 2 s, 5 s and reload. The 500 ms result is the original source while debounce is pending; every later result is the exact source plus its anchor. Verbatim final browser output: ```text PASS heading-soft-break 500 ms: original bytes pending debounce PASS heading-soft-break 2000 ms: anchor only PASS heading-soft-break 5000 ms: anchor only PASS heading-soft-break reload: anchor only PASS heading-paragraphs 500 ms: original bytes pending debounce PASS heading-paragraphs 2000 ms: anchor only PASS heading-paragraphs 5000 ms: anchor only PASS heading-paragraphs reload: anchor only PASS paragraph 500 ms: original bytes pending debounce PASS paragraph 2000 ms: anchor only PASS paragraph 5000 ms: anchor only PASS paragraph reload: anchor only PASS list-item 500 ms: original bytes pending debounce PASS list-item 2000 ms: anchor only PASS list-item 5000 ms: anchor only PASS list-item reload: anchor only PASS task 500 ms: original bytes pending debounce PASS task 2000 ms: anchor only PASS task 5000 ms: anchor only PASS task reload: anchor only PASS two-links 500 ms: original bytes pending debounce PASS two-links 2000 ms: anchor only PASS two-links 5000 ms: anchor only PASS two-links reload: anchor only PASS link-at-end 500 ms: original bytes pending debounce PASS link-at-end 2000 ms: anchor only PASS link-at-end 5000 ms: anchor only PASS link-at-end reload: anchor only PASS paragraph-link-at-end 500 ms: original bytes pending debounce PASS paragraph-link-at-end 2000 ms: anchor only PASS paragraph-link-at-end 5000 ms: anchor only PASS paragraph-link-at-end reload: anchor only PASS standalone-autolink 500 ms: original bytes pending debounce PASS standalone-autolink 2000 ms: anchor only PASS standalone-autolink 5000 ms: anchor only PASS standalone-autolink reload: anchor only REPAIR REPORT #1440: 10 existing fixture Notes scanned; 1 suspect adjacent link runs; no content rewritten. CSP REPORTS notes: 0 across 1 pages ``` Gate output (verbatim summaries; full logs in the evidence archive): `cargo fmt --check` — exit 0 No output. `cargo clippy -p calternal-collab --all-targets -- -D warnings` — exit 0 ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 4m 44s ``` `cargo test -p calternal-collab -- --test-threads=4` — exit 0 ```text test result: ok. 136 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 346.20s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.97s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.48s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.48s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 125.89s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.31s test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.22s test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.25s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.26s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.81s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 12.31s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.01s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 72.73s test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.24s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.20s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 33.61s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` `cargo clippy -p calternal-server --all-targets -- -D warnings` — exit 0 ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 11m 45s ``` `cargo test -p calternal-server -- --test-threads=4` — exit 0 ```text test result: ok. 272 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 195.14s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 46.80s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.24s ``` `cd apps/web && bun run check` — exit 0 ```text perf-lint: PASS; 0 violations; 22544 scoped exceptions svelte-check found 0 errors and 4 warnings in 2 files ``` `cd apps/web && bun run test --maxWorkers=1` — exit 0 ```text Test Files 297 passed (297) Tests 2120 passed (2120) Duration 413.70s (transform 39%, environment 22%, import 19%, tests 14%, setup 5%) ``` `cd packages/editor && bun run check` — exit 0 ```text svelte-check found 0 errors and 0 warnings ``` `cd packages/editor && bun run test` — exit 0 ```text Test Files 22 passed (22) Tests 453 passed (453) Duration 43.10s (transform 9.35s, setup 681ms, import 20.16s, tests 20.43s, environment 36.14s) ``` Earlier verification findings: two 5-second web-test timeouts passed unchanged in focused and full reruns. One Chromium closure interrupted fixture creation; the final complete browser run passed. Task test clicks were corrected to plain text; the app deliberately keeps the native menu on link text. Existing test assertions, timeout values and fixtures were not changed. Three new transaction regression cases were added. Cleanup: `cargo clean` removed 19.7 GiB. Ignored web build/output directories were removed after verification. No dependencies, lockfiles or migrations changed. No push or deploy. The required one-time origin/dev fetch/merge was already up to date. Screenshots are uncommitted review artifacts. [Download final evidence: all gate logs, successful browser output, load-failure trace and 12 current actual-size screenshots](https://git.kayg.org/attachments/a09961d3-5b79-4079-ab7c-cc3552f14982).
Author
Owner

Started hotfix35 on job/hotfix35. Base: d395b6e25. Will merge exactly 52e8dfbee3, then run the requested gates, real-server Notes regression, 20-Note byte checks, two-tab check and focused adversarial round. No push or deploy. The exact-merge instruction takes precedence over the generic origin/dev merge instruction. Browser plugin is not available; use the repository Playwright harness.

Started hotfix35 on job/hotfix35. Base: d395b6e25. Will merge exactly 52e8dfbee392e6bc9a0cdb4c4c8ebe4eca2a7b7c, then run the requested gates, real-server Notes regression, 20-Note byte checks, two-tab check and focused adversarial round. No push or deploy. The exact-merge instruction takes precedence over the generic origin/dev merge instruction. Browser plugin is not available; use the repository Playwright harness.
Author
Owner

Exact hotfix merge completed without conflicts. Head: 8ab88bb47f. Parents: d395b6e25d and 52e8dfbee3. No other branch merged. Root cause from the fix: a focus callback dispatched a presentation transaction during ProseMirror DOM replacement, which re-entered a half-built view; the DOM observer then saved duplicated link text. The fix coalesces focus updates in a microtask. The branch also preserves raw Markdown bytes on first Block ID assignment and inserts anchor text without inherited marks. cargo fmt --check exited 0 (no output). Dependencies installed from frozen lockfiles; no lockfile changes. Remaining checks are running.

Exact hotfix merge completed without conflicts. Head: 8ab88bb47f3e55809b331d3ce385eae9743028a5. Parents: d395b6e25da20d8c67b8b9fc1a593b813939c8a7 and 52e8dfbee392e6bc9a0cdb4c4c8ebe4eca2a7b7c. No other branch merged. Root cause from the fix: a focus callback dispatched a presentation transaction during ProseMirror DOM replacement, which re-entered a half-built view; the DOM observer then saved duplicated link text. The fix coalesces focus updates in a microtask. The branch also preserves raw Markdown bytes on first Block ID assignment and inserts anchor text without inherited marks. cargo fmt --check exited 0 (no output). Dependencies installed from frozen lockfiles; no lockfile changes. Remaining checks are running.
Author
Owner

Verification checkpoint. Head remains 8ab88bb47f; working tree clean. No extra merge.

cargo fmt --check: exit 0, no output.

cargo clippy -p calternal-collab -p calternal-plugin-notes --all-targets -- -D warnings: exit 0. Final output verbatim:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 9m 03s

cd apps/web && bun run check: exit 0. Final output verbatim:

svelte-check found 0 errors and 4 warnings in 2 files

Full web tests and Rust test-binary compilation continue. Frozen lockfiles installed without changes. Actual preset target is /home/kayg/build/targets/hotfix35; /mnt/hdd/targets/jobs/hotfix35 aliases it so the prescribed build path works without overriding CARGO_TARGET_DIR.

Verification checkpoint. Head remains 8ab88bb47f3e55809b331d3ce385eae9743028a5; working tree clean. No extra merge. `cargo fmt --check`: exit 0, no output. `cargo clippy -p calternal-collab -p calternal-plugin-notes --all-targets -- -D warnings`: exit 0. Final output verbatim: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 9m 03s ``` `cd apps/web && bun run check`: exit 0. Final output verbatim: ``` svelte-check found 0 errors and 4 warnings in 2 files ``` Full web tests and Rust test-binary compilation continue. Frozen lockfiles installed without changes. Actual preset target is /home/kayg/build/targets/hotfix35; /mnt/hdd/targets/jobs/hotfix35 aliases it so the prescribed build path works without overriding CARGO_TARGET_DIR.
Author
Owner

Verification continues at committed head 8ab88bb47f. Working tree clean; no additional source changes or merges.
cd apps/web && bun run test --maxWorkers=2: exit 0. Output verbatim:

 Test Files  297 passed (297)
      Tests  2120 passed (2120)
   Duration  869.03s (environment 27%, transform 25%, import 25%, tests 17%, setup 5%)

cd packages/editor && bun run test --maxWorkers=2: exit 0. Output verbatim:

 Test Files  22 passed (22)
      Tests  453 passed (453)
   Duration  69.78s (transform 11.74s, setup 1.56s, import 29.49s, tests 30.67s, environment 62.95s)

cd apps/web && bun run build: exit 0. The full output is in the attached web-gates-verbatim.tar.gz, with web check, web tests, editor tests, formatting and clippy logs. Rust test-binary compilation now reached calternal-collab. Release build and real-server checks follow.

Verification continues at committed head 8ab88bb47f3e55809b331d3ce385eae9743028a5. Working tree clean; no additional source changes or merges. `cd apps/web && bun run test --maxWorkers=2`: exit 0. Output verbatim: ``` Test Files 297 passed (297) Tests 2120 passed (2120) Duration 869.03s (environment 27%, transform 25%, import 25%, tests 17%, setup 5%) ``` `cd packages/editor && bun run test --maxWorkers=2`: exit 0. Output verbatim: ``` Test Files 22 passed (22) Tests 453 passed (453) Duration 69.78s (transform 11.74s, setup 1.56s, import 29.49s, tests 30.67s, environment 62.95s) ``` `cd apps/web && bun run build`: exit 0. The full output is in the attached web-gates-verbatim.tar.gz, with web check, web tests, editor tests, formatting and clippy logs. Rust test-binary compilation now reached calternal-collab. Release build and real-server checks follow.
Author
Owner

Head remains 8ab88bb47f. cargo test -p calternal-collab exited 0. Test summary output verbatim:

test result: ok. 136 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 221.11s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.86s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 9.05s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.69s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 85.40s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.28s
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.82s
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 18.35s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 23.39s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.67s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.36s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.76s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 70.65s
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.31s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 29.21s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

The full log will be attached in the final evidence archive. Notes Plugin test compilation is running; release server and real-server checks follow.

Head remains 8ab88bb47f3e55809b331d3ce385eae9743028a5. `cargo test -p calternal-collab` exited 0. Test summary output verbatim: ``` test result: ok. 136 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 221.11s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.86s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 9.05s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.69s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 85.40s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.28s test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.82s test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 18.35s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 23.39s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.67s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.36s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.76s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 70.65s test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.31s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 29.21s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` The full log will be attached in the final evidence archive. Notes Plugin test compilation is running; release server and real-server checks follow.
Author
Owner

All requested code gates completed at 8ab88bb47f. cargo test -p calternal-plugin-notes: exit 0. Output verbatim:

test result: ok. 317 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 306.58s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.43s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

The four ignored tests are existing opt-in migration/Voice performance profiles and a Daily Log E2E fixture generator. No expectations or ignore markers changed. Release server is compiling. Next: Copy link regression/screenshots, full Notes e2e, 20-Note/three-anchor byte check including two tabs, and one 30-minute Notes/collab adversarial sweep.

All requested code gates completed at 8ab88bb47f3e55809b331d3ce385eae9743028a5. `cargo test -p calternal-plugin-notes`: exit 0. Output verbatim: ``` test result: ok. 317 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 306.58s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.43s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` The four ignored tests are existing opt-in migration/Voice performance profiles and a Daily Log E2E fixture generator. No expectations or ignore markers changed. Release server is compiling. Next: Copy link regression/screenshots, full Notes e2e, 20-Note/three-anchor byte check including two tabs, and one 30-minute Notes/collab adversarial sweep.
Author
Owner

Real-server #1440 regression passed at 8ab88bb47f. Release build output verbatim:

    Finished `release` profile [optimized] target(s) in 32m 28s

Command: NOTES_E2E_COPY_LINK_1440_ONLY=1 CALTERNAL_SERVER_BIN=/mnt/hdd/targets/jobs/hotfix35/release/calternal-server bun e2e/notes.mjs --screenshots ../../artifacts/hotfix35/screenshots

All nine cases passed API reads at 500 ms, 2 s, 5 s and after reload. Only original bytes pending debounce were allowed at 500 ms; later bytes were exact source plus anchors. Repair output verbatim:

REPAIR REPORT #1440: 10 existing fixture Notes scanned; 1 suspect adjacent link runs; no content rewritten.
CSP REPORTS notes: 0 across 1 pages

12 screenshots are attached: 390, 820 and 1440 px; Mono and Noir; pointer and keyboard states; Mac platform emulation; device scale 1. The keyboard editor outline is the existing cosmetic finding #1448. Pointer captures have no outline. No focus or UI style change was added to this exact hotfix merge.

The existing full Notes e2e suite is running, followed by the 20-Note/three-anchor exact-byte check (including two tabs) and the 30-minute Notes/collab adversarial sweep.

Real-server #1440 regression passed at 8ab88bb47f3e55809b331d3ce385eae9743028a5. Release build output verbatim: ``` Finished `release` profile [optimized] target(s) in 32m 28s ``` Command: NOTES_E2E_COPY_LINK_1440_ONLY=1 CALTERNAL_SERVER_BIN=/mnt/hdd/targets/jobs/hotfix35/release/calternal-server bun e2e/notes.mjs --screenshots ../../artifacts/hotfix35/screenshots All nine cases passed API reads at 500 ms, 2 s, 5 s and after reload. Only original bytes pending debounce were allowed at 500 ms; later bytes were exact source plus anchors. Repair output verbatim: ``` REPAIR REPORT #1440: 10 existing fixture Notes scanned; 1 suspect adjacent link runs; no content rewritten. CSP REPORTS notes: 0 across 1 pages ``` 12 screenshots are attached: 390, 820 and 1440 px; Mono and Noir; pointer and keyboard states; Mac platform emulation; device scale 1. The keyboard editor outline is the existing cosmetic finding #1448. Pointer captures have no outline. No focus or UI style change was added to this exact hotfix merge. The existing full Notes e2e suite is running, followed by the 20-Note/three-anchor exact-byte check (including two tabs) and the 30-minute Notes/collab adversarial sweep.
Author
Owner

BLOCKING #1440 data-safety result at 8ab88bb47f. The nine single-anchor browser regression cases pass, but the requested three-anchor check fails. Note 1 passed with a second tab open. Note 2, one tab, changed a Markdown destination spelling after Copy link on its heading, paragraph and list item before one live save:

- Unicode 2: café 日本語 🪷 é — [link](https://example.org/one) and https://example.org/bare. ^q9e9j9
+ Unicode 2: café 日本語 🪷 é — [link](<https://example.org/one>) and https://example.org/bare. ^q9e9j9

The strict API byte diff failed after the five-second wait. This is a non-anchor source rewrite; the required data-safety criterion is not met. Current verdict: NOT READY. The original probe log is retained as spot.log. A collecting probe will check all 20 Notes and reloads without weakening the byte expectation. The one Notes/collab adversarial round is running.

Investigation point, not yet a proved root cause: patch_source_lines and patch_source_blocks preserve a first anchor only when one line/block is changed; several anchors in the same save can use a canonical replacement for a larger changed range. No further source change or merge has been made because this job authorizes exactly the pinned hotfix merge.

The full existing Notes e2e suite also exited 1 at notes.mjs:622, waiting 20 s for the Files/Recent Markdown editor to become contenteditable while identity hydration was deliberately paused (#606). This is retained in notes-e2e.log. No test expectation was changed.

BLOCKING #1440 data-safety result at 8ab88bb47f3e55809b331d3ce385eae9743028a5. The nine single-anchor browser regression cases pass, but the requested three-anchor check fails. Note 1 passed with a second tab open. Note 2, one tab, changed a Markdown destination spelling after Copy link on its heading, paragraph and list item before one live save: ```diff - Unicode 2: café 日本語 🪷 é — [link](https://example.org/one) and https://example.org/bare. ^q9e9j9 + Unicode 2: café 日本語 🪷 é — [link](<https://example.org/one>) and https://example.org/bare. ^q9e9j9 ``` The strict API byte diff failed after the five-second wait. This is a non-anchor source rewrite; the required data-safety criterion is not met. Current verdict: NOT READY. The original probe log is retained as spot.log. A collecting probe will check all 20 Notes and reloads without weakening the byte expectation. The one Notes/collab adversarial round is running. Investigation point, not yet a proved root cause: patch_source_lines and patch_source_blocks preserve a first anchor only when one line/block is changed; several anchors in the same save can use a canonical replacement for a larger changed range. No further source change or merge has been made because this job authorizes exactly the pinned hotfix merge. The full existing Notes e2e suite also exited 1 at notes.mjs:622, waiting 20 s for the Files/Recent Markdown editor to become contenteditable while identity hydration was deliberately paused (#606). This is retained in notes-e2e.log. No test expectation was changed.
Author
Owner

NOT READY: Copy link on several blocks still changes non-anchor Note source bytes after save and reload. The existing Notes e2e suite also fails.

Head: 8ab88bb47f3e55809b331d3ce385eae9743028a5 on job/hotfix35. Exact no-ff merge parents: d395b6e25da20d8c67b8b9fc1a593b813939c8a7 and 52e8dfbee392e6bc9a0cdb4c4c8ebe4eca2a7b7c. No conflicts. No other merge, source edit, push or deploy. Working tree is clean.

What was built: the pinned hotfix defers/coalesces focus presentation updates, inserts unmarked Block IDs, and preserves raw Markdown on first-anchor edits. Built the production web app and this branch's own release server with four cargo jobs. Server SHA-256: cb31454745f016e0a35abe99142c130381682e1d0bed1d8b5bcd08b0818bb984.

Files in the merge:

  • apps/web/e2e/notes.mjs
  • apps/web/src/lib/notes/anchors.svelte.test.ts
  • apps/web/src/lib/notes/anchors.ts
  • apps/web/src/lib/notes/inlineLinks.test.ts
  • apps/web/src/lib/notes/inlineLinks.ts
  • crates/calternal-collab/src/markdown.rs
  • packages/editor/src/markdown.test.ts
  • packages/editor/src/markdown.ts

Gate output (verbatim result lines; full unedited command output is in the attached gate archives):

cargo fmt --check: exit 0; no output.

cargo clippy -p calternal-collab -p calternal-plugin-notes --all-targets -- -D warnings: exit 0.

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 9m 03s

cargo test -p calternal-collab: exit 0.

test result: ok. 136 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 221.11s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.86s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 9.05s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.69s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 85.40s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.28s
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.82s
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 18.35s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 23.39s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.67s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.36s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.76s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 70.65s
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.31s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 29.21s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

cargo test -p calternal-plugin-notes: exit 0.

test result: ok. 317 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 306.58s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.43s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

cd apps/web && bun run check: exit 0.

perf-lint: parse Rust product sources
perf-lint: parse browser product sources
perf-lint: validate coverage and architecture
perf-lint: PASS; 0 violations; 22544 scoped exceptions
svelte-check found 0 errors and 4 warnings in 2 files

cd apps/web && bun run test --maxWorkers=2: exit 0.

 Test Files  297 passed (297)
      Tests  2120 passed (2120)
   Duration  869.03s (environment 27%, transform 25%, import 25%, tests 17%, setup 5%)

cd packages/editor && bun run test --maxWorkers=2: exit 0.

 Test Files  22 passed (22)
      Tests  453 passed (453)
   Duration  69.78s (transform 11.74s, setup 1.56s, import 29.49s, tests 30.67s, environment 62.95s)

Build output, verbatim:

Compressed 914 static variants; saved 21511333 bytes.
    Finished `release` profile [optimized] target(s) in 32m 28s

Runtime verification:

  • NOTES_E2E_COPY_LINK_1440_ONLY=1 bun e2e/notes.mjs: exit 0. All nine incoming cases pass at 2 s, 5 s and reload; the 500 ms checks accept the original bytes while the save debounce is pending. Repair report scanned ten test Notes, found one deliberately damaged link-run fixture, and rewrote nothing. CSP reports: zero.
  • bun run test:e2e:notes: exit 1. At notes.mjs:622 the #606 Files/Recent Markdown case waits 20 s for a cached editable editor while auth/me is held. A focused run reproduces it: the existing Note is shown as missing, with no editor surface. Filed #1456. The cause is not established. Capture-harness MutationObserver errors are retained in the diagnostic log. No expectation was changed.
  • Real-server data check: all 20 Notes attempted, three Block IDs each; content includes links, bare URLs, autolinks, wikilinks, tasks, tables, code and Unicode. API bytes were compared to the source plus anchors at 5 s and after reload. Thirteen Notes passed. Notes 11, 14, 15, 16, 17, 18 and 20 each failed both checks (14 byte mismatches, zero flow failures). The first Note also passed with a peer editor tab open. An earlier strict run stopped at the same byte defect on Note 2; the collecting run retained the exact byte expectation and completed all 20.

Example non-anchor change from the first strict run:

- Unicode 2: café 日本語 🪷 é — [link](https://example.org/one) and https://example.org/bare. ^q9e9j9
+ Unicode 2: café 日本語 🪷 é — [link](<https://example.org/one>) and https://example.org/bare. ^q9e9j9

The collecting probe reproduced durable normalization after reload. No duplicated prose was observed in these probes, but the requested source-plus-anchors byte invariant fails. Investigation point only: Rust source patching limits anchor-preserving replacement to a single changed line/block; coalesced anchor changes can reach a larger canonical replacement. The cause still needs a focused regression and fix.

EDITOR_ONLY=1 ADVERSARIAL_SERVER_BIN=<branch release> ADVERSARIAL_SKIP_WEB_BUILD=1 timeout -k 30s 30m bash tests/adversarial/run.sh: one round, exit 1. Native sandbox checks and the editor/collab scenarios completed, including untouched bytes/mtime, mixed Markdown, 10,002 blocks, 1 MB paragraph, concurrent writes, offline reconciliation, delete/edit, external body write and server restart. The sole editor finding is the known #1413 raw-text anchor assertion, with the same seed; loopback image proxy requests returned 400. No assertions were changed. Remaining checks after that probe assertion are not proved by this run.

editor findings=1 seed=25608414 historySeeds=25608414

Visual evidence: twelve actual-size macOS-emulated captures, at 390, 820 and 1440 px, light/dark, pointer/keyboard, after Copy link and reload. All are attached for orchestrator review. The keyboard capture retains the known focus outline #1448; no local restyling was added. The #1456 failure capture is also attached.

UX gaps closed: the incoming single-anchor regression covers the original link duplication case, marked-anchor insertion and standalone autolink spelling. UX gaps left: multi-anchor source preservation (#1440), cached Files editor (#1456), keyboard focus outline (#1448), and the #1413 adversarial probe mismatch. Four pre-existing opt-in Notes Rust tests remain ignored. No new test expectations were relaxed.

Decisions: no product design decisions. Kept the exact pinned merge instead of the generic final origin/dev merge, because the job explicitly says merge that commit and nothing else. Used per-crate clippy under the shared-host rule. The preset CARGO_TARGET_DIR was /home/kayg/build/targets/hotfix35; retained it and provided /mnt/hdd/targets/jobs/hotfix35 as a symlink to that same target. Installed frozen Bun dependencies for the test harness. Tests used fixture data only. No benchmark was run: this is a hotfix verification job, not a performance issue, and the current policy reserves perf runs for performance issues.

Cleanup: cargo clean and removal of apps/web/build and apps/web/.sveltekit. Review artifacts are ignored and attached, not committed. Changed module and function comments were re-read. No secrets were displayed.

Evidence:

NOT READY: durable non-anchor source changes after multi-block Copy link; full Notes e2e fails.

NOT READY: Copy link on several blocks still changes non-anchor Note source bytes after save and reload. The existing Notes e2e suite also fails. Head: `8ab88bb47f3e55809b331d3ce385eae9743028a5` on `job/hotfix35`. Exact no-ff merge parents: `d395b6e25da20d8c67b8b9fc1a593b813939c8a7` and `52e8dfbee392e6bc9a0cdb4c4c8ebe4eca2a7b7c`. No conflicts. No other merge, source edit, push or deploy. Working tree is clean. What was built: the pinned hotfix defers/coalesces focus presentation updates, inserts unmarked Block IDs, and preserves raw Markdown on first-anchor edits. Built the production web app and this branch's own release server with four cargo jobs. Server SHA-256: `cb31454745f016e0a35abe99142c130381682e1d0bed1d8b5bcd08b0818bb984`. Files in the merge: - apps/web/e2e/notes.mjs - apps/web/src/lib/notes/anchors.svelte.test.ts - apps/web/src/lib/notes/anchors.ts - apps/web/src/lib/notes/inlineLinks.test.ts - apps/web/src/lib/notes/inlineLinks.ts - crates/calternal-collab/src/markdown.rs - packages/editor/src/markdown.test.ts - packages/editor/src/markdown.ts Gate output (verbatim result lines; full unedited command output is in the attached gate archives): `cargo fmt --check`: exit 0; no output. `cargo clippy -p calternal-collab -p calternal-plugin-notes --all-targets -- -D warnings`: exit 0. ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 9m 03s ``` `cargo test -p calternal-collab`: exit 0. ``` test result: ok. 136 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 221.11s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.86s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 9.05s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.69s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 85.40s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.28s test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.82s test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 18.35s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 23.39s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.67s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.36s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.76s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 70.65s test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.31s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 29.21s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` `cargo test -p calternal-plugin-notes`: exit 0. ``` test result: ok. 317 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 306.58s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.43s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` `cd apps/web && bun run check`: exit 0. ``` perf-lint: parse Rust product sources perf-lint: parse browser product sources perf-lint: validate coverage and architecture perf-lint: PASS; 0 violations; 22544 scoped exceptions svelte-check found 0 errors and 4 warnings in 2 files ``` `cd apps/web && bun run test --maxWorkers=2`: exit 0. ``` Test Files 297 passed (297) Tests 2120 passed (2120) Duration 869.03s (environment 27%, transform 25%, import 25%, tests 17%, setup 5%) ``` `cd packages/editor && bun run test --maxWorkers=2`: exit 0. ``` Test Files 22 passed (22) Tests 453 passed (453) Duration 69.78s (transform 11.74s, setup 1.56s, import 29.49s, tests 30.67s, environment 62.95s) ``` Build output, verbatim: ``` Compressed 914 static variants; saved 21511333 bytes. Finished `release` profile [optimized] target(s) in 32m 28s ``` Runtime verification: - `NOTES_E2E_COPY_LINK_1440_ONLY=1 bun e2e/notes.mjs`: exit 0. All nine incoming cases pass at 2 s, 5 s and reload; the 500 ms checks accept the original bytes while the save debounce is pending. Repair report scanned ten test Notes, found one deliberately damaged link-run fixture, and rewrote nothing. CSP reports: zero. - `bun run test:e2e:notes`: exit 1. At notes.mjs:622 the #606 Files/Recent Markdown case waits 20 s for a cached editable editor while auth/me is held. A focused run reproduces it: the existing Note is shown as missing, with no editor surface. Filed #1456. The cause is not established. Capture-harness MutationObserver errors are retained in the diagnostic log. No expectation was changed. - Real-server data check: all 20 Notes attempted, three Block IDs each; content includes links, bare URLs, autolinks, wikilinks, tasks, tables, code and Unicode. API bytes were compared to the source plus anchors at 5 s and after reload. Thirteen Notes passed. Notes 11, 14, 15, 16, 17, 18 and 20 each failed both checks (14 byte mismatches, zero flow failures). The first Note also passed with a peer editor tab open. An earlier strict run stopped at the same byte defect on Note 2; the collecting run retained the exact byte expectation and completed all 20. Example non-anchor change from the first strict run: ```diff - Unicode 2: café 日本語 🪷 é — [link](https://example.org/one) and https://example.org/bare. ^q9e9j9 + Unicode 2: café 日本語 🪷 é — [link](<https://example.org/one>) and https://example.org/bare. ^q9e9j9 ``` The collecting probe reproduced durable normalization after reload. No duplicated prose was observed in these probes, but the requested source-plus-anchors byte invariant fails. Investigation point only: Rust source patching limits anchor-preserving replacement to a single changed line/block; coalesced anchor changes can reach a larger canonical replacement. The cause still needs a focused regression and fix. `EDITOR_ONLY=1 ADVERSARIAL_SERVER_BIN=<branch release> ADVERSARIAL_SKIP_WEB_BUILD=1 timeout -k 30s 30m bash tests/adversarial/run.sh`: one round, exit 1. Native sandbox checks and the editor/collab scenarios completed, including untouched bytes/mtime, mixed Markdown, 10,002 blocks, 1 MB paragraph, concurrent writes, offline reconciliation, delete/edit, external body write and server restart. The sole editor finding is the known #1413 raw-text anchor assertion, with the same seed; loopback image proxy requests returned 400. No assertions were changed. Remaining checks after that probe assertion are not proved by this run. ``` editor findings=1 seed=25608414 historySeeds=25608414 ``` Visual evidence: twelve actual-size macOS-emulated captures, at 390, 820 and 1440 px, light/dark, pointer/keyboard, after Copy link and reload. All are attached for orchestrator review. The keyboard capture retains the known focus outline #1448; no local restyling was added. The #1456 failure capture is also attached. UX gaps closed: the incoming single-anchor regression covers the original link duplication case, marked-anchor insertion and standalone autolink spelling. UX gaps left: multi-anchor source preservation (#1440), cached Files editor (#1456), keyboard focus outline (#1448), and the #1413 adversarial probe mismatch. Four pre-existing opt-in Notes Rust tests remain ignored. No new test expectations were relaxed. Decisions: no product design decisions. Kept the exact pinned merge instead of the generic final origin/dev merge, because the job explicitly says merge that commit and nothing else. Used per-crate clippy under the shared-host rule. The preset CARGO_TARGET_DIR was /home/kayg/build/targets/hotfix35; retained it and provided /mnt/hdd/targets/jobs/hotfix35 as a symlink to that same target. Installed frozen Bun dependencies for the test harness. Tests used fixture data only. No benchmark was run: this is a hotfix verification job, not a performance issue, and the current policy reserves perf runs for performance issues. Cleanup: cargo clean and removal of apps/web/build and apps/web/.sveltekit. Review artifacts are ignored and attached, not committed. Changed module and function comments were re-read. No secrets were displayed. Evidence: - [merge.md](https://git.kayg.org/attachments/5a3df77d-9e08-4c27-a653-8cb400880f53) - [web-gates-verbatim.tar.gz](https://git.kayg.org/attachments/8786a4c4-a6a7-43ce-88d5-90c2905342d5) - [rust-gates-verbatim.tar.gz](https://git.kayg.org/attachments/a1587bc9-4ca3-4982-b416-008410b0bc3a) - [copy-link-1440-1440-mono.png](https://git.kayg.org/attachments/1aaa8ab7-b247-4bb2-91ad-134f4ace819f) - [copy-link-1440-1440-noir.png](https://git.kayg.org/attachments/33a67377-eebc-4cab-b123-c36bee27f7c7) - [copy-link-1440-390-mono.png](https://git.kayg.org/attachments/7e44571c-bcfd-46b6-8aff-3ae626c7c502) - [copy-link-1440-390-noir.png](https://git.kayg.org/attachments/73177a8a-0917-4846-b53b-09c1a11c0af1) - [copy-link-1440-820-mono.png](https://git.kayg.org/attachments/8ce05e38-c403-4e3c-a17d-aab47303fc82) - [copy-link-1440-820-noir.png](https://git.kayg.org/attachments/fbf97120-69c5-45bc-a9d5-f6eb0b17aec4) - [copy-link-keyboard-1440-1440-mono.png](https://git.kayg.org/attachments/9511caf2-0e75-4aed-9315-1714706c4a0d) - [copy-link-keyboard-1440-1440-noir.png](https://git.kayg.org/attachments/b85aa559-64af-4cca-8b7c-0d1ed5570339) - [copy-link-keyboard-1440-390-mono.png](https://git.kayg.org/attachments/7c6867cd-328c-427a-ab2b-b4cc557faeac) - [copy-link-keyboard-1440-390-noir.png](https://git.kayg.org/attachments/82979493-555b-45e9-8cce-bc17db734d2a) - [copy-link-keyboard-1440-820-mono.png](https://git.kayg.org/attachments/17a07d0b-2264-4198-9bf7-bfa8190959ee) - [copy-link-keyboard-1440-820-noir.png](https://git.kayg.org/attachments/7a643527-560f-4843-a32f-8a1cdc1670e6) - [runtime-evidence.tar.gz](https://git.kayg.org/attachments/26949583-0fff-45e8-ac1e-c2dcebed6fef) - [files-cache-606-failure.png](https://git.kayg.org/attachments/cbce1e9c-dfbf-400c-8ecf-da8bc08a8506) NOT READY: durable non-anchor source changes after multi-block Copy link; full Notes e2e fails.
Author
Owner

Cleanup path correction: the Svelte build directory is apps/web/.svelte-kit (with a hyphen), not .sveltekit. It and apps/web/build are removed. Cargo clean output, verbatim:

     Removed 22513 files, 17.3GiB total

Working tree remains clean. Final verdict remains NOT READY.

Cleanup path correction: the Svelte build directory is `apps/web/.svelte-kit` (with a hyphen), not `.sveltekit`. It and `apps/web/build` are removed. Cargo clean output, verbatim: ``` Removed 22513 files, 17.3GiB total ``` Working tree remains clean. Final verdict remains NOT READY.
Author
Owner

Continue #1440 on job/linkdup-1440, base/head 52e8dfbee. First compare #1456 on pinned d395b6e25 and 8ab88bb47 with production web builds and release servers, then fix multi-anchor byte preservation. No push or deploy.

Continue #1440 on job/linkdup-1440, base/head 52e8dfbee. First compare #1456 on pinned d395b6e25 and 8ab88bb47 with production web builds and release servers, then fix multi-anchor byte preservation. No push or deploy.
Author
Owner

Multi-anchor regression reproduced in packages/editor: the new twenty-Note fixture test failed for LF and CRLF with link becoming link and the same change for the list item. Headings have block spans but no inline source spans; the source visitor rejected the heading anchor and reserialized the whole changed range. Reusing the existing block spans for anchor-only writes makes the focused Markdown test pass: Test Files 1 passed (1); Tests 138 passed (138). Rust also limits anchor preservation to a single changed line/block; added batched raw-line/block patching with complete projection validation. Rust verification and pinned #1456 comparison are in progress.

Multi-anchor regression reproduced in packages/editor: the new twenty-Note fixture test failed for LF and CRLF with [link](https://example.org/one) becoming [link](<https://example.org/one>) and the same change for the list item. Headings have block spans but no inline source spans; the source visitor rejected the heading anchor and reserialized the whole changed range. Reusing the existing block spans for anchor-only writes makes the focused Markdown test pass: Test Files 1 passed (1); Tests 138 passed (138). Rust also limits anchor preservation to a single changed line/block; added batched raw-line/block patching with complete projection validation. Rust verification and pinned #1456 comparison are in progress.
Author
Owner

Multi-anchor source patches now pass all nine focused Rust source-patching tests, including twenty Notes across LF, CRLF and CR, adjacent heading/paragraph source spans, several anchors within one list, and own-line table/quote anchors. Result: test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 130 filtered out; finished in 0.58s. The source patch keeps the original ending pending while it inserts an own-line anchor; otherwise an added anchor line bypassed the raw-byte path. The extra adjacent fixture initially assigned an anchor inside a multi-line paragraph; fixed the new fixture to put IDs on real block ends. No existing test assertion was changed. Client gates: Test Files 22 passed (22), Tests 462 passed (462). Web gates: perf-lint: PASS; 0 violations; 22544 scoped exceptions; svelte-check found 0 errors and 4 warnings in 2 files; Test Files 297 passed (297), Tests 2120 passed (2120). Full Rust gates and both remaining real-server runs are in progress.

Multi-anchor source patches now pass all nine focused Rust source-patching tests, including twenty Notes across LF, CRLF and CR, adjacent heading/paragraph source spans, several anchors within one list, and own-line table/quote anchors. Result: test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 130 filtered out; finished in 0.58s. The source patch keeps the original ending pending while it inserts an own-line anchor; otherwise an added anchor line bypassed the raw-byte path. The extra adjacent fixture initially assigned an anchor inside a multi-line paragraph; fixed the new fixture to put IDs on real block ends. No existing test assertion was changed. Client gates: Test Files 22 passed (22), Tests 462 passed (462). Web gates: perf-lint: PASS; 0 violations; 22544 scoped exceptions; svelte-check found 0 errors and 4 warnings in 2 files; Test Files 297 passed (297), Tests 2120 passed (2120). Full Rust gates and both remaining real-server runs are in progress.
Author
Owner

Confirmed pre-existing on both pinned revisions. Each revision used its own production web build and release server, with CALTERNAL_E2E_ASSET_OVERRIDE=1 and NOTES_E2E_606_ONLY=1.

Both fail with the exact same output:

TimeoutError: waitFor: Timeout 20000ms exceeded.
  - waiting for locator('.note-card .editor-surface .ProseMirror[contenteditable="true"]') to be visible
CSP REPORTS notes: 0 across 2 pages

The assertion waits for the existing cached editor while /auth/me is held. The baseline contains no #1440 hotfix changes, so #1456 predates this branch. No expectation or focus code was changed. Leaving #1456 open per the job instruction. The pinned server checksums and full logs will be attached to #1440 with the final report.

Confirmed pre-existing on both pinned revisions. Each revision used its own production web build and release server, with CALTERNAL_E2E_ASSET_OVERRIDE=1 and NOTES_E2E_606_ONLY=1. - d395b6e25: exit 1 at notes.mjs:620. - 8ab88bb47: exit 1 at notes.mjs:622. Both fail with the exact same output: ``` TimeoutError: waitFor: Timeout 20000ms exceeded. - waiting for locator('.note-card .editor-surface .ProseMirror[contenteditable="true"]') to be visible CSP REPORTS notes: 0 across 2 pages ``` The assertion waits for the existing cached editor while /auth/me is held. The baseline contains no #1440 hotfix changes, so #1456 predates this branch. No expectation or focus code was changed. Leaving #1456 open per the job instruction. The pinned server checksums and full logs will be attached to #1440 with the final report.
Author
Owner

Real-server twenty-Note check passed on the updated release server and production web build. Three Copy links each (heading, paragraph, list item); compared persisted API bytes at 5 s and after reload, plus the first Note with a peer editor tab. All sixty Copy links changed only Block ID suffixes.

Verbatim output:

COPY LINK BATCH SUMMARY: 20 Notes attempted; 0 byte mismatches; 0 flow failures
CSP REPORTS notes: 0 across 2 pages

The full calternal-collab gate passed as well. Notes Rust gate and the nine incoming cases with twelve macOS-emulated screenshots are in progress. No push, deploy or data repair.

Real-server twenty-Note check passed on the updated release server and production web build. Three Copy links each (heading, paragraph, list item); compared persisted API bytes at 5 s and after reload, plus the first Note with a peer editor tab. All sixty Copy links changed only Block ID suffixes. Verbatim output: ``` COPY LINK BATCH SUMMARY: 20 Notes attempted; 0 byte mismatches; 0 flow failures CSP REPORTS notes: 0 across 2 pages ``` The full calternal-collab gate passed as well. Notes Rust gate and the nine incoming cases with twelve macOS-emulated screenshots are in progress. No push, deploy or data repair.
Author
Owner

Final comment/source review found an extra first-anchor edge: a setext heading containing only https://example.org/heading uses a different canonical link spelling once it owns an anchor. A new regression failed on LF, CRLF and CR: the fallback converted that heading to https://example.org/heading and added angle brackets to the neighbouring unwrapped link. Fixed the semantic autolink fallback to reuse the heading text-line insertion point before the original underline. Focused result: Test Files 1 passed (1); Tests 148 passed (148). No existing assertion was changed. Final frontend gates and real-server byte checks are being rerun after this change; Rust gates already passed and Rust code is unchanged.

Final comment/source review found an extra first-anchor edge: a setext heading containing only <https://example.org/heading> uses a different canonical link spelling once it owns an anchor. A new regression failed on LF, CRLF and CR: the fallback converted that heading to [https://example.org/heading](<https://example.org/heading>) and added angle brackets to the neighbouring unwrapped link. Fixed the semantic autolink fallback to reuse the heading text-line insertion point before the original underline. Focused result: Test Files 1 passed (1); Tests 148 passed (148). No existing assertion was changed. Final frontend gates and real-server byte checks are being rerun after this change; Rust gates already passed and Rust code is unchanged.
Author
Owner

#1440 linkdup2 final report

Ready for merge. Branch job/linkdup-1440, initial head 52e8dfbee, final head af202e1514955ddf0f8b4b3d2503c780d807ed84. No push, deploy or issue closure. Fetched origin once and merged origin/dev before final gates: Already up to date. (d395b6e25).

Built and files

  • crates/calternal-collab/src/markdown.rs: batch anchor saves splice every changed source line or block. The patch preserves raw Markdown, whitespace and LF, CRLF or CR endings. It validates the complete canonical projection before accepting the patch. Container anchors retain their own line; setext anchors stay before the underline.
  • packages/editor/src/markdown.ts: source-aware anchor serialization uses parsed block sources for headings as well as inline text spans. A coalesced heading and paragraph save keeps authored URL spelling. Sole-autolink setext headings use the same insertion boundary.
  • packages/editor/src/markdown.test.ts: twenty Note shapes, all three line endings, adjacent heading/paragraph blocks, list items, table and quote containers, and sole-autolink setext regressions. Rust tests cover the same twenty shapes: links, bare URLs, autolinks, wikilinks, Tasks, tables, code and Unicode.
  • apps/web/e2e/notes.mjs: repeatable twenty-Note / sixty-Copy-link byte probe, plus a sole-autolink setext real-server case. Existing test expectations stay intact.

#1456 comparison

Both pinned revisions used their own production web build and release server. NOTES_E2E_606_ONLY=1 fails identically on baseline d395b6e25 and hotfix 8ab88bb47, with the cached editable Markdown assertion timing out while /auth/me is pending. This is pre-existing. Results were posted on #1456. No deferred focus code was changed; #1456 stays open as instructed.

Verbatim common failure:

TimeoutError: waitFor: Timeout 20000ms exceeded.
  - waiting for locator('.note-card .editor-surface .ProseMirror[contenteditable="true"]') to be visible
CSP REPORTS notes: 0 across 2 pages

Real-server verification

Focused commands (set CALTERNAL_SERVER_BIN to this branch's release server, PLAYWRIGHT_MODULE to the installed Playwright module, and CALTERNAL_E2E_ASSET_OVERRIDE=1):

cd apps/web
NOTES_E2E_COPY_LINK_BATCH_1440_ONLY=1 bun e2e/notes.mjs
NOTES_E2E_COPY_LINK_1440_ONLY=1 bun e2e/notes.mjs

The required hotfix35 fixture shapes all pass against the fixed release server and production web build: 20 Notes × 3 Copy links. Every Note was compared at five seconds and after reload. A peer tab was also checked on the first Note.

COPY LINK BATCH SUMMARY: 20 Notes attempted; 0 byte mismatches; 0 flow failures
CSP REPORTS notes: 0 across 2 pages

The complete focused Copy link run passes all ten cases (including the new sole-autolink setext case), with exit 0 and no CSP reports. All ten have anchor-only bytes at two seconds, five seconds and reload. The one suspect repair fixture is deliberately damaged test data; the repair report performs no writes.

The focused sole-autolink setext case also passes at 500 ms, 2 s, 5 s and reload. The 500 ms check allows unchanged source during the existing debounce; all later checks require exactly the anchor insertion. No link angle brackets are added. The fixture setup initially produced two h1 elements; the new fixture was corrected to use the normal Note title and a setext h2. Product code and existing test expectations were not changed for that harness failure.

Production build identity is 24639b7ba50c8e9e6e893c3b9f13bfb10939df80; the later commits contain comments and e2e test code only. The release server was rebuilt from the current collab source after the pinned-build comparison; native cache reuse across the detached comparison worktrees was explicitly invalidated. Server SHA-256 and build logs are included in the evidence archive.

Gates (verbatim output)

cargo fmt --check: exit 0; no output.

cargo clippy -p calternal-collab --all-targets -- -D warnings:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 16m 49s

cargo test -p calternal-collab -- --test-threads=4:

test result: ok. 139 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 255.96s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.60s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.09s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.79s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 64.95s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.75s
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.34s
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.89s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.38s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.36s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.81s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.46s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 32.18s
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.20s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.44s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 20.48s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

cargo test -p calternal-plugin-notes -- --test-threads=4:

test result: ok. 317 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 256.61s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

cd apps/web && bun run check:

perf-lint: PASS; 0 violations; 22544 scoped exceptions
svelte-check found 0 errors and 4 warnings in 2 files

cd apps/web && bun run test --maxWorkers=2:

 Test Files  297 passed (297)
      Tests  2120 passed (2120)
   Duration  819.14s (environment 28%, transform 26%, import 25%, tests 14%, setup 6%)

cd packages/editor && bun run test --maxWorkers=2:

 Test Files  22 passed (22)
      Tests  465 passed (465)
   Duration  28.88s (transform 3.88s, setup 428ms, import 10.71s, tests 14.32s, environment 26.55s)

No dependencies or lockfiles changed. No migrations changed. Module and non-obvious function comments were read again before this report.

UX gaps closed

Copy link can assign several block identities in one save without rewriting unrelated Note text. Setext headings, container blocks and sole autolinks keep their source bytes. The existing heading Copy link button and block context menu are reused; no visible control or style was added. Reload and the peer tab preserve the same source.

Known gaps / UX gaps left

  • #1456: cached Markdown waits for /auth/me on both pinned builds. Pre-existing; left open per the job instruction.
  • #1448: the existing keyboard-triggered focus outline remains visible in the screenshot set. No focus or styling code changed in this job.
  • Notes tests retain four existing ignored tests. Web check reports four existing warnings in two files, with zero errors.
  • The canonical Markdown writer retains its DESIGN §9 format. This fix applies source-aware anchor saves; it does not change that format.

Decisions and cost

No new product design decision. DESIGN §§9 and 33 remain the source of the canonical Markdown and identity grammar. Anchor-only persistence now preserves all other source bytes, as the job requires. The forward patch costs O(Note bytes + block count) and performs no extra filesystem or network operation. The runtime evidence covers twenty fixture Notes and sixty Copy links. No perf VM benchmark was run: the current verification policy reserves perf measurements for performance issues.

For the merge round

  • cd apps/web && bun e2e/notes.mjs: run the complete Notes e2e suite, including routes unrelated to this change.
  • bash tests/adversarial/run.sh: run the merge round's full adversarial matrices. cargo clippy --all-targets -- -D warnings && cargo test -- --test-threads=4: run the combined workspace gates. This job ran the focused real-server byte regression and the requested per-crate gates; it did not run full matrices or deploy.

Evidence

Twelve actual-size production screenshots cover macOS-emulated rendering at 390, 820 and 1440 px, light and dark, after pointer and keyboard Copy link. The Note data is loaded and no update toast is present. Screenshots are attached for Claude's visual review; this job makes no aesthetic approval claim.

Cleanup

cargo clean completed:

     Removed 22413 files, 17.3GiB total

Production web output, .svelte-kit, test temporary files and both isolated comparison worktrees were removed. The job worktree is clean. Reports, logs and screenshots remain in ignored artifacts/.

Full gate, build, comparison and runtime logs: gate-runtime-evidence.tar.gz.

# #1440 linkdup2 final report Ready for merge. Branch `job/linkdup-1440`, initial head `52e8dfbee`, final head `af202e1514955ddf0f8b4b3d2503c780d807ed84`. No push, deploy or issue closure. Fetched origin once and merged `origin/dev` before final gates: `Already up to date.` (`d395b6e25`). ## Built and files - `crates/calternal-collab/src/markdown.rs`: batch anchor saves splice every changed source line or block. The patch preserves raw Markdown, whitespace and LF, CRLF or CR endings. It validates the complete canonical projection before accepting the patch. Container anchors retain their own line; setext anchors stay before the underline. - `packages/editor/src/markdown.ts`: source-aware anchor serialization uses parsed block sources for headings as well as inline text spans. A coalesced heading and paragraph save keeps authored URL spelling. Sole-autolink setext headings use the same insertion boundary. - `packages/editor/src/markdown.test.ts`: twenty Note shapes, all three line endings, adjacent heading/paragraph blocks, list items, table and quote containers, and sole-autolink setext regressions. Rust tests cover the same twenty shapes: links, bare URLs, autolinks, wikilinks, Tasks, tables, code and Unicode. - `apps/web/e2e/notes.mjs`: repeatable twenty-Note / sixty-Copy-link byte probe, plus a sole-autolink setext real-server case. Existing test expectations stay intact. ## #1456 comparison Both pinned revisions used their own production web build and release server. `NOTES_E2E_606_ONLY=1` fails identically on baseline `d395b6e25` and hotfix `8ab88bb47`, with the cached editable Markdown assertion timing out while `/auth/me` is pending. This is pre-existing. Results were posted on #1456. No deferred focus code was changed; #1456 stays open as instructed. Verbatim common failure: ``` TimeoutError: waitFor: Timeout 20000ms exceeded. - waiting for locator('.note-card .editor-surface .ProseMirror[contenteditable="true"]') to be visible CSP REPORTS notes: 0 across 2 pages ``` ## Real-server verification Focused commands (set `CALTERNAL_SERVER_BIN` to this branch's release server, `PLAYWRIGHT_MODULE` to the installed Playwright module, and `CALTERNAL_E2E_ASSET_OVERRIDE=1`): ``` cd apps/web NOTES_E2E_COPY_LINK_BATCH_1440_ONLY=1 bun e2e/notes.mjs NOTES_E2E_COPY_LINK_1440_ONLY=1 bun e2e/notes.mjs ``` The required hotfix35 fixture shapes all pass against the fixed release server and production web build: 20 Notes × 3 Copy links. Every Note was compared at five seconds and after reload. A peer tab was also checked on the first Note. ``` COPY LINK BATCH SUMMARY: 20 Notes attempted; 0 byte mismatches; 0 flow failures CSP REPORTS notes: 0 across 2 pages ``` The complete focused Copy link run passes all ten cases (including the new sole-autolink setext case), with exit 0 and no CSP reports. All ten have anchor-only bytes at two seconds, five seconds and reload. The one suspect repair fixture is deliberately damaged test data; the repair report performs no writes. The focused sole-autolink setext case also passes at 500 ms, 2 s, 5 s and reload. The 500 ms check allows unchanged source during the existing debounce; all later checks require exactly the anchor insertion. No link angle brackets are added. The fixture setup initially produced two h1 elements; the new fixture was corrected to use the normal Note title and a setext h2. Product code and existing test expectations were not changed for that harness failure. Production build identity is `24639b7ba50c8e9e6e893c3b9f13bfb10939df80`; the later commits contain comments and e2e test code only. The release server was rebuilt from the current collab source after the pinned-build comparison; native cache reuse across the detached comparison worktrees was explicitly invalidated. Server SHA-256 and build logs are included in the evidence archive. ## Gates (verbatim output) `cargo fmt --check`: exit 0; no output. `cargo clippy -p calternal-collab --all-targets -- -D warnings`: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 16m 49s ``` `cargo test -p calternal-collab -- --test-threads=4`: ``` test result: ok. 139 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 255.96s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.60s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.09s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.79s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 64.95s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.75s test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.34s test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.89s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.38s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.36s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.81s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.46s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 32.18s test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.20s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.44s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 20.48s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` `cargo test -p calternal-plugin-notes -- --test-threads=4`: ``` test result: ok. 317 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 256.61s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` `cd apps/web && bun run check`: ``` perf-lint: PASS; 0 violations; 22544 scoped exceptions svelte-check found 0 errors and 4 warnings in 2 files ``` `cd apps/web && bun run test --maxWorkers=2`: ``` Test Files 297 passed (297) Tests 2120 passed (2120) Duration 819.14s (environment 28%, transform 26%, import 25%, tests 14%, setup 6%) ``` `cd packages/editor && bun run test --maxWorkers=2`: ``` Test Files 22 passed (22) Tests 465 passed (465) Duration 28.88s (transform 3.88s, setup 428ms, import 10.71s, tests 14.32s, environment 26.55s) ``` No dependencies or lockfiles changed. No migrations changed. Module and non-obvious function comments were read again before this report. ## UX gaps closed Copy link can assign several block identities in one save without rewriting unrelated Note text. Setext headings, container blocks and sole autolinks keep their source bytes. The existing heading Copy link button and block context menu are reused; no visible control or style was added. Reload and the peer tab preserve the same source. ## Known gaps / UX gaps left - #1456: cached Markdown waits for `/auth/me` on both pinned builds. Pre-existing; left open per the job instruction. - #1448: the existing keyboard-triggered focus outline remains visible in the screenshot set. No focus or styling code changed in this job. - Notes tests retain four existing ignored tests. Web check reports four existing warnings in two files, with zero errors. - The canonical Markdown writer retains its DESIGN §9 format. This fix applies source-aware anchor saves; it does not change that format. ## Decisions and cost No new product design decision. DESIGN §§9 and 33 remain the source of the canonical Markdown and identity grammar. Anchor-only persistence now preserves all other source bytes, as the job requires. The forward patch costs O(Note bytes + block count) and performs no extra filesystem or network operation. The runtime evidence covers twenty fixture Notes and sixty Copy links. No perf VM benchmark was run: the current verification policy reserves perf measurements for performance issues. ## For the merge round - `cd apps/web && bun e2e/notes.mjs`: run the complete Notes e2e suite, including routes unrelated to this change. - `bash tests/adversarial/run.sh`: run the merge round's full adversarial matrices. `cargo clippy --all-targets -- -D warnings && cargo test -- --test-threads=4`: run the combined workspace gates. This job ran the focused real-server byte regression and the requested per-crate gates; it did not run full matrices or deploy. ## Evidence Twelve actual-size production screenshots cover macOS-emulated rendering at 390, 820 and 1440 px, light and dark, after pointer and keyboard Copy link. The Note data is loaded and no update toast is present. Screenshots are attached for Claude's visual review; this job makes no aesthetic approval claim. - [copy-link-1440-1440-mono.png](https://git.kayg.org/attachments/3e3943e7-3749-4a3a-94f3-0daa5c4f6788) - [copy-link-1440-1440-noir.png](https://git.kayg.org/attachments/12a4f85d-4681-4017-8b90-4fc8b4325317) - [copy-link-1440-390-mono.png](https://git.kayg.org/attachments/434f6d76-06a4-4048-b3c4-e57aa6d98c14) - [copy-link-1440-390-noir.png](https://git.kayg.org/attachments/fbe54e9f-5129-4047-954f-beac0cf4c8ca) - [copy-link-1440-820-mono.png](https://git.kayg.org/attachments/74b44ae5-511e-4ec7-b139-1dad4ba44700) - [copy-link-1440-820-noir.png](https://git.kayg.org/attachments/1958ed56-2b6c-4c07-a82c-0f1fd4b925ff) - [copy-link-keyboard-1440-1440-mono.png](https://git.kayg.org/attachments/fe3117b5-b1e0-4518-b811-3f1f0d545203) - [copy-link-keyboard-1440-1440-noir.png](https://git.kayg.org/attachments/eb0cc33a-14a7-4fc7-b8a9-b9a4d137bf27) - [copy-link-keyboard-1440-390-mono.png](https://git.kayg.org/attachments/a326c544-e3ff-447e-bc2f-767628e13b48) - [copy-link-keyboard-1440-390-noir.png](https://git.kayg.org/attachments/bc8db765-6208-4c2c-866b-9c17f0753033) - [copy-link-keyboard-1440-820-mono.png](https://git.kayg.org/attachments/b021b608-c7e7-4ff6-897e-45e5803ce6e4) - [copy-link-keyboard-1440-820-noir.png](https://git.kayg.org/attachments/94fa8b10-0fa8-4316-8fae-49d5627e6b9c) ## Cleanup `cargo clean` completed: ``` Removed 22413 files, 17.3GiB total ``` Production web output, `.svelte-kit`, test temporary files and both isolated comparison worktrees were removed. The job worktree is clean. Reports, logs and screenshots remain in ignored `artifacts/`. Full gate, build, comparison and runtime logs: [gate-runtime-evidence.tar.gz](https://git.kayg.org/attachments/88742ba3-09d7-4860-b4a2-4836c6a618cd).
Author
Owner

Deployed to calternal.cloud as a hotfix (af202e151), 2026-10-08 16:24 IST. Backup: /srv/calternal/backup-pre-hotfix1440-20261008-1254. Production ready after 39 s; served build matches. Copy link on any number of blocks now changes only the anchors (20/20 Notes byte-identical). Owner can verify: Copy link on a heading in a Note with links, wait, reload — nothing else changes. Notes damaged before this deploy can be restored from Versions.

Deployed to calternal.cloud as a hotfix (af202e151), 2026-10-08 16:24 IST. Backup: /srv/calternal/backup-pre-hotfix1440-20261008-1254. Production ready after 39 s; served build matches. Copy link on any number of blocks now changes only the anchors (20/20 Notes byte-identical). Owner can verify: Copy link on a heading in a Note with links, wait, reload — nothing else changes. Notes damaged before this deploy can be restored from Versions.
kayg closed this issue 2026-10-08 11:14:38 +00:00
Commenting is not possible because the repository is archived.
No labels
No milestone
No project
No assignees
1 participant
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal-v0#1440
No description provided.