Sharing slice 1 follow-up: durable offline recovery and lifecycle controls #876
Closed
kayg
wants to merge 129 commits from
review/sharing-pr3-review into dev
pull from: review/sharing-pr3-review
merge into: kayg:dev
kayg:main
kayg:feat/contrast
kayg:feat/style-sheet-fixes
kayg:storage/wal-checkpoint-off-save-1051
kayg:t3/paged-search-reconcile-final
kayg:feat/pass8
kayg:review/calendar-2
kayg:fix/shared-row-swipes
kayg:dev
kayg:feat/collections-db
kayg:fix/instant-keys-1056
kayg:feat/money-round
kayg:perf/stalls-1054
kayg:wip/tiering-v3-cold4
kayg:wip/tiering-v3-cold5
kayg:port/rows-actions
kayg:port/rows-drop
kayg:port/hidden-blocks
kayg:port/rows
kayg:port/port-tables
kayg:port/port-tables-2
kayg:t3/mail-1011-liveness
kayg:port/devices
kayg:port/port-attachments
kayg:port/port-attachments-2
kayg:port/port-attachments-3
kayg:docs/design-consistency
kayg:docs/engineering-standards
kayg:fix/rusqlite-0.41-rustsec-2026-0459
kayg:feat/iphone-fixes
kayg:shared/restore-and-stale-918-919
kayg:fix/phone-top-band-contrast
kayg:feat/notes-approve
kayg:perf/soak-max-gate
kayg:feat/files-s1-identity
kayg:fix/lifecycle-event-id
kayg:feat/quickfix
kayg:wip/tiering-v3-cold
kayg:perf/web-mockup-frame-fixes
kayg:port/contacts-merge
kayg:port/contacts-edit
kayg:test/shared-room-no-deleted-text
kayg:perf/first-paint-credits
kayg:fix/shared-history-after-grant
kayg:fix/phone-swipe-regressions
kayg:feat/contrast-r1
kayg:feat/tiering-v3-s2-tags
kayg:feat/folder-drop
kayg:fix/deskpills-lazy-share
kayg:feat/sharing-s1-pr3
kayg:tmp/money-round-before
kayg:fix/phone-pane-backdrop-roots
kayg:fix/palette-preload-chips
kayg:fix/invite-defaults
kayg:port/tasks-matrix
kayg:fix/restore-green-gates
kayg:fix/sharing-fast-path-hardening
kayg:t3/photos-s1
kayg:feat/tiering-v3-s1-namespace
kayg:notes-archive-hide
kayg:feat/tasks-actions
kayg:t3/photos-plan-slice-one
kayg:feat/whiteboard-s1
kayg:t3/paged-search-reconcile
kayg:t3/smooth-pane-transitions
kayg:t3/index-position-startup-scan
kayg:fix/private-staging-759b-r2
kayg:feat/dav-transport
kayg:feat/imap-notes-fetch
kayg:feat/imap-notes-projection
kayg:feat/imap-notes-readonly
kayg:feat/imap-notes-auth
kayg:feat/imap-notes-server-foundation
kayg:docs/undo-block-ids-plan
kayg:fix/undo-768
kayg:proto/block-identity-v7d
kayg:issue/carddav-read-perf-fix-r2
kayg:issue/carddav-read-r2
kayg:docs/imap-766-plan-v2
kayg:docs/imap-notes-plan
kayg:docs/quota-plan-2
kayg:fix/parallel-test-flakes
kayg:feat/contacts-companion-pure
kayg:docs/calendar-backend-v2-plan
kayg:feat/calendar-ical-converter
kayg:docs/tasks-writes-v2-plan
kayg:docs/carddav-writes-v2-plan
kayg:docs/contacts-import-v2-plan
kayg:issue/610-pm-midnight
kayg:feat/calendar-v2-s1-containment
kayg:docs/dav-recorder-v2-plan
kayg:plan/previews-865
kayg:plan/save-log-durable-entry
kayg:fix/e2e-data-on-ram
kayg:feat/appwindow3
kayg:feat/appwindow2
kayg:feat/appwindow
kayg:feat/money-p1
kayg:feat/keys-sheet
kayg:review/calendar-2-themes
kayg:feat/smooth-cursor
kayg:fix/float-style
kayg:review/calendar-2-float
kayg:release/2026-11-06-hotfix
kayg:archive/port/rows-drop-code
kayg:archive/port/rows-actions
kayg:archive/port/rows
kayg:scratch/tasks-894-ui-gates
kayg:review/calendar-2-night-wip
kayg:release/2026-11-05
kayg:archive/feat/tiering-v3-s1-namespace
kayg:archive/flaky/rows-drop-fixed
kayg:archive/flaky/rows-actions
kayg:archive/feat/tiering-v3-reader
kayg:archive/feat/tiering-v3-roots
kayg:archive/flaky/rows
kayg:sim/bm15-final
kayg:sim/bm15-fix
kayg:sim/bm15-bis-932
kayg:sim/bm15-bis-909
kayg:sim/bm15
kayg:sim/bm15-bis-887
kayg:perf/tiering-option-b
kayg:port/style-3
kayg:port/style-2
kayg:port/style
kayg:fix/sw-lazy-precache
kayg:fix/vim-w-waits-for-save
kayg:fix/signout-test-races
kayg:fp-scratch/all
kayg:sim/bm15-first-paint
kayg:archive/bm15/rows-drop
kayg:archive/bm15/rows-actions
kayg:fix/palette-snippet-contrast
kayg:archive/bm15/rows
kayg:archive/bm15/hidden
kayg:archive/plan/save-log-durable-entry
kayg:mock/money-fix2
kayg:archive/fix/e2e-data-on-ram
kayg:mock/appearance-all
kayg:mock/pill-press
kayg:archive/docs/design-consistency
kayg:mock/auto-swipes
kayg:mock/mail-actions
kayg:archive/feat/mail-p1
kayg:mock/money-static
kayg:archive/review/standards-917
kayg:archive/docs/engineering-standards
kayg:perf/tiering-761-fix
kayg:mock/type-audit
kayg:mock/third-pane
kayg:feat/contacts-import-v2-s1
kayg:perf/executor-hot-path
kayg:archive/port/hidden-blocks
kayg:archive/port/devices
kayg:scratch/executor-on-894
kayg:scratch/executor-spans2
kayg:scratch/executor-spans
kayg:train/2026-11-03-bm14c
kayg:archive/port/rows-drop
kayg:feat/tiering-761-d-scale
kayg:feat/tiering-761-c-index
kayg:feat/tiering-761-b-reader
kayg:archive/review/sharing-pr3-review-9fec3d1f
kayg:train/2026-11-03-bm14b
kayg:perf/ports-lazy-budgets
kayg:feat/tiering-761-a-migration
kayg:train/2026-11-03-bm14
kayg:train/2026-11-03-bm12
kayg:archive/review/sharing-pr3-review
kayg:archive/feat/sharing-s1-pr3
kayg:train/2026-11-03-bm11
kayg:archive/feat/imap-notes-fetch
kayg:train/2026-11-03-bm10
kayg:archive/review/sharing-pr3-review-code
kayg:archive/plan/previews-865
kayg:train/2026-11-02-bm9
kayg:archive/port/port-attachments-3
kayg:archive/port/contacts-merge
kayg:fix/motion-audit-859
kayg:train/2026-11-02-bm8
kayg:archive/scratch/bm8-prep
kayg:archive/port/port-pickers
kayg:archive/port/port-tables-2
kayg:archive/port/port-tables
kayg:archive/feat/sharing-s1-pr3-code
kayg:archive/scratch/bm7-fixed
kayg:train/2026-11-02-bm7
kayg:archive/fix/parallel-test-flakes-code-minipc01
kayg:train/2026-11-02-bm6
kayg:docs/imap-766-readonly-slice
kayg:feat/dav-recorder-v3
kayg:research/788-diagnosis
kayg:archive/fix/parallel-test-flakes
kayg:archive/perf/pr792-cold-index-edit
kayg:docs/sharing-slice-1
kayg:archive/docs/imap-766-plan-v2
kayg:feat/dav-recorder-v2
kayg:archive/docs/dav-recorder-v2-plan
kayg:spike/imap-766-s0-cases
kayg:archive/fix/undo-768
kayg:feat/dav-recorder
kayg:archive/docs/contacts-import-v2-plan
kayg:archive/feat/calendar-ical-converter
kayg:feat/contacts-import
kayg:perf/cold-growth-on-764
kayg:perf/cold-growth-on-tiering
kayg:archive/docs/tasks-writes-v2-plan
kayg:archive/docs/calendar-backend-v2-plan
kayg:archive/feat/contacts-companion-pure
kayg:feat/tasks-set-status
kayg:feat/tasks-move-reorder
kayg:archive/docs/carddav-writes-v2-plan
kayg:archive/feat/calendar-v2-s1-containment
kayg:feat/tasks-delete-promote-duplicate
kayg:archive/feat/dav-transport
kayg:archive/fix/carddav-rebuild-r1
kayg:archive/fix/carddav-retention-r1
kayg:feat/carddav-writes
kayg:perf/quota-on-tiering
kayg:perf/quota-simple
kayg:perf/cold-growth-on-quota-stack
kayg:feat/calendar-identity
kayg:feat/calendar-event-parser
kayg:feat/calendar-props-maps
kayg:port/glass-when-ring
kayg:feat/tiering-761-s1
kayg:wip/10by32-01-impl-759b-scratch-20261030
kayg:wip/6by32-01-bm3-webkit-pause-20261030
kayg:wip/10by32-01-bm3-chromium-pause-20261030
kayg:wip/6by32-01-tier-761-s1-pause-20261030
kayg:spike/imap-766-s0
kayg:wip/6by32-02-calternal-pause-20261030
kayg:wip/8by64-01-review-688-pause-20261030
kayg:wip/6by32-01-verify-744-pause-20261030
kayg:wip/6by32-01-verify-742-pause-20261030
kayg:fix/private-staging-759b
kayg:wip/6by32-01-review-748-pause-20261030
kayg:wip/6by32-01-review-733c-pause-20261030
kayg:wip/6by32-01-review-733b-pause-20261030
kayg:wip/6by32-01-perf-idle-8-pause-20261030
kayg:wip/6by32-01-perf767-base-pause-20261030
kayg:wip/6by32-01-perf767b-767-pause-20261030
kayg:wip/6by32-01-perf767b-764-pause-20261030
kayg:wip/6by32-01-perf767-767-pause-20261030
kayg:wip/6by32-01-perf767-764-pause-20261030
kayg:wip/6by32-01-lists-b-pause-20261030
kayg:wip/6by32-01-ids-verify5-pause-20261030
kayg:wip/6by32-01-ids-verify4-pause-20261030
kayg:review/calendar-month
kayg:wip/10by32-02-undo-768-20261030
kayg:test/ids-verify3
kayg:wip/10by32-02-bm3-chromium-20261030
kayg:wip/10by32-01-review-753-20261030
kayg:wip/10by32-01-perf-idle-2-20261030
kayg:wip/10by32-01-bm2-webkit2-20261030
kayg:plan/759b-staging
kayg:train/2026-10-30-bm2
kayg:review/758b-tests
kayg:review/758-tests
kayg:review/764d-tests
kayg:review/767b-tests
kayg:review/preview-2026-10-29
kayg:review/767-tests
kayg:docs/tiering-731-plan
kayg:wip/c6b02-when2
kayg:wip/c6b02-tasks-create-fix5
kayg:wip/c6b02-settings-frost-mock
kayg:wip/c6b02-settings-frost-base
kayg:wip/c6b02-settings-frost
kayg:wip/c6b02-ring
kayg:wip/c6b02-review-733d
kayg:wip/c6b02-bm1-full-a
kayg:wip/compute02-when-field
kayg:wip/compute02-webkit-lists-repro
kayg:wip/compute02-train-bl2-dev
kayg:wip/compute02-dev-green-pw164
kayg:docs/deploy-plan
kayg:review/764c-tests
kayg:review/764b-tests
kayg:review/748g-tests
kayg:review/764-tests
kayg:review/759b-tests
kayg:fix/storage-owner-liveness-642
kayg:fix/storage-fix-7
kayg:wip/compute02-storage-fix-7
kayg:review/759-tests
kayg:feat/tiering-731
kayg:wip/tiering-731-first-attempt
kayg:wip/compute02-storage-fix-1
kayg:review/754g-tests
kayg:perf/idle-honest-2
kayg:review/754f-tests
kayg:review/754e-tests
kayg:review/755-tests
kayg:review/754d-tests
kayg:review/754c-tests
kayg:review/754b-tests
kayg:review/754-tests
kayg:fix/storage-private-tmp-642-dev
kayg:wip/compute02-verify-750
kayg:test/ids-verify5
kayg:test/ids-verify4
kayg:fix/storage-exact-file-quarantine-642
kayg:wip/compute02-verify-740
kayg:perf/one-flush-save
kayg:review/calendar-static
kayg:wip/compute02-verify-737
kayg:review/indexing-ring
kayg:review/when-field-2
kayg:wip/compute02-review-733
kayg:proto/block-identity-2-review
kayg:proto/block-identity-review
kayg:wip/c6b02-tc-design
kayg:review/when-field
kayg:issue/tasks-create-ids
kayg:issue/tasks-create
kayg:review/combined
kayg:wip/compute02-review-combined
kayg:review/task-polish
kayg:review/top-buttons
kayg:review/q1-q5
kayg:train/2026-10-26-bl2
kayg:archive/wt-398h
kayg:archive/train-bm-proptest-seed
kayg:archive/integ325-293
kayg:archive/integ325-ci
kayg:archive/client-auth-review-baseline
kayg:archive/wt-sim-4853
kayg:archive/wt-sim-4811
kayg:archive/wt-448m
kayg:archive/wt-398a-allocator
kayg:issue/calendar-adr
kayg:archive/old/train/2026-10-23bk2
kayg:archive/old/train/2026-10-23bk
kayg:issue/469-mockup-9a
kayg:issue/smart-tasks-mockup
kayg:issue/469-menus
kayg:issue/652-signout-flake
kayg:issue/652-history-fix7
kayg:issue/652-history-fix6
kayg:archive/old/issue/spring-check-perf
kayg:issue/spring-check-perf
kayg:issue/659-rename-fast
kayg:archive/old/train/2026-10-21ar
kayg:issue/search-hardening-3
kayg:issue/652-history-fix5
kayg:issue/660-port-sheets-glass
kayg:issue/652-history-fix4
kayg:issue/652-history-fix3
kayg:issue/652-history-fix2
kayg:issue/652-history-flake
kayg:train/2026-10-21an
kayg:issue/settings-admin-port
kayg:issue/search-port
kayg:train/2026-10-20am
kayg:issue/storage-split-fix2
kayg:issue/storage-split
kayg:archive/old/issue/folder-ids-fix
kayg:train/2026-10-20al
kayg:archive/old/issue/folder-ids
kayg:train/2026-10-20ak
kayg:issue/tables-mockup
kayg:train/2026-10-19aj
kayg:train/2026-10-19ai
kayg:issue/469-merge-fixes
kayg:issue/sidebar-band
kayg:archive/old/issue/608-settings-spec
kayg:train/2026-10-19ah
kayg:issue/swipe-offscreen
kayg:train/2026-10-19ag
kayg:archive/old/issue/590-nlp-adr
kayg:archive/old/issue/587-event-after-write-2
kayg:train/2026-10-19af
kayg:archive/old/issue/587-event-after-write
kayg:issue/469-pill-room-c
kayg:issue/469-pill-room
kayg:train/2026-10-19ae
kayg:issue/469-narrow-handle
kayg:issue/397-ios-swipe-2
kayg:archive/old/issue/adrs-photos-files-tasks
kayg:issue/469-desk-fixes
kayg:archive/old/issue/auto-update-adr
kayg:issue/469-filter-gap
kayg:issue/469-port-1b
kayg:issue/442-opacity-flake
kayg:archive/397-ios-swipe-2
kayg:issue/327-web-fast-3
kayg:archive/old/issue/469-port-1
kayg:issue/469-port-1
kayg:issue/327-web-fast-2
kayg:archive/old/issue/327-web-fast
kayg:archive/old/issue/425-stt-bench-vq1
kayg:archive/old/issue/445-no-bleed
kayg:archive/old/issue/400-swipe-mockup-2
kayg:issue/426-client-review
kayg:issue/426-client-2
kayg:issue/426-client
kayg:archive/old/issue/476-safe-area-lab
kayg:archive/445-top-light-2
kayg:archive/old/issue/445-top-light
kayg:issue/471-blocks-mockup
kayg:archive/old/issue/448-links-app-2
kayg:archive/old/issue/448-links-app
kayg:archive/old/issue/398-cold-links
kayg:issue/434-442-small-2
kayg:issue/434-442-small
kayg:archive/old/issue/398-unload
kayg:archive/old/issue/445-bottom-band
kayg:issue/445-bottom-band
kayg:issue/351-rem-3
kayg:archive/312-views-mockup
kayg:issue/351-rem-2
kayg:issue/351-rem
kayg:archive/old/issue/327-first-note
kayg:issue/395-width-phone
kayg:archive/old/issue/327-typing
kayg:issue/396-ios-edges
kayg:issue/397-ios-swipe
kayg:archive/398-allocator
kayg:archive/old/issue/327-notes-index
kayg:issue/345-347-contrast-empty-2
kayg:archive/old/issue/44-arenas
kayg:issue/44-arenas
kayg:archive/integ325
kayg:archive/old/issue/327-perf-harness
kayg:archive/old/issue/44-thp
kayg:issue/44-thp
kayg:archive/old/issue/285-sticky-pills
kayg:archive/old/issue/44-trim-3
kayg:issue/44-trim-3
kayg:archive/old/issue/165-cards
kayg:archive/old/issue/165-picker-2
kayg:archive/old/issue/212-multi-select
No reviewers
Labels
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
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!876
Loading…
Reference in a new issue
No description provided.
Delete branch "review/sharing-pr3-review"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Restack 11-09 (onto #842
8e2e3a948, which is on #909)The old head
9fec3d1f8is kept atarchive/review/sharing-pr3-review-9fec3d1f. All 89 commits were replayed withcherry-pick -x. Where they met changes since:cleanup_sharingno longer runs inside requests; it moved to a throttled background sweep. #876's runtime full-reset drops its reset-required early returns, and requests mark only their own dormant Installation.wake_fanoutis kept next to the sweep scheduling.share-controlsandsharing-syncchunks;@calternal/editor/shared-copyentry andoffline/closed-copy.ts;diff-match-patch, imported on demand.peek). Approved by kayg 11-09, offset by the credits PR. Lines are set inperf/budgets.json.Gates and perf follow in comments.
Data-safety follow-up plan
share_fanoutintents in a background worker, in ordered batches of at most 64 recipient journal appends. The source transaction only signals the worker after commit; startup and periodic sweeps recover missed signals. A stable(owner, note, note_seq, recipient)key plus a durable delivery record makes retries safe across a crash between journal append and source acknowledgement.unauthorized, close the socket, and let the client sign out and stop syncing.Sizes and complexity
Fan-out adds O(1) work to a source commit (notification only). The worker handles at most 64 recipient journal entries per batch; selection and delivery state are indexed by source sequence and recipient. Full reset work is O(S) for S currently authorized shared notes and is acknowledged only after the client durably applies controls and snapshots. WebSocket revalidation is O(1) indexed credential/Installation lookup per page or message.
Failure table
record_oncewith the source sequence key prevents a duplicate journal entryunauthorized, close, and stop client syncingGates
Rust regressions cover fan-out ordering/retry, full-reset invocation/deleted-note handling, and revoked WebSocket callers. The added Playwright case runs
admin-sharing.spec.tswithCI=1 --retries=0 --workers=1on dev-01 Chromium and dev-02 WebKit. The 200-append perf harness on both perf VMs must keep owner-only appends within 1% of the matching dev baseline.Stacks on #842 via
feat/sharing-s1-pr3.Changes
Your edits to ‹title›note. The recovery reads both open editor state and a closed copy's IndexedDB/WAL state.Verification
cargo test --locked -j4 -p calternal-auth -p calternal-core -p calternal-engine -p calternal-notes -p calternal-server -p calternal-attachments -p calternal-search -p calternal -p calternal-daily -p calternal-tasks -p calternal-contacts-actions— 1117 passed, 0 failed, 20 ignored.cd apps/web && bun run check— 0 errors, 14 warnings.cd apps/web && bun run test— 84 passed.cd packages/editor && bun run test— 519 passed.admin-sharing.spec.ts,CI=1,--retries=0,--workers=1: Chromium dev-01 — 7 passed; WebKit dev-02 — 7 passed.Second-round data-safety findings and gates
Verified on head
1b31fa0aa84e279bfd2be77ebb0f16f3f8a4675c.committed_fanout_reaches_the_recipient_journal,fanout_record_once_recovers_after_publication_before_receipt, andfanout_delivery_order_uses_note_sequence_not_wall_clockwere run red before their fixes and pass now. The offline catch-up browser case was red before the fix and passes on Chromium and WebKit.regrant_full_snapshot_is_available_through_the_sharing_action,deleted_shared_notes_are_skipped_by_a_full_reset_and_return_after_restore, andfull_reset_blocks_shared_writes_until_snapshot_acknowledgementpass. The deleted-note and re-grant regressions were run red first.live_revalidation_observes_app_password_revocationandrevoked_app_password_is_closed_before_catch_up_replays_entrieswere run red first and pass now.Final gates
~/bin/slot nix develop -c bash -c 'cargo test --locked -j4 -p calternal-auth'— 71 library unit tests and the package integration suites passed; expected perf-only tests were ignored.~/bin/slot nix develop -c bash -c 'cargo test --locked -j4 -p calternal-server --test signout'— 2 passed.~/bin/slot nix develop -c bash -c 'CI=1 CALTERNAL_BIN=/home/claude/Developer/Worktrees/sharing-pr3-review/target/debug/calternal bunx playwright test e2e/admin-sharing.spec.ts --project=admin-chromium-1440 --workers=1 --retries=0 --grep=catches'— setup plus the offline catch-up case passed.~/bin/slot nix develop -c bash -c 'CI=1 CALTERNAL_BIN=/home/cua/Developer/Worktrees/sharing-pr3-review/target/debug/calternal bunx playwright test e2e/admin-sharing.spec.ts --project=admin-webkit-1440 --workers=1 --retries=0 --grep=catches'— setup plus the offline catch-up case passed.200-append performance
Both unoptimized binaries were built on dev-01 from
dev55f35fcde3bc91ca3781055577b93e93819f6cd4and this PR head, relayed through the control host, and SHA-256 verified on both perf VMs. Each VM ran 20 alternating pairs (40 runs), with a fresh Home and 1,000-line note per run. Startup, creation, verification, and shutdown were outside the timed interval; all 200 append markers appeared exactly once in every run.Build command on dev-01 in each worktree:
~/bin/slot /nix/var/nix/profiles/default/bin/nix develop -c bash -c 'cargo build --locked -j4 -p calternal --bin calternal'.Measurement command on each perf VM:
~/bin/perf-lock python3 /tmp/sharing-pr3-append-bench.py --dev /home/claude/sharing-pr3-perf-final/dev --candidate /home/claude/sharing-pr3-perf-final/candidate --pairs 20 --root /tmp/sharing-pr3-perf-final-r10 --json-out /home/claude/sharing-pr3-perf-final-r10.json.Both medians are within the 1% gate. Binary SHA-256: dev
e1fb7c00f4fe39c244aec6a5fcf68ad025ae7e871157ed2ab9c7387055adc3a9; candidate14a9614c4c79b0b984fe07e280fc96ad01b5d77b6373242bee1ccabc52ad602a.Final sharing follow-up and stack rebase
Verified at #876 head
9a98a7f18fcb0d24baa6b9143b4d7a98d527e50b. The stack is based on the live #827 head76f11dc4ba06468a2a0ed4d4592cea6038206696; requested commit0543321bis an ancestor. The single-authorization-under-the-lock behavior remains intact.5cab44a4afdc932ce0afca65b61cb13137afe94676f11dc4ba06468a2a0ed4d4592cea60382066963755691ddc63a740d36a4782f2163a3876f58cfc5cab44a4afdc932ce0afca65b61cb13137afe9460fb5e8ed3c161b70443b63c1649484fda758e5a63755691ddc63a740d36a4782f2163a3876f58cfc9a98a7f18fcb0d24baa6b9143b4d7a98d527e50b0fb5e8ed3c161b70443b63c1649484fda758e5a6Findings
committed_fanout_reaches_the_recipient_journal,fanout_record_once_recovers_after_publication_before_receipt, andfanout_delivery_order_uses_note_sequence_not_wall_clock. The offline catch-up Playwright case also passed on Chromium and WebKit.regrant_full_snapshot_is_available_through_the_sharing_action,deleted_shared_notes_are_skipped_by_a_full_reset_and_return_after_restore, andfull_reset_blocks_shared_writes_until_snapshot_acknowledgement.live_revalidation_observes_app_password_revocationandrevoked_app_password_is_closed_before_catch_up_replays_entries.The owner room-delivery regression was also run red first:
owner_room_delivery_does_not_repeat_auth_db_lookupobserved 2 DB runs instead of 1. It now passes. Session/development owner deliveries checknotes.readwithout opening a second auth DB round trip; app-password delivery keeps live DB credential validation.Gates
cargo fmt --all -- --check.cargo test --locked -j4 -p calternal-auth owner_unshared_admission_is_cached_until_a_grant_and_never_afterandcargo test --locked -j4 -p calternal-auth owner_room_delivery_does_not_repeat_auth_db_lookup.cargo test --locked -j4 --no-fail-fast -p calternal-auth -p calternal-notes— 73 auth unit tests passed; package integration suites passed; Notes: 514 passed, 6 ignored.cargo test --locked -j4 -p calternal-server --test signout— 2 passed.CI=1 CALTERNAL_BIN=/home/claude/Developer/Worktrees/sharing-pr3-review/target/debug/calternal bunx playwright test e2e/admin-sharing.spec.ts --project=admin-chromium-1440 --workers=1 --retries=0 --grep=catches— setup plus catch-up case, 2/2.CI=1 CALTERNAL_BIN=/home/cua/Developer/Worktrees/sharing-pr3-review/target/debug/calternal bunx playwright test e2e/admin-sharing.spec.ts --project=admin-webkit-1440 --workers=1 --retries=0 --grep=catches— setup plus catch-up case, 2/2.200-append performance
The same unoptimized dev/candidate binaries were built on dev-01 from dev
55f35fcde3bc91ca3781055577b93e93819f6cd4and candidate9a98a7f18fcb0d24baa6b9143b4d7a98d527e50b, relayed through the control host, and SHA-256 verified on both perf VMs. Each VM ran 20 alternating pairs (40 runs), with a fresh Home and 1,000-line note per run; each run made 200 sequential acknowledged appends. Startup, creation, content verification and shutdown were outside the timed interval. All 200 markers appeared exactly once in every run.Both medians are within 1%. Binary SHA-256: dev
e1fb7c00f4fe39c244aec6a5fcf68ad025ae7e871157ed2ab9c7387055adc3a9; candidate7fb32a699060940dfaf49e03ae0f0e211d5323ae799ad907596ea71d8b01e4a5.The sharing gates and stack rebase are complete. No PR was merged.
Rebased onto the new #842 head
289b972c58c15233a47a61df5224688b3e473698(see the resolution notes on #842). New head:bd7fcc6a3a861601dfa9cf896a2cc863f496d57b(was9a98a7f1).All 89 commits replayed with no conflicts.
git diff origin/review/sharing-pr3-review HEAD -- cratesis empty: server-side access checks, durable recovery and lifecycle code are unchanged; only the web side moves with #842's Style-stack wiring.Gates ran on this head: same commands and results as on #842 (Chromium 299 passed 0 failed; WebKit reruns in isolation 248 and 11 passed, 0 failed, after load failures in the first combined run; see #842). The sharing specs (
admin-sharing.spec.ts, 4 tests) pass onadmin-chromium-1440/390andadmin-webkit-1440/390, including the follow-ups' offline-recovery tests. Not run: the full suite and Rust tests (train gates).Restacked on #842
e38e9a52003ed2ee3349846e156f509414bb7b67: new head9fec3d1f82bcd1414c06f88a9aca196cb1cb7743(wasbd7fcc6a). Only the base moved (the phone-bars limit change was reverted and the check fixed, see #842).crates/is identical to before.phone-barsran on this head: chromium-390 and webkit-390,--repeat-each=5, 1200 passed each, 0 failed.kayg referenced this pull request2026-11-05 23:21:11 +00:00
housekeeping #1009: needs-decision.
Depends on the blocked sharing UI #842. Offline rescue/lifecycle work remains valuable but must be restacked together with the sharing/access-check decision; do not enable cross-owner sharing through a housekeeping rebase.
original head:
9fec3d1f82bcd1414c06f88a9aca196cb1cb7743. against devcd7f84432febfc63b788fbb9b9f9950452982d74, git cherry reports 108 unmatched and 0 equivalent patches. the landing audit lists each candidate missing commit and stable patch match inpr-876.md; unmatched patches can include superseded behavior.left open, source branch unchanged. no rebase or new test claim for this decision lane.
Gates on the restack, head
db6a92981cargo clippy --workspace --all-targets --locked -j4 -- -D warningsallow(too_many_arguments)on the journal push helper, documented)cargo test … -p calternal-core -p calternal-auth -p calternal-notes -p calternal-server -p calternal -p calternal-attachments -p calternal-daily --no-fail-fastUPDATE_CONTRACTS=1 … contractaddad3abe): schemars now writes the nullable reset input astype: [object, null]bun run --cwd packages/editor testbun run --cwd packages/editor checkpicker-list.tserrors (fixed on dev by #1024)svelte-checkbun run --cwd apps/web testadmin-sharing.spec --repeat-each=2(incl. "offline edits are rescued before revocation…", "delete and restore reach recipients")--repeat-each=3)perf/web.sh --bundle-onlyperf/budgets.jsonsharing-876); binary6f190ea7…is stagedSpec fix on the restack: the phone list is virtualized, so the own-note row is checked on wide screens; phones check the same copy by its address. The "Add people" fill already searched by full name on this branch.
perf-VM ABAB ×5: #876 (restack head
db6a92981, which contains #842 and #909) vs dev661123e94, with a byte-identical dev controlSetup:
sharing-876; perf-01 + perf-02 held together, measured on perf-01, 11-09 18:54–20:13 IST.calternal-perffrom dev for every variant:--sizes 10k,100k --runs 4 --cold-runs 0 --idle-secs 0 --seed 1, 5 rotating sessions.f66e5c90…, head6f190ea7…. Later commits are merges with dev (#842, #1033), spec, format and budget changes; the server code on the write path is the same.Reading: flat everywhere, with no row outside the control. This PR changes the write path: per-Installation control gates on writes, and durable fan-out intents drained after commit. Saves (
sync.save_ack,sync.durable_write), typing (storm.*), the room round trip and the journal are equal or better than dev, and the control moves the same way.READY FOR MERGE: head
6e28e5947(merged with devd0bf2838c, which has #842 and #1036; the tree is the same as the gated5f68c1b78)cargo fmt --check/ clippy-D warnings/ Rust tests (core, auth, notes, server, calternal, attachments, daily)action-types --checkd0bf2838c222.960 (+0.69 KB; kayg approved up to +0.91 on 11-09, offset by the credits PR). idle-screens 56.44lazy-offline.specchromium-1440 ×3--repeat-each=10on the branch and on dev (11/11 each) → flaky rule, #1037 opened🤖 Generated with Claude Code
Merged into dev locally (head
6e28e5947is in origin/dev); closing.Pull request closed