WIP: Bound cold growth and keep child-tag groups fast #755
Closed
kayg
wants to merge 3 commits from
perf/cold-growth-fix3 into perf/cold-growth-fix2
pull from: perf/cold-growth-fix3
merge into: kayg:perf/cold-growth-fix2
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: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!755
Loading…
Reference in a new issue
No description provided.
Delete branch "perf/cold-growth-fix3"
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?
Cold startup work uses bounded identity/stamp snapshots outside foreground metadata locks, with candidates rechecked before commit. Derived stamps, scan-state changes, task path keys and checkbox locations stay compact. Child-tag groups read stable public ids from a covering membership range, removing a task-row lookup per child while mutable task fields remain in their own row. Field edits keep unchanged memberships untouched.
Builds on #727. Derived cache versions trigger a rebuild on next open. Markdown parsing remains in the existing format modules.
Measured on perf-test-01 with HDD Homes, SSD state, guest caches dropped for every cold pass and unchanged limits:
Original fix3 child-tag p95 at 100k was 30.951 / 25.139 / 27.988 ms, all over 25 ms. The covering-id change passes all task gates in all six fresh reports, each with 15 alternating cold pairs. Full task comparisons.
WIP: the additional full server check still fails 100k note-open p95 (18.336 ms > 15) and health readiness (590.659 ms > 300). Other blocking budgets and scenario correctness pass in that check. Earlier source failures, including the WIP 69.755-second cold-index tail, remain retained. The requested PR #727 and original WIP each have three full server reports; the final head has one additional full server report and three task reports per size. Final server comparison.
Validation: 509 scoped Rust tests passed across notes, tasks and memory (six existing ignored tests); affected file-stamp tests, strict clippy with -D warnings, formatting and release build pass. Real SyncClient tests run with frozen-lockfile Bun dependencies installed. The field-edit test also checks child groups while triggers forbid membership rewrites.
Profiles show about 1.197 GB of physical reads per cold pass in both variants, with additional task CPU and writes. perf counters are denied by the guest, so diagnostics use strace and process/I/O counters. Instrumented passes are excluded from gate repetitions. Historical dev cold values stop at list-ready; candidate cold timing includes shutdown, empty WAL and sync -f. Profile evidence.
Refs #686. Evidence is in issue comments and outside git; no limits changed.
Starting the startup regression investigation on perf/cold-growth-fix3, base and current head
1d03e06f4a. I will compare cold startup on dev and this head at 100k notes using perf-run.sh, cache drops, strace and process I/O counters, and post the cause before changing code. Then I will run three fresh full server reports at each size and the task and Rust gates. The final task instruction to push only this branch takes precedence over the generic new-branch instruction. No merge or deployment.The quota registration fix and readiness tests are implemented. The blocked-registration test failed before the fix (startup waited for watcher registration) and now passes, including initial accounting while registration is blocked. All 40 fsio tests pass. A real-binary test also passes: /healthz answers, the first upload is rejected with storage_quota when existing Home files fill the allowance, and an upload succeeds after the allowance is raised. Existing startup tests pass.
Strict clippy initially rejected direct File::create in the new test; it now uses the existing atomic write helper. Fresh fmt and strict clippy for memory, notes, tasks, fsio and calternal now pass. Scoped tests pass: memory 3, notes 455 with 6 existing ignored, tasks 51. Auth quota tests pass 2 with 1 existing ignored perf-only test. Independent read-only code review found no critical or important issues; it checked register-before-recount, initial admission, fallback polling and weak-reference ownership. The release build and final perf reports follow. No budget or format rules changed.
All three fresh full server reports are complete at
6d801fc35c. startup.healthz p95 passes 3/3 at both sizes: 10k 99.726909 / 101.744509 / 79.749679 ms; 100k 155.622284 / 136.358095 / 150.769641 ms, all against the unchanged 300 ms budget. These are full reports with 5 warm starts, 3 cold starts and the 300-second idle window per size; 17 internal cache drops per report plus the perf-run preflight drop. No repetitions were replaced.Each report exits 1 solely for the known 100k open.note budget failure. Gate output verbatim:
The complete raw report tables and output are in comments 68786, 68804 and 68836 on #686. The first of six fresh task reports is now running. Those will verify cold growth, all five task gates and child-tag p95 before the branch is pushed.
Startup regression fix finished at
6d801fc35c, on perf/cold-growth-fix3. Recursive quota watcher registration now runs on the quota worker rather than inside auth construction. Registration still precedes its repair recount, and upload admission still waits for initial accounting. Root cause profiles were posted before the fix in comment 68725.Three fresh full server reports, with no replaced repetitions, the original 5 warm starts and 3 cold starts at each size, and the 300-second idle window:
Fresh task reports, each with 15 alternating cold pairs, cache drops and the original settled-shutdown, empty-WAL, sync endpoint:
Readiness tests: blocked native registration cannot block startup or initial usage accounting (failed before the fix, passed after); the real binary rejects the first upload after healthz when existing files fill quota and accepts it after quota increases. Fsio tests pass 40; existing startup tests pass 5 with 1 existing ignored latency test, plus the new quota test. Memory 3, notes 455, tasks 51 pass, with 6 existing ignored notes tests. Auth quota tests pass 2 with 1 existing ignored perf test. Independent review found no critical or important issue.
The known open.note storage-tiering failure is retained in the server gate output below and was not chased. No budget changed. Fixture Homes and state are deleted. Only product code and tests were committed; evidence remains in issue comments and the job evidence folder. No merge or deployment.
Rust gates, verbatim:
Report and integrity gates, verbatim:
Full report comments:
Push result, verbatim:
Forgejo PR #755 head after push:
6d801fc35c.Independent verification started on branch review/755-tests at base/head
6d801fc35c. Reviewing the whole chain against devd83e54db, quota readiness windows and crash/migration correctness, and overlap with PR #754. No merges, deployments or perf workloads.P1: quota admission can use stale totals while background registration is blocked. Reproducer: hold Usage.watcher mutex, call background(), ensure() once on an empty Home, write ten bytes with std::fs::write, then call ensure() again. bytes(person) remains 0, expected 10; a one-byte upload with quota 10 would be admitted by Auth::admit. Independent regression outside_growth_after_first_admission_must_count_before_registration fails deterministically: left 0, right 10. Later registration recount repairs totals, but cannot undo an already acknowledged over-quota upload. Window mutation/reconciliation and abrupt process-exit/reopen companion tests pass. The first-upload test only covers existing files before the first ensure, so misses this second-admission case.
Overlap with PR #754
#755
6d801fc3; #754967dd3e892All files changed by both chains against dev:
Functions changed in both chains (including methods moved into watch.rs):
#755 changed: entry_info, for_each_name, names
#754 changed: child_name, child_stat, location, names, open, open_child, open_root, open_sub, verify_location
#755 changed: background, directory_move_during_recount_retries_with_relative_paths, moved, person, person_key, recording, recount_uses_relative_keys_and_ignores_symlinks, recount_using, refresh_using, walk, with_state
#754 changed: a_separate_state_root_counts_what_plugins_report, accounted_path, background, bulk_writes_and_published_folders_count_without_a_recount, drop, moved, person, reads_do_not_wait_for_the_counter_writer, recount, recount_preserves_concurrent_writes_and_deletes, recount_using, refresh, refresh_using, repair, repair_snapshot, stale_metadata_cannot_replace_a_newer_update, storage_failure, walk, with_state, writes_moves_trash_and_purge_update_without_a_recount, wrote
#755 changed: apply, background, deleted_paths_do_not_accumulate_without_periodic_recounts, outside_writes_and_directory_renames_repair_usage, poll, start, watch, watcher_registration_never_blocks_startup_or_initial_accounting
#754 changed: a_file_removed_before_native_watch_install_is_transient, apply, fallback_recounts_when_due_even_with_queued_events, gather_until, gathering_stops_at_its_deadline_even_with_queued_events, native, run, start, sync_inodes, wait_for_work
Usage::background is changed in both chains but #755 moves it into watch.rs; start is a file-local function in #755 and module entry point in #754. The shared names do not imply equivalent interfaces. watch/apply and recount_using have incompatible event/state models.
How to combine:
a779a46f, even though it is not in the intersection of changes relative tod83e54db. Keep only measurements supported by the combined head. No evidence should be copied into the repo.merge-tree command: git merge-tree --write-tree
6d801fc3origin/perf/idle-honest-2Exit: 1 (conflicts); no worktree merge performed.
88720a7b6a234536fb96d33096549ce5ba57d9e2
100644
eeda9f66281 Cargo.lock100644
8c469813622 Cargo.lock100644
07b47a7c063 Cargo.lock100644
0ef728454f1 crates/fsio/Cargo.toml100644
1e16efb5b32 crates/fsio/Cargo.toml100644
f7c1d4b8bc3 crates/fsio/Cargo.toml100644
281a81a8e01 crates/fsio/src/beneath.rs100644
6a9c8779292 crates/fsio/src/beneath.rs100644
c8e494f59f3 crates/fsio/src/beneath.rs100644
8e9c05c56c1 crates/fsio/src/usage.rs100644
438c0a7eb42 crates/fsio/src/usage.rs100644
9c15cd25693 crates/fsio/src/usage.rs100644
3d959e835c2 crates/fsio/src/usage/watch.rs100644
06b136ae7e3 crates/fsio/src/usage/watch.rs100644
721223882d1 docs/perf/web.md100644
5e81e1ecfa2 docs/perf/web.md100644
c53bf6b5cf3 docs/perf/web.mdAuto-merging Cargo.lock
CONFLICT (content): Merge conflict in Cargo.lock
Auto-merging crates/fsio/Cargo.toml
CONFLICT (content): Merge conflict in crates/fsio/Cargo.toml
Auto-merging crates/fsio/src/beneath.rs
CONFLICT (content): Merge conflict in crates/fsio/src/beneath.rs
Auto-merging crates/fsio/src/usage.rs
CONFLICT (content): Merge conflict in crates/fsio/src/usage.rs
Auto-merging crates/fsio/src/usage/watch.rs
CONFLICT (add/add): Merge conflict in crates/fsio/src/usage/watch.rs
Auto-merging docs/perf/web.md
CONFLICT (content): Merge conflict in docs/perf/web.md
P1 follow-up: the independent test now exercises the real Auth::admit path, with a fresh Usage counter in the same state as a worker stalled before registration. An initial admission snapshots an empty Home; an outside program writes ten bytes under quota 10; the next one-byte admission succeeds. The workspace run fails quota::independent_review_755::second_upload_during_registration_must_count_outside_growth with: "accepted an upload although outside bytes exhausted quota". This confirms the admission failure directly, beyond the counter-level reproducer. No product code was changed.
P2: the new quota recount silently omits valid native filesystem entries. Reproducer: on Unix create users/person/Documents/invalid- with 7 bytes and a filename containing a backslash with 9 bytes, then Usage::ensure(). Independent test independent_review_755_recount_preserves_native_outside_filenames reports 0 bytes, expected 16. Folder::for_each_name converts invalid UTF-8 with to_string_lossy before entry_info stats that new name; the original file is missed. entry_info also calls single/plain_parts, rejecting the valid native backslash name. recount ignores both errors, publishes ready=true and charges neither file. This is persistent even after registration/recount, unlike the P1 window. Dev used native read_dir paths and counted these files. Reproduce: source /etc/calternal/env.sh; /usr/local/bin/build-slot.sh cargo test -j3 -p calternal-fsio independent_review_755_recount_preserves_native_outside_filenames -- --nocapture. Combine the optimization with #754 using exact OsStr child names and descriptor-relative stats, preserving its failure handling.
Gate output verbatim. Command:
cargo fmt --all -- --check. Exit: 0. Final tests branch head:edba00ec64.Part 1/1.
Gate output verbatim. Command:
cargo clippy -j3 --workspace --all-targets -- -D warnings. Exit: 0. Final tests branch head:edba00ec64.Part 1/1.
Gate output verbatim. Command:
cargo test -j3 --workspace --no-fail-fast. Exit: 101. Final tests branch head:edba00ec64.The full run was at
108a711b; the only later change is one test-only lint allowance for an intentional outside-program write. No test behavior changed.Part 1/3.
Gate output verbatim. Command:
cargo test -j3 --workspace --no-fail-fast. Exit: 101. Final tests branch head:edba00ec64.The full run was at
108a711b; the only later change is one test-only lint allowance for an intentional outside-program write. No test behavior changed.Part 2/3.
Gate output verbatim. Command:
cargo test -j3 --workspace --no-fail-fast. Exit: 101. Final tests branch head:edba00ec64.The full run was at
108a711b; the only later change is one test-only lint allowance for an intentional outside-program write. No test behavior changed.Part 3/3.
Independent verification finished. Verdict: fix first.
Reviewed #755 head
6d801fc35cagainst devd83e54dbacross the whole chain. Tests only are pushed to review/755-tests, headedba00ec64.PR #754 head
967dd3e892overlaps in Cargo.lock, crates/fsio/Cargo.toml, crates/fsio/src/beneath.rs, crates/fsio/src/usage.rs and crates/fsio/src/usage/watch.rs. merge-tree exits 1 with conflicts in all five plus docs/perf/web.md. The earlier overlap comment lists every shared function and how to combine them. Retain #754 containment/inode accounting and adapt the iteration optimization; fix trustworthy admission during registration in the combined implementation.Gates: fmt exit 0; workspace clippy with -D warnings exit 0; full workspace tests exit 101, with 1,222 passed, 4 failed, 20 ignored. All four failures are the new quota regressions above. The known Tasks abrupt-stop test passed on its first run; no #757 rerun was needed. A final clippy check first caught the test's intentional std::fs::write; a test-only allowance fixed that lint, with no behavior change, and clippy passed again.
No perf workloads were run, so the cold-growth and startup p95 claims are not independently certified. These tests cover filesystem entry points and the actual admission policy, not every HTTP scheduling interleaving or power loss. No product changes, merges or deployments. The intentionally failing regressions remain enabled.
Full gate output verbatim:
Starting the combination on branch perf/cold-growth-on-754, from #755 base head
6d801fc3onto #754 heade8a99a6f. I will preserve reviewer tests, fix admission before watch registration, and run the required correctness and perf gates. Fetching current refs before making changes.Combined #755 with #754 head
e8a99a6fand merged reviewer testsedba00ec. Conflicting resolver, scan, inode accounting and recovery files retain #754 implementation, including its reviewer branches. Native invalid UTF-8 and backslash names now pass without a separate scanner. The reviewer tests were adapted only to the replacement background-state mutex.Admission now recounts the uploading Home through the bounded resolver on every admission before native registration and its closing recount succeed. This deliberately does not cache across unobserved outside changes: those cannot advance an application generation. Readiness and reads still do not wait for registration. Fallback keeps fresh admission enabled until coverage recovers.
Targeted regression output verbatim:
Full workspace and performance checks follow; these targeted results are not performance certification.
The first full workspace run found an integration requirement retained by #754: known storage measurement failures must block all admissions until a full successful recount clears Health. The new Home-only path initially bypassed an unrelated retained failure. Evidence verbatim:
I preserved the test and restored that contract: admission retries a full recount when there is a retained failure, then uses a fresh per-Home recount while registration is incomplete. No failure is cleared by a scoped success. The complete workspace gate will be run again.
Full workspace tests at head
30f65caf: 1302 passed, 0 failed, 21 ignored. The Tasks abrupt-stop test passed on the first run; no #757 rerun was needed. Output verbatim, part 1/4:Full workspace tests at head
30f65caf: 1302 passed, 0 failed, 21 ignored. The Tasks abrupt-stop test passed on the first run; no #757 rerun was needed. Output verbatim, part 2/4:Full workspace tests at head
30f65caf: 1302 passed, 0 failed, 21 ignored. The Tasks abrupt-stop test passed on the first run; no #757 rerun was needed. Output verbatim, part 3/4:Full workspace tests at head
30f65caf: 1302 passed, 0 failed, 21 ignored. The Tasks abrupt-stop test passed on the first run; no #757 rerun was needed. Output verbatim, part 4/4:Gate output verbatim:
Correctness and build gates passed at head
30f65cafb0. The workspace run passed 1302 tests with 21 ignored and no failures; full output is posted in the preceding four comments. The known Tasks abrupt-stop test passed on its first run.Gate output verbatim:
Strict clippy output verbatim:
Perf harness tests verbatim:
Release build output verbatim:
Starting three fresh full server reports at each of 10k and 100k, plus three 15-pair task comparisons per size, under perf-run.sh and its perf lock. The binaries are snapshotted in the job evidence folder and hashed. Every cold sample requires a successful sudo perf-drop-caches call. Budget SHA-256 is unchanged from #754: 719266cf043e49cfc54cdaf9cd5b17114c44c753b452595885d13ece83d68d8d. All reports, including any failed gates and open.note values, will be retained.
The first measurement driver launch stopped before creating a fixture or starting a report: /srv/homes itself is root owned and mkdir returned PermissionError. The writable shared perf parent is /srv/homes/perf, on the same HDD xfs mount. The driver now creates a unique job-owned child there; no other job directory is read or removed. Measurements have restarted there with the same head and binaries. No failed or warm-cache sample has been counted.
Fresh full server report 1/3 on perf-test-01, head
30f65cafb0. HDD Homes /srv/homes (xfs), SSD state (ext4). Five warm starts, three unindexed starts, full scenarios and a 300-second idle window per size. Run through perf-run.sh, perf-lock.sh and build-slot.sh. Cache drops succeeded before the outer command and 17 times inside the harness; expected internal count is 17. Elapsed 1240.8 seconds. Fixture Homes and state for this report have been deleted. No budgets changed.Report verbatim:
Machine: Homes: Linux 6.12.113+deb13-amd64 · 4 CPUs · 7.7Gi RAM · disk /dev/sda1 xfs (rotational) · state: Linux 6.12.113+deb13-amd64 · 4 CPUs · 7.7Gi RAM · disk /dev/sdb1 ext4 (non-rotational)
10000 notes (3000 daily, 35 MB, 5 long notes)
100000 notes (10000 daily, 422 MB, 50 long notes)
Gate output verbatim:
Binary and budget SHA-256:
First report at
30f65caffound 100k idle RSS 101.2421875 MB, above the unchanged 100 MB budget. Startup passed at 103.0548 ms (10k) and 124.030435 ms (100k); idle CPU and wakeups were zero. Known open.note remains over at 17.608797 ms. Full report and gates are retained in comments 68984/68985. I stopped only the recorded PID of my own driver after its current 10k task child finished with exit status 0, before it could start more repetitions. All of this attempt’s fixture Homes and state are deleted.The completed 10k task comparison passed all five gates, with 30 successful internal cache drops and cold growth 2.6819931549055687%. Gate output verbatim:
I am removing duplicate per-inode watch bookkeeping while keeping the resolver, watch coverage and event policy unchanged, then rebuilding and rerunning the required three reports at each size. The failed attempt remains evidence.
RSS follow-up: the inode registry duplicated an Arc already retained by the event index. The registry now stores only the watch token, and checks the selected native path plus inode identity in that event index. This removes 16 bytes per hash bucket on x86_64, about 2 MiB at 100k entries, without reducing coverage or adding scans. The existing alias-removal/move regression still checks the selected event name and then writes through an outside hard link; its private introspection now reads the event index rather than a removed field. All assertions remain. The first compile correctly caught those two stale test field references; they were adapted and the full workspace gate is running again.
The completed first-attempt 10k comparison had child-tag p95 2.949991 ms and cold growth 2.6819931549055687%, with all five gates passing. Its full raw measurements are retained here:
Full workspace tests after the RSS correction, head
d23e80b9. 1302 passed, 0 failed, 21 ignored. The Tasks abrupt-stop test passed first try again; no #757 rerun. Output verbatim, part 1/4:Full workspace tests after the RSS correction, head
d23e80b9. 1302 passed, 0 failed, 21 ignored. The Tasks abrupt-stop test passed first try again; no #757 rerun. Output verbatim, part 2/4:Full workspace tests after the RSS correction, head
d23e80b9. 1302 passed, 0 failed, 21 ignored. The Tasks abrupt-stop test passed first try again; no #757 rerun. Output verbatim, part 3/4:Full workspace tests after the RSS correction, head
d23e80b9. 1302 passed, 0 failed, 21 ignored. The Tasks abrupt-stop test passed first try again; no #757 rerun. Output verbatim, part 4/4:Gate output verbatim:
Restarting measurement at head
d23e80b949. Full workspace tests passed again (1302 passed, 0 failed, 21 ignored; verbatim output in comments 68995–69009). The Tasks abrupt-stop test passed first try, so no #757 rerun.Gate output verbatim:
Clippy output verbatim:
Release build output verbatim:
Each size now gets its own complete server report, starting with 100k so an RSS breach is detected earlier. This still runs three fresh reports per size with five warm starts, three cold starts and a 300-second idle window, plus three task comparisons per size. Each single-size server report requires 9 successful internal cache drops; each task comparison requires 30. Fixture path depth and length match the first attempt; no shorter path is used to obtain a pass. Budgets are unchanged. Unexpected gate failures stop the driver between workloads after recording evidence. Known open.note remains fully gated and reported but does not prevent collecting the remaining requested reports.
Fresh full server report 1/3 at 100000 notes on perf-test-01, head
d23e80b949. HDD Homes /srv/homes/perf (xfs), SSD state (ext4). Five warm starts, three unindexed starts, full scenarios and a 300-second idle window. Run through perf-run.sh, perf-lock.sh and build-slot.sh. Cache drops succeeded before the outer command and 9 times inside the harness; expected internal count is 9. Elapsed 680.0 seconds. Fixture Homes and state for this report have been deleted. No budgets changed.Report verbatim:
Machine: Homes: Linux 6.12.113+deb13-amd64 · 4 CPUs · 7.7Gi RAM · disk /dev/sda1 xfs (rotational) · state: Linux 6.12.113+deb13-amd64 · 4 CPUs · 7.7Gi RAM · disk /dev/sdb1 ext4 (non-rotational)
100000 notes (10000 daily, 422 MB, 50 long notes)
Gate output verbatim:
Binary and budget SHA-256:
Tasks report 1/3 at 100000 base notes plus 100000 task notes on perf-test-01, head
d23e80b949. The cold comparison uses 15 alternating pairs and includes shutdown, an empty WAL and sync -f. Successful internal cache drops: 30, expected 30. The outer perf-run.sh cache drop also succeeded. Elapsed 736.4 seconds. Fixture Homes and state deleted.Output verbatim:
All measurements and raw cold samples:
Gate output verbatim:
Fresh full server report 1/3 at 10000 notes on perf-test-01, head
d23e80b949. HDD Homes /srv/homes/perf (xfs), SSD state (ext4). Five warm starts, three unindexed starts, full scenarios and a 300-second idle window. Run through perf-run.sh, perf-lock.sh and build-slot.sh. Cache drops succeeded before the outer command and 9 times inside the harness; expected internal count is 9. Elapsed 541.9 seconds. Fixture Homes and state for this report have been deleted. No budgets changed.Report verbatim:
Machine: Homes: Linux 6.12.113+deb13-amd64 · 4 CPUs · 7.7Gi RAM · disk /dev/sda1 xfs (rotational) · state: Linux 6.12.113+deb13-amd64 · 4 CPUs · 7.7Gi RAM · disk /dev/sdb1 ext4 (non-rotational)
10000 notes (3000 daily, 35 MB, 5 long notes)
Gate output verbatim:
Binary and budget SHA-256:
Tasks report 1/3 at 10000 base notes plus 10000 task notes on perf-test-01, head
d23e80b949. The cold comparison uses 15 alternating pairs and includes shutdown, an empty WAL and sync -f. Successful internal cache drops: 30, expected 30. The outer perf-run.sh cache drop also succeeded. Elapsed 67.7 seconds. Fixture Homes and state deleted.Output verbatim:
All measurements and raw cold samples:
Gate output verbatim:
Fresh full server report 2/3 at 100000 notes on perf-test-01, head
d23e80b949. HDD Homes /srv/homes/perf (xfs), SSD state (ext4). Five warm starts, three unindexed starts, full scenarios and a 300-second idle window. Run through perf-run.sh, perf-lock.sh and build-slot.sh. Cache drops succeeded before the outer command and 9 times inside the harness; expected internal count is 9. Elapsed 687.8 seconds. Fixture Homes and state for this report have been deleted. No budgets changed.Report verbatim:
Machine: Homes: Linux 6.12.113+deb13-amd64 · 4 CPUs · 7.7Gi RAM · disk /dev/sda1 xfs (rotational) · state: Linux 6.12.113+deb13-amd64 · 4 CPUs · 7.7Gi RAM · disk /dev/sdb1 ext4 (non-rotational)
100000 notes (10000 daily, 422 MB, 50 long notes)
Gate output verbatim:
Binary and budget SHA-256:
Tasks report 2/3 at 100000 base notes plus 100000 task notes on perf-test-01, head
d23e80b949. The cold comparison uses 15 alternating pairs and includes shutdown, an empty WAL and sync -f. Successful internal cache drops: 30, expected 30. The outer perf-run.sh cache drop also succeeded. Elapsed 740.0 seconds. Fixture Homes and state deleted.Output verbatim:
All measurements and raw cold samples:
Gate output verbatim:
Fresh full server report 2/3 at 10000 notes on perf-test-01, head
d23e80b949. HDD Homes /srv/homes/perf (xfs), SSD state (ext4). Five warm starts, three unindexed starts, full scenarios and a 300-second idle window. Run through perf-run.sh, perf-lock.sh and build-slot.sh. Cache drops succeeded before the outer command and 9 times inside the harness; expected internal count is 9. Elapsed 541.6 seconds. Fixture Homes and state for this report have been deleted. No budgets changed.Report verbatim:
Machine: Homes: Linux 6.12.113+deb13-amd64 · 4 CPUs · 7.7Gi RAM · disk /dev/sda1 xfs (rotational) · state: Linux 6.12.113+deb13-amd64 · 4 CPUs · 7.7Gi RAM · disk /dev/sdb1 ext4 (non-rotational)
10000 notes (3000 daily, 35 MB, 5 long notes)
Gate output verbatim:
Binary and budget SHA-256:
Tasks report 2/3 at 10000 base notes plus 10000 task notes on perf-test-01, head
d23e80b949. The cold comparison uses 15 alternating pairs and includes shutdown, an empty WAL and sync -f. Successful internal cache drops: 30, expected 30. The outer perf-run.sh cache drop also succeeded. Elapsed 68.5 seconds. Fixture Homes and state deleted.Output verbatim:
All measurements and raw cold samples:
Gate output verbatim:
Fresh full server report 3/3 at 100000 notes on perf-test-01, head
d23e80b949. HDD Homes /srv/homes/perf (xfs), SSD state (ext4). Five warm starts, three unindexed starts, full scenarios and a 300-second idle window. Run through perf-run.sh, perf-lock.sh and build-slot.sh. Cache drops succeeded before the outer command and 9 times inside the harness; expected internal count is 9. Elapsed 692.0 seconds. Fixture Homes and state for this report have been deleted. No budgets changed.Report verbatim:
Machine: Homes: Linux 6.12.113+deb13-amd64 · 4 CPUs · 7.7Gi RAM · disk /dev/sda1 xfs (rotational) · state: Linux 6.12.113+deb13-amd64 · 4 CPUs · 7.7Gi RAM · disk /dev/sdb1 ext4 (non-rotational)
100000 notes (10000 daily, 422 MB, 50 long notes)
Gate output verbatim:
Binary and budget SHA-256:
Tasks report 3/3 at 100000 base notes plus 100000 task notes on perf-test-01, head
d23e80b949. The cold comparison uses 15 alternating pairs and includes shutdown, an empty WAL and sync -f. Successful internal cache drops: 30, expected 30. The outer perf-run.sh cache drop also succeeded. Elapsed 784.5 seconds. Fixture Homes and state deleted.Output verbatim:
All measurements and raw cold samples:
Gate output verbatim:
Fresh full server report 3/3 at 10000 notes on perf-test-01, head
d23e80b949. HDD Homes /srv/homes/perf (xfs), SSD state (ext4). Five warm starts, three unindexed starts, full scenarios and a 300-second idle window. Run through perf-run.sh, perf-lock.sh and build-slot.sh. Cache drops succeeded before the outer command and 9 times inside the harness; expected internal count is 9. Elapsed 542.0 seconds. Fixture Homes and state for this report have been deleted. No budgets changed.Report verbatim:
Machine: Homes: Linux 6.12.113+deb13-amd64 · 4 CPUs · 7.7Gi RAM · disk /dev/sda1 xfs (rotational) · state: Linux 6.12.113+deb13-amd64 · 4 CPUs · 7.7Gi RAM · disk /dev/sdb1 ext4 (non-rotational)
10000 notes (3000 daily, 35 MB, 5 long notes)
Gate output verbatim:
Binary and budget SHA-256:
Tasks report 3/3 at 10000 base notes plus 10000 task notes on perf-test-01, head
d23e80b949. The cold comparison uses 15 alternating pairs and includes shutdown, an empty WAL and sync -f. Successful internal cache drops: 30, expected 30. The outer perf-run.sh cache drop also succeeded. Elapsed 68.0 seconds. Fixture Homes and state deleted.Output verbatim:
All measurements and raw cold samples:
Gate output verbatim:
Finished at head
d23e80b949. New draft PR: #760. Measured integration base:e8a99a6f. PR target: perf/idle-honest-2, now ata6b1fa14.The measured integration base is the task’s explicitly requested
e8a99a6fee. During this run, the target branch perf/idle-honest-2 advanced toa6b1fa14d2. PR #760 is a draft with conflicts against that newer head in crates/auth/src/quota.rs, crates/fsio/src/usage.rs and crates/fsio/src/usage/watch.rs. The tested source remainsd23e80b9one8a99a6f. Newer quota retry and admission changes are outside these measurements; integration witha6b1fa14remains follow-up work. The open-PR branch rule requires a new branch and PR for any further code update.Quota admission and native-name regressions are fixed; all reviewer assertions remain enabled. All requested startup, cold growth, task, child-tag and idle gates pass 3/3 per size. Known open.note remains over its unchanged 15 ms budget: 100000 notes report 1: 19.793982 ms; 100000 notes report 2: 20.753939 ms; 100000 notes report 3: 18.815419 ms. This is kept visible in the server gate output.
Budgets are unchanged. Every server report recorded 9 successful internal cache drops; every task comparison recorded 30. The outer perf-run.sh drops also succeeded. Each full server report has five warm starts, three cold starts and a 300-second idle window; task comparisons use 15 alternating cold pairs. All fixture Homes and state are deleted. The failed earlier RSS report remains in comments 68984/68985. No pull request was merged and nothing was deployed.
Correctness and build gate output verbatim:
Workspace total: 1302 passed, 0 failed, 21 ignored. The Tasks abrupt-stop test passed first try; no #757 rerun. Full workspace output is in comments 68995–69009.
server-10000-1 gate output verbatim:
tasks-10000-1 gate output verbatim:
server-10000-2 gate output verbatim:
tasks-10000-2 gate output verbatim:
server-10000-3 gate output verbatim:
tasks-10000-3 gate output verbatim:
server-100000-1 gate output verbatim:
tasks-100000-1 gate output verbatim:
server-100000-2 gate output verbatim:
tasks-100000-2 gate output verbatim:
server-100000-3 gate output verbatim:
tasks-100000-3 gate output verbatim:
The measured integration base is the task’s explicitly requested
e8a99a6fee. During this run, the target branch perf/idle-honest-2 advanced toa6b1fa14d2. PR #760 is a draft with conflicts against that newer head in crates/auth/src/quota.rs, crates/fsio/src/usage.rs and crates/fsio/src/usage/watch.rs. The tested source remainsd23e80b9one8a99a6f. Newer quota retry and admission changes are outside these measurements; integration witha6b1fa14remains follow-up work. The open-PR branch rule requires a new branch and PR for any further code update.The final fetch found these new base commits, all after the approved
e8a99a6f:Read-only merge-tree output verbatim:
The task requested
e8a99a6f, so this job preserves that measured integration and records the concurrent target movement. No additional code was pushed after opening the draft. Final headd23e80b949; draft #760. All measured results and original failed attempts remain in this thread. Fixture Homes and state are deleted; evidence is outside commits.Closing per #931: cold-growth work continues in #767.
Pull request closed