port: pickers (approved mockup) #853
Closed
kayg
wants to merge 18 commits from
port/port-pickers into dev
pull from: port/port-pickers
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!853
Loading…
Reference in a new issue
No description provided.
Delete branch "port/port-pickers"
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?
Ports the approved mockup rounds 8a–8c (block registry behind
/and Insert, PR #491) and the[[/@/#pickers (T1–T3) into the product. One picker, one key model, one registry.Size: ~2,100 lines added / 730 removed (about half is tests and spec updates). It is one PR because replacing
NotePicker/TagPickerand the CodeMirror list is one interlocked change; core interaction ispackages/editor/src/transforms/picker.ts+insert/+InlinePicker/PickList.What changed
/menu: typing/at the start of a line or after a space opens the glass list under the caret, grouped (Basic, Lists, Links). Narrows as you type (label, other words, letters in order:blltfinds Bullet list). "and/or", "/usr/bin" andhttp://stay text. It never opens in code, links, the properties, the title or a table row./and the Insert sheet.InsertSheet's hardcoded list is gone; it reads the registry and redraws when a block registers late./,[[,@,#, replacing CodeMirrorautocompletion(which also drops@codemirror/autocompletefrom the editor). Rows arePickRows that know what choosing them does.NotePicker.svelteandTagPicker.svelteare deleted:FieldPicker.svelte(a search field over the samePickList) serves Move to…, Link to… and the "+" tag popover.pickKey): ↑ ↓ (round the ends), Enter, Tab (a tag with tags inside opens it), Esc. The same function drives the list under the caret and the search fields.[Name](<Name.md>));[[ ]]is never written (e2e asserts it). Missing/unmade/Create/Mentioned-in rows and the#tag rows with counts are as ADR 0040.Day linkaction:@limited to days (link-targets.days).Adding a block (for port-tables)
packages/editor/src/insert/registry.ts, exported from@calternal/editor:Call it once, from the table module's own load (it does not need this PR's code to be loaded first;
registerDefaultBlocks()only adds the built-ins and ids replace). It shows up in/and in the Insert sheet at once.markdownmay be a function (the time-log line). The block goes into the empty caret line, or on a new line after it. Optionalshortcut(hint chip),badge,pick: { kind, trigger }for picker-starting actions.onBlockActions(fn)is for UIs that list them.Gates (exact commands,
~/bin/slot, CI=1, --retries=0)packages/editor:bunx tsc --noEmitclean;bunx vitest run531 passed (newtest/picker.test.ts: registry, insert, triggers, keys, links never[[ ]]).apps/web:bunx svelte-check --threshold error0 errors; vitest 78 passed.e2e/slash-menu.spec.ts(new),tag-picker,link-suggest,lazy-ui,preload,glass-roots,text-size,phone-targets,sheet-geometry,missing-linkswithCALTERNAL_BIN=… bunx playwright test <specs> --workers=1 --retries=0: dev-01 Chromiumchromium-144078 passed / 27 skipped;chromium-390101 passed + 1 failure (link-suggest, hover lit a row under a resting pointer) fixed in the last commit and rerun at both widths (link-suggest + slash-menu ×2, 48 passed); dev-02 WebKitwebkit-144078 passed,webkit-390102 passed. (Server binary: the BM5-era debug build; no backend change.)Typing latency (keypress → paint, Chromium, dev-01)
apps/web/e2e/typing-latency.spec.ts(report only,LATENCY=1, no asserts): 215 keys of prose, 135 keys of look-alikes ("and/or", "issue #12", "a @ b"), and real triggers ([[Ab,#ta,@to,/he). Three interleaved runs, base (origin/dev) vs this branch. dev-01 was at load 21–27 from other jobs, so wall time is noise-bound (p50 140–200 ms both sides, no pattern); the steadier number is main-thread CPU per key (CDPThreadTime):* one outlier under load; the other two runs match base. No regression on plain prose (slightly lower: no autocompletion extension). Wall p50/p95 are in the run log. Real-trigger cost is dominated by the list render, not by the controller. Open: a quiet-machine run on the perf VMs is worth doing before a train.
Bundle (gzip,
vite build, base → branch)@codemirror/autocomplete)/.Screenshots
Product vs mockup pairs at 1440×900 and 390×844 on the control host:
~/Developer/Worktrees/shots/port-pickers/({product,mockup}-{slash,slash-li,note-picker,at-picker,tag-picker,insert-sheet}-{1440,390}.png).Decisions
[[ ]]in files; Tab takes a row like Enter (a tag with tags inside opens it); ↑ ↓ wrap.Not ported (and why)
![[, Link | Embed switch,›parts: the product has no embed block yet (they come with attachments/embeds). The registry'sEmbedsandMediagroups exist; nothing registers in them.chip-caret.ts): the drawn caret inside a link chip; the product's links are not chips yet (ADR 0040 look is already incm-links). Not part of the pickers.[[(blocks of notes, from the palette provider): the product's link ranking has no block provider.Risks
Update (head
2b3f5001): quiet-machine latency, final sweeps, phone#Latency on perf-01 (4 vCPU,
~/bin/perf-lockper run, release serverf087aa1f…for both sides,vite buildoforigin/devvs this branch relayed from dev-01 with sha256 check; Chromium, Home of 1,000 notes; per key: main-thread CPU (CDPThreadTime) and keydown→next frame p50/p95; every scenario at full speed (x1) and CPU slowed 4x (x4); 6 interleaved rounds, order alternating, medians [min–max]; harnessapps/web/perf/pickers-typing.perf.ts, summary files inshots/port-pickers/perf-ab-perf01.txt):Latency p50/p95 on those three: equal within noise (p50 48–57 ms both sides; p95 90–142 ms both; ±5%, ranges overlap). No regression on plain typing, in a long note, or on look-alikes. (The 2,000-line note at x4 has 11–14 s outliers in a few runs on BOTH builds (base 3/6 in the first session, 1–2/6 in the second); a pre-existing stall of the long note under 4x, not from this branch.)
While a list is open (the trigger typed through three times, Esc each time; CPU ms/key, x1 / x4):
[[: 12.3 → 12.8 (+4%) / 89.2 → 93.0 (+4%) ·#: 11.5 → 15.3 (+33%) / 95.6 → 95.1 (−0.5%) ·@: 13.8 → 15.9 (+15%) / 97.0 → 104.7 (+8%) ·/: 12.9 → 15.6 (+21%) / 95.2 → 100.2 (+5%; the base has no/menu to open, so this one is a new feature's cost, not a regression).p50 with a list open:
[[x4 58 vs 74 ms (better),#x4 74 vs 73,@x4 75 vs 65, p95 mixed (−39% … +22%) with wide ranges. Open item, honest: with a list open the branch spends about 2–4 ms more CPU per key at full speed than CodeMirror's own tooltip did (about +5% under 4x slowdown), while latency percentiles are within noise. I cut the per-key layout work inInlinePicker(no re-measuring while the trigger stays; first session before that cut showed +12–25% on the combined trigger scenario) and the second session above is after it. A sampled CPU profile (25 open/close cycles of@to) was too noisy on the loaded dev VM to name one function. If this is not acceptable for the train, the next step is keeping the list's shell mounted between opens.Sweeps on
2b3f5001(specs: slash-menu, tag-picker, link-suggest, lazy-ui, preload, glass-roots, glass, text-size, phone-targets, sheet-geometry, missing-links, editor, vim, links-parity, touch-select, block-no-text-sel;CI=1 --retries=0 --workers=1, through~/bin/slot): dev-01chromium-1440116 passed / 1 failed (missing-links:380, a 0.67 px layout tolerance on the card buttons; 5/5 on rerun),chromium-390139 passed / 1 failed (touch-select:163, timing; passed on rerun); dev-02webkit-1440113 passed,webkit-390137 passed. The first sweep on the previous commit had two other flakes (a trace-directory race caused by my own parallel job, and one WebKitglass-rootstimeout); both passed 18/18 and 60/60 on rerun. Unit: editor 531, web 78,tsc/svelte-checkclean.Phone
#at 390 (shots/port-pickers/):product-tag-picker-390.png(counts at the right, same rows as the mockup's) andproduct-tag-picker-low-390.png(a 390×520 window, caret on the last line: the list opens above the line and stays clear of the bar). In that synthetic window there is no real keyboard to scroll the last line above the bar, so that line sits under the bar; the list itself is placed correctly.Budget (kayg approved, 2026-11-08 08:20 IST): kayg approved raising the lazy budget total, up to 543.9 KiB.
perf/budgets.jsonin this PR sets each named lazy line to the largest size measured over the 17 approved ports after trimming (rounded up to 0.01 KiB) and the total to the sum of the lines (543.25 KiB). The same file is in the first PR of every stack, so whichever merges first carries it. First paint is judged separately and has not been raised.kayg referenced this pull request2026-11-05 23:21:11 +00:00
housekeeping #1009: rebased+failing, left open for review.
rebased shared field picker, retaining dev lazy code, CSS, toolbar, and picker chunk behavior. phone Attach now uses the shared editor blockById/insertBlockAction API.
head:
d4554835fa2ef0e26b5615e285eea35e7f44d753; based on devcd7f84432febfc63b788fbb9b9f9950452982d74, pushed with the original exact force-with-lease.frontend frozen install, check, lint, build and unit tests passed. bundle gate failed. first-paint brotli vs dev: JS 231679 B (+902 B), CSS 18386 B (+0 B).
targeted Chromium and WebKit specs at 1440 and 390 never started. the audit waited more than three hours behind the live daily-train-1107 locks (first queue at 23:45 IST, 7 November; final queue cleanup after 02:46 IST, 8 November). browser validation and UI captures are unrun. only this audit’s exact queued units were stopped; the train locks and owners were left intact. hot-path perf qualification is unrun.
all executed gates used the VM Nix environment, shared Mac lock and slot. exact commands, source heads, logs and dev baseline. frontend inputs are identical to the tested frontend tree when a Rust-only repair changed the head.
original-head cherry/patch inventory,
pr-853.md; unmatched entries are missing-patch candidates, with semantic overlap/replacements noted above.final queue, cleanup and source-verification evidence.
Final-port test pass (issue #1009), READY: no: specs pass; bundle gate fails; first paint is bigger than dev.
head
d4554835fa2ef0e26b5615e285eea35e7f44d753Targeted specs,
CI=1 --retries=0 --workers=1, dev-01 Chromium and dev-02 WebKit (through~/bin/slot), against a dev-head backend (cd7f84432).Bundle gate:
perf/web.sh --bundle-only --gate(the 17 failures from the housekeeping audit). Per the gate's own rule (total_js_brotlibudget must equal the sum of the named chunk budgets) a cap can only move between named chunks; there is no donor chunk inside this PR, so a fix is a code cut or a decision by kayg. I raised nothing and moved nothing.idle-screens52.71 vs 51.8. First paint JS +902 B vs dev (rule: <= dev). It touches typing (pickers): the perf ABAB x5 for typing is required and not done.Not done: Not run yet: Mac VM Safari blur/frame check and perf ABAB x5 on the perf VMs (they need a ready PR first); light/dark 2x screenshots against the mockup are only done for #888 (see its comment).
Not marked READY FOR MERGE.
Screenshots and state (issue #1009),
b5f66d2844READY FOR MERGE (issue #1009),
b5f66d2844perf/web.sh --bundle-only --gateFirst paint. Plain build vs dev (231155 B JS / 18371 B CSS): 229512 B: -1643 B. Hash-normalised vs dev (230622 B): 229440 B: -1182 B. CSS: 18371 B: +0. Dev itself fails five phone specs after #1014 on Chromium and WebKit at 390 (
glass:76,lazy-ui:70,preload:89x3); they fail the same way on this PR's head and are not caused by it.Perf (perf-02, Chromium 4x CPU slowdown, 10k Home, release dev server for every arm, rotated rounds, 5 rounds;
devA/devBare the same dev build, the control). Median of the 5 per-run medians [min-max], ms; taken on the previous dev (this PR's picker code changed only by the install fix since):Everything sits inside the dev-vs-dev control.
Found by the Safari shots and fixed: on a cold page load in real Safari the
/,[[,@,#list never opened in the first editor (the picker's install was remembered per editor, but a note's text replacing the preview rebuilds the editor's plugins, so a load finished after the rebuild marked the editor installed and the live picker never installed). It is keyed per compartment now, with a unit test that fails without the fix. Cold-load check in real Safari on fresh origins, no retry:/4 of 4,[[4 of 4,#4 of 4,@3 of 4 (then 8 of 8 on fresh origins; the one miss is not explained).Differences from the mockup: the product's Insert sheet has no Table, Note box or Media tiles (Table comes with #845; the others are later ports) and no title bar; the product's
[[/@list has no Link | Embed switch and no Blocks section; the product's tag list has its own (smaller) counts and sits under the caret where the mockup's sits right of it; the slash list has no Table or Note box rows.Screenshots (2x; light and dark; 1440x900 and 390x844). Left: the approved mockup (review/calendar-2). Right: this PR.
slash
insert-sheet
note-picker
at-picker
tag-picker
Real Safari (Mac VM, safaridriver, 1x: the VM reports devicePixelRatio 1)
slash
insert-sheet
note-picker
at-picker
tag-picker
Real Safari on the fixed head
b5f66d284(Mac VM, 1x). This supersedes the set above, which was taken before the fix: in it the pickers had to be retried because of a bug found by taking these shots (the picker lost its install when the editor was rebuilt while its code was loading; fixed, with a unit test that fails without the fix). Cold-load check on fresh origins, no retry: / 4 of 4, [[ 4 of 4, # 4 of 4, @ 3 of 4 (then 8 of 8 on fresh origins; the one miss is not explained).slash
insert-sheet
note-picker
at-picker
tag-picker
Restacked on dev
d4b32af94, heada24d87101: READY FOR MERGE.perf/web.sh --bundle-only --gateDev
d4b32af94itself fails 9 specs (palettepreload:118at 1440 and 390,glass:76,lazy-ui:70,preload:89x3 at 390), on Chromium and WebKit; the same ones fail on this head and none is new.The merge with the Tasks stack needed one change: #889's card handed the old
tagPickerloader to the Tasks card, and this PR replaces TagPicker with FieldPicker, so the Tasks card's tag picker is the shared FieldPicker now (fix(tasks): the Tasks card's tag picker is the shared FieldPicker). The perf and Safari results in the earlier comment still apply (the picker code is unchanged).Merged to dev (head
a24d87101). First paint −1400 B, specs and gate green, screenshots checked by the orchestrator. Ships with the next daily train.Pull request closed