DATA: opening a note writes it (mtime bump + 'Note saved' toast) without any edit #661

Open
opened 2026-10-02 04:33:21 +00:00 by kayg · 6 comments
Owner

Owner report (2026-10-02, calternal.cloud c4a61e8cf)

Opening the Task note "Pay Electricity Bill" (no edits) produced a toast "Note saved at 09:47: Pay Electricity Bill", and the note then appeared on the Calendar as a file item at 09:47 (see #662).

Evidence (production index, read-only)

Notes/20261002-pay-electricity-bill-….md has files_index.modified = 1790914655 (06:17:35 CEST = 09:47 IST), the moment it was opened. Size is 148 bytes, consistent with the untouched sibling Task (144 bytes, 2 characters shorter title). The Task index still reads it as todo, so the frontmatter appears intact. The open itself wrote the file.

Expected

  • Opening a note never writes it. Only a real user or agent edit writes. Seeding the collab room, normalising Markdown, adding block IDs, or loading must not produce a file write, an mtime change, a "saved" toast, a Files change-feed event, a CalDAV ETag bump or a sync upload.
  • If a migration truly must add something (e.g. a missing calternal-id), it happens server-side once, byte-preserving, and silently. It is never triggered by viewing.
  • The "Note saved" toast appears only after a user edit, and only where DESIGN says saves are announced.

Tests

e2e like a User: open a Task note, a Daily note and a plain note; wait 5 s; assert the bytes, mtime and ETag are unchanged, no toast was shown, and no change-feed event was emitted. Repeat after switching between notes quickly (blaze-style). Also one test for the MCP-edited note case (#634): opening after an external write must not write.

## Owner report (2026-10-02, calternal.cloud `c4a61e8cf`) Opening the Task note "Pay Electricity Bill" (no edits) produced a toast "Note saved at 09:47: Pay Electricity Bill", and the note then appeared on the Calendar as a file item at 09:47 (see #662). ## Evidence (production index, read-only) `Notes/20261002-pay-electricity-bill-….md` has `files_index.modified = 1790914655` (06:17:35 CEST = 09:47 IST), the moment it was opened. Size is 148 bytes, consistent with the untouched sibling Task (144 bytes, 2 characters shorter title). The Task index still reads it as `todo`, so the frontmatter appears intact. The open itself wrote the file. ## Expected - **Opening a note never writes it.** Only a real user or agent edit writes. Seeding the collab room, normalising Markdown, adding block IDs, or loading must not produce a file write, an mtime change, a "saved" toast, a Files change-feed event, a CalDAV ETag bump or a sync upload. - If a migration truly must add something (e.g. a missing calternal-id), it happens server-side once, byte-preserving, and silently. It is never triggered by viewing. - The "Note saved" toast appears only after a user edit, and only where DESIGN says saves are announced. ## Tests e2e like a User: open a Task note, a Daily note and a plain note; wait 5 s; assert the bytes, mtime and ETag are unchanged, no toast was shown, and no change-feed event was emitted. Repeat after switching between notes quickly (blaze-style). Also one test for the MCP-edited note case (#634): opening after an external write must not write.
Author
Owner

Started on job/writeonopen-661, base c4a61e8cf0. Tracing collab room seed/flush and editor mount/title updates; will compare job/dupwrite-634 and add read-only-open regressions for Task, Daily and plain Notes, external writes and quick switching.

Started on job/writeonopen-661, base c4a61e8cf090170f35b1bed3350d9de20c83ecd5. Tracing collab room seed/flush and editor mount/title updates; will compare job/dupwrite-634 and add read-only-open regressions for Task, Daily and plain Notes, external writes and quick switching.
Author
Owner

Finding: the shared StarterKit preset enables TipTap trailingNode by default. Its appendTransaction adds an empty paragraph after any terminal non-paragraph block on any transaction, including the Note surface's reminder/selection decoration transactions during mount. That mutation reaches Yjs and the server correctly treats it as an edit. A mounted editor regression fails for heading, Task list, code, image, callout and horizontal rule; each failure shows the added paragraph. Plain paragraph is unchanged. Fix: disable implicit trailingNode in the shared preset (DESIGN §9 requires the loaded tree to remain exact); retain explicit Enter/exitCode/gap-cursor edits. #634 changes conflict reconciliation and read-only duplicate scanning; this fix changes neither path.

Finding: the shared StarterKit preset enables TipTap trailingNode by default. Its appendTransaction adds an empty paragraph after any terminal non-paragraph block on any transaction, including the Note surface's reminder/selection decoration transactions during mount. That mutation reaches Yjs and the server correctly treats it as an edit. A mounted editor regression fails for heading, Task list, code, image, callout and horizontal rule; each failure shows the added paragraph. Plain paragraph is unchanged. Fix: disable implicit trailingNode in the shared preset (DESIGN §9 requires the loaded tree to remain exact); retain explicit Enter/exitCode/gap-cursor edits. #634 changes conflict reconciliation and read-only duplicate scanning; this fix changes neither path.
Author
Owner

Progress: committed shared preset fix (0744a8030), then mounted live-Yjs and explicit-edit regressions (352f1441e). Editor: 414 tests passed; mounted live Note tests: 4 passed. First full web suite: 153 files / 1053 tests passed; final run includes the new mount cases. Production SPA opens for Task, Daily and plain Notes passed at 390/820/1440 in light/dark, with unchanged bytes, nanosecond mtime, inode, Note/Files ETags and Files change feed. Quick switching passed. MCP step needs the current server build: the borrowed old binary returns 404 for /api/v1/apps/surfaces. Rust per-crate gates are building. The perf VM lock was free during setup but busy when the measured-run lock was requested; measuring locally without waiting.

Progress: committed shared preset fix (0744a8030), then mounted live-Yjs and explicit-edit regressions (352f1441e). Editor: 414 tests passed; mounted live Note tests: 4 passed. First full web suite: 153 files / 1053 tests passed; final run includes the new mount cases. Production SPA opens for Task, Daily and plain Notes passed at 390/820/1440 in light/dark, with unchanged bytes, nanosecond mtime, inode, Note/Files ETags and Files change feed. Quick switching passed. MCP step needs the current server build: the borrowed old binary returns 404 for /api/v1/apps/surfaces. Rust per-crate gates are building. The perf VM lock was free during setup but busy when the measured-run lock was requested; measuring locally without waiting.
Author
Owner

Test correction: reviewing the captured screenshots revealed that the borrowed old binary had refused collaboration, so its open checks exercised the Markdown fallback. Those read-only checks are useful but do not prove live-room opening. The browser test now requires .editor-surface.is-block-interactions .ProseMirror (the live surface) and cannot silently pass on fallback. All captures and performance evidence will be replaced with a run using this worktree's current server once the Rust build completes.

Test correction: reviewing the captured screenshots revealed that the borrowed old binary had refused collaboration, so its open checks exercised the Markdown fallback. Those read-only checks are useful but do not prove live-room opening. The browser test now requires `.editor-surface.is-block-interactions .ProseMirror` (the live surface) and cannot silently pass on fallback. All captures and performance evidence will be replaced with a run using this worktree's current server once the Rust build completes.
Author
Owner

The current-server regression passed in a real production SPA over HTTPS/WSS: 18 Task/plain/Daily opens at 390/820/1440 in light/dark, each with a 5 s byte/mtime/inode/Note ETag/Files ETag/feed/toast check; quick switching and 24 concurrent reads; an independent MCP edit then reopen; explicit Enter, Task Space and Undo. All 18 screenshots are attached. The test grants Chromium local-network permission only to its disposable origin; without that grant Chromium blocks WSS before the server sees it.

The local debug profile passed 12 opens each of 64 and 10,000 paragraphs plus a terminal heading, with unchanged durable state, and two 16-read bursts. Host load: 20.07/21.23/19.44. Average p50/p95: 2267.48/2832.47 ms, CPU 18.32%, RSS 125.73 -> 252.42 MiB. Worst p50/p95: 4444.39/9249.95 ms, CPU 121.95%, RSS 260.10 -> 665.70 MiB. Bursts: 91.44 ms / 503.91 ms. There is no equivalent Note-open-to-editor metric in docs/perf/baseline.json; these are a first feature baseline, not a comparable regression. The measured-run perf lock was busy, so this is explicitly local. Numbers are committed in docs/perf/notes-open-661.json.

UX gaps closed: implicit content/save on mount in both shared-preset hosts; metadata/selection-driven insertion after terminal blocks; external-write reopen preservation; a regression suite that could otherwise silently pass on the fallback editor. Explicit editing and Undo remain tested. UX gaps left: the shared Task header/status action and Undo toast are tracked by #659; the current root Markdown checkbox does not change the authoritative frontmatter status.

All editor/web, collab, Notes and notes-core gates pass. Server clippy passes; the server test gate is now running. Final head SHA, verbatim gate results and the report follow after that gate and cleanup.

The current-server regression passed in a real production SPA over HTTPS/WSS: 18 Task/plain/Daily opens at 390/820/1440 in light/dark, each with a 5 s byte/mtime/inode/Note ETag/Files ETag/feed/toast check; quick switching and 24 concurrent reads; an independent MCP edit then reopen; explicit Enter, Task Space and Undo. All 18 screenshots are attached. The test grants Chromium local-network permission only to its disposable origin; without that grant Chromium blocks WSS before the server sees it. The local debug profile passed 12 opens each of 64 and 10,000 paragraphs plus a terminal heading, with unchanged durable state, and two 16-read bursts. Host load: 20.07/21.23/19.44. Average p50/p95: 2267.48/2832.47 ms, CPU 18.32%, RSS 125.73 -> 252.42 MiB. Worst p50/p95: 4444.39/9249.95 ms, CPU 121.95%, RSS 260.10 -> 665.70 MiB. Bursts: 91.44 ms / 503.91 ms. There is no equivalent Note-open-to-editor metric in docs/perf/baseline.json; these are a first feature baseline, not a comparable regression. The measured-run perf lock was busy, so this is explicitly local. Numbers are committed in docs/perf/notes-open-661.json. UX gaps closed: implicit content/save on mount in both shared-preset hosts; metadata/selection-driven insertion after terminal blocks; external-write reopen preservation; a regression suite that could otherwise silently pass on the fallback editor. Explicit editing and Undo remain tested. UX gaps left: the shared Task header/status action and Undo toast are tracked by #659; the current root Markdown checkbox does not change the authoritative frontmatter status. All editor/web, collab, Notes and notes-core gates pass. Server clippy passes; the server test gate is now running. Final head SHA, verbatim gate results and the report follow after that gate and cleanup.
Author
Owner

Final report. Branch: job/writeonopen-661. Head: 04c4a651be5a0da6c1311af9ad2d39bd289b8a09.

Note opening stays read-only (#661)

The shared editor preset now disables TipTap's implicit trailing paragraph.
A metadata or selection transaction cannot add content on mount. The live
room and Markdown fallback keep the loaded tree. Explicit edit commands
still work. DESIGN §9 requires this behavior.

Implementation: packages/editor/src/extensions.ts.
Regression tests: packages/editor/src/Editor.svelte.test.ts,
apps/web/src/lib/notes/collaborationUndo.svelte.test.ts,
apps/web/e2e/notes-open-661.mjs, and
tests/adversarial/notes-open-661.mjs.
Profile: bench/notes-open-661.sh and docs/perf/notes-open-661.json.
Test instructions: docs/testing/notes-open-661.md.

Evidence

A real local server and the production SPA passed 18 read-only opens:
Task, Daily and plain Notes at 390, 820 and 1440 pixels, light and dark.
Each five-second open kept bytes, nanosecond mtime, inode, Note ETag and
Files ETag. No Note change-feed event or save notice appeared. Quick
switching, a read burst, reopen after a real MCP edit, explicit Enter,
Task Space activation and keyboard Undo passed. The live ready marker
prevents a fallback-only pass. All 18 screenshots are attached to issue
#661. The orchestrator reviews their visual quality.

Gates

These excerpts are verbatim. Logs remain in the ignored artifacts/
directory. cargo fmt --check passed with no output. Each Rust command
used four build jobs, no incremental build and small debug output.

calternal-collab

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

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 6m 14s

cargo test -p calternal-collab -- --test-threads=1

test result: ok. 25 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.67s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.95s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.71s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 88.34s
test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 14.87s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.28s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.59s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.56s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.29s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 24.03s
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.11s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 42.07s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

calternal-plugin-notes

cargo clippy -p calternal-plugin-notes --all-targets -- -D warnings

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 7m 41s

cargo test -p calternal-plugin-notes -- --test-threads=1

test result: ok. 167 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 132.84s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.42s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

calternal-notes-core

cargo clippy -p calternal-notes-core --all-targets -- -D warnings

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 24.08s

cargo test -p calternal-notes-core -- --test-threads=1

test result: ok. 519 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.33s
test result: ok. 19 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.49s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.61s
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

calternal-server

cargo clippy -p calternal-server --all-targets -- -D warnings

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

cargo test -p calternal-server -- --test-threads=1

test result: ok. 107 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 44.00s

editor

bun run --cwd packages/editor check

svelte-check found 0 errors and 0 warnings

bun run --cwd packages/editor test

 Test Files  18 passed (18)
      Tests  414 passed (414)

web

bun run --cwd apps/web check

svelte-check found 0 errors and 0 warnings

bun run --cwd apps/web test --maxWorkers=1

 Test Files  153 passed (153)
      Tests  1056 passed (1056)

Production build and bounded consistency round

bun run --cwd apps/web build

> Using @sveltejs/adapter-static
  Wrote site to "build"
  ✔ done

bun tests/adversarial/notes-open-661.mjs

notes-open #661: Task, Daily, plain; 5 s read-only opens at 390/820/1440 light/dark; quick switching; MCP; explicit Enter, Task Space and Undo passed

The server suite's three ignored process-global cases run through its
passing live_apps_run_in_separate_processes test.

Performance

The perf VM lock was busy at the measured-run attempt. These results are
local, with a debug server and production SPA on the shared build host.
Load average was 20.07 / 21.23 / 19.44. There are 12 navigation samples
per size. The 16-request burst uses read requests.

Fixture p50 ms p95 ms Server CPU s Server RSS before/after MiB Burst ms
64 paragraphs 2267.48 2832.47 4.88 125.73 / 252.42 91.44
10,000 paragraphs 4444.39 9249.95 74.68 260.10 / 665.70 503.91

docs/perf/baseline.json has no equivalent Note-open-to-editor metric.
These results establish the first feature baseline. They do not support
a comparison with a release-server baseline. Durable snapshots also stayed
unchanged during the profile.

UX gaps closed

  • Metadata and selection transactions no longer add content on open.
  • Both editor hosts use the same read-only initialization rule.
  • The tests cover quick switching and reopen after external reconciliation.
  • Explicit editing and keyboard Undo remain available.

UX gaps left and known gaps

The Task header/status action and its shared Undo toast belong to #659.
An explicit frontmatter status remains authoritative under the existing
Task contract. This change keeps that contract and its test expectations.
There is no known remaining #661 correctness gap.

The required one-time fetch and merge of origin/dev returned Already up to date. at c4a61e8cf090170f35b1bed3350d9de20c83ecd5.
The #634 branch was read. It had not landed on the fetched origin/dev.
This fix changes the editor preset; it leaves the external-write and
conflict-repair writer paths unchanged. The real MCP reopen case passes.
The orchestrator must combine it with the final #634 merge.

Decisions

No new product design was needed. The shared editor preset owns the
read-only initialization invariant, as required by DESIGN §9. Explicit
commands create terminal paragraphs when the User edits. Test fixtures
use the existing server/browser harness. No server writer rule changed.

No pushes or deploys were made. Only the authorized origin/dev merge
was attempted. Build output is removed after validation; review artifacts
stay in the worktree and on issue #661.

Final report. Branch: `job/writeonopen-661`. Head: `04c4a651be5a0da6c1311af9ad2d39bd289b8a09`. # Note opening stays read-only (#661) The shared editor preset now disables TipTap's implicit trailing paragraph. A metadata or selection transaction cannot add content on mount. The live room and Markdown fallback keep the loaded tree. Explicit edit commands still work. DESIGN §9 requires this behavior. Implementation: `packages/editor/src/extensions.ts`. Regression tests: `packages/editor/src/Editor.svelte.test.ts`, `apps/web/src/lib/notes/collaborationUndo.svelte.test.ts`, `apps/web/e2e/notes-open-661.mjs`, and `tests/adversarial/notes-open-661.mjs`. Profile: `bench/notes-open-661.sh` and `docs/perf/notes-open-661.json`. Test instructions: `docs/testing/notes-open-661.md`. ## Evidence A real local server and the production SPA passed 18 read-only opens: Task, Daily and plain Notes at 390, 820 and 1440 pixels, light and dark. Each five-second open kept bytes, nanosecond mtime, inode, Note ETag and Files ETag. No Note change-feed event or save notice appeared. Quick switching, a read burst, reopen after a real MCP edit, explicit Enter, Task Space activation and keyboard Undo passed. The live ready marker prevents a fallback-only pass. All 18 screenshots are attached to issue #661. The orchestrator reviews their visual quality. ## Gates These excerpts are verbatim. Logs remain in the ignored `artifacts/` directory. `cargo fmt --check` passed with no output. Each Rust command used four build jobs, no incremental build and small debug output. ### calternal-collab `cargo clippy -p calternal-collab --all-targets -- -D warnings` ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 6m 14s ``` `cargo test -p calternal-collab -- --test-threads=1` ```text test result: ok. 25 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.67s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.95s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.71s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 88.34s test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 14.87s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.28s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.59s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.56s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.29s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 24.03s test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.11s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 42.07s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` ### calternal-plugin-notes `cargo clippy -p calternal-plugin-notes --all-targets -- -D warnings` ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 7m 41s ``` `cargo test -p calternal-plugin-notes -- --test-threads=1` ```text test result: ok. 167 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 132.84s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.42s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` ### calternal-notes-core `cargo clippy -p calternal-notes-core --all-targets -- -D warnings` ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 24.08s ``` `cargo test -p calternal-notes-core -- --test-threads=1` ```text test result: ok. 519 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.33s test result: ok. 19 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.49s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.61s test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` ### calternal-server `cargo clippy -p calternal-server --all-targets -- -D warnings` ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 33s ``` `cargo test -p calternal-server -- --test-threads=1` ```text test result: ok. 107 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 44.00s ``` ### editor `bun run --cwd packages/editor check` ```text svelte-check found 0 errors and 0 warnings ``` `bun run --cwd packages/editor test` ```text Test Files 18 passed (18) Tests 414 passed (414) ``` ### web `bun run --cwd apps/web check` ```text svelte-check found 0 errors and 0 warnings ``` `bun run --cwd apps/web test --maxWorkers=1` ```text Test Files 153 passed (153) Tests 1056 passed (1056) ``` ### Production build and bounded consistency round `bun run --cwd apps/web build` ```text > Using @sveltejs/adapter-static Wrote site to "build" ✔ done ``` `bun tests/adversarial/notes-open-661.mjs` ```text notes-open #661: Task, Daily, plain; 5 s read-only opens at 390/820/1440 light/dark; quick switching; MCP; explicit Enter, Task Space and Undo passed ``` The server suite's three ignored process-global cases run through its passing `live_apps_run_in_separate_processes` test. ## Performance The perf VM lock was busy at the measured-run attempt. These results are local, with a debug server and production SPA on the shared build host. Load average was 20.07 / 21.23 / 19.44. There are 12 navigation samples per size. The 16-request burst uses read requests. | Fixture | p50 ms | p95 ms | Server CPU s | Server RSS before/after MiB | Burst ms | | --- | ---: | ---: | ---: | ---: | ---: | | 64 paragraphs | 2267.48 | 2832.47 | 4.88 | 125.73 / 252.42 | 91.44 | | 10,000 paragraphs | 4444.39 | 9249.95 | 74.68 | 260.10 / 665.70 | 503.91 | `docs/perf/baseline.json` has no equivalent Note-open-to-editor metric. These results establish the first feature baseline. They do not support a comparison with a release-server baseline. Durable snapshots also stayed unchanged during the profile. ## UX gaps closed - Metadata and selection transactions no longer add content on open. - Both editor hosts use the same read-only initialization rule. - The tests cover quick switching and reopen after external reconciliation. - Explicit editing and keyboard Undo remain available. ## UX gaps left and known gaps The Task header/status action and its shared Undo toast belong to #659. An explicit frontmatter status remains authoritative under the existing Task contract. This change keeps that contract and its test expectations. There is no known remaining #661 correctness gap. The required one-time fetch and merge of `origin/dev` returned `Already up to date.` at `c4a61e8cf090170f35b1bed3350d9de20c83ecd5`. The #634 branch was read. It had not landed on the fetched `origin/dev`. This fix changes the editor preset; it leaves the external-write and conflict-repair writer paths unchanged. The real MCP reopen case passes. The orchestrator must combine it with the final #634 merge. ## Decisions No new product design was needed. The shared editor preset owns the read-only initialization invariant, as required by DESIGN §9. Explicit commands create terminal paragraphs when the User edits. Test fixtures use the existing server/browser harness. No server writer rule changed. No pushes or deploys were made. Only the authorized `origin/dev` merge was attempted. Build output is removed after validation; review artifacts stay in the worktree and on issue #661.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
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#661
No description provided.