port: rows, bulk Tag + the list of missing server actions 2/3 #877
Open
kayg
wants to merge 15 commits from
port/rows-actions into port/rows
pull from: port/rows-actions
merge into: kayg:port/rows
kayg:main
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:feat/contrast
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-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!877
Loading…
Reference in a new issue
No description provided.
Delete branch "port/rows-actions"
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?
Slice 2 of 3, stacked on #875 (base
port/rows). It also merges #887 (notes-archive-hide, server side of hide/archive) so it can be built and tested; once #887 is on dev, retarget and the merge commit drops out.Ships (kayg 11-03 decisions)
notes.archive|unarchive|hide|unhide: row menu, swipe (Delete, Hide, Archive on the right; Unarchive leads in the Archived place), and the selection bar. One toast says what happened, per note ("Archived 99 · 1 couldn't be changed"; 100 ids a request, longer selections are several requests and one Undo throughnotes.undo).visibilityinnotes.saved(#887) from other devices.tags:, one Undo). The earlier separate Tag action is merged into it.Still not here: bulk Share (no server action), Insert link here (needs an editor-side insert into the open note).
Found while testing #887 (for its author): the server skips Archive/Hide for a note whose frontmatter has a flow-style list
tags: [a, b]("its properties use formatting Calternal can't edit safely"); block-styletags:\n - aworks. The web's own tag writer (fm-tags.ts, and bulk Move) writes the flow style for a new field, so a note tagged from the app cannot then be archived or hidden. Probe: seed---\ntags: [errands]\n---thennotes.archivereturnsskipped. The toast shows the reason; I did not change the writer here.Gates (head
da8c7bb0for this slice; slice 3 headecc8838bcontains it): web vitest 110 passed; svelte-check: the only errors are 2 ine2e/review4-signout.spec.ts(from dev, not this stack); Chromium 1440+390 (press, bulk-tag, visibility, sidebar-drop, select-rows, plus the earlier full set 131 passed / 65 skipped / 0 failed); WebKit 1440+390 on dev-02 (press, bulk-tag, visibility, sidebar-drop, tags, swipe-rows, select-rows, touch-select) 102 passed / 44 skipped / 0 failed. New specs:visibility.spec.ts,bulk-tag.spec.ts(now Move).Shots, product vs mockup: bulk bar after Select (phone and wide), the Move picker (mockup calls it Tag; kayg's 11-03 decision: Move is tags, one picker that adds and removes, a check means every picked note has the tag), archive/hide toast and the Archived place, Show hidden (faded rows, product only: the mockup has it behind its own list menu).
Fix for "can't archive or hide a note whose other keys use flow style" (head
59f7f0ebonnotes-archive-hide)Cause: the strict planner judged every line of the metadata, so
tags: [a, b](what the app writes) refused the whole note.Change:
strict_frontmatter/scoped.rs): the requested keys' own lines go through the same strict grammar and planner. Every other line is never read or changed. The metadata must still load as one YAML map, and after the edit the map must equal the old one with exactly the requested change.current_key), plans (plan_keys) and the executor's metadata check (ScopedMetadata { keys }) use it. The whole-fileplanstays for Tasks.yes,True, quoted, list or map values still refuse that note.Tests (byte-exact, with undo): archive, unarchive, hide, unhide on
tags: [a, b],aliases: [x], flow+block mix, comments between keys, unindented lists, quoted values, multi-line flow, nested map, LF and CRLF; the oldhidden:block list moving next to flow lists; end to end: tag a note through a room client (tags: [a, b]), then archive, unarchive, hide, unhide.Gates on dev-01 (
~/bin/slot,-j4, after train BM14d finished):cargo fmt --all --check: clean (afterstyle: fmt).cargo clippy --workspace --all-targets --locked -- -D warnings: clean.cargo test --locked -p calternal-notes -p calternal-tasks -p calternal-core -p calternal-engine: all pass (notes lib 592 passed, 6 ignored; tasks 69; 0 failures). Tasks strict-writer users unchanged and passing.Perf spot check (archive one / archive 100, flat against
c8afa867): pending, see the next comment. The perf VMs are held by other jobs.Fixed: Move menu race (#947). Head
27abe224(fixc407032e, test27abe224).Cause: the menu chose add or remove from the notes list, which lags the server, so a fast second tap saw "no tag yet" and added again ("They already have #tag").
Fix:
lib/pending-tags.ts: the tags a Move asked for sit over the list until the list shows the same tags (or a newereditedstamp after the write finished). Each ask has a turn number, so an older write never settles a newer ask. No timers.rows/plugins/move-tags.ts: the check on each row and the tap's add-or-remove both read the notes with pending Moves applied; the ask is recorded before anything is awaited. Writes run one after another, so the second reads the file the first wrote. Undo goes through the same line.bulk-note.tsuses it.Tests (no timeouts):
move-tags.test.tsholds the first write open, checks the menu already shows the tag as on, and that the second tap removes ([add, remove], in order, no error toast). Also: writes do not overlap; a no-op write and a newer list hand back to the list.bulk-tag.spec.ts: new "a fast second Move tap removes the tag the first one added" (two taps, no waiting).Gates on dev-01 (
~/bin/slot,CI=1 --workers=1 --retries=0),bunx playwright test e2e/bulk-tag.spec.ts --project=<p> --repeat-each=20:Not run: the bundle-size gate (one small new file, no new chunk); the 390 projects skip this spec.
Heads-up from the BM15 first-paint diet lane (#947): I restacked the rows PRs on top of the #887 diet and pushed
port/rows(#875),port/rows-actions(#877) andport/rows-drop(#878) with--force-with-lease. Your last commits on #877 (82b257f6, the Move menu throughopenMenuWith) and #878 (11e8ae1d,b68a61e5, the Undo and live-pick fixes) are kept: I cherry-picked them onto the new stack, so their SHAs changed. Pleasegit fetchand reset your local branches to the pushed heads before pushing again; a plain push from an older checkout would drop the diet. Anything you change in first-paint code (indexchunk) should stay behind the lazy chunks: the press engine, swipe engine, menu helpers, Archive/Hide actions and the tooltip engine now load withpress/press.tsor on first use. Numbers are in the #947 comment.First-paint diet (BM15, #947). Head
71ed79ac(restacked on #875; your fixes, the Move menu throughopenMenuWithand the bulk-tag spec tag, are kept).First-paint bytes are brotli q11 from
apps/web/scripts/bundle-size.mjs(JS of the first-paint closure = theindexchunk; CSS of the first stylesheet). Dev baseline41f2efa3: 238,797 B JS, 19,250 B CSS. A second figure, "hash-normalised", is the same chunk with the 8-character chunk-file hashes replaced by a fixed string: the hashes are random, and they move the real brotli number by ±300 B between two builds of identical code, so a few-hundred-byte claim is only meaningful in the normalised figure (dev: 238,804). Chunk budgets: every new lazy chunk's line is taken from the first-script line or the idle-screens line so the total stays 404.2;perf/web.sh --bundle-only --gatepasses on this head.Own effect over #875: +320 B JS real (normalised +768), +1 B CSS, down from +1,215 B / +49 B. What moved out of first paint: the Archived/Show-hidden reads (
visibility-load.ts) and the tag-edit helpers (fm-tags-edit.ts) load on first use (the Show hidden switch still flips at once); Archive and Hide row actions register with the press chunk (a row's buttons are only drawn after its first touch, which that chunk serves) with the server code behindimport(); the faded-row rule loads with the code that reads hidden notes;.band{display:block}(default) dropped and the auto margin shared with.pick-acts.Specs:
press,visibility,bulk-tagon all four projects: 28 passed, 24 skipped, 0 failed (includingbulk-tag, which passed on its first run here; I did not repeat it 10 times). Lint ok, svelte-check = baseline, units ok.Budgets:
press7.2 (it measures 7.15),index232.5 (231.5),idle-screens48.7; total 404.2.Two small commits landed here for the stack:
82b257f6(Move menu opens throughopenMenuWith; fixes the svelte-check 3rd error from the lazy-menu split) anda47cab78(bulk-tag spec tag can no longer collide with the note ids/titles, ~1 in 100). #8786e994016is stacked on it; its repeat results are on #878.Warm-up commit on this stack (BM15 follow-up, #947): the press+swipe chunk is now fetched right after the list's first paint (at once on touch, first idle moment with a 150 ms cap elsewhere) and by the first pointer over the list; the tooltip engine at idle (200 ms cap) and by the first pointer movement. Heads: #875
259b5ab7, #87753104962, #878bef3b4f7(restacked with--force-with-lease; reset local checkouts before pushing). Cold first-use numbers and the specs for these heads are in #947 (comment).Not gated yet: carries #887
This branch contains a merge of #887 (
notes-archive-hide: the hide/archive/restore Rust and thecontracts/actions.jsonchanges). #887's write-path regression is being fixed by a separate lane, so gating this branch now would measure that regression, and merging it would land #887 through the back door. Once #887 is in dev, I merge dev here and run the full per-PR gates (I already merged origin/devb5e8dcb2into #875 and #904; #877 and #878 follow #875 as a stack). Also needs then: backend perf ABAB on the perf VMs (Rust), and for #904 the unchanged phone-bar fixf30e0bb7.kayg referenced this pull request2026-11-05 23:21:11 +00:00
Compiles again: dev
258f3eac-era merge,Requirement::ExpectedOwnersrestoredThe branch had lost the
ExpectedOwners { digest }variant (reader half of #898, dev72434e45) in an earlier dev merge, sohome.rs,plan.rsandtests/tolerant.rsdid not compile. Merged origin/dev02cdf878intoport/rows(#875)367c7d37, put the variant back inplan.rsnext to #887'sScopedMetadata/ExactUndo, and merged forward: #877a54f90f2, #878d96ee32f.perf/budgets.jsonmerged by the 3-way rule on each side's line moves (index 220.7 → 221.7, idle-screens 51.0 → 49.8 → 49.65,picker-list9.7 from #975; total stays 404.2).Checked on dev-01:
cargo fmt --all --checkrc 0 andcargo clippy -j4 --workspace --all-targets --locked -- -D warningsrc 0 (compiles every test target) on #875 alone and on the #878 tip (the whole stack). Full gates still wait for #887.housekeeping #1009: rebased+failing, left open for review.
restacked row actions on #875; retained lazy handlers and current chunk allocations.
head:
a2b294944d132d052fdf3f725d375a68348e8a05; 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 229010 B (-1767 B), CSS 18164 B (-222 B).
Rust gate results (Mac VM):
cargo fmt -p calternal-core -p calternal-engine -p calternal-notes -p calternal-perf -p calternal-search -p calternal-tasks -- --checkcargo check -j4 --locked -p calternal-core -p calternal-engine -p calternal-notes -p calternal-perf -p calternal-search -p calternal-tasks --all-targetscargo clippy -j4 --locked -p calternal-core -p calternal-engine -p calternal-notes -p calternal-perf -p calternal-search -p calternal-tasks --all-targets -- -D warningscargo test -j4 --locked -p calternal-core -p calternal-engine -p calternal-notes -p calternal-perf -p calternal-search -p calternal-tasksEngine idle-user fixture fails with missing file; the same failure reproduces on dev. 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-877.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.
head
a2b294944d132d052fdf3f725d375a68348e8a05Targeted 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-screens57.79 vs 50,index223.64 vs 218.75,press7.24 vs 7.2. First paint JS -1767 B, CSS -222 B vs dev (good). Stacked on #875, which has thelazy-uifailure.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.
READY FOR MERGE (issue #1009),
11eadd4689perf/web.sh --bundle-only --gateFirst paint. Plain build vs dev (231155 B JS / 18371 B CSS): 229191 B: -1964 B. Hash-normalised vs dev (230622 B): 229068 B: -1554 B. CSS: 18152 B: -219 B. 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, same method, dev
2fa9e18fb;devA/devBare the same dev build). Median of the 5 per-run medians, ms:Inside the control on every metric. (#875 and #877 are inside the tip; the press engine they share is the one measured in the Tasks stack.)
Screenshots, Chromium 2x and real Safari 1x, light and dark next to the mockup: in the comment on #878 (the tip carries all three rows PRs).
Head
c8ac6ee8d: over dev on first paint, kayg's callDesign merge with Sharing (#842/#876) and dev
4274dafb4(rusqlite 0.41, restore detection, #1044 frame fixes, #1048 lifecycle ids). Done once in the rows base (#875), carried up by merges:write_executor/home.rs:run_note_write(plan, undo_of, caller)takes both the rows undo key and Sharing's caller; plain writes pass(None, None),execute_note_write_forpasses the caller, undo passes its key.crates/notes/src/actions.rs:shared::actionsandvisibility::actionsare both chained.contracts/actions.jsonis the union (notes.hide/archive/unarchive/unhideandnotes.hide-sharedside by side;actions.gen.tsregenerated withaction-types.mjs --check).crates/search/src/index.rs: dev's hand-opened read snapshot (rusqlite 0.41) plus the foreground gauge.NoteList,lists.ts,sidebar.svelte.ts,actions.tskeep both the Archived and the Shared with me lists; Show hidden does not add your own hidden notes to Shared with me;lists.tsreadsstore.list(key)(#1030) for Archived/Pinned/tags.Checks on dev-02 (aarch64), PR-built backend:
cargo test -p calternal-notes623 passed (one run hadtyping_during_a_tag_rename_is_keptfail while WebKit specs loaded the host; it passes 3/3 alone on this head and on dev),calternal-authisolation 3,calternalisolation 40,calternal-serveraccess 1, admin-sharing 11 passed in both chromium projects on #878 and #904 (including the new trash/restore test). Specs, 4 projects: preload, lazy-ui, lazy-offline, glass, shortcuts, keys-no-motion, press, bulk-tag, visibility, sidebar-drop, hidden-blocks, slash-menu: 0 failures exceptkeys-no-motionwebkit-1440settings (Control+,), a flake (fails on 845/877/904 runs and passes on rerun, also on #854/#861).First paint vs dev: +644 / +763 B, CSS +0. This is the Archived place, Show hidden and the hide/archive row actions living in the entry (NoteList, lists, sidebar, visibility-views state, Icon table). I tried making the sidebar's drop targets lazy; it made the first screen 74 B bigger (the module becomes its own chunk plus the dynamic-import glue), so I reverted it. I did not find a cut that gets #877 or #878 to ≤ dev without moving the Archived place and the row actions out of the first screen, which would change what the first list shows. Budget total 535.69 KiB. Gate clean.
Handoff: head
c8ac6ee8dpushed; waiting on kayg's first-paint decisionRows slice 2 is over dev by +644 / +763 B first paint (Archived place and hide/archive actions in the entry). Making the sidebar drop targets lazy made it worse (+74 B) and was reverted. Next step: kayg decides whether to accept the growth or to move the Archived place and row actions out of the first screen (a separate change). Backend design merge with Sharing is done in #875 and verified (notes 623, isolation, admin-sharing 11 on #878/#904).
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.