Notes editor: deleting a block reverts and forks a (conflict) Note #1616

Closed
opened 2026-10-12 16:10:57 +00:00 by kayg · 4 comments
Owner

Severity: DATA LOSS. Production is affected (rev 8e8409629).

Found by the Notes block editor hunt (owner focus, 2026-10-12). Repro scripts are on dev (6fefd4a62) in apps/web/e2e/break-editor/. Run from apps/web after bun run build: node e2e/break-editor/<script>. Exit 1 = reproduced, 0 = fixed. Server used: prebuilt rev 8e8409629 (same as production). The scripts leave calternal-server-release processes behind; kill them after each run.

Symptom

  1. Open a Note whose blocks came from the .md file or the API (not typed in this editor session).
  2. Delete a block: from the block menu, by click + Backspace, or by deleting its text.
  3. The block goes. Within about 1 s it comes back. The .md file still holds it. A second Note "
**Severity: DATA LOSS. Production is affected (rev 8e8409629).** Found by the Notes block editor hunt (owner focus, 2026-10-12). Repro scripts are on `dev` (6fefd4a62) in `apps/web/e2e/break-editor/`. Run from `apps/web` after `bun run build`: `node e2e/break-editor/<script>`. Exit 1 = reproduced, 0 = fixed. Server used: prebuilt rev 8e8409629 (same as production). The scripts leave `calternal-server-release` processes behind; kill them after each run. ## Symptom 1. Open a Note whose blocks came from the .md file or the API (not typed in this editor session). 2. Delete a block: from the block menu, by click + Backspace, or by deleting its text. 3. The block goes. Within about 1 s it comes back. The .md file still holds it. A second Note "<title> (conflict)" appears in the list and the sidebar. This is the owner's "multiple notes of the same note" and "blocks disappearing/coming back". Script: `20-block-delete-reverts-and-forks-note.mjs`. Reproduced 3/3, also in WebKit. Orchestrator re-ran it: all four variants (menu, select, text, block added in the session then deleted) reproduce. ## Lead (not verified) `crates/calternal-collab/src/session.rs` around lines 5366–5375: `deleted_block && !deleted_local_block` seems to treat the User's own delete of a block they did not create in this session as a stale delete of another collaborator's block, and the conflict shadow (around line 2410) forks the Note. ## Done when - Script 20 exits 0 three runs in a row, Chromium and WebKit. - A Rust test covers: a delete of a block loaded from disk is applied and written to .md; no conflict copy is made. - A real concurrent conflict (two editors, same block, one deletes while the other edits) still behaves as DESIGN §9 says. Quote the section you followed.
Author
Owner

Started job edrevert-1616 on branch job/edrevert-1616, base 6fefd4a62d. Tracing conflict-shadow delete handling; will add failing disk-block deletion regression before fixing, retain concurrent edit/delete coverage, and run scripts 20/19 plus 09 with this branch's server.

Started job edrevert-1616 on branch job/edrevert-1616, base 6fefd4a62dcd616690fd1f3c95be67283ee0d277. Tracing conflict-shadow delete handling; will add failing disk-block deletion regression before fixing, retain concurrent edit/delete coverage, and run scripts 20/19 plus 09 with this branch's server.
Author
Owner

Root cause reproduced with failing Rust tests before the fix: browser checkpoint accepts the root delete and the live projection is correct, but flush restores the original .md body. patch_source_lines returns None for first\n\nsecond\n\nthird\n\n -> first\n\nthird\n\n. Its empty replacement unconditionally appended the deleted range's line ending (markdown.rs, original lines 3706–3707), introducing one extra empty paragraph. Validation falls back to patch_source_blocks, whose old_nodes.len() != source_blocks.len() rejects sources with multiple trailing empty paragraphs (one captured blank run emits several nodes). flush_document_locked then calls preserve_snapshot, which writes a conflict Note and applies the unchanged source back into the live room. Captured real-browser traffic confirms the API-created Note has two trailing empty paragraphs; the minimal one-paragraph fixture did not reproduce. Script 20 on production reproduced 4/4 variants.

Fix: append an ending only when the splice inserts replacement lines. Preserve stale-delete/unseen-child safeguards unchanged. Regression coverage includes actual UndoManager undo after saving a duplicate, checked disk flush/no sibling, LF/CRLF and first/middle/last deletions with 1–3 trailing empty paragraphs. Existing concurrent edit/delete tests remain required. DESIGN §9: "Markdown is the truth." and "When the file changes outside the editor, the server diffs old vs new Markdown and applies the diff into the live document as a collaborator edit." Existing block merge keeps concurrent unseen edits visible rather than losing them; no new conflict policy is introduced.

Root cause reproduced with failing Rust tests before the fix: browser checkpoint accepts the root delete and the live projection is correct, but flush restores the original .md body. patch_source_lines returns None for first\n\nsecond\n\nthird\n\n -> first\n\nthird\n\n. Its empty replacement unconditionally appended the deleted range's line ending (markdown.rs, original lines 3706–3707), introducing one extra empty paragraph. Validation falls back to patch_source_blocks, whose old_nodes.len() != source_blocks.len() rejects sources with multiple trailing empty paragraphs (one captured blank run emits several nodes). flush_document_locked then calls preserve_snapshot, which writes a conflict Note and applies the unchanged source back into the live room. Captured real-browser traffic confirms the API-created Note has two trailing empty paragraphs; the minimal one-paragraph fixture did not reproduce. Script 20 on production reproduced 4/4 variants. Fix: append an ending only when the splice inserts replacement lines. Preserve stale-delete/unseen-child safeguards unchanged. Regression coverage includes actual UndoManager undo after saving a duplicate, checked disk flush/no sibling, LF/CRLF and first/middle/last deletions with 1–3 trailing empty paragraphs. Existing concurrent edit/delete tests remain required. DESIGN §9: "Markdown is the truth." and "When the file changes outside the editor, the server diffs old vs new Markdown and applies the diff into the live document as a collaborator edit." Existing block merge keeps concurrent unseen edits visible rather than losing them; no new conflict policy is introduced.
Author
Owner

Completed #1616 and #1617 on job/edrevert-1616.

Head: 9c043566252aa8bc41a4454639caf283d7b68b95
Base: 6fefd4a62dcd616690fd1f3c95be67283ee0d277. git fetch origin && git merge origin/dev returned Already up to date. before final gates. Two atomic commits: d9ddeddd0 (fix and regressions), 9c0435662 (separate named delete/Undo tests).

Built

  • Correct empty Markdown splices: a delete removes the deleted range's line endings, without inserting a blank paragraph.
  • Correct EOF splices: remove the ending that no longer belongs to the last retained line.
  • Rust regressions for a disk-authored block delete and actual UndoManager undo after a saved duplicate. Both require the edited .md body and exactly one Note. Source tests cover first/middle/last deletions, LF/CRLF, and 1–3 trailing empty paragraphs.

Files

  • crates/calternal-collab/src/markdown.rs: source splice fix, module reasoning, source regressions.
  • crates/calternal-collab/src/session.rs: checkpoint/flush persistence regressions; existing production conflict handling is unchanged.

Root cause
markdown.rs:3702–3707 (base revision: 3695–3696) appended a deleted range's ending even when the replacement was empty. The reparse then had an extra empty paragraph. Validation at markdown.rs:3731–3733 fell back to the block-span patcher. That fallback rejects a blank run that produces multiple trailing paragraphs (markdown.rs:3749), since one source span covers several nodes. The API-created Note has two trailing empty paragraphs. session.rs:2348–2351 therefore treated a valid delete as an unmappable save; preserve_snapshot (session.rs:2770) wrote a conflict Note and merged the unchanged source into the room. That is the revert. The stale-delete lead at session.rs:5373 was not the cause.

Failing tests came first: the browser checkpoint accepted the delete and its live projection matched the intended edit, but the flush restored the original body. The focused source patch returned None. The same fixture passes after the fix. Production script 20 reproduced all four variants before the fix.

Conflict rule
DESIGN §9 says: "Markdown is the truth." It also says: "When the file changes outside the editor, the server diffs old vs new Markdown and applies the diff into the live document as a collaborator edit."
§9 does not define a separate delete/edit tie breaker. This fix keeps the existing visible-conflict rule: a concurrent edit the deleting peer did not receive survives visibly, once. Existing tests passed for both delivery orders, including an existing mirror and delayed edits after restart. No new conflict policy was introduced.

Gates
All commands used CARGO_PROFILE_DEV_DEBUG=line-tables-only, CARGO_INCREMENTAL=0, CARGO_BUILD_JOBS=4 and TMPDIR=/target/tmp. The preset CARGO_TARGET_DIR was retained.

cargo fmt --check: exit 0, no output.
cargo clippy -p calternal-collab --all-targets -- -D warnings: exit 0. Verbatim terminal output:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 08s

cargo test -p calternal-collab -- --test-threads=4: exit 0; 212 tests passed. Verbatim result lines for every test binary and doc tests:

test result: ok. 144 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 105.30s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.55s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.97s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.28s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 42.08s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.28s
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.14s
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.40s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.30s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.19s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.94s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.67s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 15.09s
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.46s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 16.19s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

bun install && bun run build in apps/web: exit 0. Web production build completed. No web code or dependencies changed; web check/test were not required for this Rust-only fix.

cargo build -p calternal-server: exit 0. Used the debug profile expected by e2e/harness.mjs and explicitly selected the resulting binary with CALTERNAL_SERVER_BIN. Verbatim terminal output:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 12s

Binary SHA-256: c9c0a9455c61c2c2a5d3cf72d0d9ae01e6651d3887a7ad6df67ba85a474ed683.

Real editor proof
Three runs of each script in each browser, one active browser run at a time. Verbatim run status:

BEGIN chromium-20-1
END chromium-20-1 exit=0
BEGIN chromium-20-2
END chromium-20-2 exit=0
BEGIN chromium-20-3
END chromium-20-3 exit=0
BEGIN chromium-19-1
END chromium-19-1 exit=0
BEGIN chromium-19-2
END chromium-19-2 exit=0
BEGIN chromium-19-3
END chromium-19-3 exit=0
BEGIN webkit-20-1
END webkit-20-1 exit=0
BEGIN webkit-20-2
END webkit-20-2 exit=0
BEGIN webkit-20-3
END webkit-20-3 exit=0
BEGIN webkit-19-1
END webkit-19-1 exit=0
BEGIN webkit-19-2
END webkit-19-2 exit=0
BEGIN webkit-19-3
END webkit-19-3 exit=0
BEGIN chromium-09-1
END chromium-09-1 exit=1

chromium-20-1, verbatim output:

menu     after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD menu"]
select   after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD select"]
text     after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD text"]
session  after 0.4 s [Para A,Para B,Para C] after 6 s [Para A,Para B,Para C] disk has Para NEW: false notes: ["BD session"]
no defect observed (block-delete)
--- console/network lines: 0
--- server: 2026-10-12T16:36:25.038439Z  WARN calternal_auth::api: First owner setup URL; shown once setup_url=http://localhost:2805/setup?token=[redacted]

chromium-20-2, verbatim output:

menu     after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD menu"]
select   after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD select"]
text     after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD text"]
session  after 0.4 s [Para A,Para B,Para C] after 6 s [Para A,Para B,Para C] disk has Para NEW: false notes: ["BD session"]
no defect observed (block-delete)
--- console/network lines: 0
--- server: 2026-10-12T16:37:21.340029Z  WARN calternal_auth::api: First owner setup URL; shown once setup_url=http://localhost:31711/setup?token=[redacted]

chromium-20-3, verbatim output:

menu     after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD menu"]
select   after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD select"]
text     after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD text"]
session  after 0.4 s [Para A,Para B,Para C] after 6 s [Para A,Para B,Para C] disk has Para NEW: false notes: ["BD session"]
no defect observed (block-delete)
--- console/network lines: 0
--- server: 2026-10-12T16:38:18.068227Z  WARN calternal_auth::api: First owner setup URL; shown once setup_url=http://localhost:19545/setup?token=[redacted]

chromium-19-1, verbatim output:

pause 300  dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 300,Para A,Para B,Para C,
pause 900  dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 900,Para A,Para B,Para C,
pause 1500 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 1500,Para A,Para B,Para C,
pause 3000 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 3000,Para A,Para B,Para C,
no defect observed (duplicate-undo)
--- console/network lines: 0
--- server: 2026-10-12T16:39:13.979363Z  WARN calternal_auth::api: First owner setup URL; shown once setup_url=http://localhost:11985/setup?token=[redacted]

chromium-19-2, verbatim output:

pause 300  dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 300,Para A,Para B,Para C,
pause 900  dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 900,Para A,Para B,Para C,
pause 1500 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 1500,Para A,Para B,Para C,
pause 3000 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 3000,Para A,Para B,Para C,
no defect observed (duplicate-undo)
--- console/network lines: 0
--- server: 2026-10-12T16:40:05.045545Z  WARN calternal_auth::api: First owner setup URL; shown once setup_url=http://localhost:11045/setup?token=[redacted]

chromium-19-3, verbatim output:

pause 300  dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 300,Para A,Para B,Para C,
pause 900  dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 900,Para A,Para B,Para C,
pause 1500 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 1500,Para A,Para B,Para C,
pause 3000 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 3000,Para A,Para B,Para C,
no defect observed (duplicate-undo)
--- console/network lines: 0
--- server: 2026-10-12T16:40:57.065015Z  WARN calternal_auth::api: First owner setup URL; shown once setup_url=http://localhost:27777/setup?token=[redacted]

webkit-20-1, verbatim output:

menu     after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD menu"]
select   after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD select"]
text     after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD text"]
session  after 0.4 s [Para A,Para B,Para C] after 6 s [Para A,Para B,Para C] disk has Para NEW: false notes: ["BD session"]
no defect observed (block-delete)
--- console/network lines: 17
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:7383/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] requestfailed: https://localhost:7383/api/v1/notes/events Load request cancelled
[A] requestfailed: https://localhost:7383/api/v1/files/events Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:7383/api/v1/notes/events Load request cancelled
[A] requestfailed: https://localhost:7383/api/v1/files/events Load request cancelled
[A] requestfailed: https://localhost:7383/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:7383/api/v1/files/events Load request cancelled
[A] requestfailed: https://localhost:7383/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] requestfailed: https://localhost:7383/api/v1/notes/events Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
--- server: 2026-10-12T16:41:49.387667Z  WARN calternal_auth::api: First owner setup URL; shown once setup_url=https://localhost:7383/setup?token=[redacted]

webkit-20-2, verbatim output:

menu     after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD menu"]
select   after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD select"]
text     after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD text"]
session  after 0.4 s [Para A,Para B,Para C] after 6 s [Para A,Para B,Para C] disk has Para NEW: false notes: ["BD session"]
no defect observed (block-delete)
--- console/network lines: 17
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:25425/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] requestfailed: https://localhost:25425/api/v1/notes/events Load request cancelled
[A] requestfailed: https://localhost:25425/api/v1/files/events Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:25425/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] requestfailed: https://localhost:25425/api/v1/notes/events Load request cancelled
[A] requestfailed: https://localhost:25425/api/v1/files/events Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:25425/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] requestfailed: https://localhost:25425/api/v1/notes/events Load request cancelled
[A] requestfailed: https://localhost:25425/api/v1/files/events Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
--- server: 2026-10-12T16:42:47.421109Z  WARN calternal_auth::api: First owner setup URL; shown once setup_url=https://localhost:25425/setup?token=[redacted]

webkit-20-3, verbatim output:

menu     after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD menu"]
select   after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD select"]
text     after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD text"]
session  after 0.4 s [Para A,Para B,Para C] after 6 s [Para A,Para B,Para C] disk has Para NEW: false notes: ["BD session"]
no defect observed (block-delete)
--- console/network lines: 17
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:15781/api/v1/files/events Load request cancelled
[A] requestfailed: https://localhost:15781/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] requestfailed: https://localhost:15781/api/v1/notes/events Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:15781/api/v1/notes/events Load request cancelled
[A] requestfailed: https://localhost:15781/api/v1/files/events Load request cancelled
[A] requestfailed: https://localhost:15781/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:15781/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] requestfailed: https://localhost:15781/api/v1/files/events Load request cancelled
[A] requestfailed: https://localhost:15781/api/v1/notes/events Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
--- server: 2026-10-12T16:43:46.200170Z  WARN calternal_auth::api: First owner setup URL; shown once setup_url=https://localhost:15781/setup?token=[redacted]

webkit-19-1, verbatim output:

pause 300  dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 300,Para A,Para B,Para C,
pause 900  dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 900,Para A,Para B,Para C,
pause 1500 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 1500,Para A,Para B,Para C,
pause 3000 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 3000,Para A,Para B,Para C,
no defect observed (duplicate-undo)
--- console/network lines: 17
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:30515/api/v1/notes/events Load request cancelled
[A] requestfailed: https://localhost:30515/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] requestfailed: https://localhost:30515/api/v1/files/events Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:30515/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] requestfailed: https://localhost:30515/api/v1/files/events Load request cancelled
[A] requestfailed: https://localhost:30515/api/v1/notes/events Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:30515/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] requestfailed: https://localhost:30515/api/v1/files/events Load request cancelled
[A] requestfailed: https://localhost:30515/api/v1/notes/events Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
--- server: 2026-10-12T16:44:44.721273Z  WARN calternal_auth::api: First owner setup URL; shown once setup_url=https://localhost:30515/setup?token=[redacted]

webkit-19-2, verbatim output:

pause 300  dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 300,Para A,Para B,Para C,
pause 900  dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 900,Para A,Para B,Para C,
pause 1500 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 1500,Para A,Para B,Para C,
pause 3000 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 3000,Para A,Para B,Para C,
no defect observed (duplicate-undo)
--- console/network lines: 17
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:12285/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] requestfailed: https://localhost:12285/api/v1/notes/events Load request cancelled
[A] requestfailed: https://localhost:12285/api/v1/files/events Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:12285/api/v1/files/events Load request cancelled
[A] requestfailed: https://localhost:12285/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] requestfailed: https://localhost:12285/api/v1/notes/events Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:12285/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] requestfailed: https://localhost:12285/api/v1/notes/events Load request cancelled
[A] requestfailed: https://localhost:12285/api/v1/files/events Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
--- server: 2026-10-12T16:45:36.334706Z  WARN calternal_auth::api: First owner setup URL; shown once setup_url=https://localhost:12285/setup?token=[redacted]

webkit-19-3, verbatim output:

pause 300  dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 300,Para A,Para B,Para C,
pause 900  dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 900,Para A,Para B,Para C,
pause 1500 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 1500,Para A,Para B,Para C,
pause 3000 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 3000,Para A,Para B,Para C,
no defect observed (duplicate-undo)
--- console/network lines: 17
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:15653/api/v1/notes/events Load request cancelled
[A] requestfailed: https://localhost:15653/api/v1/files/events Load request cancelled
[A] requestfailed: https://localhost:15653/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:15653/api/v1/files/events Load request cancelled
[A] requestfailed: https://localhost:15653/api/v1/notes/events Load request cancelled
[A] requestfailed: https://localhost:15653/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
[A] requestfailed: https://localhost:15653/api/v1/notes/events Load request cancelled
[A] requestfailed: https://localhost:15653/api/v1/files/events Load request cancelled
[A] requestfailed: https://localhost:15653/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled
[A] console.error: Viewport argument key "interactive-widget" not recognized and ignored.
[A] console.warning: Parsing application manifest : The manifest is not valid JSON data.
--- server: 2026-10-12T16:46:28.267540Z  WARN calternal_auth::api: First owner setup URL; shown once setup_url=https://localhost:15653/setup?token=[redacted]

Script 09 (#1618), once in Chromium, verbatim output:

heading-then-paragraph: typedInEditor=true editorStillHasEdit=false diskHasEdit=false notesWithThisTitle=["Fork heading-then-paragraph (conflict)","Fork heading-then-paragraph"]
paragraph-then-list: typedInEditor=true editorStillHasEdit=false diskHasEdit=false notesWithThisTitle=["Fork paragraph-then-list (conflict)","Fork paragraph-then-list"]
adjacent-headings: typedInEditor=true editorStillHasEdit=false diskHasEdit=false notesWithThisTitle=["Fork adjacent-headings (conflict)","Fork adjacent-headings"]
BUG REPRODUCED (noncanonical-edit-forks-note):
 - heading-then-paragraph: edit not on disk
 - heading-then-paragraph: editor reverted the typed text
 - heading-then-paragraph: duplicate Notes ["Fork heading-then-paragraph (conflict)","Fork heading-then-paragraph"]
 - paragraph-then-list: edit not on disk
 - paragraph-then-list: editor reverted the typed text
 - paragraph-then-list: duplicate Notes ["Fork paragraph-then-list (conflict)","Fork paragraph-then-list"]
 - adjacent-headings: edit not on disk
 - adjacent-headings: editor reverted the typed text
 - adjacent-headings: duplicate Notes ["Fork adjacent-headings (conflict)","Fork adjacent-headings"]
--- console/network lines: 0
--- server: 2026-10-12T16:47:20.267929Z  WARN calternal_auth::api: First owner setup URL; shown once setup_url=http://localhost:28747/setup?token=[redacted]

UX gaps closed

  • Deletes through the block menu, block selection + Backspace, text deletion, and deletion of a block created in the current session stay deleted in the editor and file.
  • Undo after Duplicate stays applied after all four tested pauses.

Known gaps / UX gaps left
#1618 remains reproduced by script 09 and is left for its assigned job. Noncanonical source mapping needs a separate fix; it is not the empty-splice change. No new visible controls or styles were added.

Decisions
None beyond the existing design and conflict policy. The fixture uses the real API-created Note shape instead of a smaller source that hid the failure. Save work remains linear in one Note's lines and bytes; valid deletes now avoid the fallback conversion and conflict-copy writes. Performance measurements are reserved for performance issues under the current verification policy.

Cleanup
Verified no servers using this job's binary remain. Cleanup selects only that executable and signals its PID; no pattern-based kill was used. Ran cargo clean (verbatim: Removed 16260 files, 17.2GiB total) and removed web build output. Review artifacts remain uncommitted under artifacts/.

For the merge round
The orchestrator owns full-workspace gates (cargo clippy --all-targets -- -D warnings, cargo test), release build (cargo build -p calternal-server --release), full web/e2e/adversarial suites and deployment checks. This job ran the requested focused real-server regressions to completion.

No push or deploy. Issues remain open.

Completed #1616 and #1617 on job/edrevert-1616. Head: `9c043566252aa8bc41a4454639caf283d7b68b95` Base: `6fefd4a62dcd616690fd1f3c95be67283ee0d277`. `git fetch origin && git merge origin/dev` returned `Already up to date.` before final gates. Two atomic commits: d9ddeddd0 (fix and regressions), 9c0435662 (separate named delete/Undo tests). Built - Correct empty Markdown splices: a delete removes the deleted range's line endings, without inserting a blank paragraph. - Correct EOF splices: remove the ending that no longer belongs to the last retained line. - Rust regressions for a disk-authored block delete and actual UndoManager undo after a saved duplicate. Both require the edited .md body and exactly one Note. Source tests cover first/middle/last deletions, LF/CRLF, and 1–3 trailing empty paragraphs. Files - `crates/calternal-collab/src/markdown.rs`: source splice fix, module reasoning, source regressions. - `crates/calternal-collab/src/session.rs`: checkpoint/flush persistence regressions; existing production conflict handling is unchanged. Root cause `markdown.rs:3702–3707` (base revision: 3695–3696) appended a deleted range's ending even when the replacement was empty. The reparse then had an extra empty paragraph. Validation at `markdown.rs:3731–3733` fell back to the block-span patcher. That fallback rejects a blank run that produces multiple trailing paragraphs (`markdown.rs:3749`), since one source span covers several nodes. The API-created Note has two trailing empty paragraphs. `session.rs:2348–2351` therefore treated a valid delete as an unmappable save; `preserve_snapshot` (`session.rs:2770`) wrote a conflict Note and merged the unchanged source into the room. That is the revert. The stale-delete lead at session.rs:5373 was not the cause. Failing tests came first: the browser checkpoint accepted the delete and its live projection matched the intended edit, but the flush restored the original body. The focused source patch returned None. The same fixture passes after the fix. Production script 20 reproduced all four variants before the fix. Conflict rule DESIGN §9 says: "Markdown is the truth." It also says: "When the file changes outside the editor, the server diffs old vs new Markdown and applies the diff into the live document as a collaborator edit." §9 does not define a separate delete/edit tie breaker. This fix keeps the existing visible-conflict rule: a concurrent edit the deleting peer did not receive survives visibly, once. Existing tests passed for both delivery orders, including an existing mirror and delayed edits after restart. No new conflict policy was introduced. Gates All commands used CARGO_PROFILE_DEV_DEBUG=line-tables-only, CARGO_INCREMENTAL=0, CARGO_BUILD_JOBS=4 and TMPDIR=<worktree>/target/tmp. The preset CARGO_TARGET_DIR was retained. `cargo fmt --check`: exit 0, no output. `cargo clippy -p calternal-collab --all-targets -- -D warnings`: exit 0. Verbatim terminal output: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 08s ``` `cargo test -p calternal-collab -- --test-threads=4`: exit 0; 212 tests passed. Verbatim result lines for every test binary and doc tests: ``` test result: ok. 144 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 105.30s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.55s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.97s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.28s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 42.08s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.28s test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.14s test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.40s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.30s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.19s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.94s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.67s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 15.09s test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.46s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 16.19s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` `bun install && bun run build` in apps/web: exit 0. Web production build completed. No web code or dependencies changed; web check/test were not required for this Rust-only fix. `cargo build -p calternal-server`: exit 0. Used the debug profile expected by e2e/harness.mjs and explicitly selected the resulting binary with CALTERNAL_SERVER_BIN. Verbatim terminal output: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 12s ``` Binary SHA-256: `c9c0a9455c61c2c2a5d3cf72d0d9ae01e6651d3887a7ad6df67ba85a474ed683`. Real editor proof Three runs of each script in each browser, one active browser run at a time. Verbatim run status: ``` BEGIN chromium-20-1 END chromium-20-1 exit=0 BEGIN chromium-20-2 END chromium-20-2 exit=0 BEGIN chromium-20-3 END chromium-20-3 exit=0 BEGIN chromium-19-1 END chromium-19-1 exit=0 BEGIN chromium-19-2 END chromium-19-2 exit=0 BEGIN chromium-19-3 END chromium-19-3 exit=0 BEGIN webkit-20-1 END webkit-20-1 exit=0 BEGIN webkit-20-2 END webkit-20-2 exit=0 BEGIN webkit-20-3 END webkit-20-3 exit=0 BEGIN webkit-19-1 END webkit-19-1 exit=0 BEGIN webkit-19-2 END webkit-19-2 exit=0 BEGIN webkit-19-3 END webkit-19-3 exit=0 BEGIN chromium-09-1 END chromium-09-1 exit=1 ``` chromium-20-1, verbatim output: ``` menu after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD menu"] select after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD select"] text after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD text"] session after 0.4 s [Para A,Para B,Para C] after 6 s [Para A,Para B,Para C] disk has Para NEW: false notes: ["BD session"] no defect observed (block-delete) --- console/network lines: 0 --- server: 2026-10-12T16:36:25.038439Z WARN calternal_auth::api: First owner setup URL; shown once setup_url=http://localhost:2805/setup?token=[redacted] ``` chromium-20-2, verbatim output: ``` menu after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD menu"] select after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD select"] text after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD text"] session after 0.4 s [Para A,Para B,Para C] after 6 s [Para A,Para B,Para C] disk has Para NEW: false notes: ["BD session"] no defect observed (block-delete) --- console/network lines: 0 --- server: 2026-10-12T16:37:21.340029Z WARN calternal_auth::api: First owner setup URL; shown once setup_url=http://localhost:31711/setup?token=[redacted] ``` chromium-20-3, verbatim output: ``` menu after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD menu"] select after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD select"] text after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD text"] session after 0.4 s [Para A,Para B,Para C] after 6 s [Para A,Para B,Para C] disk has Para NEW: false notes: ["BD session"] no defect observed (block-delete) --- console/network lines: 0 --- server: 2026-10-12T16:38:18.068227Z WARN calternal_auth::api: First owner setup URL; shown once setup_url=http://localhost:19545/setup?token=[redacted] ``` chromium-19-1, verbatim output: ``` pause 300 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 300,Para A,Para B,Para C, pause 900 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 900,Para A,Para B,Para C, pause 1500 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 1500,Para A,Para B,Para C, pause 3000 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 3000,Para A,Para B,Para C, no defect observed (duplicate-undo) --- console/network lines: 0 --- server: 2026-10-12T16:39:13.979363Z WARN calternal_auth::api: First owner setup URL; shown once setup_url=http://localhost:11985/setup?token=[redacted] ``` chromium-19-2, verbatim output: ``` pause 300 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 300,Para A,Para B,Para C, pause 900 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 900,Para A,Para B,Para C, pause 1500 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 1500,Para A,Para B,Para C, pause 3000 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 3000,Para A,Para B,Para C, no defect observed (duplicate-undo) --- console/network lines: 0 --- server: 2026-10-12T16:40:05.045545Z WARN calternal_auth::api: First owner setup URL; shown once setup_url=http://localhost:11045/setup?token=[redacted] ``` chromium-19-3, verbatim output: ``` pause 300 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 300,Para A,Para B,Para C, pause 900 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 900,Para A,Para B,Para C, pause 1500 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 1500,Para A,Para B,Para C, pause 3000 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 3000,Para A,Para B,Para C, no defect observed (duplicate-undo) --- console/network lines: 0 --- server: 2026-10-12T16:40:57.065015Z WARN calternal_auth::api: First owner setup URL; shown once setup_url=http://localhost:27777/setup?token=[redacted] ``` webkit-20-1, verbatim output: ``` menu after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD menu"] select after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD select"] text after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD text"] session after 0.4 s [Para A,Para B,Para C] after 6 s [Para A,Para B,Para C] disk has Para NEW: false notes: ["BD session"] no defect observed (block-delete) --- console/network lines: 17 [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:7383/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] requestfailed: https://localhost:7383/api/v1/notes/events Load request cancelled [A] requestfailed: https://localhost:7383/api/v1/files/events Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:7383/api/v1/notes/events Load request cancelled [A] requestfailed: https://localhost:7383/api/v1/files/events Load request cancelled [A] requestfailed: https://localhost:7383/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:7383/api/v1/files/events Load request cancelled [A] requestfailed: https://localhost:7383/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] requestfailed: https://localhost:7383/api/v1/notes/events Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. --- server: 2026-10-12T16:41:49.387667Z WARN calternal_auth::api: First owner setup URL; shown once setup_url=https://localhost:7383/setup?token=[redacted] ``` webkit-20-2, verbatim output: ``` menu after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD menu"] select after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD select"] text after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD text"] session after 0.4 s [Para A,Para B,Para C] after 6 s [Para A,Para B,Para C] disk has Para NEW: false notes: ["BD session"] no defect observed (block-delete) --- console/network lines: 17 [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:25425/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] requestfailed: https://localhost:25425/api/v1/notes/events Load request cancelled [A] requestfailed: https://localhost:25425/api/v1/files/events Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:25425/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] requestfailed: https://localhost:25425/api/v1/notes/events Load request cancelled [A] requestfailed: https://localhost:25425/api/v1/files/events Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:25425/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] requestfailed: https://localhost:25425/api/v1/notes/events Load request cancelled [A] requestfailed: https://localhost:25425/api/v1/files/events Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. --- server: 2026-10-12T16:42:47.421109Z WARN calternal_auth::api: First owner setup URL; shown once setup_url=https://localhost:25425/setup?token=[redacted] ``` webkit-20-3, verbatim output: ``` menu after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD menu"] select after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD select"] text after 0.4 s [Para A,Para C] after 6 s [Para A,Para C] disk has Para B: false notes: ["BD text"] session after 0.4 s [Para A,Para B,Para C] after 6 s [Para A,Para B,Para C] disk has Para NEW: false notes: ["BD session"] no defect observed (block-delete) --- console/network lines: 17 [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:15781/api/v1/files/events Load request cancelled [A] requestfailed: https://localhost:15781/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] requestfailed: https://localhost:15781/api/v1/notes/events Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:15781/api/v1/notes/events Load request cancelled [A] requestfailed: https://localhost:15781/api/v1/files/events Load request cancelled [A] requestfailed: https://localhost:15781/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:15781/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] requestfailed: https://localhost:15781/api/v1/files/events Load request cancelled [A] requestfailed: https://localhost:15781/api/v1/notes/events Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. --- server: 2026-10-12T16:43:46.200170Z WARN calternal_auth::api: First owner setup URL; shown once setup_url=https://localhost:15781/setup?token=[redacted] ``` webkit-19-1, verbatim output: ``` pause 300 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 300,Para A,Para B,Para C, pause 900 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 900,Para A,Para B,Para C, pause 1500 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 1500,Para A,Para B,Para C, pause 3000 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 3000,Para A,Para B,Para C, no defect observed (duplicate-undo) --- console/network lines: 17 [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:30515/api/v1/notes/events Load request cancelled [A] requestfailed: https://localhost:30515/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] requestfailed: https://localhost:30515/api/v1/files/events Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:30515/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] requestfailed: https://localhost:30515/api/v1/files/events Load request cancelled [A] requestfailed: https://localhost:30515/api/v1/notes/events Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:30515/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] requestfailed: https://localhost:30515/api/v1/files/events Load request cancelled [A] requestfailed: https://localhost:30515/api/v1/notes/events Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. --- server: 2026-10-12T16:44:44.721273Z WARN calternal_auth::api: First owner setup URL; shown once setup_url=https://localhost:30515/setup?token=[redacted] ``` webkit-19-2, verbatim output: ``` pause 300 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 300,Para A,Para B,Para C, pause 900 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 900,Para A,Para B,Para C, pause 1500 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 1500,Para A,Para B,Para C, pause 3000 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 3000,Para A,Para B,Para C, no defect observed (duplicate-undo) --- console/network lines: 17 [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:12285/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] requestfailed: https://localhost:12285/api/v1/notes/events Load request cancelled [A] requestfailed: https://localhost:12285/api/v1/files/events Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:12285/api/v1/files/events Load request cancelled [A] requestfailed: https://localhost:12285/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] requestfailed: https://localhost:12285/api/v1/notes/events Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:12285/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] requestfailed: https://localhost:12285/api/v1/notes/events Load request cancelled [A] requestfailed: https://localhost:12285/api/v1/files/events Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. --- server: 2026-10-12T16:45:36.334706Z WARN calternal_auth::api: First owner setup URL; shown once setup_url=https://localhost:12285/setup?token=[redacted] ``` webkit-19-3, verbatim output: ``` pause 300 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 300,Para A,Para B,Para C, pause 900 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 900,Para A,Para B,Para C, pause 1500 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 1500,Para A,Para B,Para C, pause 3000 dup [Para A,Para B,Para B,Para C] -> Ctrl+Z [Para A,Para B,Para C] -> 4.5 s later [Para A,Para B,Para C] disk ,# DupUndo 3000,Para A,Para B,Para C, no defect observed (duplicate-undo) --- console/network lines: 17 [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:15653/api/v1/notes/events Load request cancelled [A] requestfailed: https://localhost:15653/api/v1/files/events Load request cancelled [A] requestfailed: https://localhost:15653/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:15653/api/v1/files/events Load request cancelled [A] requestfailed: https://localhost:15653/api/v1/notes/events Load request cancelled [A] requestfailed: https://localhost:15653/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. [A] requestfailed: https://localhost:15653/api/v1/notes/events Load request cancelled [A] requestfailed: https://localhost:15653/api/v1/files/events Load request cancelled [A] requestfailed: https://localhost:15653/api/v1/files/entries?path=Notes&sort=name&limit=500&notes_filter=true&show_hidden_items=true Load request cancelled [A] console.error: Viewport argument key "interactive-widget" not recognized and ignored. [A] console.warning: Parsing application manifest : The manifest is not valid JSON data. --- server: 2026-10-12T16:46:28.267540Z WARN calternal_auth::api: First owner setup URL; shown once setup_url=https://localhost:15653/setup?token=[redacted] ``` Script 09 (#1618), once in Chromium, verbatim output: ``` heading-then-paragraph: typedInEditor=true editorStillHasEdit=false diskHasEdit=false notesWithThisTitle=["Fork heading-then-paragraph (conflict)","Fork heading-then-paragraph"] paragraph-then-list: typedInEditor=true editorStillHasEdit=false diskHasEdit=false notesWithThisTitle=["Fork paragraph-then-list (conflict)","Fork paragraph-then-list"] adjacent-headings: typedInEditor=true editorStillHasEdit=false diskHasEdit=false notesWithThisTitle=["Fork adjacent-headings (conflict)","Fork adjacent-headings"] BUG REPRODUCED (noncanonical-edit-forks-note): - heading-then-paragraph: edit not on disk - heading-then-paragraph: editor reverted the typed text - heading-then-paragraph: duplicate Notes ["Fork heading-then-paragraph (conflict)","Fork heading-then-paragraph"] - paragraph-then-list: edit not on disk - paragraph-then-list: editor reverted the typed text - paragraph-then-list: duplicate Notes ["Fork paragraph-then-list (conflict)","Fork paragraph-then-list"] - adjacent-headings: edit not on disk - adjacent-headings: editor reverted the typed text - adjacent-headings: duplicate Notes ["Fork adjacent-headings (conflict)","Fork adjacent-headings"] --- console/network lines: 0 --- server: 2026-10-12T16:47:20.267929Z WARN calternal_auth::api: First owner setup URL; shown once setup_url=http://localhost:28747/setup?token=[redacted] ``` UX gaps closed - Deletes through the block menu, block selection + Backspace, text deletion, and deletion of a block created in the current session stay deleted in the editor and file. - Undo after Duplicate stays applied after all four tested pauses. Known gaps / UX gaps left #1618 remains reproduced by script 09 and is left for its assigned job. Noncanonical source mapping needs a separate fix; it is not the empty-splice change. No new visible controls or styles were added. Decisions None beyond the existing design and conflict policy. The fixture uses the real API-created Note shape instead of a smaller source that hid the failure. Save work remains linear in one Note's lines and bytes; valid deletes now avoid the fallback conversion and conflict-copy writes. Performance measurements are reserved for performance issues under the current verification policy. Cleanup Verified no servers using this job's binary remain. Cleanup selects only that executable and signals its PID; no pattern-based kill was used. Ran cargo clean (verbatim: `Removed 16260 files, 17.2GiB total`) and removed web build output. Review artifacts remain uncommitted under artifacts/. For the merge round The orchestrator owns full-workspace gates (`cargo clippy --all-targets -- -D warnings`, `cargo test`), release build (`cargo build -p calternal-server --release`), full web/e2e/adversarial suites and deployment checks. This job ran the requested focused real-server regressions to completion. No push or deploy. Issues remain open.
Author
Owner

Deployed to calternal.cloud in c94c92221 (merge of job/edrevert-1616). Gates: fmt ok, clippy ok, calternal-collab 212 passed 0 failed. Scripts 20 and 19: 3/3 exit 0 in Chromium and WebKit (job report).

Deployed to calternal.cloud in c94c92221 (merge of job/edrevert-1616). Gates: fmt ok, clippy ok, calternal-collab 212 passed 0 failed. Scripts 20 and 19: 3/3 exit 0 in Chromium and WebKit (job report).
kayg closed this issue 2026-10-12 17:12:37 +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#1616
No description provided.