Notes editor: undo after Duplicate block is reverted by the server #1617

Closed
opened 2026-10-12 16:10:58 +00:00 by kayg · 5 comments
Owner

Severity: DATA LOSS. Production is affected.

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

Insert a block with the block menu "Duplicate", wait about 1 s, press Ctrl+Z. The duplicate goes, then comes back within about 1 s, and the .md file keeps both copies. A pause of 0.9 s or more before Ctrl+Z triggers it; 0.3 s does not.

Script: 19-duplicate-block-undo-comes-back.mjs, 3/3.

Lead

Likely the same server path as the block-delete revert (): the undo is a delete of a block the server already stored, and the server treats it as a stale delete. Fix together with that issue if it is the same cause; prove it with this script.

Done when

Script 19 exits 0 three runs in a row, plus a Rust regression test.

**Severity: DATA LOSS. Production is affected.** 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 Insert a block with the block menu "Duplicate", wait about 1 s, press Ctrl+Z. The duplicate goes, then comes back within about 1 s, and the .md file keeps both copies. A pause of 0.9 s or more before Ctrl+Z triggers it; 0.3 s does not. Script: `19-duplicate-block-undo-comes-back.mjs`, 3/3. ## Lead Likely the same server path as the block-delete revert (): the undo is a delete of a block the server already stored, and the server treats it as a stale delete. Fix together with that issue if it is the same cause; prove it with this script. ## Done when Script 19 exits 0 three runs in a row, plus a Rust regression test.
Author
Owner

Related: #1616 (block delete reverts). Likely the same server path; one job owns both.

Related: #1616 (block delete reverts). Likely the same server path; one job owns both.
Author
Owner

Working on #1617 with #1616 in job/edrevert-1616, base 6fefd4a62d. Added a Rust checkpoint/flush regression covering disk-block deletion and actual UndoManager undo after a saved duplicate. Production script 20 reproduced all four variants; investigating source patch rejection separately from conflict-shadow causality. No production change yet.

Working on #1617 with #1616 in job/edrevert-1616, base 6fefd4a62dcd616690fd1f3c95be67283ee0d277. Added a Rust checkpoint/flush regression covering disk-block deletion and actual UndoManager undo after a saved duplicate. Production script 20 reproduced all four variants; investigating source patch rejection separately from conflict-shadow causality. No production change yet.
Author
Owner

#1617 uses the same source splice failure as #1616. The Rust regression now uses the real Yrs UndoManager: insert a duplicate, flush it to Markdown, undo, apply the browser checkpoint, flush again, then require the original body and exactly one Note. It passes with the splice fix. The root-deletion checkpoint accepts the operation; the lost Undo was caused by an invalid Markdown patch and preservation/rebase at flush, not by a stale-delete rejection. The final test has a separate name: browser_undo_saved_duplicate_persists_without_conflict_note. Production browser scripts remain to prove this branch in Chromium and WebKit.

#1617 uses the same source splice failure as #1616. The Rust regression now uses the real Yrs UndoManager: insert a duplicate, flush it to Markdown, undo, apply the browser checkpoint, flush again, then require the original body and exactly one Note. It passes with the splice fix. The root-deletion checkpoint accepts the operation; the lost Undo was caused by an invalid Markdown patch and preservation/rebase at flush, not by a stale-delete rejection. The final test has a separate name: browser_undo_saved_duplicate_persists_without_conflict_note. Production browser scripts remain to prove this branch in Chromium and WebKit.
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: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#1617
No description provided.