Plan amendment: quota under real workloads (#764) #769
Open
kayg
wants to merge 33 commits from
docs/quota-plan-2 into dev
pull from: docs/quota-plan-2
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: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!769
Loading…
Reference in a new issue
No description provided.
Delete branch "docs/quota-plan-2"
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?
App saves currently trigger repeated whole-Home recounts: the supplied perf VM results show 26.6–26.8% typing CPU and a roughly 15 s cold recount at 100k files. Amend the quota plan before implementation with 22 workload cases, exact own-write deltas and checked echo receipts, explicit same-path outside-writer invalidation, a restart recommendation, perf gates and an updated failure table.
Recommend optimizing the complete cold recount and requiring successful 100k admission within 2 s. Persisted totals remain hints without proven durable change detection; far-below quota does not bound arbitrary offline changes. The amendment also identifies legacy single-root SQLite/WAL churn and the #761 two-tree counting boundary as requirements to resolve before claiming a typing pass.
Only
docs/plans/0754-quota.mdchanges. Based onperf/quota-simpleata506b739f0. No product code or deployment.Validation:
git diff --checkpassed; scope check confirms only the quota plan changes.Refs #764, #767 and #761.
Independent design review — round 1 of at most 3.
Verdict: approve with required edits. The direction is sound: exact deltas for proven app publications, conservative recounts for ambiguity, and a measured cold recount rather than trusting offline totals. Three requirements below need to be explicit before this becomes the implementation contract. This is approval of the design direction, not of a working fast path or its performance.
Reviewed PR #769,
docs/quota-plan-2at6c3f7f8a4f68b180c79f377b076d07fa93d7e62b, againstperf/quota-simpleata506b739f001c85336ae8a234aadbfcd2d78e3f2. Fresh detached worktree:/home/agent/wt/review-769, on10by32-01-std. Read the entire plan, scanner/watch/event/fence code, Auth and HTTP admission, file publication and note-save paths, state-root setup, and Contacts history accounting. Read the seven #754 review reports and the #764 review/follow-up reports, and inspected the reviewer branch test inventory and relevant historical tests, including round-3 mode transitions. No product or test code was changed. No build, runtime test, perf run, merge or deployment was performed for this docs-only review.Required edits, in priority order
P2 — Define the new-inode coverage handoff, including a size observation after watch installation. At plan lines 163–171, spell out what “verified owned coverage extension” proves before it can avoid R. Pin the exact inode; establish its watch incarnation; then read/validate its chargeable size, type, link count and mount/domain identity through the pinned object under that coverage. Check publication endpoints and drain the ordered fence before certifying the resulting total. A size captured while preparing the file is insufficient. A mismatch must dirty/refuse or enter another explicitly validated transition, never keep the original payload length as verified authority. If staging is to provide an alternative continuity proof, specify that proof.
Concrete missing interleaving: prepare and close an 8-byte named staging file; an outside writer extends that same inode to 1,009 bytes before its inode watch is installed; install the watch and publish it. No inode MODIFY predating installation will be replayed. Identity and rename cookie can still match. A receipt using the prepared length would certify 8 bytes and could permit an upload against a 100-byte limit. Watching “before exposure” alone does not close this interval. Today
watch_identityverifies identity/type beforeinotify_add_watch, and new registration dirties the Home (watch/linux.rs:160–213); that invalidation forces another observation. The amendment deliberately introduces an exception, so its replacement proof must be explicit. This is a design gap, not a reproduced bug in an implementation that does not yet exist.Add this exact pre-watch growth/truncate/replace adversary to the required deterministic tests, alongside the already requested after-publication tests. A correct implementation can retain D(1): this needs a local covered observation, not a Home walk.
P2 — Specify receipt concurrency and make its tests explicit. At lines 153–181 and 208–213, require the same per-person publication/accounting serialization for note saves, uploads, companion writes, rename/delete and provider transitions that participate in the verified total. Define the point at which a receipt becomes eligible to consume events, when its delta becomes visible to admission, and when it is retired. Either keep serialization through the closing fence/accounting commit or specify how unresolved receipts prevent stale admission. Concurrent staging is fine. The event reader must not need a publication lock held by a writer waiting for its fence.
Add named cases for two prepared app writes to the same destination, two different destinations in one Home, a save racing a real Auth upload, and a recount/watch-prune racing publication. Delay delivery across receipt registration, delta commit and retirement; interleave directory and inode notifications and back-to-back replacement cookies. Assert exactly-once accounting and real allowed/refused Auth outcomes. A receipt must never consume another operation's event or let a failed/stale operation clear newer dirtiness. Preserve the one-reader kernel ordering; test userspace scheduling permutations rather than treating arbitrary kernel event reordering as normal.
The plan already mentions accounting sequence, watch generations and races at every boundary. These edits turn that general requirement into an auditable contract for the specifically requested two-writes-in-flight case. Today's Auth guard covers uploads (
auth/src/quota.rs:80–127); the note placement path independently invokesPrepared::place, so a common lock cannot be assumed to exist already.P2 — Make both state layouts explicit merge gates, and state how the default layout gets the typing fix. Lines 143–146 correctly acknowledge the problem, but leave a central supported configuration unresolved. Require W01/W02/W07/W09 to run separately on (i) an existing default installation with no
--state, including preexisting DB/WAL/SHM files, and (ii) a separate-state installation. Before accepting the product change, choose and document either a safe state migration with its crash/recovery and charge-preservation rules, or a proven accounting protocol for those in-place DB writes. If the choice is deferred, explicitly keep the product merge blocked for the default layout; a split-state-only typing pass cannot satisfy the fix.Tie those variants to the existing 60-second typing/zero-own-save-R/≤2% gate and exact-charge oracle, and require a W01–W22 evidence checklist on the final product head before product merge. For capacity/known-failure variants, record the actual exercised limit/failure, bounded refusal and measured recovery where recovery is possible; a skipped/unrun cell is missing evidence. Identify which 1M/100-Home cells document unsupported capacity rather than promise successful ≤2-second admission. This preserves the plan's honest limits without letting '?' or an expected failure hide an unexecuted workload.
Own-write suppression assessment
The amendment is substantially stronger than a pathname/time window. An app operation ID is only an application key; it does not identify the writer of a kernel event. The safe part of this design is that completed staging removes legitimate app content MODIFY events from the suppressible set. The receipt then accounts for a narrowly verified namespace/lifecycle transition. Subject to edits 1–2, the requested cases have conservative outcomes:
Keep the earlier containment obligations literally operative: raw names and fd-relative no-follow descent, device/mount-ID exclusion and mountinfo readiness, all-owner alias invalidation, watch-incarnation protection, bounded retries/queues, and no admission from fallback/provisional totals. In particular, preserve the anti-vacuity checks: actual configured inode reuse, actual kernel overflow in its explicit test, exact successful reads, and positive allowed Auth admissions after recovery. The old #764 non-linearizable fallback reproducer must continue to refuse.
Three workload spot checks against
a506b739Prepared::newcloses a flushed image andPrepared::placeexchanges/places it; the successful callback reachesusage::wrote.Usage::changedadds a provisional amount and dirties the Home (usage.rs:528–534), and ordinary native events also dirty it. Therefore repeated full recounts are a credible explanation of the reported CPU result. D(1) is a proposed outcome, correctly conditional on receipt coverage and the state boundary; it is not current behavior.statxsupplying size/type/inode/mount ID per eligible regular name (scan.rs:82–106, 228–244). Thus 60k/150k/1.05M regular-file metadata observations per completed pass are consistent with adding 50k to the three initial fixtures. Directory metadata, unknown d_type entries, watch setup and rejected/repeated passes are additional costs. The amendment correctly distinguishes these from one guaranteed pass or an end-to-end latency measurement. Its one-statx description supersedes the older introductory two-call estimate.--stateassignsstate = data(calternal/src/args.rs:169); notes use<state>/users/<id>/notes, including history/meta DBs. The Home walker charges regular names without a SQLite exception. WAL/DB changes therefore invalidate the same Home. Split state avoids those filesystem recounts, but provider logical bytes still need their own generation/failure contract. Existing providers return plainu64; that API alone is not the proposed stable provider fence.No additional top-level workload family is needed beyond the 22 rows. The missing mandatory variants are the pre-watch handoff, concurrent receipts/admission, and explicit legacy/split-state gates above. Keep payload bytes and topology as independent fixture dimensions: a tiny-file 100k tree alone cannot qualify long-note autosave, large-photo, sparse, huge-flat-folder or two-disk behavior. Those variants are already called for in the matrix and restart discussion.
Restart and perf-gate assessment
Recommendation (c) is safe and candid. It keeps complete live coverage, refuses unverifiable offline state, does not claim directory/file mtimes prove continuity, rejects “far below quota” as a bound on external growth, and distinguishes a quick 503 from successful admission. Parallel work is a hypothesis to profile, not a promised fourfold gain. A ~15-second starting point still needs a substantial improvement to reach two seconds; the explicit release block if that fails is necessary. Existing 64 KiB enumeration/d_type skipping is correctly acknowledged. Keep the independent flat-folder benchmark because directory-level parallelism does not distribute one huge folder automatically.
The gate section already requires perf-test VMs, pinned release heads, all 22 rows at all three sizes, cold/warm repetitions, success/refusal counts, resource/call/fallback measurements and five-minute idle tails. It covers the risky rows in principle. With edit 3's layout variants and evidence/merge checklist, it is enforceable as a pre-product-merge requirement. None of the proposed pass predictions has been independently measured in this design review, and none should be reported as a performance pass merely because this amendment merges.
Applied the three required edits from comment 70235 in
85f4c31c(docs only).The receipt eligibility, admission visibility and retirement points are explicit; the reader cannot wait for the publication lock. Named tests cover pre-watch growth/truncate/replace, concurrent same/different destinations, save versus real Auth upload, recount/prune races and delayed userspace delivery with kernel ordering preserved.
Both layouts require the exact-charge oracle, 60-second typing, zero own-save recounts and ≤2% CPU. Default-layout product merge remains blocked until a documented migration or proven in-place DB accounting protocol passes. Final-head W01–W22 evidence must include exercised capacity/failure and recovery; unrun cells remain missing evidence.
Validation: git diff --check passed; only docs/plans/0754-quota.md changed. No implementation/performance pass claimed.
kayg referenced this pull request2026-11-05 23:21:11 +00:00
housekeeping #1009: rebased+green, left open for review.
rebased only quota proposal amendments, excluding WIP #764 implementation; retarget to dev.
head:
56d1abb71d182d45290b28280ae2051e0cdc69e2. rebased onto devcd7f84432febfc63b788fbb9b9f9950452982d74and pushed with the original exact force-with-lease.validation on the Mac VM, through Nix and the shared Mac lock/slot: root
bun install --frozen-lockfile; inapps/web,bun run check,bun run lint,bun run build,bun run test;PERF_DIST=<worktree>/apps/web/dist bash perf/web.sh --bundle-only --gate. all passed. this documentation-only branch has no targeted browser specs or Rust implementation changes. exact commands, logs, and dev bundle control.original-head missing-commit/patch inventory, file
pr-769.md.View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.