feat: sharing slice 1 PR 1: scoped auth and admission #827
Closed
kayg
wants to merge 55 commits from
feat/sharing-s1-pr1 into dev
pull from: feat/sharing-s1-pr1
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:review/sharing-pr3-review
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!827
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/sharing-s1-pr1"
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?
PR 1 gates
notes.read,notes.writeandnotes.sharescopes; write does not imply sharecargo test --workspace --lockedcargo test --workspace --locked(every_registered_action_and_direct_route_has_a_capability_classification,route_inventory_check_detects_a_missing_route_entry)cargo test --workspace --locked; base comparison belowcargo test --workspace --locked(grant_admission_rechecks_person_visibility_and_share_scope)cargo test --workspace --locked(late_write_after_revoke_is_refused_while_reader_keeps_sequence_access,randomized_interleavings_keep_admitted_edits_inside_grant_intervals,admission_writer_progresses_while_a_reader_holds_a_wal_snapshot)cargo fmt --all -- --checkcargo clippy --workspace --all-targets -- -D warningscargo test --workspace --lockedAll Rust gates ran on dev-01 through Nix and
~/bin/slot. The schema-six legacy case also passed once on the requested base commitd0a2819a:cargo test -p calternal-auth --test host_cookies upgrading_schema_six_removes_cookie_state_and_keeps_passkeys -- --exact.Summary
Identity,Caller, action dispatch and sync. App-password Notes scopes remain separate from DAV scopes; app passwords remain refused on sign-in and account-management routes.note_seq, and commits the source journal row and one fan-out intent before the room or history path accepts the change.UnknownAction) in this PR. PR 2 adds complete shared-read and control enforcement before enabling them.Scope decision
Following the recommendation in
docs/grills/sharing.md, app passwords may carrynotes.shareonly as an explicit scope.notes.writedoes not imply it. If this recommendation changes, removingAppPasswordScope::NotesSharefromSUPPORTED_SCOPESwithdraws it in one line.Refs #409
Refs #823 (plan head
9bf4a9c5).Independent review, round 1
Verdict: approve. No P0–P3 findings.
Failure scenarios checked
Verification
All commands ran on dev-01 through Nix and ~/bin/slot.
Temporary unclassified route and action probes both failed as expected; the source was restored afterward. The v10 test builds the pre-PR schema from its migration DDL before opening it with this revision. The v6 fixture removes v11 tables before resetting its version; separate v7→v11 and v10→v11 checks still run.
Rebase and auth-regression status (2026-11-02)
Rebased onto current
origin/dev(55f35fcd), fixed the missingCaller.credentialinitializer incrates/search/tests/note_generation.rs, and pushed head322cb24582a7003e894a401a2a9615ef02e787ad. The all-target check passes.Offline sign-out passed 10/10 on WebKit-390 and 10/10 on Chromium-390 on both
devand this head. The old-session request returned 401 in every run, so #827 did not cause the reported 200 and no server-side change was needed. The combined #824+#827 retests also did not reproduce the four other browser failures; details and the search-corpus shared-data caveat are in the #834 status comment.bm7 diagnosis and source fix: pushed
91a19dcf0a.both tasks.set-status and tasks.set-status-many already exist at the train base; #833 did not introduce these registrations. this branch omitted them from its capability inventory. both are now explicitly SessionOnly, consistent with the other task actions and the sharing plan's Notes scope boundary. unknown task actions remain denied; no blanket allow or app-password scope widening.
added task_status_actions_remain_session_only. that regression and the shipping action/route inventory pass on the local eight-head merge
b05d4ccd10. no rebase of #833 was necessary. browser session errors were separately traced to #828's saved file stamps.the repeated requested chromium/webkit matrix passed 22/22 with zero retries. the full workspace gate remains red: an unchanged timed crash-test append-count assertion observed 96 instead of >100; a subsequent run skipping it reached #833's upcoming kept-row ordering assertion. neither is hidden or weakened. no train branch was changed.
kayg referenced this pull request2026-11-02 08:59:09 +00:00
Authorization argument before code changes
Fresh API edits will keep the local
notes.writescope guard before receipt lookup, then rely onadmitfor the single database authorization.admittakes the per-note writer lock shared with grant and revoke, and checks credential liveness, scope and current access in its immediate transaction before assigning a sequence or fan-out intent. A revoke that wins before admission leaves no sequence, room/history mutation or broadcast; an edit admitted first is ordered before the revoke sequence and stays within that grant interval.The stored-receipt and Yjs writer-clock replay exits bypass admission, so each will perform one current authorization check before returning the prior result. That check will use the same per-note writer lock as grant/revoke. A revoked credential or grant therefore fails; after re-grant, a still-authorized caller may replay the old receipt without creating a sequence or bypassing the re-grant baseline and server/device fences.
Owner writes still pass once through admission; the transaction checks a supplied credential and resolves owner access. Internal
caller=Nonework remains server-originated. I’ll keep coverage for fresh admission, both replay forms, replay across revoke/re-grant, owner writes, the shared lock, and refusal before room mutation when revoke wins before admission. Existinglate_write_after_revoke_is_refused_while_reader_keeps_sequence_accesscontinues to cover the real auth admission race and its sequence/fan-out outcome.Authorization argument and implementation plan (before code changes)
Fresh edits continue through one
admitcall. For shared notes, admission holds the per-note writer lock shared with grant and revoke, then checks the credential and current edit grant in the same immediate transaction that assigns the sequence and fan-out intent. There is no gap between that check and durable admission: if revoke wins before the transaction commits, admission fails before room/history mutation; if admission commits first, its sequence precedes the revoke sequence and the device/server fences govern delivery.Stored-receipt and writer-clock replays bypass admission, so each still performs one current
authorize_writecheck under that same lock before returning the prior result. Revoked credentials or grants fail; after re-grant, a currently authorized caller may receive the old receipt without creating a new sequence or bypassing the re-grant baseline and fences.The measured owner/unshared cost is the immediate transaction and
note_sharesexistence query on every append. I will add a bounded, positive cache of only “nonote_sharesrow exists.” A miss is populated only after the immediate transaction confirms absence while holding the writer lock. A cache hit is restricted to an owner-side session/development or internal owner write; the owner ID andnotes.writescope are checked under the lock. App-password writes still recheck credential liveness in the database, and all recipient writes, shared notes, and receipt replays keep their database checks. Grant and revoke remove the entry under the same lock before touching the database; revokednote_sharesrows remain, so a revoked or re-granted note cannot be cached as never shared. This relies on the single server/Auth service in ADR 0009, whose clones share the sameInner.Bound and failure behavior: at most 4,096 note keys, O(1) lookup/insert. A full cache or a cache miss falls back to the existing immediate transaction. Grant/revoke invalidation before a failed transaction only causes a safe cache miss. A row present at any time remains on the database path.
Tests and gates: keep fresh editor and owner writes, stored and clock-based replay, replay across revoke/re-grant, the per-note lock wait, and late-write-after-revoke/no-room-mutation coverage; add a cache transition test proving first-use fill, grant invalidation, and no recache after revoke/re-grant. Then run touched-crate Rust tests and
admin-sharing.spec.tson dev-01 Chromium, plus the same 200-append harness with at least ten interleaved runs on both perf VMs. The perf target is within 1% oforigin/dev, with auth-db lock counts recorded.Verification for current #827 head
0543321b34f9a739275f70e31c79c5575d680259The authorization rationale and test plan were posted before implementation in comment #75206. The current branch is still at this head; no PR was merged.
Gates
~/bin/slot nix develop -c bash -c 'cargo test -j4 --no-fail-fast -p calternal-auth -p calternal-notes'on dev-01. Auth library: 53 passed; notes: 513 passed, 6 ignored; all package integration suites passed. Relevant cases passed:owner_unshared_admission_is_cached_until_a_grant_and_never_after,late_write_after_revoke_is_refused_while_reader_keeps_sequence_access, andfresh_editor_write_uses_only_admission_and_receipt_replays_recheck_access.admin-sharing.spec.tson dev-01 Chromium, 3/3 at 1440px and 3/3 at 390px. The route/UI is supplied by #842, so this ran in a disposable integration tree combining #842 headbf616240bd91with current #827 head0543321b34f9(tree3b5a2d03eb85). The cache field/admission path/grant-revoke invalidation were carried into #842's existing fencedresolve_resource_intransaction; no #842 branch or PR was changed.200-append performance
20 alternating dev/#827 pairs per VM, 200 sequential acknowledged appends per run, fresh 1,000-line note and Home,
--dev-user, with exact-once content checks. Startup, create, verify and shutdown were outside the timed interval. Both binaries were built on dev-01 in the unoptimized profile, relayed through the control host, and passedsha256sum -con both perf VMs.Both medians are within 1% of dev. Each VM had 40 successful measured runs (20 per revision), with every content check passing. Three diagnostic traces per revision per VM counted
fcntlcalls toauth.db*: dev 63 each; current #827 69 each. The current count is down from the earlier reported 869 at the culprit head.fdatasyncandfsynccounts were unchanged in every trace: 262 and 10.Stack status
The current #827 head is not an ancestor of #829 head
d45584294273; #829 needs a rebase. #835 head19071be8455ddescends from that stale #829 head and should be refreshed after #829. #842 headbf616240bd91also does not include current #827 and needs a rebase if it remains stacked on #827. None of those branches were changed.BM9 clippy repair pushed:
76f11dc4b(parent0543321b). Collapsed the nested optional-caller/scope check incrates/notes/src/room/edit.rs:43into the same let-chain form used below it. Authorization order and behavior are unchanged.PASS on dev-01, Nix shell and
~/bin/slot:cargo clippy --workspace --all-targets --locked -j4 -- -D warnings(exit 0). Also passedgit diff --checkbefore commit. The #779 Nix tooling overlay was used only in the VM and was not committed. No train branch changed.kayg referenced this pull request2026-11-03 02:09:05 +00:00
Closing: head
76f11dc4is already in dev (reached viaaace16a1); nothing left to merge. Branch kept.Pull request closed