perf(web): first-paint credits for the port stacks #1022
Closed
kayg
wants to merge 3 commits from
perf/first-paint-credits into dev
pull from: perf/first-paint-credits
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/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: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!1022
Loading…
Reference in a new issue
No description provided.
Delete branch "perf/first-paint-credits"
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?
First paint is the gate every port PR is measured against, and the ports each add a few hundred bytes of stubs (#902, #904, the rows, tables, attachments, Sharing). This PR moves code the first screen does not need to draw behind lazy imports, one piece per commit, so the ports have room. No behaviour or visual change.
@and[[offer) and its ranking load when the editor is idleEach moved piece is fetched when the browser is idle after the editor shows, so the first use finds it already in; nothing waits on the network that did not before.
What I looked at and left alone, and why (sourcemap of the index chunk by module):
wipe.ts(6 KB raw) is the account-safety code and an offline sign-out must not depend on a chunk fetch; the icon table is almost all referenced by first-screen modules;daily/log.tsis needed by the first screen's day headings; the Toasts stack is rendered "immediately" on purpose; the CodeMirror, Yjs and Lezer libraries are 372 KB of the 797 KB raw and are the editor itself.Evidence follows as comments: the bundle gate, 2x before/after screenshots at 390 and 1440, and the perf ABAB against a dev-vs-dev control.
🤖 Generated with Claude Code
Evidence (issue #1009), head
0253819b7ad87f71e6295fa5eaa9be36008a3e69missing-links:245at 390: click on a link did not navigate; 1 in 8 runs; being compared with dev, see below), 26 skippedlane-queue-ctl7)No visual change. The same data served with dev's build and with this build, 2x, light and dark, the list and a note with a link: at 390 the PNGs are byte-identical; at 1440 they differ by 49 to 51 dB PSNR, which is one glyph of the Journal row's time (the day note's time changed between the two runs) and the animated backdrop's noise.
Update, head
0253819b7ad87f71e6295fa5eaa9be36008a3e69.missing-links:245at WebKit 390: it failed once in 8 runs on dev-02 under load. Run 16 times on dev-01 on both builds, it passes 16 of 16 on this PR and 16 of 16 on dev, so it is a load-dependent flake of the spec, not something this PR changes.ports) together with the tables, attachments and Contacts runs.Honest size: -1522 B, short of the 4.5 KB aimed for. The rest of the index chunk is the editor's libraries (CodeMirror, Yjs, Lezer: 372 KB of 797 KB raw) and code the first screen needs; the pieces I looked at and rejected are listed in the description. Larger credits would need behaviour risks I did not take: lazy Yjs and the sync client until a note goes live, splitting the sign-out wipe from its offline path, or deferring the toast stack (its first toast is meant to be immediate).
READY FOR MERGE: first-paint credits (head
e65ef6510e)Rebased on dev
1619002ac(#1025). No behaviour change: the link search, the copy confirmation and link following load when the browser is idle instead of in the first screen.1619002acperf/web.sh --bundle-only --gate)The saving (−1.6 KB) covers Sharing #842's +1.19 KB once this merges (it counts for the PR that carries it only while dev's baseline has not moved, so Sharing's gate should be re-measured after this lands).
Specs (chromium and webkit, 1440 and 390; preload, lazy-ui, lazy-offline, glass, shortcuts, links, links-parity, missing-links, link-suggest, slash-menu, tag-picker, daily, typing-latency, lazy-styled, picker-lazy, tasks-lazy), this PR vs dev, same binary:
The 23 failures here are all among dev's 24 (same specs, same projects): preload:118 (×4 projects), preload:89 (×6 at 390), glass:76 and lazy-ui:70 at 390, shortcuts:280 at 1440, lazy-offline:3 chromium-390. Dev has one more (missing-links:228 webkit-390, a flake that passed here). Nothing new fails with this PR. Those 23 are dev's own failures, not caused or fixed here.
Screenshots below: list, note and the
[[link search open, light/dark at 1440 and 390, 2x, dev vs this PR on identical seeded data. Pixel difference ≤ 0.02 % of the image in every pair (clock text and anti-aliasing only;compare -metric AE). Perf rides my queued perf ticket.Screenshots (2x; light and dark; 1440x900 and 390x844). Left: dev (
1619002ac). Right: this PR. Same data, same server.list
note
search
READY FOR MERGE: first-paint credits, rebased on dev
3f079de39(head17010f469)Rebased onto current dev (#909, #1025, #1029 in). The budgets conflict is gone: the lines are regenerated from a fresh build of this head on top of dev's own file.
A fix since the last READY: after #1029 the preload spec
palette … intent prepares only its own screen before idle(preload:118) failed here (and passed on dev). Cause: the link search madelib/search.tsa module shared by the Palette and the idle-loaded link search, so the bundler gave it a chunk of its own and the Palette's Control-key preload fetched two files. It now travels in thedateschunk (the same trick #1029 used for the date words), with one commit:perf(web): the note ranking (lib/search) travels in the dates chunk….3f079de39perf/web.sh --bundle-only --gate)Specs, chromium and webkit at 1440 and 390: preload, lazy-ui, lazy-offline, link-suggest, links, shortcuts, slash-menu. 145 passed, 9 failed, 46 skipped. Dev on the same specs (without slash-menu): 118 passed, 8 failed, 42 skipped. The 9 here are dev's 8 (lazy-ui:70 at 390 ×2 projects, preload:89 ×3 at 390 ×2 projects) plus
lazy-offline:3at chromium-390, which is a flake on dev too (reruns: credits pass/fail, dev fail/fail).preload:118passes in all four projects. Nothing new fails with this PR.The 2× light/dark shots from the previous comment (list, note,
[[search; ≤ 0.02 % pixel difference vs dev) still apply: the only change since is a bundler grouping rule, no code or CSS. Perf rides my queued ticket.Perf (perf-02, Chromium 4x slowdown, 10k notes, 5 interleaved rounds, dev built from
3f079de39run twice as a control; medians of per-run p50 / p95, ms):The dev-vs-dev control moves by as much as any arm (code_block p95 34.8 vs 47.3; long_note p95 53.4 vs 55.5), so there is no change beyond the noise on any metric, for any arm. Arms are the heads built from the rebased branches (#854
f58c71010, #861f20b9457b, #849 as144013926before its budget-only commit, #102217010f469).READY FOR MERGE: first-paint credits, rebased on dev
d0bf2838c(head81f692826)Conflicts resolved:
vite.config.tskeeps #1036'ssheet-kitgroup (before idle-screens, unchanged) and dev'spage-dimin thedatesgroup, and addslib/searchto it.perf/budgets.jsonis regenerated from a fresh build of this head on top of dev's file.d0bf2838cSpecs (preload, lazy-ui, lazy-offline; chromium and webkit at 1440 and 390): 74 passed, 10 skipped, 0 failed.
lazy-offline:3is green, and so arelazy-ui:70,preload:89andpreload:118in all four projects. The earlier shots (list, note,[[search, ≤ 0.02 % pixel difference vs dev) still apply: since then only a bundler grouping rule and budget lines changed.READY FOR MERGE, again: first-paint credits, head
db34f2268(on dev0878cb550, #876)Dev moved to #876 while the last READY was open and
perf/budgets.jsonconflicted again, so this is rebased on0878cb550with the budgets regenerated from a fresh build. It also merges cleanly with7b03bfcea(#1039;git merge-tree, no conflicts).vite.config.tsstill keeps #1036'ssheet-kitgroup and page-dim indates, pluslib/search.0878cb550Specs (preload, lazy-ui, lazy-offline; chromium and webkit at 1440 and 390): 74 passed, 10 skipped, 0 failed. The saving is a little smaller than before (−1.6 KB on
d0bf2838c) because #876 grew the first screen around the same modules.If another merge lands first, the only conflict to expect is
perf/budgets.json: take dev's file and keep the changes in my budget commit (index, dates, four new lines, total).Merged into dev locally (head
db34f2268is in origin/dev); closing.Pull request closed