Live editing: Yrs server, y-sync, Markdown ↔ Yrs converter on shared vectors #16

Closed
opened 2026-09-24 11:48:39 +00:00 by kayg · 20 comments
Owner

Codex job collab.

Base: 49fb86f1c3

Codex job `collab`. Base: 49fb86f1c36af264b9c22031669c8dd26897ae38
Author
Owner

Starting job/collab at base 49fb86f1c3. I read the repository contract and design; fetched the editor package at 5692b4dd. Next I am checking the vector schema and existing Note write/auth APIs.

Starting job/collab at base 49fb86f1c36af264b9c22031669c8dd26897ae38. I read the repository contract and design; fetched the editor package at 5692b4dd. Next I am checking the vector schema and existing Note write/auth APIs.
Author
Owner

Finding: y-sync 0.4.0 depends on yrs 0.17, while the workspace pins yrs 0.28.0. The pinned Yrs crate includes the standard sync and awareness protocol in yrs::sync; using that keeps one Yrs document version. The notes plugin currently keeps ID lookup, If-Match, write, and index helpers private, so a small public persistence hook is needed for the live session path.

Finding: y-sync 0.4.0 depends on yrs 0.17, while the workspace pins yrs 0.28.0. The pinned Yrs crate includes the standard sync and awareness protocol in yrs::sync; using that keeps one Yrs document version. The notes plugin currently keeps ID lookup, If-Match, write, and index helpers private, so a small public persistence hook is needed for the live session path.
Author
Owner

Finding: all 15 pinned editor Markdown vectors pass the Rust Markdown → ProseMirror JSON → Yrs XML → ProseMirror JSON → exact Markdown path. A server build required the existing web production artifact because calternal-server uses RustEmbed; bun run --cwd apps/web build generated it. The live route now compiles behind the existing session middleware. External edits to a different block preserve the live block; a same-block edit keeps both versions in a deterministic order.

Finding: all 15 pinned editor Markdown vectors pass the Rust Markdown → ProseMirror JSON → Yrs XML → ProseMirror JSON → exact Markdown path. A server build required the existing web production artifact because calternal-server uses RustEmbed; `bun run --cwd apps/web build` generated it. The live route now compiles behind the existing session middleware. External edits to a different block preserve the live block; a same-block edit keeps both versions in a deterministic order.
Author
Owner

Finding: the current Notes plugin resolves Note IDs only inside the authenticated user's Home; it has no cross-owner Share lookup or grant check. The live route enforces data scope, the auth-validated Home root, and WebSocket Origin, but cannot safely open a Note shared by another user yet. The converter passes every supplied vector and real Yjs/y-prosemirror update exchange, but its Markdown grammar does not yet cover all forms in the editor's larger markdown.ts implementation. These are remaining coverage gaps rather than assumed authorization or syntax rules.

Finding: the current Notes plugin resolves Note IDs only inside the authenticated user's Home; it has no cross-owner Share lookup or grant check. The live route enforces data scope, the auth-validated Home root, and WebSocket Origin, but cannot safely open a Note shared by another user yet. The converter passes every supplied vector and real Yjs/y-prosemirror update exchange, but its Markdown grammar does not yet cover all forms in the editor's larger markdown.ts implementation. These are remaining coverage gaps rather than assumed authorization or syntax rules.
Author
Owner

Finished on branch job/collab, head 65767f381f.

Built: pinned editor sync script and Markdown vectors; Rust Markdown/ProseMirror/Yrs bridge; real Bun Yjs/y-prosemirror interoperability test; authenticated y-sync and awareness WebSocket rooms; Note-plugin If-Match persistence hook; 750 ms debounce and last-client flush; block-level external edit application from Note events and the file watcher; named agent presence/edit hook. Frontmatter stays outside the live fragment.

Gates (quoted output):

cargo fmt --check: no output (exit 0).

cargo clippy --all-targets -- -D warnings:
Finished dev profile [unoptimized + debuginfo] target(s) in 4.11s

cargo test:
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 29 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 28.58s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test yjs_updates_match_editor_vectors ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.81s
test markdown_vectors_pass_through_yrs ... ok
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 8 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.10s
test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
test result: ok. 27 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s
test result: ok. 354 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s
test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.13s
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.82s
test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.72s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

bun run --cwd apps/web check:
$ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/collab/apps/web
Getting Svelte diagnostics...

svelte-check found 0 errors and 0 warnings

bun run --cwd apps/web test:
$ vitest run

RUN v5.0.1 /home/kayg/Developer/calternal-wt/collab/apps/web

Test Files 3 passed (3)
Tests 9 passed (9)
Start at 14:12:36
Duration 29.21s (transform 92%, import 8%)

Transform transforming modules took 53.11s · 92% of tracked time, re-done on every run
persist transforms across runs with fsModuleCache: true
learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns

bash packages/api-client/check-generated.sh:
Compiling calternal-plugin-notes v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/plugins/notes)
Compiling calternal-server v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-server)
Compiling calternal-search v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-search)
Compiling calternal-collab v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-collab)
Finished dev profile [unoptimized + debuginfo] target(s) in 18.04s
Running target/debug/calternal-server openapi
$ bunx --package openapi-typescript@7.13.0 openapi-typescript ../../contracts/openapi.json -o src/generated.ts
✨ openapi-typescript 7.13.0
🚀 ../../contracts/openapi.json → src/generated.ts [162.6ms]

cargo clean:
Removed 9963 files, 5.6GiB total

Known gaps: current Notes identity/grant lookup covers only the authenticated user's Home, so cross-user Shares cannot use this route yet; Markdown syntax outside the 15 shared vectors is not fully covered by the Rust parser; no end-to-end WebSocket two-client test or fault-injection crash test was added. The cross-language test uses the pinned upstream editor source until packages/editor is vendored and skips if neither source is available. Same-block external conflicts preserve both blocks, with the external block first. No issue was closed, pushed, deployed, or merged.

Finished on branch job/collab, head 65767f381fa74b5ea7338e67e3eeee56395ba15c. Built: pinned editor sync script and Markdown vectors; Rust Markdown/ProseMirror/Yrs bridge; real Bun Yjs/y-prosemirror interoperability test; authenticated y-sync and awareness WebSocket rooms; Note-plugin If-Match persistence hook; 750 ms debounce and last-client flush; block-level external edit application from Note events and the file watcher; named agent presence/edit hook. Frontmatter stays outside the live fragment. Gates (quoted output): cargo fmt --check: no output (exit 0). cargo clippy --all-targets -- -D warnings: Finished `dev` profile [unoptimized + debuginfo] target(s) in 4.11s cargo test: test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 29 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 28.58s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test yjs_updates_match_editor_vectors ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.81s test markdown_vectors_pass_through_yrs ... ok test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 8 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.10s test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s test result: ok. 27 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s test result: ok. 354 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.13s test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.82s test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.72s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s bun run --cwd apps/web check: $ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/collab/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings bun run --cwd apps/web test: $ vitest run RUN v5.0.1 /home/kayg/Developer/calternal-wt/collab/apps/web Test Files 3 passed (3) Tests 9 passed (9) Start at 14:12:36 Duration 29.21s (transform 92%, import 8%) Transform transforming modules took 53.11s · 92% of tracked time, re-done on every run persist transforms across runs with fsModuleCache: true learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns bash packages/api-client/check-generated.sh: Compiling calternal-plugin-notes v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/plugins/notes) Compiling calternal-server v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-server) Compiling calternal-search v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-search) Compiling calternal-collab v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-collab) Finished `dev` profile [unoptimized + debuginfo] target(s) in 18.04s Running `target/debug/calternal-server openapi` $ bunx --package openapi-typescript@7.13.0 openapi-typescript ../../contracts/openapi.json -o src/generated.ts ✨ openapi-typescript 7.13.0 🚀 ../../contracts/openapi.json → src/generated.ts [162.6ms] cargo clean: Removed 9963 files, 5.6GiB total Known gaps: current Notes identity/grant lookup covers only the authenticated user's Home, so cross-user Shares cannot use this route yet; Markdown syntax outside the 15 shared vectors is not fully covered by the Rust parser; no end-to-end WebSocket two-client test or fault-injection crash test was added. The cross-language test uses the pinned upstream editor source until packages/editor is vendored and skips if neither source is available. Same-block external conflicts preserve both blocks, with the external block first. No issue was closed, pushed, deployed, or merged.
Author
Owner

Additional durability caveat from final review: the Notes plugin's live write checks the full-file ETag under its per-user lock, which serializes Notes-plugin writes. calternal-fs::Root::write has no compare-and-swap argument, so a concurrent write by another server plugin or an out-of-band file replacement between that read and Root::write is not atomically excluded. Fixing this requires a new conditional write operation in calternal-fs, which changes another crate's persistence API and is outside this worktree's owned behavior. Do not treat the live persistence path as fully race-free until that API exists.

Additional durability caveat from final review: the Notes plugin's live write checks the full-file ETag under its per-user lock, which serializes Notes-plugin writes. calternal-fs::Root::write has no compare-and-swap argument, so a concurrent write by another server plugin or an out-of-band file replacement between that read and Root::write is not atomically excluded. Fixing this requires a new conditional write operation in calternal-fs, which changes another crate's persistence API and is outside this worktree's owned behavior. Do not treat the live persistence path as fully race-free until that API exists.
Author
Owner

Continuing on branch job/collab from 65767f381f. I am closing the atomic write, Markdown dialect, live-client, crash, and shared-note gaps, then running all gates.

Continuing on branch job/collab from 65767f381fa74b5ea7338e67e3eeee56395ba15c. I am closing the atomic write, Markdown dialect, live-client, crash, and shared-note gaps, then running all gates.
Author
Owner

Finding: the HTTP and collab If-Match checks read the Note before calternal-fs acquired its writer lock. Commit 6aeabfc adds replace_if, compares BLAKE3 under that lock, and uses it for both paths. A two-Root concurrent test proves exactly one competing replacement succeeds and one version is kept.

Finding: the HTTP and collab If-Match checks read the Note before calternal-fs acquired its writer lock. Commit 6aeabfc adds replace_if, compares BLAKE3 under that lock, and uses it for both paths. A two-Root concurrent test proves exactly one competing replacement succeeds and one version is kept.
Author
Owner

Finding: neither this branch nor main contains a Files plugin Share model. The shared-note route therefore uses a typed SharedNoteAccess adapter whose default denies access. Its contract requires an editor Share bound to immutable item identity; allowed_roots is only a session check.

Finding: neither this branch nor main contains a Files plugin Share model. The shared-note route therefore uses a typed SharedNoteAccess adapter whose default denies access. Its contract requires an editor Share bound to immutable item identity; allowed_roots is only a session check.
Author
Owner

Finding: the prior crash test only dropped an in-memory Yrs value. The new child-process test exits after an update schedules its 750 ms flush, then reopens the Note from Markdown. A filesystem journal test injects failure after each conditional-replace step and verifies recovery. The two Bun/Yjs clients now edit one live Note, receive an external write, and the final Markdown contains all edits.

Finding: the prior crash test only dropped an in-memory Yrs value. The new child-process test exits after an update schedules its 750 ms flush, then reopens the Note from Markdown. A filesystem journal test injects failure after each conditional-replace step and verifies recovery. The two Bun/Yjs clients now edit one live Note, receive an external write, and the final Markdown contains all edits.
Author
Owner

Finished on job/collab at 29a78a56a2.

Built: atomic calternal-fs replace_if used by collab and Notes If-Match; editor-generated supplemental Markdown vectors and Rust bridge coverage; two real Bun/Yjs WebSocket clients with an external write; abrupt pre-flush and mid-journal child-process restart tests; typed shared-Note Share adapter that denies access until the Files Share model exists.

Known gap: shared Notes from another user's Home remain denied because main has no Files Share model. The adapter requires an editor Share bound to immutable item identity and rechecks active sockets.

Gate output (verbatim excerpts):
$ cargo fmt --check
$ cargo clippy --all-targets -- -D warnings
Checking calternal-fs v0.1.0 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-fs)
Compiling calternal-server v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-server)
Checking calternal-plugin v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-plugin)
Checking calternal-plugin-notes v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/plugins/notes)
Checking calternal-search v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-search)
Checking calternal-collab v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-collab)
Finished dev profile [unoptimized + debuginfo] target(s) in 4.49s
$ cargo test
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 29 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 24.86s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.85s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.06s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 8 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.09s
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
test result: ok. 28 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.08s
test result: ok. 354 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s
test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.80s
test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.70s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
$ bun run check (apps/web)
$ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/collab/apps/web
Getting Svelte diagnostics...

svelte-check found 0 errors and 0 warnings
$ bun run test (apps/web)
$ vitest run

RUN v5.0.1 /home/kayg/Developer/calternal-wt/collab/apps/web

Test Files 3 passed (3)
Tests 9 passed (9)
Start at 14:38:49
Duration 34.08s (transform 90%, import 10%)

Transform transforming modules took 60.46s · 90% of tracked time, re-done on every run
persist transforms across runs with fsModuleCache: true
learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns

Finished on job/collab at 29a78a56a2b52fdd564c5b4afa7c7b6d812e0bbb. Built: atomic calternal-fs replace_if used by collab and Notes If-Match; editor-generated supplemental Markdown vectors and Rust bridge coverage; two real Bun/Yjs WebSocket clients with an external write; abrupt pre-flush and mid-journal child-process restart tests; typed shared-Note Share adapter that denies access until the Files Share model exists. Known gap: shared Notes from another user's Home remain denied because main has no Files Share model. The adapter requires an editor Share bound to immutable item identity and rechecks active sockets. Gate output (verbatim excerpts): $ cargo fmt --check $ cargo clippy --all-targets -- -D warnings Checking calternal-fs v0.1.0 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-fs) Compiling calternal-server v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-server) Checking calternal-plugin v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-plugin) Checking calternal-plugin-notes v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/plugins/notes) Checking calternal-search v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-search) Checking calternal-collab v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-collab) Finished `dev` profile [unoptimized + debuginfo] target(s) in 4.49s $ cargo test test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 29 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 24.86s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.85s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.06s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 8 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.09s test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s test result: ok. 28 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.08s test result: ok. 354 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.80s test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.70s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s $ bun run check (apps/web) $ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/collab/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings $ bun run test (apps/web) $ vitest run RUN v5.0.1 /home/kayg/Developer/calternal-wt/collab/apps/web Test Files 3 passed (3) Tests 9 passed (9) Start at 14:38:49 Duration 34.08s (transform 90%, import 10%) Transform transforming modules took 60.46s · 90% of tracked time, re-done on every run persist transforms across runs with fsModuleCache: true learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns
Author
Owner

Final update for issue #16. This supersedes my earlier completion comment. Branch job/collab, head 2633867708.

The final Markdown bridge also preserves nested inline marks in the editor's schema order. The editor-generated supplemental vectors now include that case. All listed work is committed. Shared Notes from another user's Home remain denied by default because main has no Files Share model; the typed adapter and periodic revoke checks are in place.

Gate output (verbatim excerpts):
$ cargo fmt --check
$ cargo clippy --all-targets -- -D warnings
Checking cfg-if v1.0.5
Checking serde_core v1.0.229
Checking libc v0.2.189
Checking zeroize v1.9.0
Checking memchr v2.8.3
Compiling syn v2.0.119
Compiling displaydoc v0.2.7
Checking pin-project-lite v0.2.17
Checking typenum v1.20.1
Checking itoa v1.0.18
Checking subtle v2.6.1
Checking once_cell v1.21.4
Checking log v0.4.34
Compiling generic-array v0.14.9
Compiling libm v0.2.16
Compiling num-traits v0.2.19
Checking const-oid v0.9.6
Checking stable_deref_trait v1.2.1
Compiling jobserver v0.1.35
Checking futures-core v0.3.34
Checking smallvec v1.16.1
Checking bytes v1.12.1
Checking zerofrom v0.1.8
Checking futures-sink v0.3.34
Checking scopeguard v1.2.0
Compiling cc v1.4.7
Checking yoke v0.8.3
Checking crypto-common v0.1.6
Checking block-buffer v0.10.4
Checking errno v0.3.14
Checking digest v0.10.7
Checking mio v1.2.3
Checking signal-hook-registry v1.4.8
Checking zerovec v0.11.8
Checking zmij v1.0.23
Checking socket2 v0.6.5
Checking serde v1.0.229
Checking bitflags v2.13.2
Checking serde_json v1.0.151
Checking tokio v1.53.1
Checking futures-channel v0.3.34
Checking percent-encoding v2.3.2
Checking lock_api v0.4.14
Checking tracing-core v0.1.36
Checking slab v0.4.12
Checking futures-io v0.3.34
Checking futures-task v0.3.34
Compiling zerocopy v0.8.58
Checking tinystr v0.8.4
Checking futures-util v0.3.34
Checking litemap v0.8.3
Checking writeable v0.6.4
Checking potential_utf v0.1.6
Checking zerotrie v0.2.5
Checking icu_locale_core v2.3.0
Checking utf8_iter v1.0.4
Checking icu_collections v2.3.0
Checking equivalent v1.0.2
Checking icu_properties_data v2.3.0
Checking icu_normalizer_data v2.3.0
Checking cpufeatures v0.2.17
Checking icu_provider v2.3.1
Checking form_urlencoded v1.2.2
Checking spin v0.9.9
Checking crossbeam-utils v0.8.23
Checking icu_properties v2.3.0
Checking icu_normalizer v2.3.0
Checking getrandom v0.4.3
Checking thiserror v2.0.21
Checking getrandom v0.2.17
Checking getrandom v0.3.4
Checking either v1.18.0
Checking http v1.5.0
Checking base64 v0.22.1
Checking idna_adapter v1.2.2
Checking idna v1.1.0
Checking hashbrown v0.17.1
Checking rand_core v0.9.5
Checking url v2.5.8
Checking indexmap v2.14.2
Checking allocator-api2 v0.2.21
Checking foldhash v0.2.0
Checking sha2 v0.10.9
Compiling tracing-attributes v0.1.31
Compiling zerocopy-derive v0.8.58
Checking hashbrown v0.16.1
Checking iana-time-zone v0.1.65
Checking chrono v0.4.45
Checking http-body v1.1.0
Compiling parking_lot_core v0.9.12
Checking tracing v0.1.44
Checking parking v2.2.1
Checking event-listener v5.4.2
Compiling parking_lot v0.12.5
Checking httparse v1.10.1
Compiling libsqlite3-sys v0.37.0
Checking linux-raw-sys v0.12.1
Checking tower-service v0.3.3
Compiling crc-catalog v2.5.0
Compiling crc v3.4.0
Checking rustix v1.1.5
Compiling hashlink v0.11.1
Compiling crossbeam-queue v0.3.14
Compiling futures-intrusive v0.5.0
Checking tokio-util v0.7.19
Checking uuid v1.26.1
Checking ryu v1.0.23
Checking cpufeatures v0.3.1
Checking try-lock v0.2.5
Checking tokio-stream v0.1.19
Checking want v0.3.1
Compiling flume v0.12.0
Compiling futures-executor v0.3.34
Compiling atoi v2.0.0
Checking rand_core v0.6.4
Checking sync_wrapper v1.0.2
Checking atomic-waker v1.1.2
Checking httpdate v1.0.3
Checking data-encoding v2.11.1
Checking tower-layer v0.3.3
Checking siphasher v1.0.3
Checking hyper v1.11.1
Compiling blake3 v1.8.7
Checking ipnet v2.12.2
Checking ppv-lite86 v0.2.21
Compiling phf_shared v0.11.3
Checking sqlx-core v0.9.0
Checking tower v0.5.3
Checking rand_chacha v0.9.0
Checking hyper-util v0.1.20
Checking rand v0.9.5
Checking http-body-util v0.1.5
Compiling num-conv v0.2.2
Checking constant_time_eq v0.4.2
Checking arrayvec v0.7.8
Checking base64ct v1.8.3
Compiling time-core v0.1.9
Compiling time-macros v0.2.32
Compiling phf_generator v0.11.3
Checking serde_urlencoded v0.7.1
Checking deranged v0.5.8
Checking fastrand v2.5.0
Checking powerfmt v0.2.0
Compiling crunchy v0.2.4
Compiling utoipa-gen v6.0.1
Compiling phf_macros v0.11.3
Checking sha1 v0.10.7
Checking serde_path_to_error v0.1.20
Checking mime v0.3.17
Checking tungstenite v0.29.0
Checking pem-rfc7468 v0.7.0
Checking phf v0.11.3
Checking winnow v0.7.15
Checking tinyvec v1.13.3
Checking minimal-lexical v0.2.1
Checking nom v7.1.3
Checking unicode-normalization v0.1.25
Checking time v0.3.55
Checking tokio-tungstenite v0.29.0
Checking der v0.7.10
Checking cron v0.17.0
Checking axum-core v0.5.6
Checking tempfile v3.27.0
Compiling axum-macros v0.5.1
Checking matchit v0.8.4
Compiling openssl-src v300.6.1+3.6.3
Checking spki v0.7.3
Compiling ident_case v1.0.1
Compiling strsim v0.11.1
Checking regex-syntax v0.8.11
Compiling darling_core v0.24.1
Compiling openssl-sys v0.9.117
Compiling sqlx-sqlite v0.9.0
Checking pkcs8 v0.10.2
Checking calternal-fs v0.1.0 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-fs)
Compiling thiserror v1.0.69
Checking linkme v0.3.37
Compiling thiserror-impl v1.0.69
Checking axum v0.8.9
Compiling ring v0.17.14
Checking num-integer v0.1.47
Compiling sqlx-macros-core v0.9.0
Checking same-file v1.0.6
Checking walkdir v2.5.0
Checking calternal-notes-core v0.1.0 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-notes-core)
Compiling darling_macro v0.24.1
Checking lazy_static v1.5.0
Compiling zstd-sys v2.1.0+zstd.1.5.7
Compiling sqlx-macros v0.9.0
Compiling darling v0.24.1
Compiling typeid v1.0.3
Checking utoipa v6.0.0
Checking inotify-sys v0.1.8
Checking arc-swap v1.9.2
Compiling synstructure v0.13.2
Checking hmac v0.12.1
Checking rustls-pki-types v1.15.1
Checking untrusted v0.9.0
Checking hashbrown v0.14.5
Checking sqlx v0.9.0
Checking inotify v0.11.5
Checking calternal-db v0.1.0 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-db)
Checking rusticata-macros v4.1.0
Checking phf_shared v0.12.1
Compiling asn1-rs-derive v0.5.1
Checking ff v0.13.1
Checking signature v2.2.0
Compiling asn1-rs-impl v0.2.0
Checking notify-types v2.1.0
Compiling zstd-safe v7.3.0
Checking base64 v0.21.7
Compiling erased-serde v0.4.10
Compiling crossbeam-epoch v0.9.21
Compiling rustls v0.23.45
Compiling unicase v2.9.0
Checking base16ct v0.2.0
Checking byteorder v1.5.0
Checking fnv v1.0.7
Compiling mime_guess v2.0.5
Checking asn1-rs v0.6.2
Checking sec1 v0.7.3
Checking notify v8.2.0
Checking phf v0.12.1
Checking group v0.13.0
Checking hkdf v0.12.4
Checking calternal-api v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-api)
Checking crypto-bigint v0.5.5
Checking ownedbytes v0.9.0
Compiling tiny-keccak v2.0.2
Checking foreign-types-shared v0.1.1
Compiling oid-registry v0.7.1
Compiling openssl v0.10.81
Checking calternal-plugin v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-plugin)
Compiling pastey v0.1.1
Compiling semver v1.0.28
Compiling crossbeam-deque v0.8.8
Compiling prettyplease v0.3.0
Compiling rustc_version v0.4.1
Checking foreign-types v0.3.2
Checking tantivy-common v0.11.0
Checking bitpacking v0.9.3
Checking base64urlsafedata v0.5.5
Checking chrono-tz v0.10.4
Checking elliptic-curve v0.13.8
Checking num-bigint v0.4.8
Checking regex-automata v0.4.18
Checking rand_chacha v0.3.1
Checking event-listener-strategy v0.5.4
Compiling openssl-macros v0.1.1
Compiling hybrid-array v0.4.15
Compiling webauthn-attestation-ca v0.5.5
Compiling rayon-core v1.13.0
Checking rustls-webpki v0.103.15
Checking utf8-ranges v1.0.5
Checking der-parser v9.0.0
Checking tantivy-fst v0.5.0
Checking async-lock v3.4.2
Checking rand v0.8.8
Checking tantivy-bitpacker v0.10.0
Compiling curve25519-dalek v4.1.3
Checking dashmap v6.2.1
Checking webpki-roots v1.0.9
Checking rfc6979 v0.4.0
Checking half v2.7.1
Checking itertools v0.14.0
Checking smallstr v0.3.1
Checking unsafe-libyaml v0.2.11
Compiling num-bigint-dig v0.8.6
Checking murmurhash32 v0.3.1
Compiling webauthn-rs-core v0.5.5
Compiling typetag v0.2.23
Compiling crc32fast v1.5.2
Checking serde_yaml v0.9.34+deprecated
Checking tantivy-stacker v0.7.0
Compiling bon-macros v3.10.1
Checking yrs v0.28.0
Compiling const-random-macro v0.1.16
Checking serde_cbor_2 v0.13.0
Checking tokio-rustls v0.26.5
Checking ecdsa v0.16.9
Checking x509-parser v0.16.0
Checking hyper-rustls v0.27.10
Checking calternal-plugin-notes v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/plugins/notes)
Compiling block-buffer v0.12.1
Compiling crypto-common v0.2.2
Checking primeorder v0.13.6
Checking webauthn-rs-proto v0.5.5
Checking num-iter v0.1.46
Checking tower-http v0.6.11
Compiling curve25519-dalek-derive v0.1.1
Checking ordered-float v5.5.0
Compiling typetag-impl v0.2.23
Checking inventory v0.3.24
Checking hex v0.4.3
Checking fastdivide v0.4.2
Checking downcast-rs v2.0.2
Checking similar v3.2.0
Compiling const-oid v0.10.2
Checking tantivy-query-grammar v0.26.0
Compiling digest v0.11.3
Checking reqwest v0.12.28
Checking rayon v1.12.0
Checking const-random v0.1.18
Checking regex v1.13.1
Checking ed25519 v2.2.3
Compiling serde_with_macros v3.23.0
Checking pkcs1 v0.7.5
Compiling multiversion-macros v0.9.0
Compiling encoding_rs v0.8.41
Checking fs4 v0.13.1
Checking lru v0.16.4
Checking crossbeam-channel v0.5.17
Checking ordered-float v2.10.1
Checking rust-stemmers v1.2.0
Checking sketches-ddsketch v0.4.1
Checking tantivy-tokenizer-api v0.7.0
Checking memmap2 v0.9.11
Checking bon v3.10.1
Checking measure_time v0.9.0
Checking aho-corasick v1.1.5
Checking levenshtein_automata v0.2.1
Checking census v0.4.2
Checking htmlescape v0.3.1
Checking lz4_flex v0.13.1
Checking rustc-hash v2.1.3
Checking oneshot v0.1.13
Checking datasketches v0.2.0
Compiling sha2 v0.11.0
Checking multiversion v0.9.0
Checking serde_with v3.23.0
Checking serde-value v0.7.0
Checking rsa v0.9.10
Checking ed25519-dalek v2.2.0
Checking oauth2 v5.0.0
Checking dlv-list v0.5.2
Checking calternal-collab v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-collab)
Checking p384 v0.13.1
Checking p256 v0.13.2
Checking password-hash v0.5.0
Checking itertools v0.10.5
Checking serde_plain v1.0.2
Checking blake2 v0.10.6
Checking simdutf8 v0.1.5
Checking core_detect v1.0.0
Checking dyn-clone v1.0.20
Checking winnow v1.0.4
Compiling multiversion_no_op v1.0.0
Checking argon2 v0.5.3
Compiling rust-embed-utils v8.12.0
Checking ordered-multimap v0.7.3
Compiling async-stream-impl v0.3.6
Checking openidconnect v4.0.1
Checking serde_spanned v1.1.1
Checking toml_datetime v1.1.1+spec-1.1.0
Checking toml_parser v1.1.3+spec-1.1.0
Checking wait-timeout v0.2.1
Checking bit-vec v0.8.0
Checking unicode-segmentation v1.13.3
Checking unicode-ident v1.0.26
Checking arraydeque v0.5.1
Checking toml_writer v1.1.2+spec-1.1.0
Checking quick-error v1.2.3
Checking ucd-trie v0.1.7
Compiling webauthn-authenticator-rs v0.5.5
Checking yaml-rust2 v0.11.1
Checking zstd v0.13.3
Checking toml v1.1.6+spec-1.1.0
Checking json5 v1.3.1
Checking convert_case v0.6.0
Checking tantivy-sstable v0.7.0
Checking rusty-fork v0.3.1
Checking ron v0.12.2
Checking bit-set v0.8.0
Checking async-stream v0.3.6
Checking rust-ini v0.21.3
Compiling rust-embed-impl v8.12.0
Checking matchers v0.2.0
Checking tantivy-columnar v0.7.0
Checking serde-untagged v0.1.9
Checking sharded-slab v0.1.7
Checking futures v0.3.34
Compiling num-derive v0.4.2
Checking rand_xorshift v0.4.0
Checking tracing-log v0.2.0
Checking serde_bytes v0.11.19
Checking thread_local v1.1.10
Checking unarray v0.1.4
Checking bitflags v1.3.2
Checking pathdiff v0.2.3
Compiling calternal-server v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-server)
Checking nu-ansi-term v0.50.3
Checking rust-embed v8.12.0
Checking config v0.15.26
Checking proptest v1.11.0
Checking tantivy v0.26.2
Checking tracing-subscriber v0.3.23
Checking calternal-search v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-search)
Checking webauthn-rs v0.5.5
Checking calternal-auth v0.1.0 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-auth)
Finished dev profile [unoptimized + debuginfo] target(s) in 2m 48s
$ cargo test
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 29 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 35.07s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.66s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.10s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 8 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.14s
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s
test result: ok. 28 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s
test result: ok. 354 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s
test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.16s
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.93s
test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.33s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
$ bun run check (apps/web)
$ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/collab/apps/web
Getting Svelte diagnostics...

svelte-check found 0 errors and 0 warnings
$ bun run test (apps/web)
$ vitest run

RUN v5.0.1 /home/kayg/Developer/calternal-wt/collab/apps/web

Test Files 3 passed (3)
Tests 9 passed (9)
Start at 14:38:49
Duration 34.08s (transform 90%, import 10%)

Transform transforming modules took 60.46s · 90% of tracked time, re-done on every run
persist transforms across runs with fsModuleCache: true
learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns

Final update for issue #16. This supersedes my earlier completion comment. Branch job/collab, head 26338677080496892740f0b619d9d90d5c16bf1c. The final Markdown bridge also preserves nested inline marks in the editor's schema order. The editor-generated supplemental vectors now include that case. All listed work is committed. Shared Notes from another user's Home remain denied by default because main has no Files Share model; the typed adapter and periodic revoke checks are in place. Gate output (verbatim excerpts): $ cargo fmt --check $ cargo clippy --all-targets -- -D warnings Checking cfg-if v1.0.5 Checking serde_core v1.0.229 Checking libc v0.2.189 Checking zeroize v1.9.0 Checking memchr v2.8.3 Compiling syn v2.0.119 Compiling displaydoc v0.2.7 Checking pin-project-lite v0.2.17 Checking typenum v1.20.1 Checking itoa v1.0.18 Checking subtle v2.6.1 Checking once_cell v1.21.4 Checking log v0.4.34 Compiling generic-array v0.14.9 Compiling libm v0.2.16 Compiling num-traits v0.2.19 Checking const-oid v0.9.6 Checking stable_deref_trait v1.2.1 Compiling jobserver v0.1.35 Checking futures-core v0.3.34 Checking smallvec v1.16.1 Checking bytes v1.12.1 Checking zerofrom v0.1.8 Checking futures-sink v0.3.34 Checking scopeguard v1.2.0 Compiling cc v1.4.7 Checking yoke v0.8.3 Checking crypto-common v0.1.6 Checking block-buffer v0.10.4 Checking errno v0.3.14 Checking digest v0.10.7 Checking mio v1.2.3 Checking signal-hook-registry v1.4.8 Checking zerovec v0.11.8 Checking zmij v1.0.23 Checking socket2 v0.6.5 Checking serde v1.0.229 Checking bitflags v2.13.2 Checking serde_json v1.0.151 Checking tokio v1.53.1 Checking futures-channel v0.3.34 Checking percent-encoding v2.3.2 Checking lock_api v0.4.14 Checking tracing-core v0.1.36 Checking slab v0.4.12 Checking futures-io v0.3.34 Checking futures-task v0.3.34 Compiling zerocopy v0.8.58 Checking tinystr v0.8.4 Checking futures-util v0.3.34 Checking litemap v0.8.3 Checking writeable v0.6.4 Checking potential_utf v0.1.6 Checking zerotrie v0.2.5 Checking icu_locale_core v2.3.0 Checking utf8_iter v1.0.4 Checking icu_collections v2.3.0 Checking equivalent v1.0.2 Checking icu_properties_data v2.3.0 Checking icu_normalizer_data v2.3.0 Checking cpufeatures v0.2.17 Checking icu_provider v2.3.1 Checking form_urlencoded v1.2.2 Checking spin v0.9.9 Checking crossbeam-utils v0.8.23 Checking icu_properties v2.3.0 Checking icu_normalizer v2.3.0 Checking getrandom v0.4.3 Checking thiserror v2.0.21 Checking getrandom v0.2.17 Checking getrandom v0.3.4 Checking either v1.18.0 Checking http v1.5.0 Checking base64 v0.22.1 Checking idna_adapter v1.2.2 Checking idna v1.1.0 Checking hashbrown v0.17.1 Checking rand_core v0.9.5 Checking url v2.5.8 Checking indexmap v2.14.2 Checking allocator-api2 v0.2.21 Checking foldhash v0.2.0 Checking sha2 v0.10.9 Compiling tracing-attributes v0.1.31 Compiling zerocopy-derive v0.8.58 Checking hashbrown v0.16.1 Checking iana-time-zone v0.1.65 Checking chrono v0.4.45 Checking http-body v1.1.0 Compiling parking_lot_core v0.9.12 Checking tracing v0.1.44 Checking parking v2.2.1 Checking event-listener v5.4.2 Compiling parking_lot v0.12.5 Checking httparse v1.10.1 Compiling libsqlite3-sys v0.37.0 Checking linux-raw-sys v0.12.1 Checking tower-service v0.3.3 Compiling crc-catalog v2.5.0 Compiling crc v3.4.0 Checking rustix v1.1.5 Compiling hashlink v0.11.1 Compiling crossbeam-queue v0.3.14 Compiling futures-intrusive v0.5.0 Checking tokio-util v0.7.19 Checking uuid v1.26.1 Checking ryu v1.0.23 Checking cpufeatures v0.3.1 Checking try-lock v0.2.5 Checking tokio-stream v0.1.19 Checking want v0.3.1 Compiling flume v0.12.0 Compiling futures-executor v0.3.34 Compiling atoi v2.0.0 Checking rand_core v0.6.4 Checking sync_wrapper v1.0.2 Checking atomic-waker v1.1.2 Checking httpdate v1.0.3 Checking data-encoding v2.11.1 Checking tower-layer v0.3.3 Checking siphasher v1.0.3 Checking hyper v1.11.1 Compiling blake3 v1.8.7 Checking ipnet v2.12.2 Checking ppv-lite86 v0.2.21 Compiling phf_shared v0.11.3 Checking sqlx-core v0.9.0 Checking tower v0.5.3 Checking rand_chacha v0.9.0 Checking hyper-util v0.1.20 Checking rand v0.9.5 Checking http-body-util v0.1.5 Compiling num-conv v0.2.2 Checking constant_time_eq v0.4.2 Checking arrayvec v0.7.8 Checking base64ct v1.8.3 Compiling time-core v0.1.9 Compiling time-macros v0.2.32 Compiling phf_generator v0.11.3 Checking serde_urlencoded v0.7.1 Checking deranged v0.5.8 Checking fastrand v2.5.0 Checking powerfmt v0.2.0 Compiling crunchy v0.2.4 Compiling utoipa-gen v6.0.1 Compiling phf_macros v0.11.3 Checking sha1 v0.10.7 Checking serde_path_to_error v0.1.20 Checking mime v0.3.17 Checking tungstenite v0.29.0 Checking pem-rfc7468 v0.7.0 Checking phf v0.11.3 Checking winnow v0.7.15 Checking tinyvec v1.13.3 Checking minimal-lexical v0.2.1 Checking nom v7.1.3 Checking unicode-normalization v0.1.25 Checking time v0.3.55 Checking tokio-tungstenite v0.29.0 Checking der v0.7.10 Checking cron v0.17.0 Checking axum-core v0.5.6 Checking tempfile v3.27.0 Compiling axum-macros v0.5.1 Checking matchit v0.8.4 Compiling openssl-src v300.6.1+3.6.3 Checking spki v0.7.3 Compiling ident_case v1.0.1 Compiling strsim v0.11.1 Checking regex-syntax v0.8.11 Compiling darling_core v0.24.1 Compiling openssl-sys v0.9.117 Compiling sqlx-sqlite v0.9.0 Checking pkcs8 v0.10.2 Checking calternal-fs v0.1.0 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-fs) Compiling thiserror v1.0.69 Checking linkme v0.3.37 Compiling thiserror-impl v1.0.69 Checking axum v0.8.9 Compiling ring v0.17.14 Checking num-integer v0.1.47 Compiling sqlx-macros-core v0.9.0 Checking same-file v1.0.6 Checking walkdir v2.5.0 Checking calternal-notes-core v0.1.0 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-notes-core) Compiling darling_macro v0.24.1 Checking lazy_static v1.5.0 Compiling zstd-sys v2.1.0+zstd.1.5.7 Compiling sqlx-macros v0.9.0 Compiling darling v0.24.1 Compiling typeid v1.0.3 Checking utoipa v6.0.0 Checking inotify-sys v0.1.8 Checking arc-swap v1.9.2 Compiling synstructure v0.13.2 Checking hmac v0.12.1 Checking rustls-pki-types v1.15.1 Checking untrusted v0.9.0 Checking hashbrown v0.14.5 Checking sqlx v0.9.0 Checking inotify v0.11.5 Checking calternal-db v0.1.0 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-db) Checking rusticata-macros v4.1.0 Checking phf_shared v0.12.1 Compiling asn1-rs-derive v0.5.1 Checking ff v0.13.1 Checking signature v2.2.0 Compiling asn1-rs-impl v0.2.0 Checking notify-types v2.1.0 Compiling zstd-safe v7.3.0 Checking base64 v0.21.7 Compiling erased-serde v0.4.10 Compiling crossbeam-epoch v0.9.21 Compiling rustls v0.23.45 Compiling unicase v2.9.0 Checking base16ct v0.2.0 Checking byteorder v1.5.0 Checking fnv v1.0.7 Compiling mime_guess v2.0.5 Checking asn1-rs v0.6.2 Checking sec1 v0.7.3 Checking notify v8.2.0 Checking phf v0.12.1 Checking group v0.13.0 Checking hkdf v0.12.4 Checking calternal-api v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-api) Checking crypto-bigint v0.5.5 Checking ownedbytes v0.9.0 Compiling tiny-keccak v2.0.2 Checking foreign-types-shared v0.1.1 Compiling oid-registry v0.7.1 Compiling openssl v0.10.81 Checking calternal-plugin v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-plugin) Compiling pastey v0.1.1 Compiling semver v1.0.28 Compiling crossbeam-deque v0.8.8 Compiling prettyplease v0.3.0 Compiling rustc_version v0.4.1 Checking foreign-types v0.3.2 Checking tantivy-common v0.11.0 Checking bitpacking v0.9.3 Checking base64urlsafedata v0.5.5 Checking chrono-tz v0.10.4 Checking elliptic-curve v0.13.8 Checking num-bigint v0.4.8 Checking regex-automata v0.4.18 Checking rand_chacha v0.3.1 Checking event-listener-strategy v0.5.4 Compiling openssl-macros v0.1.1 Compiling hybrid-array v0.4.15 Compiling webauthn-attestation-ca v0.5.5 Compiling rayon-core v1.13.0 Checking rustls-webpki v0.103.15 Checking utf8-ranges v1.0.5 Checking der-parser v9.0.0 Checking tantivy-fst v0.5.0 Checking async-lock v3.4.2 Checking rand v0.8.8 Checking tantivy-bitpacker v0.10.0 Compiling curve25519-dalek v4.1.3 Checking dashmap v6.2.1 Checking webpki-roots v1.0.9 Checking rfc6979 v0.4.0 Checking half v2.7.1 Checking itertools v0.14.0 Checking smallstr v0.3.1 Checking unsafe-libyaml v0.2.11 Compiling num-bigint-dig v0.8.6 Checking murmurhash32 v0.3.1 Compiling webauthn-rs-core v0.5.5 Compiling typetag v0.2.23 Compiling crc32fast v1.5.2 Checking serde_yaml v0.9.34+deprecated Checking tantivy-stacker v0.7.0 Compiling bon-macros v3.10.1 Checking yrs v0.28.0 Compiling const-random-macro v0.1.16 Checking serde_cbor_2 v0.13.0 Checking tokio-rustls v0.26.5 Checking ecdsa v0.16.9 Checking x509-parser v0.16.0 Checking hyper-rustls v0.27.10 Checking calternal-plugin-notes v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/plugins/notes) Compiling block-buffer v0.12.1 Compiling crypto-common v0.2.2 Checking primeorder v0.13.6 Checking webauthn-rs-proto v0.5.5 Checking num-iter v0.1.46 Checking tower-http v0.6.11 Compiling curve25519-dalek-derive v0.1.1 Checking ordered-float v5.5.0 Compiling typetag-impl v0.2.23 Checking inventory v0.3.24 Checking hex v0.4.3 Checking fastdivide v0.4.2 Checking downcast-rs v2.0.2 Checking similar v3.2.0 Compiling const-oid v0.10.2 Checking tantivy-query-grammar v0.26.0 Compiling digest v0.11.3 Checking reqwest v0.12.28 Checking rayon v1.12.0 Checking const-random v0.1.18 Checking regex v1.13.1 Checking ed25519 v2.2.3 Compiling serde_with_macros v3.23.0 Checking pkcs1 v0.7.5 Compiling multiversion-macros v0.9.0 Compiling encoding_rs v0.8.41 Checking fs4 v0.13.1 Checking lru v0.16.4 Checking crossbeam-channel v0.5.17 Checking ordered-float v2.10.1 Checking rust-stemmers v1.2.0 Checking sketches-ddsketch v0.4.1 Checking tantivy-tokenizer-api v0.7.0 Checking memmap2 v0.9.11 Checking bon v3.10.1 Checking measure_time v0.9.0 Checking aho-corasick v1.1.5 Checking levenshtein_automata v0.2.1 Checking census v0.4.2 Checking htmlescape v0.3.1 Checking lz4_flex v0.13.1 Checking rustc-hash v2.1.3 Checking oneshot v0.1.13 Checking datasketches v0.2.0 Compiling sha2 v0.11.0 Checking multiversion v0.9.0 Checking serde_with v3.23.0 Checking serde-value v0.7.0 Checking rsa v0.9.10 Checking ed25519-dalek v2.2.0 Checking oauth2 v5.0.0 Checking dlv-list v0.5.2 Checking calternal-collab v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-collab) Checking p384 v0.13.1 Checking p256 v0.13.2 Checking password-hash v0.5.0 Checking itertools v0.10.5 Checking serde_plain v1.0.2 Checking blake2 v0.10.6 Checking simdutf8 v0.1.5 Checking core_detect v1.0.0 Checking dyn-clone v1.0.20 Checking winnow v1.0.4 Compiling multiversion_no_op v1.0.0 Checking argon2 v0.5.3 Compiling rust-embed-utils v8.12.0 Checking ordered-multimap v0.7.3 Compiling async-stream-impl v0.3.6 Checking openidconnect v4.0.1 Checking serde_spanned v1.1.1 Checking toml_datetime v1.1.1+spec-1.1.0 Checking toml_parser v1.1.3+spec-1.1.0 Checking wait-timeout v0.2.1 Checking bit-vec v0.8.0 Checking unicode-segmentation v1.13.3 Checking unicode-ident v1.0.26 Checking arraydeque v0.5.1 Checking toml_writer v1.1.2+spec-1.1.0 Checking quick-error v1.2.3 Checking ucd-trie v0.1.7 Compiling webauthn-authenticator-rs v0.5.5 Checking yaml-rust2 v0.11.1 Checking zstd v0.13.3 Checking toml v1.1.6+spec-1.1.0 Checking json5 v1.3.1 Checking convert_case v0.6.0 Checking tantivy-sstable v0.7.0 Checking rusty-fork v0.3.1 Checking ron v0.12.2 Checking bit-set v0.8.0 Checking async-stream v0.3.6 Checking rust-ini v0.21.3 Compiling rust-embed-impl v8.12.0 Checking matchers v0.2.0 Checking tantivy-columnar v0.7.0 Checking serde-untagged v0.1.9 Checking sharded-slab v0.1.7 Checking futures v0.3.34 Compiling num-derive v0.4.2 Checking rand_xorshift v0.4.0 Checking tracing-log v0.2.0 Checking serde_bytes v0.11.19 Checking thread_local v1.1.10 Checking unarray v0.1.4 Checking bitflags v1.3.2 Checking pathdiff v0.2.3 Compiling calternal-server v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-server) Checking nu-ansi-term v0.50.3 Checking rust-embed v8.12.0 Checking config v0.15.26 Checking proptest v1.11.0 Checking tantivy v0.26.2 Checking tracing-subscriber v0.3.23 Checking calternal-search v0.0.1 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-search) Checking webauthn-rs v0.5.5 Checking calternal-auth v0.1.0 (/home/kayg/Developer/calternal-wt/collab/crates/calternal-auth) Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 48s $ cargo test test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 29 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 35.07s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.66s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.10s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 8 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.14s test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s test result: ok. 28 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s test result: ok. 354 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.16s test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.93s test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.33s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s $ bun run check (apps/web) $ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/collab/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings $ bun run test (apps/web) $ vitest run RUN v5.0.1 /home/kayg/Developer/calternal-wt/collab/apps/web Test Files 3 passed (3) Tests 9 passed (9) Start at 14:38:49 Duration 34.08s (transform 90%, import 10%) Transform transforming modules took 60.46s · 90% of tracked time, re-done on every run persist transforms across runs with fsModuleCache: true learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns
Author
Owner

Continuation 2 started on branch job/collab from 2633867708. Merged main 8f3a380d27 as a clean merge. Next: final editor pin and Share-bound session authority.

Continuation 2 started on branch job/collab from 26338677080496892740f0b619d9d90d5c16bf1c. Merged main 8f3a380d2791aadc71dc5d8ecfc7cdbfb624d827 as a clean merge. Next: final editor pin and Share-bound session authority.
Author
Owner

Editor pin finding: synced 118ece3d93d1f6c14770777132b9cb7da8d8c65e (19 upstream vectors). Upstream's serializedMarkdown is the exact TS output; expectedCoreCanonicalMarkdown is intentionally separate. Regenerated calternal vectors using the pinned TS parser/serializer. Rust vector_bridge: 7 passed; cross_language Yjs bridge: 1 passed. Pin commit: 8b67d471bb. Added workspace TipTap overrides for extension-list and extension-code-block 3.27.1 after Bun resolved incompatible 3.31.3 peers.

Editor pin finding: synced 118ece3d93d1f6c14770777132b9cb7da8d8c65e (19 upstream vectors). Upstream's serializedMarkdown is the exact TS output; expectedCoreCanonicalMarkdown is intentionally separate. Regenerated calternal vectors using the pinned TS parser/serializer. Rust vector_bridge: 7 passed; cross_language Yjs bridge: 1 passed. Pin commit: 8b67d471bb4419cfbecfc3c81359f46fde0357b9. Added workspace TipTap overrides for extension-list and extension-code-block 3.27.1 after Bun resolved incompatible 3.31.3 peers.
Author
Owner

Share authority finding: Files grant_allows already verifies each Share's immutable item_id against the current indexed item and filesystem fingerprint. The live Note adapter now resolves the current Note path by immutable Note identity, then uses that Files check per WebSocket frame and every second while idle. Viewer frames with Yjs document updates are ignored. Real owner/editor/viewer WebSocket test passed: 1 test in 1.40s; it covers owner and editor co-edit, viewer write rejection, and editor revocation closing the socket within the one-second recheck window.

Share authority finding: Files grant_allows already verifies each Share's immutable item_id against the current indexed item and filesystem fingerprint. The live Note adapter now resolves the current Note path by immutable Note identity, then uses that Files check per WebSocket frame and every second while idle. Viewer frames with Yjs document updates are ignored. Real owner/editor/viewer WebSocket test passed: 1 test in 1.40s; it covers owner and editor co-edit, viewer write rejection, and editor revocation closing the socket within the one-second recheck window.
Author
Owner

Further finding: Files' Share check verifies the indexed fingerprint, and a Notes atomic save replaces the inode. Without an Index refresh, a valid editor Share becomes denied after the first live save. Added a narrow Files record_note_write hook after the Notes collaboration save; it preserves the existing immutable item ID while refreshing hash and fingerprint. The live test now uses real files_shares rows and real FilesState checks (not a mock), waits past the 750 ms save, verifies the editor remains connected, then revokes the Share. Focused test passed: 1 passed, 0 failed in 2.18s. Commit 638514b31a.

Further finding: Files' Share check verifies the indexed fingerprint, and a Notes atomic save replaces the inode. Without an Index refresh, a valid editor Share becomes denied after the first live save. Added a narrow Files record_note_write hook after the Notes collaboration save; it preserves the existing immutable item ID while refreshing hash and fingerprint. The live test now uses real files_shares rows and real FilesState checks (not a mock), waits past the 750 ms save, verifies the editor remains connected, then revokes the Share. Focused test passed: 1 passed, 0 failed in 2.18s. Commit 638514b31a1e3d11bca14d6b6f1ba2af397baad8.
Author
Owner

Security refinement: the post-save Files refresh now receives the Note inode fingerprint captured before the authorized write. It preserves the old item ID only when the prior Files Index row matched that fingerprint. A stale row gets a new item ID, so an old Share cannot attach to a replacement. Focused Files and live WebSocket tests passed. Commit 780ba21330.

Security refinement: the post-save Files refresh now receives the Note inode fingerprint captured before the authorized write. It preserves the old item ID only when the prior Files Index row matched that fingerprint. A stale row gets a new item ID, so an old Share cannot attach to a replacement. Focused Files and live WebSocket tests passed. Commit 780ba21330f5e954b733d25459278d603b3bd30c.
Author
Owner

Finished on branch job/collab at 780ba21330. No push, merge to main, or deploy.

Built: merged main; pinned editor 118ece3d93d1f6c14770777132b9cb7da8d8c65e; regenerated 20 calternal vectors with TS; all 19 upstream vectors and 20 calternal vectors pass Rust Markdown and Yjs cross-language directions. Live shared Notes now use Files' item-ID-bound Share check per frame and each idle second. Viewer receives Note state and awareness but cannot submit Yjs document updates. Files Index refresh after a live save preserves the item ID only when its pre-write fingerprint matched the indexed item. Real Share-backed WebSocket test covers owner/editor co-edit, viewer write rejection, editor access after the 750 ms save, and revocation within the one-second check window.

Small public cross-crate additions: Notes path_for_id exposes Note identity resolution; Files shared_note_access and record_note_write expose the existing Share and Index rules to the server adapter. These are needed to keep the server's collaboration route on the same Share authority as Files.

Gate output (verbatim excerpts):

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

cargo clippy --all-targets -- -D warnings:
Finished dev profile [unoptimized + debuginfo] target(s) in 8.46s

cargo test:
test yjs_updates_match_editor_vectors ... ok
test owner_editor_viewer_and_live_revoke ... ok
test markdown_vectors_pass_through_yrs ... ok
test tests::note_share_access_tracks_level_revoke_and_item_identity ... ok
test result: ok. 29 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.03s

apps/web bun run check:
svelte-check found 0 errors and 0 warnings

apps/web bun run test:
Test Files 3 passed (3)
Tests 9 passed (9)

packages/editor bun run typecheck:
svelte-check found 0 errors and 0 warnings

packages/editor bun run test:
Test Files 17 passed (17)
Tests 361 passed (361)

bash packages/api-client/check-generated.sh:
Running target/debug/calternal-server openapi
$ bunx --package openapi-typescript@7.13.0 openapi-typescript ../../contracts/openapi.json -o src/generated.ts
✨ openapi-typescript 7.13.0
🚀 ../../contracts/openapi.json → src/generated.ts [166.7ms]

cargo clean:
Removed 10616 files, 6.6GiB total

Known gap: Notes HTTP writes and retitles outside a live collaboration save do not yet refresh or move the Files Index item, so an existing Share can fail closed until the owner reissues it. This job did not change those separate Notes/Files route behaviors.

Design decision for owner confirmation: an authorized live Note save keeps the Share's item ID only when the pre-write inode fingerprint matched the Files Index. A stale item gets a new ID and its old Share remains inert.

Finished on branch job/collab at 780ba21330f5e954b733d25459278d603b3bd30c. No push, merge to main, or deploy. Built: merged main; pinned editor 118ece3d93d1f6c14770777132b9cb7da8d8c65e; regenerated 20 calternal vectors with TS; all 19 upstream vectors and 20 calternal vectors pass Rust Markdown and Yjs cross-language directions. Live shared Notes now use Files' item-ID-bound Share check per frame and each idle second. Viewer receives Note state and awareness but cannot submit Yjs document updates. Files Index refresh after a live save preserves the item ID only when its pre-write fingerprint matched the indexed item. Real Share-backed WebSocket test covers owner/editor co-edit, viewer write rejection, editor access after the 750 ms save, and revocation within the one-second check window. Small public cross-crate additions: Notes path_for_id exposes Note identity resolution; Files shared_note_access and record_note_write expose the existing Share and Index rules to the server adapter. These are needed to keep the server's collaboration route on the same Share authority as Files. Gate output (verbatim excerpts): cargo fmt --check: exit 0, no stdout. cargo clippy --all-targets -- -D warnings: Finished `dev` profile [unoptimized + debuginfo] target(s) in 8.46s cargo test: test yjs_updates_match_editor_vectors ... ok test owner_editor_viewer_and_live_revoke ... ok test markdown_vectors_pass_through_yrs ... ok test tests::note_share_access_tracks_level_revoke_and_item_identity ... ok test result: ok. 29 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.03s apps/web bun run check: svelte-check found 0 errors and 0 warnings apps/web bun run test: Test Files 3 passed (3) Tests 9 passed (9) packages/editor bun run typecheck: svelte-check found 0 errors and 0 warnings packages/editor bun run test: Test Files 17 passed (17) Tests 361 passed (361) bash packages/api-client/check-generated.sh: Running `target/debug/calternal-server openapi` $ bunx --package openapi-typescript@7.13.0 openapi-typescript ../../contracts/openapi.json -o src/generated.ts ✨ openapi-typescript 7.13.0 🚀 ../../contracts/openapi.json → src/generated.ts [166.7ms] cargo clean: Removed 10616 files, 6.6GiB total Known gap: Notes HTTP writes and retitles outside a live collaboration save do not yet refresh or move the Files Index item, so an existing Share can fail closed until the owner reissues it. This job did not change those separate Notes/Files route behaviors. Design decision for owner confirmation: an authorized live Note save keeps the Share's item ID only when the pre-write inode fingerprint matched the Files Index. A stale item gets a new ID and its old Share remains inert.
Author
Owner

The time-boxed adversarial probe also measured the 10,000 top-level block collaboration sync at 2,656 ms against its 2,000 ms budget (seed 25608414). This is a timing observation under a busy shared host; it may be load-related. I left Editor behavior and test budgets unchanged in this UI job and am recording the measurement with the live editing work.

The time-boxed adversarial probe also measured the 10,000 top-level block collaboration sync at 2,656 ms against its 2,000 ms budget (seed `25608414`). This is a timing observation under a busy shared host; it may be load-related. I left Editor behavior and test budgets unchanged in this UI job and am recording the measurement with the live editing work.
Author
Owner

Completed on dev in 95b01dcfcc (Merge job/collab: live note editing (Yrs, y-sync, Markdown converter on the editor vectors) (#16)).

Completed on dev in 95b01dcfccccd98c14df7c92127851e4be9e87f4 (Merge job/collab: live note editing (Yrs, y-sync, Markdown converter on the editor vectors) (#16)).
kayg closed this issue 2026-10-01 05:08:30 +00:00
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#16
No description provided.