Sharing slice 1, PR 3: UI (float toolbar, Shared with me, view-only), switch removed #842
Closed
kayg
wants to merge 74 commits from
feat/sharing-s1-pr3 into dev
pull from: feat/sharing-s1-pr3
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: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!842
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/sharing-s1-pr3"
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?
Sharing slice 1, PR 3: the approved sharing UI, restacked on dev and on #909, ported into the current layout. Turns cross-owner sharing on (no switch:
CROSS_OWNER_SHARING_ENABLEDis gone; owner rule, no feature flags).Stacks on #909 (
fix/sharing-fast-path-hardening). The old head wase38e9a520(Style-stack era); the earlier version is kept atarchive/feat/sharing-s1-pr3.What it does
PageToolbar, with the mockup's values on wide screens (DeskPills: 32 px, 72 px wide, 14 px inset). On a note shared with you, the owner's avatar takes Share's place (shared+ children;SharedBadgeis the sharedPill), with a lock when view-only, the tooltip "Shared by X · level", and a menu with "Remove me".notes.shared-with-meandnotes.hide-sharedadded;notes.historytakesowner_id, through the resolver;sharing.granted/sharing.revokedentries;First paint (kayg 11-09)
Everything that isn't needed to draw the first screen loads afterwards:
sharing-sync(list read, journal hook, controls, dot, Remove me, shared-row menu),share-open(the sheet and its host, warmed at idle once a Share button shows),SharedBadge,DeskPills,share-rescue(joins the editor viaappendConfigonly on an edit-shared note).first_js_brotliis 222.995 KB vs dev 221.802 KB, so +1.19 KB: the shared-note state and the view-only checks the first screen must draw.chunk.indexis set to 223.2, offset by the first-paint credits PR from the ports lane. The new lazy lines fit inside the 11-08 lazy ceiling.Decisions
extraslot.Risks
Gates, screenshots and perf follow in comments.
🤖 Generated with Claude Code
I reviewed the backend changes against
docs/plans/0409-sharing-slice-1.md. Three follow-ups remain:next_sequencepersistsshare_fanoutintents, but there is no worker draining them into recipient journals. The directsharing.grantedandsharing.revokedpushes cover access changes only. Owner note writes therefore do not reach recipient journal catch-up through the ordered fan-out path in the plan. Please wire an idempotent consumer ordered by note sequence and recipient, with the existing acknowledgement and retention behavior.The full-reset preparation and acknowledgement helpers are not exposed or called by journal sync or the web client. An Installation that needs a reset has no runtime path to apply a full authorized snapshot and acknowledge it. In addition,
prepare_full_resetselects active grants for deleted notes and then resolves each as readable; the resolver refuses deleted notes, so one such share can fail the reset preparation. Please connect the reset flow and handle deleted shares in the reset snapshot.App-password revocation can be missed during WebSocket catch-up after journal lag.
Engine::journal_forfiltersaccount.installation-revokedfrom app-password pages, butcatch_upadvances to the page token and does not run thesigns_outcheck over those entries. The socket keeps a cachedCaller, andEngine::executechecks its scopes without revalidating the credential. If revocation lands while the receiver is lagged, the socket can remain usable for scope-allowed actions. Please detect revocation during catch-up or revalidate the credential on each WebSocket message, with a lagged-revocation regression test.Rebased onto the Style stack. New head:
289b972c58c15233a47a61df5224688b3e473698(was0fb5e8ed).Base (decision). #842's own 15 commits now sit on
base-bm15= #852 head08b6d9ad+--no-ffmerge of #835 (3755691d, which carries #829). I did not edit #829/#835/#850-852. The PR base on Forgejo is unchanged (feat/sharing-s1-pr2-rooms), so its diff view also shows the Style stack until those merge.Conflicts and how they were resolved
bar/Tools.svelte: took the Style stack's bar (phone: Aa, +, Attach; desktop: Log/New, Insert, Aa, Info, Focus; Source mode stays in ⋯). Added only the access wiring: on a view-only note the writing tools (Insert on desktop; Write and Attach on phone) are disabled, not removed, so Aa keeps its fixed slot and the capsule keeps its width and its bar to sheet morph.lib/lazy-ui.svelte.ts: Style stack's resource list plusshareSheet. The build guard inlazy-ui-plugin.tsstill reads 24 and the build passes.App.svelte: merged without conflict.Design, UI wiring only
--glyph-bar(new token instyles/note-bars.css, 22 px phone / 20 px desktop, same values the bar already used); no hardcoded sizes.--glass-float-dense0.96 overrides. It is plain<Glass dense />now.BottomBar.svelte: a view-only note never switches to the text or block bars (focus or selection kept showing Bold, Undo, Delete).phone-bars.spec.ts: Chromium note over a photo reads a top-band delta of 4.181636 (was under 4.1) because the right pill now holds Share + ⋯ on a note. All 6 cases give exactly that value; the pre-UI base passes 40/40. Limit for that case set to 4.5 by the file's rule (max + 0.25, rounded up to 0.1).Access checks.
git diff origin/feat/sharing-s1-pr3 HEAD -- cratesis empty: server-side checks are byte-identical.Gates (dev-01 Chromium, dev-02 WebKit; each through
~/bm15-sharingworktree,~/bin/slot,CI=1 --workers=1 --retries=0)bun run check: 0 errors, 15 warnings.bun run testweb 95 passed, editor 519 passed.bunx playwright test e2e/note-bars.spec.ts e2e/note-pills.spec.ts e2e/bar-rest.spec.ts e2e/phone-bars.spec.ts e2e/style-sheet.spec.ts e2e/tooltips.spec.ts e2e/glass.spec.ts e2e/admin-sharing.spec.ts --project=chromium-1440 --project=chromium-390 --project=admin-chromium-1440 --project=admin-chromium-390: 299 passed, 0 failed, 282 skipped (final head).webkit-*andadmin-webkit-*: first run on the final head had 7 failures while a train held the VM (22 min):admin-setup(setup page after 5 s), fourstyle-sheetcases and twophone-barshome/journal cases at webkit-390. Reruns in isolation:style-sheet.spec.ts phone-bars.spec.tsonwebkit-390+webkit-1440248 passed 0 failed;admin-sharing.spec.ts zz captureonadmin-webkit-1440+admin-webkit-39011 passed 0 failed. I read these as load, not as a pass from a single clean run, so treat them as unconfirmed until a train run.codeunder~/Developer/Worktrees/mockup-capture/shots/bm15-sharing/{chromium,webkit}/. Not committed. Shared-note shots are always a Chromium guest (WebKit has no virtual passkeys).Update: head is now
e38e9a52003ed2ee3349846e156f509414bb7b67(was289b972c). The phone-bars limit change is reverted (the 4.5 commit is dropped from the branch; the limit is 4.1 again) and replaced by a fix to what the check measures.What the number measures.
phone-bars.spec.ts"top band" is the colour difference between the very top row (y=0) and the row at y=95, each taken as the median across the whole row. Its intent (from the file) is "a little way in, the screen is still close to its edge colour": it is a page-colour check. But y=95 crosses the top pills, so their pixels were in that median. A note's right pill went from one button (44 px) to Share + ⋯ (92 px), so the pills cover about 35% of the row instead of 23%, the median landed one colour level lower (44 → 43), and the delta went 3.71 → 4.18 against 4.1.Is the wider pill worse? No. Probe on the note over a photo, dark, 393/390/430 wide, base (#852 + backend) vs this branch, Chromium on dev-01:
[44,43,43], head[44,43,43], delta to the top row 3.7107 in all 16 cases on both.[38,38,38], head[39,38,37](within one level; same single<Glass />). Nothing new shows through it, so the glyphs read the same. WebKit and Chromium on dev-02 give 3.7107 for both with or without the exclusion.The fix, same intent, not a looser bar. The two top rows are now read between the top pills (
[data-chrome-pills] .pill, 2 px margin): the page colour next to the pills at that row, so pill width no longer moves it. The limit stays 4.1. On every case I measured, the new reading is at or below the old one (base 3.8073 → 3.7107, head 4.1816 → 3.7107), so the bar is the same or tighter. The bottom rows and every other limit are unchanged. Cases without a pill at that row (none excluded) read exactly as before.Numbers. Head under test: #876
9fec3d1f(contains this commit).CI=1 CALTERNAL_BIN=… bunx playwright test e2e/phone-bars.spec.ts --project=<p> --workers=1 --retries=0 --repeat-each=5, through~/bin/slot:chromium-390: 1200 passed, 0 failed (30.7 min, dev-01).webkit-390: 1200 passed, 0 failed (33.0 min, dev-02).(dev-01's
/tmpran out of inodes from another job's fixtures, so that run usedTMPDIR=$HOME/bm15-tmp, as BM14 did; my first two Chromium attempts failed for that reason and are not counted.)Blockers for turning cross-owner sharing on in this PR, from the sharing review on #829 (#829 (comment)). Each needs a fix and a perf check:
Also fix the two wrong comments in #909 (P3).
kayg referenced this pull request2026-11-05 23:21:11 +00:00
housekeeping #1009: needs-decision.
Cross-owner sharing enablement remains explicitly blocked by #829/#909: auth-DB scan per write, unbatched recipient checks, and incomplete grant enforcement across note entry points. Its old Style/chrome stack also needs reconciliation with current Float work. Leave feature flags unchanged for the maintainer decision.
original head:
e38e9a52003ed2ee3349846e156f509414bb7b67. against devcd7f84432febfc63b788fbb9b9f9950452982d74, git cherry reports 19 unmatched and 0 equivalent patches. the landing audit lists each candidate missing commit and stable patch match inpr-842.md; unmatched patches can include superseded behavior.left open, source branch unchanged. no rebase or new test claim for this decision lane.
Sharing slice 1, PR 3: UIto Sharing slice 1, PR 3: UI (float toolbar, Shared with me, view-only), switch removedScreenshots: app (Chromium, 2×) next to the approved mockup (review/calendar-2
?slice=1, 2×)App:
admin-sharing.specwithE2E_SHOTSandE2E_THEME, at6d4c3e67c(the sheet-order fix is in; the head110314b15only changes a spec assertion since). Mockup: captured from the preview host. Sample data only. The shell around the sharing pieces is dev's current layout (sidebar, cards), so compare the sharing pieces themselves.Checked by me against the mockup:
Share sheet (owner) · 1440 · light
Share sheet (owner) · 1440 · dark
Share sheet (owner) · 390 · light
Share sheet (owner) · 390 · dark
Shared with me · 1440 · light
Shared with me · 1440 · dark
Shared with me · 390 · light
Shared with me · 390 · dark
Shared note, view only · 1440 · light
Shared note, view only · 1440 · dark
Shared note, view only · 390 · light
Shared note, view only · 390 · dark
Shared note, can edit · 1440 · light
Shared note, can edit · 1440 · dark
Shared note, can edit · 390 · light
Shared note, can edit · 390 · dark
"Your edits to ‹title›" · 1440 · light
"Your edits to ‹title›" · 1440 · dark
"Your edits to ‹title›" · 390 · light
"Your edits to ‹title›" · 390 · dark
More app states (Chromium):
shared-history-1440-dark.png

shared-history-1440-light.png

shared-menu-1440-dark.png

shared-menu-1440-light.png

shared-menu-390-dark.png

shared-menu-390-light.png

shared-place-1440-dark.png

shared-place-1440-light.png

shared-view-bar-1440-dark.png

shared-view-bar-1440-light.png

shared-view-bar-390-dark.png

shared-view-bar-390-light.png

WebKit (Playwright WebKit paints no backdrop blur, so judge layout only):
share-sheet-1440-dark.png

share-sheet-1440-light.png

share-sheet-390-dark.png

share-sheet-390-light.png

shared-list-390-dark.png

shared-note-1440-light.png

shared-note-390-dark.png

shared-view-bar-390-light.png

Gates on
8e2e3a948(head; the last commits since the shots are spec-only)cargo fmt --all --check~/bin/slot, nixcargo clippy --workspace --all-targets --locked -j4 -- -D warningscargo test --locked -j4 -p calternal-core -p calternal-auth -p calternal-notes -p calternal-server -p calternal -p calternal-attachments --no-fail-fastnotes_crash::kill_nine_mid_append_on_a_long_note. Not reproduced 10× on the branch or 10× on dev → flaky rule; #1023 openedisolation::grants, 16 tests incl. the positive case)svelte-check661123e94had (InsertSheet, TaskCard; fixed on dev by #1024)bun run --cwd apps/web testicons.test(tasks icons, fixed by #1024)action-types.mjs --checkd0a50787d)admin-sharing.spec,CI=1 --workers=1 --retries=0admin-sharing.spec --repeat-each=5perf/web.sh --bundle-only)sharing-842); numbers followFixes found by the gates (all on the branch):
perf-VM ABAB ×5: #842 head
110314b15(contains #909) vs dev661123e94, with a byte-identical dev controlSetup:
sharing-842; perf-01 + perf-02 locks held together, measured on perf-01, 11-09 16:19–17:35 IST.calternal-perffrom dev for every variant:--sizes 10k,100k --runs 4 --cold-runs 0 --idle-secs 0 --seed 1.--runs 4keeps the turn under 90 minutes.f66e5c90…, head10b2d476…. Commits after110314b15change only specs.Reading.
open.notep50 −1.9%, and 100kstartup.healthzp95 +0.4% (one 28 ms outlier in the head range, median equal). This run contains #909's code, so #909 is clear.open.api_getp95 12.0 ms vs 7.6 (control 8.7). All five head sessions [11.1–14.3] sit above dev+control [7.3–10.4]. p50 is flat (+1.2%), and max is equal (~45 ms in all three).notes.get, which is a tail figure.notes.getpath. Its server diff vs #909 is only new action registrations (notes.shared-with-me,notes.hide-shared, the sharing plugin),notes.historywith an owner, and the reader's empty sync step in the room.sync.*,storm.*), search, open in the editor, the journal and startup.Re-measure (orchestrator's option b): 10k, dev / head / control, ABAB ×5, perf-turn
sharing-842b, 17:58–18:25 ISTSame binaries as before (dev = ctl
f66e5c90…, head10b2d476…),--sizes 10k --runs 4. The harness has no open-only switch, so every scenario ran at 10k.open.api_getp95 per session: dev [7.54, 8.84, 8.07, 11.06, 11.56], head [7.45, 11.06, 10.63, 7.74, 12.92], control [12.26, 7.74, 7.98, 8.13, 7.16]. The head range overlaps both dev and the control; dev itself reaches 11.6 and the control 12.3. That fits a 24-sample tail (p95 ≈ the second-slowest call) on a path this PR doesn't change. No row is outside the control.READY FOR MERGE: head
479df9153(merged with dev3f079de39, which has #909)Gates on the merged head:
-D warningsaction-types --check/ web unit / editor checkperf/web.sh --bundle-only --gate)admin-sharing.spec+admin.spec, Chromium 1440/390, WebKit 1440/390🤖 Generated with Claude Code
Cross-cutting + navigation specs vs dev
3f079de39(merge gate from train #1026)Specs:
preload lazy-ui lazy-offline glass shortcuts switching list-chrome list-fit sidebar-edge pane-transition note-pills note-bars tabs,CI=1 --workers=1 --retries=0, compared by test title. #842 at479df9153; the fix below is1f018f69a.preload:118×2 (palette Control/Meta) → fixed in1f018f69a, see belowpreload:118×2 → fixed in1f018f69apreload:118. The palette's modifier intent fetchedPaletteandpage-dim.page-dim(the dim behind a sheet) is now shared by the Palette and the Share sheet, so the bundler gives it its own 0.12 KB chunk. It's a dependency of the Palette, the same way the test already letsdatesride along; it isn't a second screen prepared early. The test now allows it, with the reason in the comment.preload.specrerun at1f018f69a: chromium-1440 9 passed; chromium-390 8 passed, 3 failed; webkit-1440 9 passed; webkit-390 8 passed, 3 failed. The 3 failures are dev's knownpreload:89phone Search reds, so there are no new failures.The other failures common to both branches are dev's known phone reds from #1026: glass:76, lazy-ui:70, lazy-offline:3 and preload:89 ×3.
Shots at the current head (
479df9153, Chromium 2×)Add people is above the people and the field has no fill. One observation for the glass owners: at 390 the bottom bar's icons read faintly through the sheet's glass. That's the shared glass's read-through; this PR doesn't change it.
share-sheet-1440-dark.png

share-sheet-1440-light.png

share-sheet-390-dark.png

share-sheet-390-light.png

shared-note-1440-dark.png

shared-note-1440-light.png

shared-view-bar-390-dark.png

shared-view-bar-390-light.png

preload:118fixed in the build, not the test: head1a05bbe1fbc596aa9a), sopreload.specis the same as on dev.page-dimjoins the smalldateschunk (apps/web/vite.config.ts), the same fix #1029 made for the phrase reader. A Control/Meta intent fetches the palette's own set again:Palette+dates. The Share sheet fetches that small chunk with its own.page-dimline is gone, anddates1.48 → 1.63. The total is unchanged (512.88 = sum of the lines).1a05bbe1f)perf/web.sh --bundle-only --gatedates1.578preload.specchromium-1440 / webkit-1440preload.specchromium-390 / webkit-390preload:89×3 failing, as on dev3f079de39(known #1026 phone reds);preload:118passesEverything else in #issuecomment-88850 stands. There are no new failures vs dev on the cross-cutting and navigation set.
Invite a friend: first test after deploy (kayg)
What to do, and what you should see at each step. It assumes #842 (sharing) is deployed. #1025 (invite defaults: 1 GB, group preselect, Groups hint) lands with the same train or the next; until then the invite starts at Unlimited and has no hint.
0. One-time setup (recommended). Settings → Admin → Groups → make a group, e.g. "Friends", and put yourself in it.
Why: a person sees only people who share a group with them (admins see everyone). You can always share to a friend. For the friend to find you in "Add people" (to share back), you both need a common group.
1. Invite. Settings → Admin → People → Invite someone.
2. Your friend redeems. They open the link on their phone or laptop.
3. Share a note. Open one of your notes and press Share in the top-right pill.
4. Your friend sees it.
5. Your friend edits, and you see it.
6. Ending a share (optional check). Remove them in the Share sheet.
If something looks off: take a screenshot, and note the time (IST) and which step. Every access check is on the server, so a wrong-looking UI never means the wrong person can read the note.
Merged into dev locally (head
1a05bbe1fis in origin/dev); closing.Pull request closed