Merge train BM14c #897
Closed
kayg
wants to merge 68 commits from
train/2026-11-03-bm14c into dev
pull from: train/2026-11-03-bm14c
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: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: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!897
Loading…
Reference in a new issue
No description provided.
Delete branch "train/2026-11-03-bm14c"
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?
BM14c, based on origin/dev
41f2efa387b74175971a838f602535089d0d5fb4. Headb59e4a5e2155b2b71c6246b98a4e20679073cf26. Do not merge.af6fb861d94771b6656b61bf97d790f63755691d(current head)3c1d8debNo conflicts. First-run gates, full matrix and perf gate results follow in comments. No fixes, no retries.
41f2efa3' into feat/sharing-s1-pr2 d95b705c0caf6fb861) into BM14c cb9e6679e2d94771b6) into BM14c 16548f2b25656b61bf) into BM14c 7e68d56dfb97d790f6) into BM14c ef284146b23755691d) into BM14c efa2bf37843c1d8deb) into BM14cBM14c in progress. Head
b59e4a5e2155b2b71c6246b98a4e20679073cf26, base origin/dev41f2efa387b74175971a838f602535089d0d5fb4. Merged--no-ffin the requested order, every head matched the list (#835 current head3755691d); no conflicts.Train locks held on dev-01 and dev-02 (owner shells with EXIT trap),
CI=1,SLOT_TRAIN=1, on-disk TMPDIR,--workers=1 --retries=0, df checked before each step (dev-01 ≥ 238 GiB, dev-02 ≥ 300 GiB free).First-run gates so far (dev-01 unless noted), all pass:
bun install --frozen-lockfile(both),cargo fmt --all --check,cargo clippy --workspace --all-targets --locked -j4 -- -D warnings,cargo test --workspace -j4,cargo build -j4(both),bun run build(both),perf/web.sh --bundle-only --gate,ci/check-case-paths.mjs,ci/check-no-evidence.mjs.Running now: the full Playwright matrix (Chromium on dev-01, WebKit on dev-02), then
apps/webbun run check, then the perf-VM comparison against origin/dev.BM14c interim (head
b59e4a5e2155b2b71c6246b98a4e20679073cf26). First-run matrix is RED: 17 failing cases on Chromium (dev-01) and 17 on WebKit (dev-02), same spec set on both browsers; passed 1381 (chromium half) + 1351 (webkit half). Not merging. Throttled projects (skipped by Playwright because their chromium dependencies failed) got their first attempts separately with--no-depson the train binary: throttled-1440 3 pass, throttled-390 5 pass, 0 fail.Failing cases on the train (first error; all deterministic in the first run):
cover.spec.ts:124,:143(chromium-1440/390, webkit-1440/390):[data-testid=style-cover]Change button / "No cover" not found.width.spec.ts:48(1440 only, timeout),:86(1440, tab "Wide" not found),:177(1440 and 390, tab "Narrow" not found).opacity.spec.ts:122(1440/390): test timeout 30 s.style-sheet.spec.ts:26,:49(1440/390): test timeout 30 s.note-bars.spec.ts:319(1440, timeout) and:237(390, "the Text page is shorter than Page": 394 vs < 245).vim.spec.ts:387(Savednot visible); webkit-1440 onlyaccent-labels.spec.ts:26(accent radios: 0 found, expected 7).Lead (no fix made):
svelte-checkon the train reportssrc/components/style/StyleSheet.svelte:142:Property 'noteId' is missing in type '{}' but requiredfor<PageTab />. The merge of #850/#851/#852 renders Page tab without itsnoteIdprop, which fits the missing Width/Cover/Opacity rows. It also reports 2 type errors ine2e/review4-signout.spec.ts:225-226(never; check against dev pending).apps/webbun run checkfails on both train and origin/dev41f2efa3withsrc/lib/actions.gen.ts is out of date with contracts/actions.json(pre-existing, not the train). Since that stops before svelte-check, svelte-check was run directly on the train (3 errors above); the same run on origin/dev is queued.Next: one origin/dev comparison per failing case,
--repeat-each=10on the train, then the perf table (append, server hot paths, browser first paint are running on perf-01/02).BM14c result: RED. Do not merge.
Head
b59e4a5e2155b2b71c6246b98a4e20679073cf26, base origin/dev41f2efa387b74175971a838f602535089d0d5fb4. Merged--no-ffin order, heads verified first: #850af6fb861, #851d94771b6, #852656b61bf, #82997d790f6, #8353755691d(current), #8953c1d8deb. No conflicts.CI=1,SLOT_TRAIN=1, train lock with EXIT trap on both VMs, on-disk TMPDIR,--workers=1 --retries=0, df before each step (dev-01 ≥ 235 GiB, dev-02 ≥ 300 GiB free). First run counted, nothing retried. No fixes made.Gates (first run)
bun install --frozen-lockfilecargo fmt --all --checkcargo clippy --workspace --all-targets --locked -j4 -- -D warningscargo test --workspace -j4cargo build -j4cd apps/web && bun run buildPERF_DIST=$PWD/apps/web/dist perf/web.sh --bundle-only --gatenode ci/check-case-paths.mjsnode ci/check-no-evidence.mjsapps/webbun run checkactions.gen.ts is out of date with contracts/actions.json. The same failure happens on origin/dev41f2efa3(built the same way), so it is pre-existing, not the train.svelte-checkrun directly (thecheckscript stops before it)bunx svelte-check --tsconfig ./tsconfig.jsonsrc/components/style/StyleSheet.svelte:142:158 Property 'noteId' is missing in type '{}' but required(<PageTab />). The 2 ine2e/review4-signout.spec.ts:225-226are on dev too.Playwright matrix (every project, one attempt each, retry 0)
Chromium half on dev-01, WebKit half on dev-02,
admin-setupon each, via the.mtswrapper as in BM14b.* The throttled projects depend on the failed chromium projects, so Playwright skipped them. Their first attempts were run right after with
--no-depson the same train binary and dist.Known flakes
sidebar-edge.spec.ts:8, webkit-1440editor.spec.ts:173, webkit-390missing-links.spec.ts:245did not occur.Failures (34 first-run failures = 17 cases on each browser)
One comparison on origin/dev
41f2efa3(built and run the same way, exact case, one attempt) and--repeat-each=10 --no-depson the train. "pass n/10" is the train repeat.cover.spec.ts:124Style sheet Cover row[data-testid=style-cover]Change button not foundcover.spec.ts:143"Use this picture as the cover"style-cover"No cover" not foundstyle-sheet.spec.ts:26style-sheet.spec.ts:49note-bars.spec.ts:319Style popover tabsnote-bars.spec.ts:237Style tabs follow heightopacity.spec.ts:122(dev:120) slider to 0%width.spec.ts:48width.spec.ts:86width.spec.ts:177vim.spec.ts:387(dev:380):commandsSavednot visibleaccent-labels.spec.ts:26So 10 distinct cases fail on every repeat only on the train (cover ×2, style-sheet ×2, note-bars ×2, opacity, width ×3).
vim:380/387fails on dev too;accent-labels:26did not reproduce. Likely cause (not fixed):StyleSheet.svelterenders<PageTab />without the requirednoteIdafter the #850/#851/#852 merge (svelte-check error above); the missing Width, Cover and Opacity rows are on that tab.Perf (new gate: no regression vs origin/dev)
Train
b59e4a5eagainst origin/dev41f2efa3, release binaries built on dev-01 and relayed with matching SHA-256 on both perf VMs (headcalternal56787f47…, dev2c6a9b93…, samecalternal-perf4631c52b…). Every run under~/bin/perf-lock, seed 1, pairs alternating, perf VM loads quiet (0.3–5.2).Server, perf-02 (
calternal-perf --sizes 10k,100k --runs 5 --cold-runs 0 --idle-secs 0 --storm-edits 1, 3 alternating pairs; medians of per-run p50 / p95; spread = min–max of per-run p95 across the 3 runs):200 appends (30 alternating pairs, perf-01,
CALTERNAL_NOTES_SAVE_MS=15, sameappend.pyas #792): total time median dev 1.308 s, head 1.328 s = +1.50%; per-append p95 median 11.55 → 12.10 ms (+4.8%); pair ratios 0.79–1.21. Noise control, the same script with the dev binary against a copy of itself (30 pairs): +2.11%. So the +1.50% is inside run-to-run noise.Browser, perf-01 (Chromium 4× CPU slowdown, 10k Home,
perf/boot.perf.ts,list-search.perf.ts,blaze.perf.ts; 3 alternating runs per side; each side served by its own server binary and dist; WebKit not available on perf VMs):Bundle (brotli KB,
perf/web.sh --bundle-only, deterministic): first JS 233.20 → 233.95 (+0.75, +0.3%); first CSS 18.80 → 19.59 (+0.79, +4.2%); total JS 353.3 → 364.6 (+11.3, idle-screens +10.4); all CSS 34.5 → 37.0. All inside budgets (first JS 240, first CSS 22.1) but larger than dev.Perf verdict: RED. Beyond noise:
sync.round_tripp95 +52%/+58% (≈ +0.2 ms, 10 ms budget), cold first contentful paint / first note +84 / +67 ms p50 at 4× slowdown,list_search.keyp95 +14% (+1.5 ms), and a larger first CSS (+4.2%). Not bisected:sync.round_trippoints at the #829/#835 room/live changes, the browser numbers at the #850–#852 style stack (bundle +11 KB). Everything else is flat or better.Summary
Gates pass; the matrix has 10 train-only deterministic failures (Style sheet, Cover, Width, Opacity) plus
vim:380that fails on dev too and one first-runaccent-labelsflake that did not reproduce; perf has the regressions above. Artifacts (JSON, logs, reports) are only in these comments; VM work dirs are cleaned.BM14c Style stack: causes and fixes (pushed to #852
port/style-3, head07b6770a)Cause 1 (most of the red). #851 gave
PageTabanoteIdprop and #852's merge of #851/#850 took the<PageTab />call from the #851 side ofStyleSheet.svelte:142(nonoteId), while #850's side had<PageTab {noteId} />. So the Cover row got no note, and cover / Width / Opacity / style-sheet / note-bars specs lost their rows and timed out.svelte-checkshowed it asProperty 'noteId' is missing(the only train-only error). Fix:f757dc1epassesnoteId.Cause 2 (
note-bars.spec.ts:237, phone, WebKit 13/20 after cause 1 was fixed). The Page tab builds itself in steps (looks, then rows + Cover, then colour; 40 ms timers).StyleSheetdropped its held room (min-height) as soon as the tab was mounted, so the capsule shrank to the looks (307 px) and grew back; the spec'sstill()saw the shrunken moment and compared "Text page shorter than Page" against 307 (Text is 394). Fixes:fed76ea1keeps the held room until PageTab says its last step is in (onready), and07b6770aupdates the held-room guesses for the taller Page tab with the Cover row (measured on the stack: page 464 phone / 553 wide, sheet 516 / 605; they were 362/451 and 414/503 from before the Cover row). No assertion, threshold or timeout changed.Results on the merged train tree + these 3 commits (train
b59e4a5eplus cherry-picks, dev-01,CI=1 --workers=1 --retries=0 --repeat-each=20)Cases: cover.spec.ts:124, :143; style-sheet.spec.ts:26, :49; note-bars.spec.ts:319 (desktop), :237 (phone); opacity.spec.ts:122; width.spec.ts:177, :48 and :86 (1440 only). Cases that do not apply to a width are skipped by their own
test.skip.Notes on the runs: the very first parallel runs shared one
test-resultsdir and a port, giving ENOENT/port errors (my harness, not the app); every number above is from runs with their own--output. One webkit-1440 run beside three other 20x runs had 1 failure in 180 (note-bars.spec.ts:319, tablist not up in 5 s under heavy load); the same project alone, repeated: 180/180.svelte-checkon the stack: only the 2 errors ine2e/review4-signout.spec.ts:225-226that origin/dev has too;StyleSheet.svelte:142is gone.Style sheet open time (kept)
note-bars-motion.spec.ts"rest to Style sheet", throttled-390 (6x CPU),--no-deps --repeat-each=20: 20/20 pass; longest main-thread task of the open: min 80, median 92, p90 128, max 172 ms (limit 250; goal median ≤ 120). Held room did not add any task.Not done
vim.spec.ts:387(:wsays Saved): not touched. It fails on dev too and I did not find a quick deterministic fix; left as is for #895.Correction to cause 1: #850 passes
<PageTab {noteId} />; #851'sStyleSheet.svelterewrote that call as<PageTab />(its PageTab takes no prop); #852 madePageTabrequirenoteIdfor the Cover row and kept #851's call. So the missing prop is a #851/#852 interaction, fixed on #852 byf757dc1e.BM14c perf bisect and fixes (not merged)
Method: release binaries built on dev-01, relayed to the perf VMs with matching sha256 (dev
de99cfbf…, train+fixes68dd30a0…, same devcalternal-perffor every run). Every run under~/bin/perf-lock, seed 1, 10k Home, alternating pairs. Medians of per-run p50 / p95, [min–max of p50]. The perf VMs were shared with other agents' long lock holds, so runs spread over several windows; dev-vs-dev spread alone is 0.20–0.37 ms on round trip.sync.round_trip bisect (10k, perf-02, ms)
41f2efa3ef284146)efa2bf37)72eb0eb1) vs dev same windowCulprits: #829 (
Auth::authorize_room_delivery, called per delivered frame, does a sharing-db read even for the owner's own note) and #835 (the same check per queued frame in the room, again per written frame inlive.rs, plus two more reads per room join and a clone of the caller). Both are the same cause: an owner reading their own note never depends on a grant row, but every frame paid a database hop.Final train + fixes vs dev, both sizes (3 pairs, ms; p50 / p95)
Browser (Chromium 4x CPU, 10k Home;
boot.perf.ts,list-search.perf.ts)Pooled, interleaved dev / #850 / #851 / #852 / #852+CSS-split runs across three windows (D n=21, #850 n=7, #851 n=5, #852 n=14, split n=7):
bundle-size.mjs): first CSS dev 18.8 → train 19.6 → with split 19.2; first JS 233.2 → 233.9 → 233.6. The remaining +0.4 KB CSS is the rest bar's own rules, needed by the first note screen.Fix branches pushed to the owning PRs: #829
72eb0eb1, #83546be23e3, #8506eb81f62. Train order check: #852 state + #829 + #835 + #895 merges cleanly (no conflicts) with all fixes; tree = train head + 5 changed files.kayg referenced this pull request2026-11-05 23:21:11 +00:00
Train superseded by #914 (BM14e), landed in dev via
12103f1c97. Closing the obsolete BM14c train.Pull request closed