WIP: measure option B first-fill map and paged startup (#792) #953
Closed
kayg
wants to merge 1 commit from
perf/tiering-option-b into dev
pull from: perf/tiering-option-b
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: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!953
Loading…
Reference in a new issue
No description provided.
Delete branch "perf/tiering-option-b"
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?
Option B identity prototype
Build on dev without changing storage layout. Reuse dev's compact identity map and log writer for a Home's first scan; after discovery publish the paged projection once, then release the map. Reuse the existing projection recovery and bounded writer from #792. Warm startup classifies paths by one ordered projection traversal, rather than point queries for every file. This prototype is not a tiering rollout.
Sizes and costs
Measure 1k, 10k, 100k notes and the plan's 10M aggregate identity envelope (100 Homes of 100k, ten active), including the 1M active envelope separately. Notes average 4 KiB; retain the harness's deterministic mixed-size distribution for comparison with A. First fill uses O(N + path bytes) transient heap, the same map as dev. Projection construction is O(N log N), one FULL transaction with secondary indexes built afterwards. Publication also streams the authoritative log before replay and before install, O(L) work for L authoritative-log bytes, with constant hash memory, so an equal-length rewrite in one filesystem clock tick cannot certify a stale projection. Normal ID lookups and writes are O(log N); pages use O(log N + page size); startup classification sorts observed paths O(N log N) and merges them with one O(N) ordered projection pass. Report sorting and projection time as well as total startup.
Reuse current paged connection/cache/admission limits, explicitly report any mismatch with the approved 64 MiB aggregate cache gate. Do not silently replace a failed B scale case with A. The 50 MiB transient allowance is a measured delta, not a capacity claim. Initial scope is one Home at a time; concurrent first fills and the full aggregate envelope remain gates, not implied passes.
Failure table
Execution and gates
validation checkpoint, not an option b performance result:
b has no measured performance verdict yet and remains unaccepted. results and exact commands will be added here after the build and perf runs.
functional checkpoint at 13:40 ist, still no option b perf result:
tob-check4reproduced the admission bug:cargo test -j4 -p calternal-notes warm_discovery_surfaces_refused_identity_admission --locked -- --nocapturefailed withdiscovery hid a refused identity admission.tob-check5passed notes all-target compilation, that regression (1 passed), andcargo test -j4 -p calternal-notes option_b_tests --locked -- --nocapture(6 passed). rustfmt passed.40795a38removes it. full validation of the latest head9b7fad0934aa5a7151e4fb47532290867a501454and its release build are now queued through nix/slot behind the live dev-01 train. no train reservation was bypassed.results, scripts and exact measurement commands will stay in pr comments. no acceptance or merge is implied by this checkpoint.
latest-build measurement checkpoint, no acceptance verdict yet:
3f9ce0fd6acbbcdcc5100668ebf2b2a50b6c1cb1release build passed on dev-01 through nix/slot. binary sha256e2d4f96133289356c4770c7fff07746c0921f27db3d4200984482d7f6f12db8cmatches on dev-01, control and perf-01. dev is9377d711217532a44973edcf63c2af0b7f7969d8, binarye7fce554632c7a35dd6fc424fd55f29a86377f04d12228141b23037b8176f5d5.~/tob-b2. an earlier partial run used a different binary and was stopped, its active Home removed, and its results excluded from qualification.glibc.malloc.arena_max=2; no page-cache drop. raw request samples, RSS series and every failure are retained.commands and the completed tables will follow with the raw artifacts.
option b main campaign results, 5 november, 15:23 ist. b does not qualify for adoption.
head
3f9ce0fd6acbbcdcc5100668ebf2b2a50b6c1cb1, dev9377d711217532a44973edcf63c2af0b7f7969d8. exact head binary sha256e2d4f96133289356c4770c7fff07746c0921f27db3d4200984482d7f6f12db8c; dev binarye7fce554632c7a35dd6fc424fd55f29a86377f04d12228141b23037b8176f5d5. no cache drop. both shared perf locks were held together, perf-01 confirmed acquired before perf-02. measurements ran on perf-01. both holders were stopped after the campaign.48 custom arms completed, 16 per size: three dev/b/dev/b cycles, then dev/dev-copy/dev/dev-copy. native websocket/journal harness completed 16 arms, each covering all three sizes, with three warm runs per arm and one cold run. no custom failure files and no native recorded failures. medians below are medians of arm quantiles, not pooled quantiles. control columns are the same-session dev-copy/dev ratio; do not subtract this ratio from b's results or use it to waive regressions. raw request samples and arm ranges will be attached.
full-fill timing includes projection publication. the first-page metric is the first notes.list response after health readiness, including lazy Home open; the native harness also reports cold.first_page and warm home.first_page separately. startup-check timing is observed completion during early requests, with a 20 ms polling interval. RSS uses the child process only: 10 ms samples plus kernel VmHWM. steady fill is sampled two seconds after publication; startup steady follows the settled request campaign. the 720-second idle campaign is separate and still running. native mem.idle here uses --idle-secs 0 and is not the 720-second idle gate.
the tested single-Home paired peak excess is below 50 mib in every arm. this measures total process RSS differences, not isolated map allocation, and does not qualify concurrent first fills or the full aggregate envelope.
internal b timings, six arms each:
current gate verdicts: 100k fill <=60 s passes its absolute budget; cold first-page <=100 ms fails; native open.note p95 <=15 ms passes its absolute budget. the requirement that every touched hot path be flat or better fails qualification: for example, settled 100k append p95 is 14.721 ms versus 12.107 ms (+21.6%; dev-copy control +10.9%), settled 1k create is 31.065 versus 22.856 ms (+35.9%; control +9.9%), and 10k native api-get p95 is 10.121 versus 7.477 ms (+35.4%; control -11.4%). noisy paths also cannot pass. startup-check and publication overhead are included and reported below. the inherited 704 mib configured aggregate cache allowance fails the unchanged 64 mib bound. idle, concurrent first fills, and the 100×100k/ten-active envelope remain unqualified pending the remaining measurements and feasibility check. no gate was loosened. functional final-head checks are still queued behind the existing dev-01 reservation.
exact measurement commands, using the attached unchanged scripts:
all VM access used
timeout 60 netbird ssh claude@calternal-perf-01-backup01.vpn.kayg.org '<command>'or the corresponding perf-02 address. the custom driver setsCALTERNAL_NOTES_SAVE_MS=15andGLIBC_TUNABLES=glibc.malloc.arena_max=2. script sha256ab2176240bb0f4894ccd9689aa803ea45832064d9cc59f386d1c5609795beaf5; filtered native harness sha256352d448a4e7ef2c8099eb38ad02fd2fea2be93b6f7cba6bc83d29bf3cd7ce374.full tables follow. RSS values labelled MB by the native harness are its original labels; custom process values are mib. every early/settled p50/p95 delta and native metric is retained, including regressions.
medians across complete arms; control uses the same-session dev-copy arms. raw failures remain failures.
1000 notes, process
1000 notes, early
1000 notes, settled
1000 notes, native
10000 notes, process
10000 notes, early
10000 notes, settled
10000 notes, native
100000 notes, process
100000 notes, early
100000 notes, settled
100000 notes, native
failures
[]
main-campaign raw artifact: tob-main-3f9ce0fd.tar.gz.
contains all 48 custom arm results, 96 raw RSS series, 16 native JSON reports, numeric-only publication/classification diagnostics, full comparison tables, exact external scripts, and a file hash manifest. server logs and setup output are excluded. results are attached here only and are not committed. the separate 720-second idle results and final validation/cleanup report will follow.
correction to the gate label in comment 79742:
perf/budgets.jsonapplies the 100 ms first-page budget specifically tohome.first_page@100000, an indexed-home reopen. b's native median arm p95 is 4.034 ms versus dev's 4.641 ms, so that named absolute gate passes. the fresh, never-indexed Home response is a separatecold.first_pagemetric: the custom run measured 1,620.156 ms versus 1,603.764 ms, and the native cold values are retained in the full table. the existing JSON does not assign that cold metric the same 100 ms budget. the final gate table will keep these definitions explicit instead of presenting the cold value as a failure of the named warm gate.this corrects a measurement label; no limit changes. b still fails qualification under the unchanged requirement that every hot path be flat or better, and its configured 704 mib aggregate cache allowance still fails the 64 mib bound. the 720-second idle campaign remains running. API append timings are API save measurements, not the editor's websocket
sync.save_ack; no websocket-save budget pass is claimed from them.measured capacity checkpoint, 5 november, 15:52 ist:
first 720-second idle pair: dev 91.01953125 mib, b 74.13671875 mib. these are individual arms, not the final campaign medians; the remaining six arms, including the idle dev-copy control, are still running under both ordered locks.
allocated bytes after the measured server stopped, immediately before deleting that arm's Home:
100 times b's observed per-user allocation is 244,847,820,800 bytes, about 228.03 gib. the entire perf-01 filesystem is only 105,467,994,112 bytes, about 98.23 gib. it therefore cannot materialize 100 equivalent independent Homes, even before leaving the mandatory 15 gib free. this is a feasibility calculation from measured on-disk allocation, not a measured 100-Home runtime result. final clean free bytes and all per-arm footprints will be reported after cleanup.
the full 100×100k / ten simultaneously active envelope will not be seeded unsafely. it remains unrun and fails qualification here; a single 1m-note Home, sparse files, or ten independent server processes will not be presented as a substitute. the 1m active envelope and concurrent first fills are also unqualified. no cache or latency gate changes.
final-head functional validation passed, 5 november, 16:00 ist:
3f9ce0fd6acbbcdcc5100668ebf2b2a50b6c1cb1passed notes all-target compilation, the admission regression, six option-b tests, formatting, strict workspace clippy, the full workspace test command, and release build. notes' full run: 591 passed, 0 failed, 7 ignored. the whole set-e validation job exited 0; rustfmt left zero diff bytes and the VM worktree is clean. the owned 13 gib shared target was removed after all owned dev jobs settled.exact commands on dev-01, through
/nix/var/nix/profiles/default/bin/nix develop -c bash -c "~/bin/slot bash ~/tob-check-body.sh", withCARGO_TARGET_DIR="$HOME/Developer/Worktrees/tiering-option-b/target":the measured artifact is still the immutable
e2d4f96133289356c4770c7fff07746c0921f27db3d4200984482d7f6f12db8c, built at this exact head by release5. the later validation worktree produced93f3b99fc162c5f73fb15fc537db8f405dffcaea5c47a36b3b2853767583f562; that binary has not replaced the measured one or been mixed into any result group. validation records will accompany the final artifact.memory-allowance clarification: the original recommendation in #792 comment 78352 described the temporary map as “about +50 MB at 100k, as dev does all the time.” comparison with dev therefore does not isolate the map: both use it during first fill. the measured paired b-minus-dev peak excess is <=6.348 mib, but that alone cannot certify the original map-memory claim.
these are medians of within-arm gaps, so subtracting the separately reported median peak and median steady values need not give the same median gap. they measure the whole process, including scan/search/projection/allocator effects. they are not an isolated allocation count for the map. under a 50 mib total peak-above-post-fill-steady interpretation, the 100k result exceeds the allowance in every arm (smallest observed gap 56.629 mib). the narrower claim that the map alone costs at most 50 mib remains unverified. the final verdict will not mark the original 50 mib transient claim passed on the strength of the paired dev comparison.
mount check: perf-01 has the measured ext4 root (98.23 gib total) and a rotational xfs
/srv/homesvolume (100 gib total, about 26 gib free), with no mounted/mnt/b/hdd-ext4or/mnt/z4-nvme. neither can accommodate the measured 228.03 gib independent-user footprint for 100 Homes with the required reserve. the scale qualification remains unrun, not a pass.no source changes, adoption, or merge. six idle arms remain to finish.
final option b report, 5 november, 17:16 ist. b fails qualification. no adoption or merge.
head
3f9ce0fd6acbbcdcc5100668ebf2b2a50b6c1cb1; dev baseline9377d711217532a44973edcf63c2af0b7f7969d8. measured head binary sha256e2d4f96133289356c4770c7fff07746c0921f27db3d4200984482d7f6f12db8c. the later validation binary was not mixed into these results. the branch is clean and pushed; the PR stays a draft.completed: 48 custom main arms, 16 native arms (each covering 1k/10k/100k), and eight 100k idle arms. no recorded custom/native failures. main groups are six b, six dev, two dev-copy and two control-dev per size. idle groups are two of each. both locks were acquired in order, perf-01 confirmed ready before requesting perf-02, and held together in each session. all measurements ran on perf-01. both holders are stopped.
main campaign medians, b / dev. fill includes publication. fill steady is specifically the snapshot two seconds after publication, not a claim that all background search work is quiescent. check peak includes kernel VmHWM up to observed warm-check completion; startup steady follows the settled request campaign. rss is whole-process mib.
maximum paired b peak excess over dev: first fill +6.305 mib; warm check +6.348 mib. maximum absolute b fill peak was 298.324 mib; maximum warm-check peak 126.188 mib in the main campaign. the supplemental idle campaign did not exceed these paired excesses.
selected p95 results below show why the no-regression gate fails. all early/settled p50/p95 and native metrics remain in the main table; no noisy control was used to waive a regression.
720-second idle campaign, separate from the main groups:
b/dev idle ratio 0.849045, -15.1%; control ratio 1.020038, +2.0%. final-minute p95 and maximum equal the endpoint in every arm; the raw series and window summaries are attached. the 100 mb idle budget passes for the tested single Home. this does not qualify 100 Homes or concurrent fills.
for the 50 mib comparison, the total process fill peak minus its two-second post-fill rss had a within-arm median gap of 133.426 mib, maximum 199.746 mib, at 100k (minimum 56.629 mib). this exceeds 50 mib if the allowance means total peak above that post-fill snapshot. these gaps include scan/search/projection/allocator effects and are not isolated map allocation. the specific map-memory claim therefore is not marked passed. detailed gap table and exact validation commands: comment 79781.
both stopped b idle Homes used exactly 2,448,478,208 allocated bytes per user: note files 678,334,464; notes metadata/history/identity directory 901,021,696 (including meta.db 846,499,840); search 854,188,032. 100 equivalent independent users require 244,847,820,800 bytes, 228.03 gib, calculated from those measured per-user allocations. this is a capacity feasibility calculation, not a measured 100-Home runtime result. root clean free bytes after cleanup: 79,446,827,008; reserving 15 gib leaves 63,340,699,648. the separate rotational xfs volume has only 27,760,361,472 bytes free. neither fits the envelope; even both entire filesystems together are smaller than the measured required user allocation. no sparse files, single 1m Home, or ten independent processes were substituted.
exact campaign commands, with scripts attached (VM access exclusively
timeout 60 netbird ssh <exact-host> <command>):fresh idle holders used the following on perf-01, waited for its ready marker, then the same command on perf-02; the idle matrix unit had RuntimeMaxSec=6900. main holders and native command expansion are in comment 79742.
no page-cache drop. Home and state were colocated on the ext4 SSD root, matching this lane's A comparison protocol; these are not split HDD/SSD production qualifications.
GLIBC_TUNABLES=glibc.malloc.arena_max=2; custom API saves usedCALTERNAL_NOTES_SAVE_MS=15for both binaries. API append timing is not the editor's websocket sync.save_ack; no websocket-save budget pass is claimed. full scale, concurrent fill and split-storage qualifications remain unrun.cleanup verified: no owned jobs running on dev-01/perf-01/perf-02; both lock holders stopped; all owned seeded work directories and native work directories gone; all four owned dev worktree target directories gone; copied dev/perf binaries removed. small JSON/MD reports and scripts retained. no main checkout was written. branch remains clean, draft, open and unmerged.
full supplemental idle comparisons follow; do not pool their two-arm medians with the six-arm main groups.
medians across complete arms; control uses the same-session dev-copy arms. raw failures remain failures.
100000 notes, process
100000 notes, early
100000 notes, settled
failures
[]
raw artifacts:
server logs/setup output are excluded. all measurements and reports live in these PR comments/attachments, never in committed files.
Orchestrator: option B is rejected. It saves memory (100k settled −10 %, idle −15 %), but reads (+35 %), appends (+22 %) and the tagged page (+41 %, 79 ms against the 50 ms gate) are slower than dev, and no perf regression may merge. A has failed too, so under the rethink rule I'm not patching B any further. A design-only lane is profiling why B is slower and writing
docs/plans/tiering-v3.md, a simpler design that has to keep every hot path at or below dev. This PR stays a draft for reference until v3 decides what to keep or delete.Housekeeping #1009 status: audited head
3f9ce0fd6acbbcdcc5100668ebf2b2a50b6c1cb1against devcd7f84432feb.git cherry origin/dev <head>reports 31 unmatched commits and 0 equivalent patches. Separate stable patch-id indexing and key-file checks do not establish full landing. Absent from dev:crates/notes/src/index/first.rs,crates/notes/src/index/option_b_tests.rs,crates/notes/src/index/paged.rs. Left unchanged as WIP, per kayg’s instruction; no rebase, close, tests, or merge. The #1009 audit records the unmatched commit list.Closing: option B was rejected on measured regressions (see the orchestrator comment above); the tiering design now lives in
docs/plans/tiering-v3.mdand the open slice PRs #970 / #1008. Head3f9ce0fd6acbbcdcc5100668ebf2b2a50b6c1cb1; reopen to revive the measurements. (Housekeeping 2026-11-09 night)Pull request closed