Train BM9 #869
Closed
kayg
wants to merge 120 commits from
train/2026-11-02-bm9 into dev
pull from: train/2026-11-02-bm9
merge into: kayg:dev
kayg:main
kayg:feat/contrast
kayg:feat/style-sheet-fixes
kayg:storage/wal-checkpoint-off-save-1051
kayg:t3/paged-search-reconcile-final
kayg:feat/pass8
kayg:review/calendar-2
kayg:fix/shared-row-swipes
kayg:dev
kayg:feat/collections-db
kayg:fix/instant-keys-1056
kayg:feat/money-round
kayg:perf/stalls-1054
kayg:wip/tiering-v3-cold4
kayg:wip/tiering-v3-cold5
kayg:port/rows-actions
kayg:port/rows-drop
kayg:port/hidden-blocks
kayg:port/rows
kayg:port/port-tables
kayg:port/port-tables-2
kayg:t3/mail-1011-liveness
kayg:port/devices
kayg:port/port-attachments
kayg:port/port-attachments-2
kayg:port/port-attachments-3
kayg:docs/design-consistency
kayg:docs/engineering-standards
kayg:fix/rusqlite-0.41-rustsec-2026-0459
kayg:feat/iphone-fixes
kayg:shared/restore-and-stale-918-919
kayg:fix/phone-top-band-contrast
kayg:feat/notes-approve
kayg:perf/soak-max-gate
kayg:feat/files-s1-identity
kayg:fix/lifecycle-event-id
kayg:feat/quickfix
kayg:wip/tiering-v3-cold
kayg:perf/web-mockup-frame-fixes
kayg:port/contacts-merge
kayg:port/contacts-edit
kayg:test/shared-room-no-deleted-text
kayg:perf/first-paint-credits
kayg:fix/shared-history-after-grant
kayg:fix/phone-swipe-regressions
kayg:feat/contrast-r1
kayg:review/sharing-pr3-review
kayg:feat/tiering-v3-s2-tags
kayg:feat/folder-drop
kayg:fix/deskpills-lazy-share
kayg:feat/sharing-s1-pr3
kayg:tmp/money-round-before
kayg:fix/phone-pane-backdrop-roots
kayg:fix/palette-preload-chips
kayg:fix/invite-defaults
kayg:port/tasks-matrix
kayg:fix/restore-green-gates
kayg:fix/sharing-fast-path-hardening
kayg:t3/photos-s1
kayg:feat/tiering-v3-s1-namespace
kayg:notes-archive-hide
kayg:feat/tasks-actions
kayg:t3/photos-plan-slice-one
kayg:feat/whiteboard-s1
kayg:t3/paged-search-reconcile
kayg:t3/smooth-pane-transitions
kayg:t3/index-position-startup-scan
kayg:fix/private-staging-759b-r2
kayg:feat/dav-transport
kayg:feat/imap-notes-fetch
kayg:feat/imap-notes-projection
kayg:feat/imap-notes-readonly
kayg:feat/imap-notes-auth
kayg:feat/imap-notes-server-foundation
kayg:docs/undo-block-ids-plan
kayg:fix/undo-768
kayg:proto/block-identity-v7d
kayg:issue/carddav-read-perf-fix-r2
kayg:issue/carddav-read-r2
kayg:docs/imap-766-plan-v2
kayg:docs/imap-notes-plan
kayg:docs/quota-plan-2
kayg:fix/parallel-test-flakes
kayg:feat/contacts-companion-pure
kayg:docs/calendar-backend-v2-plan
kayg:feat/calendar-ical-converter
kayg:docs/tasks-writes-v2-plan
kayg:docs/carddav-writes-v2-plan
kayg:docs/contacts-import-v2-plan
kayg:issue/610-pm-midnight
kayg:feat/calendar-v2-s1-containment
kayg:docs/dav-recorder-v2-plan
kayg:plan/previews-865
kayg:plan/save-log-durable-entry
kayg:fix/e2e-data-on-ram
kayg:feat/appwindow3
kayg:feat/appwindow2
kayg:feat/appwindow
kayg:feat/money-p1
kayg:feat/keys-sheet
kayg:review/calendar-2-themes
kayg:feat/smooth-cursor
kayg:fix/float-style
kayg:review/calendar-2-float
kayg:release/2026-11-06-hotfix
kayg:archive/port/rows-drop-code
kayg:archive/port/rows-actions
kayg:archive/port/rows
kayg:scratch/tasks-894-ui-gates
kayg:review/calendar-2-night-wip
kayg:release/2026-11-05
kayg:archive/feat/tiering-v3-s1-namespace
kayg:archive/flaky/rows-drop-fixed
kayg:archive/flaky/rows-actions
kayg:archive/feat/tiering-v3-reader
kayg:archive/feat/tiering-v3-roots
kayg:archive/flaky/rows
kayg:sim/bm15-final
kayg:sim/bm15-fix
kayg:sim/bm15-bis-932
kayg:sim/bm15-bis-909
kayg:sim/bm15
kayg:sim/bm15-bis-887
kayg:perf/tiering-option-b
kayg:port/style-3
kayg:port/style-2
kayg:port/style
kayg:fix/sw-lazy-precache
kayg:fix/vim-w-waits-for-save
kayg:fix/signout-test-races
kayg:fp-scratch/all
kayg:sim/bm15-first-paint
kayg:archive/bm15/rows-drop
kayg:archive/bm15/rows-actions
kayg:fix/palette-snippet-contrast
kayg:archive/bm15/rows
kayg:archive/bm15/hidden
kayg:archive/plan/save-log-durable-entry
kayg:mock/money-fix2
kayg:archive/fix/e2e-data-on-ram
kayg:mock/appearance-all
kayg:mock/pill-press
kayg:archive/docs/design-consistency
kayg:mock/auto-swipes
kayg:mock/mail-actions
kayg:archive/feat/mail-p1
kayg:mock/money-static
kayg:archive/review/standards-917
kayg:archive/docs/engineering-standards
kayg:perf/tiering-761-fix
kayg:mock/type-audit
kayg:mock/third-pane
kayg:feat/contacts-import-v2-s1
kayg:perf/executor-hot-path
kayg:archive/port/hidden-blocks
kayg:archive/port/devices
kayg:scratch/executor-on-894
kayg:scratch/executor-spans2
kayg:scratch/executor-spans
kayg:train/2026-11-03-bm14c
kayg:archive/port/rows-drop
kayg:feat/tiering-761-d-scale
kayg:feat/tiering-761-c-index
kayg:feat/tiering-761-b-reader
kayg:archive/review/sharing-pr3-review-9fec3d1f
kayg:train/2026-11-03-bm14b
kayg:perf/ports-lazy-budgets
kayg:feat/tiering-761-a-migration
kayg:train/2026-11-03-bm14
kayg:train/2026-11-03-bm12
kayg:archive/review/sharing-pr3-review
kayg:archive/feat/sharing-s1-pr3
kayg:train/2026-11-03-bm11
kayg:archive/feat/imap-notes-fetch
kayg:train/2026-11-03-bm10
kayg:archive/review/sharing-pr3-review-code
kayg:archive/plan/previews-865
kayg: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!869
Loading…
Reference in a new issue
No description provided.
Delete branch "train/2026-11-02-bm9"
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?
Replaces #862. Assembly and first-run gate evidence are recorded in PR comments. Never merge as part of this test task.
Assembly head
383eb8f88b45b4cdd1604274dea26d642fd04ba6, base55f35fcde3bc91ca3781055577b93e93819f6cd4. Current source heads captured immediately before each merge.7b97e4d14231be07f6a80cb9ca172d02442c487e626388da9052eaecb159d735f0cadc5e59e88312ba1f47dc94797d4a8a937298464b5e4828e301c2f1c1aa961e169ef99e132063a97ccbd9a89a5def0543321b34f9a739275f70e31c79c5575d680259d455842942731aabc05474c7929597d57090a7cc19071be8455d718822ba98f6b9a402c5fd3452425d7b9b36cd008de78851809724c90a85d92b40a7ccaece3dfecbe2048634fc792d7d4a2c6e31f3245f7d1a59776411e7f3353d0023817b43affae51e316b43e9578c3e4d2944df8df43caebc611356f750cce9dcceb87f23a9f346300b3336e315ff6c0c40448327a15730271d56226b898e48bcc87b2a4dc38c3083d51f4adcf5cd76a70f1f6960b427413e144e717145e35f70356f593b7c04a527e00f7b1785845e3d11bea351608bde7481779ba2303372e5#840 excluded as requested. #829 conflicts with #827
0543321bin authorize_write/admit: resource authorization and cleanup overlap the new never-shared cache and writer locking. This requires implementation choices, so #829 and dependent #835 are excluded. Mechanical resolutions only: #824 keeps both Cargo.lock package entries in name order; #828 retains credential checks then starts runtime timing. #831 measurement files moved to a PR comment and removed in cleanup commit.First runs only, CI=1, retries=0. Nix with strace; heavy commands through ~/bin/slot, -j4, browser workers=1. Browser halves retain all native projects, admin-setup with dependents; only cross-half scheduling dependencies removed. All evidence stays in comments. Never merge.
Artifacts inherited from #831, moved here under ADR 0003.
docs/perf/attachment-index-flush.md
The trace run used the same arguments under:
Untraced warm run: 696 uploads; 60 save acknowledgements; p50 17.88 ms and p95
56.26 ms. This is a single dev-01 diagnostic run, not perf-VM qualification.
The matching
strace -f -tt -T -yyrun completed 465 uploads. It found 932attachment WAL syncs, 469 attachment database syncs, and 467 attachment
directory syncs: 1,868 total, or 4.017 attachment-index sync calls per upload.
Two WAL syncs, one database sync, and one directory sync occurred per new
attachment. The trace also showed a separate pending-marker sync per upload.
Traced latency is excluded from the before/after comparison.
This reproduces the inherited amplification reported in
#788 comment 73181
on current dev. The original profile at
133cf2c2is not used as the currentbaseline.
Fix and current-dev result
The implementation keeps up to 64 per-user index connections in an LRU cache.
The connection uses WAL with
synchronous=FULL, so each changed row is durablein the WAL before acknowledgement. SQLite can checkpoint after its normal
page threshold, cache eviction, or shutdown. Attachment bytes still use the
existing file and parent-directory durability barriers.
The Linux regression test measures sync syscalls between real upload action
markers under
strace. It passed with 0 attachment-index sync calls for aduplicate/no-change save and 1 WAL sync call for one new attachment. The
bounded-cache test also passed with 65 busy users: 64 cached connections and
one scoped connection.
On dev-01, the same untraced matrix cell after the change completed 1,520
uploads and 59 overlapping note saves. Save-ack p50 was 13.29 ms and p95 was
40.62 ms. Against the single baseline run, p50 improved 25.7% and p95 improved
27.8%. These shared-host samples are diagnostic only, not qualification.
The matching trace run completed 807 uploads and 60 save samples. It found
814 attachment WAL syncs, 5 database syncs, and 2 attachment-directory syncs:
821 total, or 1.017 attachment-index sync calls per upload. The seven calls
above one per upload came from SQLite checkpoints during the run. Traced
save-ack p95 was 58.37 ms and is excluded from the latency comparison.
Targeted gates on dev-01 passed:
The test result was 21 passed, 0 failed; targeted Clippy passed with warnings
denied. The current-dev binary was built from implementation commit
eef6473203e20df1be29346b8ef03ff47a269522and has SHA256196ff9b8ea473f0cf22ea0546c76056d6efb2d413317ec0a8c6063a759271bbd.Perf-01 matched comparison
On perf-01, I ran five alternating matched pairs with the same 1k-note Home,
four upload clients, 256 KiB attachments, 60-second upload window, and seed
75931004. Homes and app state were on the VM's ext4 non-rotational SSD. Thebaseline was current
origin/devat55f35fcde3bc91ca3781055577b93e93819f6cd4;the fixed binary was built from
eef6473203e20df1be29346b8ef03ff47a269522.Both were measured with the same matrix driver and unchanged budgets file
(SHA256
8feee55baeb3940c09015f37db8da85bd0cf2c5f33d5673568bd976fcf02ace3).Each run exited 0 and collected 59 or 60 save acknowledgements.
The five-pair median meets the existing #788 small all-SSD cell limits: upload
throughput at least 95% of current dev, upload response p95 at most 105%, and
overlapping save-ack p95 at most 105%. Save-ack p50 was 4.2% higher by the
median of run p50s; median run p95 fell 3.2%, and the median paired p95 ratio
was 98.8%. The first and fifth save-ack pairs were noisy and slower on the
fixed run, which is why the full five-pair table is retained. The full 18-cell
matrix still needs requalification after rebasing #788.
The unchanged
perf/budgets.jsonwas passed to--gate; it has no entry foruploads.256KiB.save_ack, so the upload comparison uses the existing relativematrix limits from #788 comment 72886.
No budget was edited. Individual JSON and Markdown outputs are retained on
perf-01. The compact per-run data is in
attachment-index-flush-perf01.json.First-run clippy FAIL (101):
CI=1 cargo clippy --workspace --all-targets --locked -j4 -- -D warnings. No retry or source fix. First error:The same baseline command will run once on origin/dev
55f35fcde3bc91ca3781055577b93e93819f6cd4, with only the #779 Nix tooling overlay.Clippy attribution: the identical
CI=1 cargo clippy --workspace --all-targets --locked -j4 -- -D warningscommand passed (0) on origin/dev55f35fcde3bc91ca3781055577b93e93819f6cd4, once, using the #779 tooling overlay. The train collapsible_if failure atcrates/notes/src/room/edit.rs:43is new, so the verdict cannot be green. Remaining gates and full browser halves continue; no retries.First-run gates complete, CI=1, Nix with strace, all heavy commands through ~/bin/slot. No retries.
cargo fmt --all --checkcargo clippy --workspace --all-targets --locked -j4 -- -D warningscargo test --workspace -j4cargo build -j4bun run buildenv PERF_DIST=/home/claude/Developer/Worktrees/bm9/apps/web/dist PERF_OUT=/home/claude/bm9-train/bundle PERF_WORK=/home/claude/bm9-train/bundle-work bash perf/web.sh --bundle-only --gatenode ci/check-case-paths.mjsnode ci/check-no-evidence.mjsHead
383eb8f88b45b4cdd1604274dea26d642fd04ba6. Full workspace tests and per-app bundle budgets PASS. Only clippy fails, confirmed new by one identical baseline run (see preceding comments). Both full browser halves are now released together: non-WebKit native projects on dev-01, WebKit plus admin-setup on dev-02. Workers=1, --retries=0, CI=1, disk >50 GB on each VM.Early single-case baseline attribution: Chromium-1440
search-corpus.spec.ts:40, “every prefix, the full word, one-letter and two-letter typos find their note”, PASS on origin/dev55f35fcde3bc91ca3781055577b93e93819f6cd4: 1 test passed, 1492 queries, 0 missed. The train failed with miss ratio0.7412868632707775against0.02. Classification: new/unresolved, not reproduced on baseline. The exact failed train case ran on baseline once, CI=1, --workers=1, --retries=0; it will not run again. Full first-error catalog and per-project tables follow at suite completion.Baseline selection:
bunx playwright test e2e/search-corpus.spec.ts --config=playwright.bm9-baseline.config.ts --project=chromium-1440 --grep "every prefix, the full word, one-letter and two-letter typos find their note$" --workers=1 --retries=0 --reporter=line,json. Baseline config imports native config and retains only admin-setup dependencies, removing scheduling-only dependencies for exact-case isolation.Full chromium half first-run results. CI=1, --workers=1, --retries=0.
Native project selection preserved, admin-setup ran with dependents. Cross-half scheduling dependencies only were removed. Each failed case receives exactly one origin/dev run.
Runner stats:
{"startTime": "2026-11-02T16:39:12.206Z", "duration": 4444747.241, "expected": 1331, "skipped": 774, "unexpected": 1, "flaky": 0}Every first-attempt failure, chromium. No retries.
1. chromium-1440 · search-corpus.spec.ts:40
every prefix, the full word, one-letter and two-letter typos find their note
First attempt errors:
The complete Chromium invocation finished with 1331 passed, 1 failed, 770 explicit skips, and 4 cases with zero attempts. The four are the two tests in each throttled project, blocked by native scheduling dependencies after the main project failed. To satisfy the FULL suite, those four are now receiving their FIRST attempts in one separate CI=1 invocation, --workers=1, --retries=0, Nix + slot, same train head. Only their already-completed scheduling dependencies are removed. No attempted test is rerun. The initial per-project table counts these four under both skipped and not-run; the final consolidated table will separate those categories and include their first attempts. Search-corpus baseline PASS is reused, not rerun.
Single-run origin/dev attribution (
55f35fcde3bc91ca3781055577b93e93819f6cd4, #779 tooling overlay only). CI=1, Nix, slot, --workers=1, --retries=0. Each exact failed case selected once; scheduling dependencies removed, admin-setup retained when needed. The early search-corpus comparison is reused, not rerun.search-corpus.spec.ts:40every prefix, the full word, one-letter and two-letter typos find their noteExact commands, from apps/web, with CALTERNAL_BIN/E2E_DIST pointing to the baseline build and TMPDIR outside the repo:
The four dependency-blocked cases completed their FIRST attempts: all 4 PASS, 0 retries. No attempted case was rerun.
Consolidated Chromium half: 1335 passed, 1 failed, 770 skipped, 0 unattempted. The first invocation’s unattempted records are replaced by these actual first attempts in the final table.
Command in apps/web:
CI=1 bunx playwright test --config=playwright.bm9-unrun.config.ts --output="$HOME/bm9-train/unrun-results" --workers=1 --retries=0 --reporter=line,json, CALTERNAL_BIN/E2E_DIST at the train build. The config imports native config, selects both throttled projects, and removes their already-completed scheduling dependencies. Nix + slot; >50 GB free.Full webkit half first-run results. CI=1, --workers=1, --retries=0.
Native project selection preserved, admin-setup ran with dependents. Cross-half scheduling dependencies only were removed. Each failed case receives exactly one origin/dev run.
Runner stats:
{"startTime": "2026-11-02T16:39:08.540Z", "duration": 5799901.539, "expected": 1303, "skipped": 782, "unexpected": 0, "flaky": 0}Final Train BM9 verdict: RED. Do not merge. Head
383eb8f88b45b4cdd1604274dea26d642fd04ba6, origin/dev base55f35fcde3bc91ca3781055577b93e93819f6cd4. BM8 #862 closed with a link to this replacement.7b97e4d14231be07f6a80cb9ca172d02442c487e626388da9052eaecb159d735f0cadc5e59e88312ba1f47dc94797d4a8a937298464b5e4828e301c2f1c1aa961e169ef99e132063a97ccbd9a89a5def0543321b34f9a739275f70e31c79c5575d680259d455842942731aabc05474c7929597d57090a7cc19071be8455d718822ba98f6b9a402c5fd3452425d7b9b36cd008de78851809724c90a85d92b40a7ccaece3dfecbe2048634fc792d7d4a2c6e31f3245f7d1a59776411e7f3353d0023817b43affae51e316b43e9578c3e4d2944df8df43caebc611356f750cce9dcceb87f23a9f346300b3336e315ff6c0c40448327a15730271d56226b898e48bcc87b2a4dc38c3083d51f4adcf5cd76a70f1f6960b427413e144e717145e35f70356f593b7c04a527e00f7b1785845e3d11bea351608bde7481779ba2303372e5#840 intentionally omitted. #829 conflicted with #827’s
0543321bcache path in sharing authorization and admission; resolving resource authorization, cleanup, locking, and cache interactions needs implementation choices. Its dependent #835 was also excluded. Mechanical resolutions: retain both Cargo.lock packages for #824; retain credential checks then start runtime timing for #828. #831’s inherited measurements were posted in the artifact comment and removed from the train.First-run gates, CI=1, Nix with strace, heavy work through ~/bin/slot:
cargo fmt --all --checkcargo clippy --workspace --all-targets --locked -j4 -- -D warningscargo test --workspace -j4cargo build -j4bun run build (apps/web)PERF_DIST="$PWD/apps/web/dist" PERF_OUT="$HOME/bm9-train/bundle" PERF_WORK="$HOME/bm9-train/bundle-work" bash perf/web.sh --bundle-only --gatenode ci/check-case-paths.mjsnode ci/check-no-evidence.mjsClippy’s first error:
clippy::collapsible_ifatcrates/notes/src/room/edit.rs:43. The identical baseline command passed once. Full first error, baseline attribution.Consolidated full Playwright project matrix, each executed attempt counted once:
Totals: 2638 passed, 1 failed, 1552 skipped, 0 unattempted. Admin-setup appears on each VM because each half provisions its own admin session in the same invocation as its dependents.
The first Chromium invocation dependency-blocked four throttled cases without attempting them. Those four then passed their first attempts in a dedicated invocation with completed scheduling dependencies removed. No attempted case was rerun. Details, four first-attempt passes.
Browser command in apps/web, BM9_HALF=chromium on dev-01 and webkit on dev-02, released together:
The split config imports the native config, selects every non-WebKit project on dev-01 and every WebKit project plus admin-setup on dev-02, retaining same-half dependencies. Only cross-half scheduling dependencies are removed. Preparation:
bun install --frozen-lockfileat root, Rust debug symbols/incremental disabled (CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 CARGO_INCREMENTAL=0).Failure attribution: the exact Chromium-1440 search-corpus case passed once on baseline (1492 queries, 0 misses), while the train missed 1106/1492 queries (ratio 0.7412868632707775, limit 0.02). New/unresolved, not established as pre-existing. Every first Chromium error, exact baseline result and command.
WebKit had no failures requiring baseline attribution. Complete WebKit project table.
All own build/test/baseline jobs finished before handback. Both VMs passed
df -h /checks with >50 GB free before heavy work. Own throwaway targets, built dist copies, test-result traces and temporary test Homes were removed on each VM after its jobs finished; only small logs/JSON remain outside the repository. No build/test ran on the control host. No source PR branch or repository settings changed. The train was never merged.The verdict is RED because every failure must be pre-existing for green, and both the clippy and search-corpus failures passed their exact baseline comparisons.
BM9 source-fix investigation update. #827 clippy repair is pushed at
76f11dc4ba06468a2a0ed4d4592cea6038206696; the requested workspace clippy command passes on dev-01: #827 (comment).Executed every cumulative BM9 merge in order, rebuilding each server and web app on dev-01. No first bad merge appeared in isolated search-corpus runs. Each row below passed both tests and reported 1492 queries / 0 misses:
b71504bb2ef9605dac68890b19cf580592429527e621bbfc70982e1aaf5c14d1538bb9d5888d24791b42557e88916c094488b5d6e4af9a94Exact gates per merge, CI=1, CARGO_PROFILE_DEV_DEBUG=0, CARGO_PROFILE_TEST_DEBUG=0, CARGO_INCREMENTAL=0, all heavy commands through Nix and
~/bin/slot:cargo build --locked -j4bun install --frozen-lockfilebun run buildbunx playwright test e2e/search-corpus.spec.ts --project=chromium-1440 --no-deps --retries=0 --workers=1 --reporter=lineOne runner-only error between #779 and #858 removed an exported TMPDIR; fixed the runner and resumed #858 before its test ran. No failed browser attempt was rerun in this sequence.
This does not invalidate the full-train failure or establish a flake. Investigation continues into shared search state:
crates/search/src/index.rs:229-275permits a stale typo vocabulary during its five-second background-refresh interval; the corpus setup only checks exact endpoint matches. A temporary existing-corpus probe is running to test that hypothesis. No search source fix or culprit claim yet. No train branch changed.Source repairs pushed; no train branch changed:
76f11dc4ba06468a2a0ed4d4592cea6038206696: let-chain clippy repair. Requested workspace clippy passes on dev-01, including again on the full BM9 scratch.b89e39bb313bb06b92da274124c6bbde30e2250a: corpus setup waits for all exact notes and the separately refreshed typo vocabulary; preserves all 1492 assertions and executes both requested desktop projects.Full BM9 scratch
73abdbce9821f30e903668f8fe7781028410a1ec: clippy/build/web build pass; three executed invocations each of chromium-1440 and webkit-1440 pass, 12 tests / 8952 corpus queries / 0 misses. One extra WebKit launch failed before tests on an already-used ephemeral port; retained and replaced by one independent launch, with no test retries.Important attribution limit: all 14 cumulative isolated merges passed, so no historical first-bad product merge was demonstrated. A warmed-vocabulary probe reproduced the incomplete readiness contract (48 misses with indexing=false), then passed with the fix (0 misses). This establishes the setup fault repaired in #856, not the exact historical 1106-miss cache state. Do not infer full-train green without rerunning the train.
Complete root-cause evidence, red/green probe, full source/scratch heads, exact gates, decisions and risks. Cold cumulative bisection. All own jobs are finished and large VM outputs cleaned. No merge or deployment.
Replaced by Train BM10 #880: #880. Fresh assembly uses the current source heads and new first-run gates.
Pull request closed