test(notes): make long-note crash coverage independent of throughput #844
Closed
kayg
wants to merge 0 commits from
fix/notes-crash-deterministic into dev
pull from: fix/notes-crash-deterministic
merge into: kayg:dev
kayg:main
kayg:feat/contrast
kayg:feat/style-sheet-fixes
kayg:storage/wal-checkpoint-off-save-1051
kayg:t3/paged-search-reconcile-final
kayg:feat/pass8
kayg:review/calendar-2
kayg:fix/shared-row-swipes
kayg:dev
kayg:feat/collections-db
kayg:fix/instant-keys-1056
kayg:feat/money-round
kayg:perf/stalls-1054
kayg:wip/tiering-v3-cold4
kayg:wip/tiering-v3-cold5
kayg:port/rows-actions
kayg:port/rows-drop
kayg:port/hidden-blocks
kayg:port/rows
kayg:port/port-tables
kayg:port/port-tables-2
kayg:t3/mail-1011-liveness
kayg:port/devices
kayg:port/port-attachments
kayg:port/port-attachments-2
kayg:port/port-attachments-3
kayg:docs/design-consistency
kayg:docs/engineering-standards
kayg:fix/rusqlite-0.41-rustsec-2026-0459
kayg:feat/iphone-fixes
kayg:shared/restore-and-stale-918-919
kayg:fix/phone-top-band-contrast
kayg:feat/notes-approve
kayg:perf/soak-max-gate
kayg:feat/files-s1-identity
kayg:fix/lifecycle-event-id
kayg:feat/quickfix
kayg:wip/tiering-v3-cold
kayg:perf/web-mockup-frame-fixes
kayg:port/contacts-merge
kayg:port/contacts-edit
kayg:test/shared-room-no-deleted-text
kayg:perf/first-paint-credits
kayg:fix/shared-history-after-grant
kayg:fix/phone-swipe-regressions
kayg:feat/contrast-r1
kayg:review/sharing-pr3-review
kayg:feat/tiering-v3-s2-tags
kayg:feat/folder-drop
kayg:fix/deskpills-lazy-share
kayg:feat/sharing-s1-pr3
kayg:tmp/money-round-before
kayg:fix/phone-pane-backdrop-roots
kayg:fix/palette-preload-chips
kayg:fix/invite-defaults
kayg:port/tasks-matrix
kayg:fix/restore-green-gates
kayg:fix/sharing-fast-path-hardening
kayg:t3/photos-s1
kayg:feat/tiering-v3-s1-namespace
kayg:notes-archive-hide
kayg:feat/tasks-actions
kayg:t3/photos-plan-slice-one
kayg:feat/whiteboard-s1
kayg:t3/paged-search-reconcile
kayg:t3/smooth-pane-transitions
kayg:t3/index-position-startup-scan
kayg:fix/private-staging-759b-r2
kayg:feat/dav-transport
kayg:feat/imap-notes-fetch
kayg:feat/imap-notes-projection
kayg:feat/imap-notes-readonly
kayg:feat/imap-notes-auth
kayg:feat/imap-notes-server-foundation
kayg:docs/undo-block-ids-plan
kayg:fix/undo-768
kayg:proto/block-identity-v7d
kayg:issue/carddav-read-perf-fix-r2
kayg:issue/carddav-read-r2
kayg:docs/imap-766-plan-v2
kayg:docs/imap-notes-plan
kayg:docs/quota-plan-2
kayg:fix/parallel-test-flakes
kayg:feat/contacts-companion-pure
kayg:docs/calendar-backend-v2-plan
kayg:feat/calendar-ical-converter
kayg:docs/tasks-writes-v2-plan
kayg:docs/carddav-writes-v2-plan
kayg:docs/contacts-import-v2-plan
kayg:issue/610-pm-midnight
kayg:feat/calendar-v2-s1-containment
kayg:docs/dav-recorder-v2-plan
kayg:plan/previews-865
kayg:plan/save-log-durable-entry
kayg:fix/e2e-data-on-ram
kayg:feat/appwindow3
kayg:feat/appwindow2
kayg:feat/appwindow
kayg:feat/money-p1
kayg:feat/keys-sheet
kayg:review/calendar-2-themes
kayg:feat/smooth-cursor
kayg:fix/float-style
kayg:review/calendar-2-float
kayg:release/2026-11-06-hotfix
kayg:archive/port/rows-drop-code
kayg:archive/port/rows-actions
kayg:archive/port/rows
kayg:scratch/tasks-894-ui-gates
kayg:review/calendar-2-night-wip
kayg:release/2026-11-05
kayg:archive/feat/tiering-v3-s1-namespace
kayg:archive/flaky/rows-drop-fixed
kayg:archive/flaky/rows-actions
kayg:archive/feat/tiering-v3-reader
kayg:archive/feat/tiering-v3-roots
kayg:archive/flaky/rows
kayg:sim/bm15-final
kayg:sim/bm15-fix
kayg:sim/bm15-bis-932
kayg:sim/bm15-bis-909
kayg:sim/bm15
kayg:sim/bm15-bis-887
kayg:perf/tiering-option-b
kayg:port/style-3
kayg:port/style-2
kayg:port/style
kayg:fix/sw-lazy-precache
kayg:fix/vim-w-waits-for-save
kayg:fix/signout-test-races
kayg:fp-scratch/all
kayg:sim/bm15-first-paint
kayg:archive/bm15/rows-drop
kayg:archive/bm15/rows-actions
kayg:fix/palette-snippet-contrast
kayg:archive/bm15/rows
kayg:archive/bm15/hidden
kayg:archive/plan/save-log-durable-entry
kayg:mock/money-fix2
kayg:archive/fix/e2e-data-on-ram
kayg:mock/appearance-all
kayg:mock/pill-press
kayg:archive/docs/design-consistency
kayg:mock/auto-swipes
kayg:mock/mail-actions
kayg:archive/feat/mail-p1
kayg:mock/money-static
kayg:archive/review/standards-917
kayg:archive/docs/engineering-standards
kayg:perf/tiering-761-fix
kayg:mock/type-audit
kayg:mock/third-pane
kayg:feat/contacts-import-v2-s1
kayg:perf/executor-hot-path
kayg:archive/port/hidden-blocks
kayg:archive/port/devices
kayg:scratch/executor-on-894
kayg:scratch/executor-spans2
kayg:scratch/executor-spans
kayg:train/2026-11-03-bm14c
kayg:archive/port/rows-drop
kayg:feat/tiering-761-d-scale
kayg:feat/tiering-761-c-index
kayg:feat/tiering-761-b-reader
kayg:archive/review/sharing-pr3-review-9fec3d1f
kayg:train/2026-11-03-bm14b
kayg:perf/ports-lazy-budgets
kayg:feat/tiering-761-a-migration
kayg:train/2026-11-03-bm14
kayg:train/2026-11-03-bm12
kayg:archive/review/sharing-pr3-review
kayg:archive/feat/sharing-s1-pr3
kayg:train/2026-11-03-bm11
kayg:archive/feat/imap-notes-fetch
kayg:train/2026-11-03-bm10
kayg:archive/review/sharing-pr3-review-code
kayg:archive/plan/previews-865
kayg: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!844
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/notes-crash-deterministic"
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?
The long-note crash test could fail after 12 random kill windows despite preserving every confirmed append (96 under load). Keep at least 12 kill/restart rounds and continue until at least 100 appends are confirmed, with a 180-second stalled-progress cap and count diagnostics. Every retry, no-loss, no-double and saved-file assertion is retained. The test is unchanged on dev, so this is a separate source PR. No functional speed budget is introduced.
Validation: BM8 validation at scratch
b9dac07806a398f53f8a9acaf1506d4b6f718a30:cargo fmt --all -- --checkandcargo test --workspace -j4passed on dev-01 in the standard Nix/slot shell, 1,483 passed and 22 ignored, with no skips or test-thread override. Four report selectors passed 22/22 on Chromium/WebKit, zero retries. Final production code passed 30 fresh Chromium composer invocations (90 tests, zero retries) during one ordinary slot build. Exact commands, head provenance, append samples, retained failures and attached raw evidence: #844 (comment). No merge or train change; owned jobs finished and VM targets/temp Homes cleaned.bm8 preparation
The manual gates pass. Final scratch
scratch/bm8-prepisb9dac07806a398f53f8a9acaf1506d4b6f718a30, in~/Developer/Worktrees/bm8-prep. It reconstructs all eight BM7 heads in original order, preserving the prior Cargo.lock/execute.rs merge resolutions, then includes the source fixes below. The scratch is unpushed. No PR was merged and the train was not edited; #838 remains57f5c6bbd72cabd1c166d7f147ccc591eb7428f4.f1c1aa961e169ef99e132063a97ccbd9a89a5def91a19dcf0a9cf3844861e0e6acf4318618f3ea33d455842942731aabc05474c7929597d57090a7cc19071be8455d718822ba98f6b9a402c5fd3452425d7b9b36cd008de78851809724c90a85d92b40a7ccaece3dfecbe2048634fc792d7d4a2c6e31f3245f7d1a59776411e7f3353d0023817b43affae51e316b43e9578c3e4d2944df8df43caebc611356f750cce9dcceb87f23a9f346300b3336e315ff6c0c40448327a15730271d56226b898e48bcc87b2a4dc38c3083d51f4adcf5cd76a70f1f6960b427413e144e717145e35f70356f593b7c04a527e00f7b177b97e4d14231be07f6a80cb9ca172d02442c487e#779's flake files are a shared, uncommitted VM overlay, following BRIEF-COMMON.md. They are not merged into the scratch. All source changes are committed and pushed to their own branches. New PRs are #844, #847, #855 and #857, all into dev.
source decisions
Crash coverage (#844). The test is unchanged on dev. It now runs at least 12 kill/restart rounds and continues until at least 100 confirmed appends, retaining all no-loss, no-double, retry and saved-file assertions. A 180-second stalled-progress cap reports rounds and confirmed appends. It no longer treats work completed in random kill windows as a throughput requirement.
Standard shell (#779).
pkgs.straceis added only to the Linux devShell packages. The standard shell resolves strace on both Linux architectures, and the existing attachment flush syscall test passes. #831 requires no source change.Upcoming fixture (#833). The tasks writes v2 plan (
docs/plans/tasks-v2-set-status.md) has no kept-first rule. ADR 0066 and the implementation use normal date/time/priority/created/id sorting. The fixture now supplies distinct notedate:values, which feed indexedcreated_ms, and asserts both indexed timestamps. The earliercreated:fixture property was the wrong field and could still pass by random id order; that iteration and its failed full run are preserved. Product sorting is unchanged.Daily capture race (#847). The original 30-run Chromium batch reproduced the line-58
done:1failure twice, during ordinary build load. A concurrent reader can create history for an unwritten daily placeholder between capture's history check and private placement, causing the second seed to fail with “already has history.” This path is unchanged on dev. Capture now opens the placeholder's existing room and uses its existing history throughdaily_seed. A deterministic paused-reader regression fails on dev and passes with the fix, checking the same lineage, both completed steps, one captured line and exact saved bytes. The 13 task-create regressions also pass.List initialization cancellation (#828). The stronger timeout test observes the original owned initializer rather than issuing a replacement request. Under the full suite it exposed
note list: database is locked: cancellation of a request-owned OnceCell initializer released its permit while its blocking SQLite open continued, allowing a second open. List initialization now belongs to Notes' existing initialization task set; callers own only result observers. Shutdown closes admission before draining that set, and failed opens remain retryable. A deterministic aborted-caller regression fails before the fix with two schema opens and passes afterward with exactly one and the same cached Arc. All 14 restart-listing tests pass. The prior ctime/placed-stamp fix is retained. Plan and failure table: #828 (comment).Undo fixture (#855). WebKit traces showed Playwright waiting over seven seconds for spring stability before hover, outliving the eight-second Undo toast. These functional creation/Undo tests now select the supported reduced-motion mode, then hover to hold the normal clock while server assertions run. Real clicks and every content/search/snippet/Undo assertion remain. Product motion, lifetime and retry settings are unchanged.
Idle upload fixture (#857). An unchanged baseline auth test slept 31 seconds after observing only two pending files, then assumed every admitted upload's idle timer had finished. The full run found four still pending. It now observes all upload tasks completing with a 90-second failure cap and preserves response statuses, per-person admission, cleanup, sign-in and worker checks. The worker probe uses a 30-second liveness cap instead of a 100 ms speed assertion. Product upload code/timeouts are unchanged.
gates and results
All heavy commands ran on the VMs through
~/bin/slotand Nix, withCI=1 CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 CARGO_INCREMENTAL=0. No build, test, install or Rust tooling ran on the control host.Full workspace: exit 0, 1,483 passed, 22 ignored, no skips or test-thread override supplied. The crash, attachment strace, owned-initialization and indexed Upcoming regressions are included. Existing ignored performance/platform tests remain ignored by their own declarations.
Composer: 30/30 invocations, 90 tests passed, zero retries. The ordinary build was active throughout every invocation, verified from individual start/finish records. Its interval was 17:04:03–17:26:38 IST on November 2. It was cancelled through its own systemd unit after reproduction and the accompanying matrix; no successful release-build gate is claimed.
Four-selector matrix: 22/22 passed, zero retries, Chromium 1440 and WebKit 1440. The passing matrix uses #855's final reduced-motion fixture.
Provenance: the benchmark and 30-run batch used
72149532, with final production code. The passing matrix used74aa02f7; its web/package trees are identical to final scratch. Changes from72149532to final scratch are confined to the composer e2e fixture and Rust test fixtures. The Rust gate itself ran at exact final headb9dac078.Focused source commands also passed:
200-append comparison on dev-01
Three alternating rounds per revision, 200 sequential acknowledged HTTP appends, fresh 1,000-line note, 15 ms save quiet period and identical debug profiles. Startup, note creation and final verification are excluded. Every appended token is independently checked exactly once. Script and binary hashes are in
append-attribution-final.pyandappend-attribution-final.json.55f35fcd316b43e95d7b9b36The combined scratch median is 13.0% higher than baseline. Neither isolated #828 nor #831 has a higher median in this final batch. These shared-VM diagnostics do not establish which change caused the combined difference, and are not performance qualification. Earlier samples and their varying paired differences are retained in the history and raw archives.
retained failures and practical limits
The latest full command is green; earlier attempts are not discarded or relabelled. They include the initial #828 completion helper, baseline upload admission, markdown's 50 ms parse success assertion, baseline tag-rename/shutdown settlement, the confirmed list-open cancellation race, the first incorrect Upcoming fixture, the idle-upload fixed sleep and an unchanged 80 ms session-expiry fixture. That session test expired before its first expected-200 assertion, then passed in the identical-head full rerun. A second dev-02 attempt reported the unchanged delete-event/read and shutdown-settlement 30-second watchdogs, then stalled in the save/crash test's restarted runtime. Native stacks and buffered panic excerpts were preserved before stopping that owned unit. The cause of these intermittent waits is unconfirmed; focused follow-up results are retained separately: exact outside_delete passed in 14.77 seconds and exact save/crash passed in 0.43 seconds on the same dev-02 tree. These failures remain an observed risk; this task does not claim to eliminate them all.
Browser history retains the two original daily-capture failures, one pre-test port collision in an earlier batch (with its replacement), and WebKit Undo expiry failures before #855 was complete. The final 30-run batch had no failed invocation or port collision. Details and per-attempt commands are in
history.md.evidence and closeout
dev01-final.tar.gz: final append logs/hashes, 30 individual composer JSON/log/exit records, exact build-load interval, passing browser JSON, all earlier browser traces and forensic capture data.dev01-list-race-evidence.tar.gz: deterministic list-open red/green evidence and the failed full-suite list-open error.dev01-rust-final.tar.gz: successful final full Rust stdout, exit/head and formatting result.dev02-final.tar.gz: retained earlier full/focused runs, stopped save/crash wait, native stacks and buffered panic excerpts.dev01-before-final.tar.gz,dev01-browser-final.tar.gz,dev01-intermediate.tar.gzanddev02.tar.gz.Owned VM targets, copied binaries, bundles, temporary Homes, dist/results and installed node_modules were removed after archiving. Both VMs were checked for running BM8 units; none remain. Control worktrees and small evidence remain. Source heads and the untouched train were verified through Forgejo. Manual results above are separate from Forgejo CI/review state:
bm8 cumulative append attribution on the perf VMs
first confirmed >3% step: #827 (
91a19dcf), merged cumulatively at199a938b. It adds 5.74% on perf-01 and 5.02% on perf-02 versus the preceding #824 step in the full matrix. A separate 20-run interleaved confirmation gives +3.48% and +4.75%. The 3% limit is unchanged; this boundary does not pass it.The final scratch versus dev is +6.10% on perf-01 and +2.42% on perf-02 in the full matrix. The previously observed shared-dev +13% is not reproduced at that magnitude. This experiment attributes a repeatable incremental cost to #827, not the entire original 13% to one change.
workload and provenance
Recovered
~/bm8-prep-report/append-attribution-final.pyfrom the original job. Preserved its 200 sequential acknowledged HTTP appends, fresh 1,000-line note, fresh Home per run,CALTERNAL_NOTES_SAVE_MS=15,--dev-user, HTTP client and exact-once token checks. Startup, note creation, verification and hashing are outside the timed interval. Ten runs per revision per VM; each round rotates case order and alternates direction. p90 is nearest-rank over the ten 200-append totals, not request latency. Every primary and confirmation sample passed the content checks.Builds ran only on dev-01 through
~/bin/slot, with the shared Nix shell and the original unoptimized profile:All twelve binaries were relayed dev-01 → control host → each perf VM.
sha256sum -c SHA256SUMSpassed for every binary on both VMs, and each measured row independently records its matching binary hash. No builds or tests ran on the control host or perf VMs. The perf tool was fetched from Nix's binary cache with--max-jobs 0; no compilation was allowed there.origin/devremained55f35fcde3bc91ca3781055577b93e93819f6cd4. The first nine cumulative steps reuse the original scratch's actual merge commits, including its conflict resolutions and the requested #828fe46caf5. #833 uses the original step with head158af347; later fixture fixes remain confined to the separate final scratch. #847 was merged directly on the #844 cumulative commit, producing185dba5910eb2e09e3320d0996501019cc0299c1, without the later unrelated initialization follow-up. No existing branch was edited or pushed. PR #844 head remains50cce9dcceb87f23a9f346300b3336e315ff6c0c.Both VMs were idle before measurement (load approximately 0.00–0.02, no competing benchmark). Every measurement held the one shared lock:
All primary and confirmation jobs exited 0: 240 primary runs plus 160 confirmation runs. These are performance-harness measurements, not functional-test wall-clock assertions. Disk headroom remained above the required thresholds.
full cumulative matrix
Each entry is seconds for 200 appends. Step delta compares the preceding row; the final scratch row compares the #847 cumulative row.
55f35fcd53269288199a938bb42ee47daa4c34a19c1a35234dc11d76b79c17ff42fbcd3ad49db9e2185dba59b9dac078#836 and its preceding #833 step have identical binary hashes; #844 and #831 also have identical hashes. Their small observed differences show timing noise. #847 exceeds 3% only on perf-02 (+3.01%, versus +0.11% on perf-01), so this batch does not establish an additional repeatable regression there. #828 is +2.98% on perf-01 and -0.40% on perf-02; no confirmed >3% boundary at #828.
separate 20-run confirmation
syscall profile and code cause
On perf-01 under the same shared lock, three fresh-Home runs each for dev, cumulative #824, cumulative #827 and final scratch used:
Profiled timings are diagnostic only and are excluded from the table. Syscall counts below cover server startup, creation, 200 appends, verification and shutdown; all profile runs used the same lifecycle. All profile jobs exited 0.
The independent
-yytrace localizes the increase: auth.db-related fcntl calls rise from 63 at #824 to 869 at #827. The trace and source support extra serialized auth-database work and worker handoffs on the private-note append path. There is no added fsync/fdatasync count in this workload; these traces do not support attributing the cost to extra durable flushes. Summed multithreaded futex time is not treated as elapsed time.Code locations at final scratch
b9dac078:crates/notes/src/room/edit.rs:44: every API edit first awaits write authorization, before checking a cached receipt.crates/notes/src/room/edit.rs:72: a fresh edit then awaits admission, which repeats authority resolution.crates/auth/src/sharing.rs:984and:1012: authorization dispatches resource resolution; admission takes the note writer fence, dispatches another DB job, opens an IMMEDIATE transaction, rechecks authority and queries note_shares, then commits even when the private note has no shares.crates/auth/src/db.rs:337: each DB operation crosses the bounded dedicated-worker queue and awaits its response. The equivalent introduced #827 paths aresharing.rs:398–477androom/edit.rs:42–85at cumulative199a938b.perf stat -e task-clock truewas unavailable because the VM hasperf_event_paranoid=3; passwordless sudo is unavailable. No kernel settings or access limits were changed. Used the requested strace fallback; no CPU flamegraph claim is made.proposed fix, not implemented
Remove the redundant fresh-edit authorization round trip while retaining every authority check: keep the cheap scope guard first; look up a receipt internally; if a receipt/replay exists, authorize before returning any result; otherwise use the fenced admission's existing in-transaction authorization as the authority check before mutating the room/history. This preserves revoked-credential and replay checks and avoids checking the same fresh write twice.
The remaining owner/private-note admission transaction should be evaluated separately. If needed, introduce a bounded per-note sharing-state fast path that is maintained under the same writer fence as first grant/revoke and invalidated before those transitions become visible. It must retain app-password liveness/scope checks and shared-note sequencing. Do not simply skip authorization for owners or weaken SQLite durability.
Re-run this exact two-VM matrix after any fix with the same 3% limit, plus replay-after-revocation, first-grant versus append, shared admission/order and crash-durability gates. No fix was applied or claimed validated in this task.
cleanup and scope
Owned binaries on dev-01 and both perf VMs, the throwaway dev target/worktree and the relayed binary bundle on the control host were removed. Temporary Homes were automatically removed; a final check found no
bm8-append-*directories. No owned units remain running. Only small scripts, logs, JSON and report archives remain, attached here. No evidence or source changes were committed. Conclusions apply to the requested unoptimized, dev-user, private-note append workload; authenticated/shared-note and release-build performance were not measured.kayg referenced this pull request2026-11-03 02:09:05 +00:00
Closing: head
50cce9dcis already in dev (reached via995baf64); nothing left to merge. Branch kept.Pull request closed