port: hidden blocks, the editor UI (#611, approved mockup) #904
Open
kayg
wants to merge 70 commits from
port/hidden-blocks into dev
pull from: port/hidden-blocks
merge into: kayg:dev
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-actions
kayg:port/rows-drop
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!904
Loading…
Reference in a new issue
No description provided.
Delete branch "port/hidden-blocks"
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?
The editor side of hidden blocks (#611, ADR 0056). Stacked on #887 (
notes-archive-hide): this branch is based on #887's headc8afa867, so the first commits here are #887's. Review range:c8afa867..port/hidden-blocks. Gate numbers and screenshots are added as comments below.#887 only has the server side:
hidden blocks:frontmatter and search skipping them. It has no block-level action, so the client writes the list itself through the normal edit path, in the same change as the block's id.What it does
^id, on its last line, if it has none) and the frontmatter getshidden blocks: ["^id", …], in ONE change, so one Undo takes it all back; a toast offers Undo. The block's words never change. An olderhidden:list moves intohidden blocks:in that same edit (hidden: trueis the note flag and is left alone).?block=<id>) opens the note with only that block shown faded, for that visit: the list is unchanged, so it is hidden again after leaving.Cost on the typing path
None for a note without hidden blocks (the field returns its value untouched; the test proves it). With hidden blocks: a change touches the frontmatter or a marker line → rebuild; anything else only maps the existing decorations through the change.
Decisions
--repeat-each).Tests
packages/editor/test/hidden-blocks.test.ts(list read/write incl. both keys, the reading view, peeking, zero cost),apps/web/e2e/hidden-blocks.spec.ts(4 cases: hide with no placeholder, Undo, Show hidden + unhide, link to a hidden block).🤖 Generated with Claude Code
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.Product (left) vs approved mockup (right), 1440x900 and 390x844, light and dark. Taken by me and checked; the mockup is
review/calendar-2on its own page, so its surroundings differ.First paint, exact bytes (brotli,
indexchunk; #887 headc8afa867vs this head68f30a78)41f2efa3) is 238,797 for reference. First-paint CSS: 19,250 vs 19,250 (identical).lib/lazy-hidden.ts(one view plugin that looks at the properties when the note opens and when they change), the "Hide" menu entry, the Show hidden toggle (note tools and Composer) and two fields in the editing store. The editor piece, its stylesheet and the hide/unhide/peek actions are one lazy chunk (hidden-ui, 2.3 KiB), fetched only for a note whose properties list hidden blocks, when Hide is used, or when a link names a hidden block.editor.ts,index.ts,syntax/mode.tsandcm.cssare byte-identical to #887's.Gates at
68f30a78hidden-blocks.spec.ts(4 cases),--repeat-each=5,CI=1 --retries=0 --workers=1: chromium-1440 20/20, chromium-390 20/20 (dev-01), webkit-1440 20/20, webkit-390 20/20 (dev-02).tsc --noEmitclean, svelte-check only the existingreview4-signouterrors.Typing latency on the perf VMs (ABAB, dev-vs-dev control, both locks)
Taken 11-03 on perf-01 with
perf-lockheld on BOTH perf VMs for the whole run. Chromium at 4x CPU slowdown, 10k Home, 4 rounds, order reversed every other round. Cases:dev(41f2efa3),dev2(the same dist again: the dev-vs-dev control),cb(#903 head),h887(#887 headc8afa867),hb(#904 head). Each cell is the median over the 4 rounds of that run's p50 (or p95, or CPU per key), ms:Reading it: dev and dev2 are identical bits and differ by up to 6 ms (code_note_prose), so that is the resolution. #903 against dev2: within -1.1 to +2.0 ms p50 and -0.4 to +2.0 ms CPU per key; #904 against #887: within +0.4 to +2.2 ms p50 and about +0.2 to +0.4 ms... see the table; no row separates a PR from its base by more than the control does. The earlier +10 ms (one run, perf-01 under load 9, no control) is not reproduced. The per-keystroke work was also cut: the #903 gate now looks only at typed backticks/tildes, and #904 does nothing on a keystroke until a hidden list exists.
Exact deltas for the table above (this PR minus its base
h887, ms): p50 code_block -1.6, code_note_prose +1.3, long_note +2.2; CPU per key 0.0, -0.2, +0.2. The same-bits dev-vs-dev control differs by +2.9, +6.0, +1.6 p50, so none of this separates the PR from noise; the first run's +10 ms is not reproduced.First-paint diet (BM15, #947). Head
7443f392(cherry-picked onto the #887 diet; basenotes-archive-hide).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.The Hide block action's body (select, undo toast) moved into
hidden-ui.ts(it was inactions.ts); everything else already loaded on demand (lazy-hidden.tsis the one trigger). What is left on the first screen is the trigger plugin, the Show-hidden-blocks button inTools.svelteand its count inediting. This PR is not ≤ 0 on its own; it is paid for by #875's offset (see #947 for the running total in merge order).hidden-blocks.spec: 16 passed (all four projects). Lint ok, svelte-check = baseline, units ok.Budgets:
hidden-ui2.5 fromindex(240 → 237.5) and thenotes-visibility-applyline fromidle-screens; total 404.2 (the +2.5 bump is reverted).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
housekeeping #1009: rebased+failing, left open for review.
rebased hidden blocks with its missing backend dependency. kept dev code/picker lazy chunks, current toolbar and phone Attach behavior; restored lazy hidden UI and editing.peeking.
head:
2b98bf3af49165cf2196e4939e7e34ad5e6f8392; 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 231250 B (+473 B), CSS 18386 B (+0 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-904.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: fixed 3 real failures, specs now pass; bundle gate fails.
head
0e601928a307dff6a414660e8c140ae71a88165fTargeted specs,
CI=1 --retries=0 --workers=1, dev-01 Chromium and dev-02 WebKit (through~/bin/slot), against a dev-head backend (cd7f84432).0e601928a)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.0e601928a): Hide and Unhide dispatched withuserEvent: "input". Dev's editor refuses every frontmatter edit that isn't taggedinput.properties(packages/editor/src/syntax/hidden.ts), so Hide did nothing on the page. Both dispatches now useinput.properties.idle-screens51.75 vs 51.2,index225.83 vs 223.75 (caps were set tight by the PR itself). No donor chunk; needs a cut.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),
e84b29d0bbProduct (this PR, Chromium, 2x) next to the approved mockup (review/calendar-2, 2x), light and dark, 1440x900 and 390x844. Real Safari (glass) for these states is not taken yet. Not READY: first paint is over dev (see the #1009 table).
Differences from the mockup: the desktop has no note-level button in dev today, so Show hidden blocks is reached through the command palette there (the phone's Page actions menu has it, between Show source and Pin); the block menu has dev's own items (Move up/down, Delete note) and Hide now sits after Select with the eye-slash icon, as in the mockup; the sample note in the mockup has a fenced code block that the product cannot hide in these shots (the product's hidden wifi block is a plain line).
Screenshots (2x; light and dark; 1440x900 and 390x844). Left: the approved mockup (review/calendar-2). Right: this PR.
menu
shown
blockmenu
hidden
Real Safari (Mac VM, safaridriver, 1x: the VM reports devicePixelRatio 1)
menu
shown
blockmenu
hidden
Restacked on dev
d4b32af94, heade30958527. Not READY: first paint is over dev.First paint JS vs dev (plain 228525 B / normalised 228128 B): 228903 B: +378 B / 228614 B: +486 B; CSS +0. Specs: hidden-blocks 8 passed, Chromium and WebKit (1440 + 390). Bundle gate passes; budget regenerated (total 516.0 KiB). Dev
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.Restacked on dev
661123e94, head569feffc61987560fd0960ae3d9b4c2e9588f1da. Not READY: first paint +361 B plain (normalised +110 B), CSS +0. Specs: hidden-blocks 8 passed, both engines; gate passes (total 510.1 KiB). The stubs are the note menu entry, the block menu's Hide, the visibility flags and the Hide icon in the shared icon table (the block menu is drawn before the hidden-blocks chunk is there). Dev661123e94itself fails the same nine specs as before (palettepreload:118at 1440 and 390,glass:76,lazy-ui:70,preload:89x3), on both engines; none is new on this head.READY FOR MERGE: hidden blocks (head
1cb0233f6, on the rows base)Design 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: +283 / +341 B, CSS 0. Budget total 535.36 KiB. Gate clean. Merging #904 after #877 needs one small fix: both put an
showicon in a table (Icon.sveltein #877,hidden-ui.tsregisterIcons in #904), whichicons.testrejects as a duplicate; drop the one inhidden-ui.tsthen.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.