build: rusqlite 0.41 (libsqlite3-sys 0.39) for RUSTSEC-2026-0459 #1043

Closed
kayg wants to merge 4 commits from fix/rusqlite-0.41-rustsec-2026-0459 into dev
Owner

Fixes RUSTSEC-2026-0459 (bundled SQLite in libsqlite3-sys, fixed in >= 0.39).

Change

  • One workspace dependency: rusqlite = { version = "0.41", features = ["bundled"] } in the root Cargo.toml; the 12 crates use workspace = true (search adds hooks).
  • Lock: rusqlite 0.40.2 -> 0.41.1, libsqlite3-sys 0.38.2 -> 0.39.1 (bundled SQLite 3.53.2 -> 3.54.1).
  • .cargo/config.toml (LIBSQLITE3_FLAGS=-DHAVE_FDATASYNC=1) and every PRAGMA are untouched.

0.41 breaking changes hit

  1. Connection::progress_handler now takes &mut self (used by the search time limit in read::ranked). read::search/candidates/ranked take &mut Connection; the vocabulary closure now receives the connection.
  2. Transaction still only derefs to &Connection, so the search reader's unchecked_transaction() guard can't give the &mut. The read snapshot is opened with BEGIN DEFERRED / ROLLBACK by hand; a connection that can't leave the transaction is dropped, not pooled.

No other call site in the 12 crates needed changes.

Gate results and perf tables follow in comments.

🤖 Generated with Claude Code

Fixes RUSTSEC-2026-0459 (bundled SQLite in libsqlite3-sys, fixed in >= 0.39). ## Change - One workspace dependency: `rusqlite = { version = "0.41", features = ["bundled"] }` in the root `Cargo.toml`; the 12 crates use `workspace = true` (search adds `hooks`). - Lock: rusqlite 0.40.2 -> 0.41.1, libsqlite3-sys 0.38.2 -> 0.39.1 (bundled SQLite 3.53.2 -> 3.54.1). - `.cargo/config.toml` (`LIBSQLITE3_FLAGS=-DHAVE_FDATASYNC=1`) and every PRAGMA are untouched. ## 0.41 breaking changes hit 1. `Connection::progress_handler` now takes `&mut self` (used by the search time limit in `read::ranked`). `read::search`/`candidates`/`ranked` take `&mut Connection`; the vocabulary closure now receives the connection. 2. `Transaction` still only derefs to `&Connection`, so the search reader's `unchecked_transaction()` guard can't give the `&mut`. The read snapshot is opened with `BEGIN DEFERRED` / `ROLLBACK` by hand; a connection that can't leave the transaction is dropped, not pooled. No other call site in the 12 crates needed changes. Gate results and perf tables follow in comments. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
rusqlite 0.41 pulls libsqlite3-sys >= 0.39, which carries the SQLite fix
for RUSTSEC-2026-0459. The bundled feature stays on in the one workspace
entry; search adds hooks on top.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Breaking change hit: Connection::progress_handler now takes &mut self.
The ranked() time limit is the only caller, so read::search and
candidates take &mut Connection, and the typo vocabulary closure gets the
connection as an argument instead of borrowing the snapshot.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
search: open the read snapshot by hand (Transaction has no &mut access)
Some checks are pending
CI / server (pull_request) Waiting to run
CI / rust (pull_request) Waiting to run
CI / web (pull_request) Waiting to run
Markdown extraction contract / markdown-native-contract (pull_request) Waiting to run
Markdown extraction contract / markdown-editor-contract (pull_request) Waiting to run
9cfdaaa1e6
Second 0.41 break fallout: Transaction only derefs to &Connection, and
progress_handler now needs &mut Connection. BEGIN DEFERRED / ROLLBACK on
the reader keeps the one-snapshot guarantee. A connection that could not
leave the transaction is dropped, not pooled.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Author
Owner

Gates at head 60306ce08 (dev-01 calternal-dev-01-compute02, via ~/bin/slot)

Gate Result
cargo fmt --check OK
cargo clippy -j4 --workspace --all-targets --locked -- -D warnings exit 0
cargo test -j4 --workspace --locked exit 0, 127 test binaries ok, 0 failed
cargo audit (cargo-audit 0.22.2, same advisory DB, dev base vs PR) RUSTSEC-2026-0459 gone. Vulnerabilities 5 -> 4; the 4 left are old: RUSTSEC-2026-0381 webpki-roots, -0382 rustls-webpki, -0414 and -0433 pulldown-cmark. Warnings identical (unsafe-libyaml, smallstr, tokio unsound). No new advisories.

SQLite before / after (in-memory probe, LIBSQLITE3_FLAGS="-DHAVE_FDATASYNC=1 -DSQLITE_ENABLE_MEMORY_MANAGEMENT")

  • sqlite_version(): 3.53.2 -> 3.54.1 (rusqlite 0.40.2 / libsqlite3-sys 0.38.2 -> 0.41.1 / 0.39.1).
  • PRAGMA compile_options diff: only the new MAX_SCHEMA=10000000 line (SQLite's own default) and the version.
  • Finding: libsqlite3-sys 0.39 stopped passing -DSQLITE_ENABLE_MEMORY_MANAGEMENT. The first probe showed it missing (our PRAGMA shrink_memory calls depend on it), so commit 60306ce08 adds it to LIBSQLITE3_FLAGS next to -DHAVE_FDATASYNC=1. The probe above is after that fix; bundled stays on.
  • PRAGMAs in our code are untouched.

Size and build time (release, fat LTO, -p calternal -p calternal-perf -p calternal-mail-bench, cold target/release)

dev 0878cb550 PR 60306ce08
calternal unstripped 31,992,520 B 32,036,216 B (+43.7 KB, +0.14%)
calternal stripped 27,292,144 B 27,328,624 B (+36.5 KB, +0.13%)
cold build wall 687 s 726 s

The build wall times ran on a busy shared host (load avg ~30), so they are noisy; user CPU was 1596 s vs 1717 s (+7.6%), which is within what I would expect from load, not measured as a regression.

Perf ABAB is queued behind other lanes (FIFO) and will be posted next.

## Gates at head 60306ce08 (dev-01 `calternal-dev-01-compute02`, via `~/bin/slot`) | Gate | Result | |---|---| | `cargo fmt --check` | OK | | `cargo clippy -j4 --workspace --all-targets --locked -- -D warnings` | exit 0 | | `cargo test -j4 --workspace --locked` | exit 0, 127 test binaries `ok`, 0 failed | | `cargo audit` (cargo-audit 0.22.2, same advisory DB, dev base vs PR) | RUSTSEC-2026-0459 gone. Vulnerabilities 5 -> 4; the 4 left are old: RUSTSEC-2026-0381 webpki-roots, -0382 rustls-webpki, -0414 and -0433 pulldown-cmark. Warnings identical (unsafe-libyaml, smallstr, tokio unsound). No new advisories. | ## SQLite before / after (in-memory probe, `LIBSQLITE3_FLAGS="-DHAVE_FDATASYNC=1 -DSQLITE_ENABLE_MEMORY_MANAGEMENT"`) - `sqlite_version()`: **3.53.2 -> 3.54.1** (rusqlite 0.40.2 / libsqlite3-sys 0.38.2 -> 0.41.1 / 0.39.1). - `PRAGMA compile_options` diff: only the new `MAX_SCHEMA=10000000` line (SQLite's own default) and the version. - Finding: libsqlite3-sys 0.39 **stopped passing `-DSQLITE_ENABLE_MEMORY_MANAGEMENT`**. The first probe showed it missing (our `PRAGMA shrink_memory` calls depend on it), so commit 60306ce08 adds it to `LIBSQLITE3_FLAGS` next to `-DHAVE_FDATASYNC=1`. The probe above is after that fix; bundled stays on. - PRAGMAs in our code are untouched. ## Size and build time (release, fat LTO, `-p calternal -p calternal-perf -p calternal-mail-bench`, cold `target/release`) | | dev 0878cb550 | PR 60306ce08 | |---|---|---| | `calternal` unstripped | 31,992,520 B | 32,036,216 B (+43.7 KB, +0.14%) | | `calternal` stripped | 27,292,144 B | 27,328,624 B (+36.5 KB, +0.13%) | | cold build wall | 687 s | 726 s | The build wall times ran on a busy shared host (load avg ~30), so they are noisy; user CPU was 1596 s vs 1717 s (+7.6%), which is within what I would expect from load, not measured as a regression. Perf ABAB is queued behind other lanes (FIFO) and will be posted next.
Author
Owner

Perf: ABAB x5 vs dev, with a dev-copy control (perf-01/perf-02 via perf-turn, PR head 60306ce08 vs dev 0878cb550)

Setup: 5 reps, rotating order (dev pr ctl, pr ctl dev, ctl dev pr, ...), dev-ctl = a second copy of the dev binaries. Per rep and arm: calternal-perf (10k notes, 3 warm runs, 2 cold runs, 3000-edit storm; covers cold index/first page, home/notes open/list/append, search, sync round trip, startup, trash, uploads, memory), tasks-bench (10k), storage-bench history/save, mail-bench (100k). Table = median over 5 reps; verdict flags pr worse than dev by >3% AND more than the control's gap / half the dev spread. 169 metrics compared, 12 flagged (3 are "better").

Where pr is worse (decision needed)

metric dev dev-ctl pr pr vs dev per-rep (dev / pr)
mail list_page p50 @100k 46.1 us 47.1 us 48.2 us +4.5% 45.8-47.3 / 47.9-48.3, every rep worse
mail unified_page p50 45.9 us 46.6 us 48.1 us +5.0%
mail account_page p50 56.8 us 58.2 us 58.9 us +3.6%
tasks describe pass_and_rows p95 70.6 us 70.9 us 97.2 us +38% dev 66-73 / pr 95-102, all 5 reps
tasks describe pass_and_rows p50 38.8 us 38.0 us 39.9 us +2.8% (reps 1-2: +9%)
tasks describe pass p50 13.1 us 12.8 us 13.8 us +5.0%
tasks list untracked p50 1.24 ms 1.25 ms 1.29 ms +3.6%
idle RSS p50 18.8 MB 18.8 MB 19.0 MB (+0.2) +1.2% (p95 +3.9%)
RSS after first page p50 21.3 MB 21.3 MB 22.0 MB +3.4% every rep pr higher
trash restore p95 106.4 ms 106.3 ms 111.6 ms +5.0% spread 7%, borderline

Pattern: microsecond-scale point lookups and the small per-note DB writes, about +2 us on ~46 us (~30 us/lookup is what infraternal measured for SQLite 3.54.1 itself) plus ~0.3-0.7 MB RSS. Not tuned around; I did not find an isolated cause because rusqlite 0.41 and SQLite 3.53.2 -> 3.54.1 change together (a split build would need another perf turn; say if you want it).

Where pr is better or flat

All user-visible paths are flat within the control: notes open p50 0.72 ms, home page p50 -6%, tag page p50 -6.8%, search query p50 1.45 -> 1.44 ms (p95 -4.9%), search first_query, sync round trip p50 0.212 -> 0.207 ms, save ack, typing, storm edits/s, durable write p50 24.9 -> 24.7 ms, cold index p50 1.465 -> 1.422 s, cold first page p50 319 -> 293 ms, cold startup p50 19.9 -> 17.6 ms, healthz startup, storage-bench save p50/p99, mail thread_open and storm. Rest of the table is in the collapsed block.

All 169 metrics (median of 5 reps)

reps=5

metric dev dev-ctl pr ctl vs dev % pr vs dev % dev spread % verdict
mail.mail.account_page@1accounts@100000.p50 0.05679 0.05816 0.05883 +2.4 +3.6 3.7 REGRESS?
mail.mail.account_page@1accounts@100000.p95 0.07195 0.07123 0.07423 -1.0 +3.2 8.8
mail.mail.build_s@100000.p50 3.521 3.527 3.568 +0.2 +1.3 1.1
mail.mail.build_s@100000.p95 3.521 3.527 3.568 +0.2 +1.3 1.1
mail.mail.fake_headers_per_s.p50 2.105e+04 2.09e+04 2.105e+04 -0.7 -0.0 0.5
mail.mail.fake_headers_per_s.p95 2.105e+04 2.09e+04 2.105e+04 -0.7 -0.0 0.5
mail.mail.list_first@100000.p50 0.04045 0.04111 0.04164 +1.6 +2.9 3.0
mail.mail.list_first@100000.p95 0.04899 0.05245 0.05035 +7.1 +2.8 8.4
mail.mail.list_page@100000.p50 0.04613 0.04706 0.04821 +2.0 +4.5 3.3 REGRESS?
mail.mail.list_page@100000.p95 0.05731 0.05912 0.05823 +3.2 +1.6 7.6
mail.mail.thread_open@100000.p50 0.04673 0.04774 0.04788 +2.2 +2.5 3.1
mail.mail.thread_open@100000.p95 0.06332 0.06615 0.06392 +4.5 +0.9 3.8
mail.mail.thread_storm_merges@newest@1000000.p50 6.155e+05 6.155e+05 6.155e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@newest@1000000.p95 6.155e+05 6.155e+05 6.155e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@newest@250000.p50 1.535e+05 1.535e+05 1.535e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@newest@250000.p95 1.535e+05 1.535e+05 1.535e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@newest@500000.p50 3.074e+05 3.074e+05 3.074e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@newest@500000.p95 3.074e+05 3.074e+05 3.074e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@oldest@1000000.p50 6.155e+05 6.155e+05 6.155e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@oldest@1000000.p95 6.155e+05 6.155e+05 6.155e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@oldest@250000.p50 1.535e+05 1.535e+05 1.535e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@oldest@250000.p95 1.535e+05 1.535e+05 1.535e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@oldest@500000.p50 3.074e+05 3.074e+05 3.074e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@oldest@500000.p95 3.074e+05 3.074e+05 3.074e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@shuffled@1000000.p50 6.155e+05 6.155e+05 6.155e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@shuffled@1000000.p95 6.155e+05 6.155e+05 6.155e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@shuffled@250000.p50 1.535e+05 1.535e+05 1.535e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@shuffled@250000.p95 1.535e+05 1.535e+05 1.535e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@shuffled@500000.p50 3.074e+05 3.074e+05 3.074e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_merges@shuffled@500000.p95 3.074e+05 3.074e+05 3.074e+05 +0.0 +0.0 0.0
mail.mail.thread_storm_s@newest@1000000.p50 2.585 2.612 2.564 +1.0 -0.8 1.8
mail.mail.thread_storm_s@newest@1000000.p95 2.585 2.612 2.564 +1.0 -0.8 1.8
mail.mail.thread_storm_s@newest@250000.p50 0.6123 0.6168 0.5998 +0.7 -2.0 4.2
mail.mail.thread_storm_s@newest@250000.p95 0.6123 0.6168 0.5998 +0.7 -2.0 4.2
mail.mail.thread_storm_s@newest@500000.p50 1.254 1.264 1.243 +0.8 -0.9 2.8
mail.mail.thread_storm_s@newest@500000.p95 1.254 1.264 1.243 +0.8 -0.9 2.8
mail.mail.thread_storm_s@oldest@1000000.p50 2.608 2.649 2.582 +1.6 -1.0 3.5
mail.mail.thread_storm_s@oldest@1000000.p95 2.608 2.649 2.582 +1.6 -1.0 3.5
mail.mail.thread_storm_s@oldest@250000.p50 0.6079 0.6209 0.6042 +2.1 -0.6 3.8
mail.mail.thread_storm_s@oldest@250000.p95 0.6079 0.6209 0.6042 +2.1 -0.6 3.8
mail.mail.thread_storm_s@oldest@500000.p50 1.259 1.267 1.251 +0.7 -0.6 2.4
mail.mail.thread_storm_s@oldest@500000.p95 1.259 1.267 1.251 +0.7 -0.6 2.4
mail.mail.thread_storm_s@shuffled@1000000.p50 2.887 2.887 2.855 +0.0 -1.1 2.7
mail.mail.thread_storm_s@shuffled@1000000.p95 2.887 2.887 2.855 +0.0 -1.1 2.7
mail.mail.thread_storm_s@shuffled@250000.p50 0.6493 0.6647 0.6414 +2.4 -1.2 5.7
mail.mail.thread_storm_s@shuffled@250000.p95 0.6493 0.6647 0.6414 +2.4 -1.2 5.7
mail.mail.thread_storm_s@shuffled@500000.p50 1.361 1.376 1.356 +1.1 -0.4 3.6
mail.mail.thread_storm_s@shuffled@500000.p95 1.361 1.376 1.356 +1.1 -0.4 3.6
mail.mail.unified_page@1accounts@100000.p50 0.04587 0.04661 0.04815 +1.6 +5.0 3.8 REGRESS?
mail.mail.unified_page@1accounts@100000.p95 0.05913 0.05784 0.05825 -2.2 -1.5 28.2
perf.cold.first_page.p50 319.3 312.5 305.3 -2.1 -4.4 15.3
perf.cold.first_page.p95 335.6 332.6 324.9 -0.9 -3.2 25.8
perf.cold.index.p50 1.465 1.449 1.444 -1.1 -1.4 24.6
perf.cold.index.p95 1.552 1.464 1.468 -5.6 -5.4 38.5
perf.cold.mem_peak.p50 142.9 142.9 143.9 +0.0 +0.7 1.1
perf.cold.mem_peak.p95 143.6 143.8 144.4 +0.2 +0.5 1.5
perf.cold.notes_per_s.p50 6445 6831 6810 +6.0 +5.7 31.1
perf.cold.notes_per_s.p95 6826 6899 6924 +1.1 +1.4 20.4
perf.cold.startup.p50 19.84 20.1 17.69 +1.3 -10.8 23.0
perf.cold.startup.p95 20.16 21.91 17.9 +8.7 -11.2 27.6
perf.home.first_page.p50 2.619 2.381 2.259 -9.1 -13.7 151.7
perf.home.first_page.p95 4.085 2.617 4.092 -35.9 +0.2 103.8
perf.home.page.p50 0.758 0.7539 0.7125 -0.5 -6.0 8.6 better
perf.home.page.p95 2.876 2.896 2.993 +0.7 +4.1 111.3
perf.home.page_big.p50 16.57 16.27 16.6 -1.8 +0.2 3.9
perf.home.page_big.p95 18.14 18.57 19.23 +2.4 +6.0 12.9
perf.home.page_next.p50 0.7625 0.7989 0.8043 +4.8 +5.5 14.7
perf.home.page_next.p95 1.121 1.195 1.168 +6.6 +4.1 24.2
perf.home.page_tag.p50 5.321 5.14 4.958 -3.4 -6.8 5.7 better
perf.home.page_tag.p95 7.249 6.469 6.862 -10.8 -5.3 11.3
perf.home.page_title.p50 0.6474 0.6316 0.6388 -2.4 -1.3 5.9
perf.home.page_title.p95 0.7765 0.7368 0.7403 -5.1 -4.7 13.2
perf.journal.catch_up.p50 28.15 28.18 28.61 +0.1 +1.6 7.1
perf.journal.catch_up.p95 29.01 29.15 29.73 +0.5 +2.5 7.6
perf.journal.entries.p50 1.018e+04 1.018e+04 1.018e+04 +0.0 +0.0 0.0
perf.journal.entries.p95 1.036e+04 1.036e+04 1.036e+04 +0.0 +0.0 0.0
perf.journal.page.p50 2.4 2.382 2.398 -0.8 -0.1 4.7
perf.journal.page.p95 2.685 2.769 2.718 +3.1 +1.2 15.9
perf.mem.after_first_page.p50 21.33 21.3 22.05 -0.1 +3.4 3.0 REGRESS?
perf.mem.after_first_page.p95 22 21.73 22.44 -1.3 +2.0 3.4
perf.mem.after_opens.p50 41.73 41.14 41.74 -1.4 +0.0 6.1
perf.mem.after_opens.p95 41.84 42.12 42.19 +0.7 +0.8 6.2
perf.mem.after_search.p50 47.79 47.85 47.25 +0.1 -1.1 8.3
perf.mem.after_search.p95 75.29 75.34 75.65 +0.1 +0.5 0.9
perf.mem.idle.p50 18.78 18.77 19 -0.0 +1.2 1.2
perf.mem.idle.p95 19.05 19.32 19.79 +1.4 +3.9 4.7 REGRESS?
perf.mem.peak.p50 47.32 47.59 46.99 +0.6 -0.7 8.6
perf.mem.peak.p95 74.89 74.91 75.32 +0.0 +0.6 0.8
perf.open.api_get.p50 3.924 3.976 3.877 +1.3 -1.2 10.9
perf.open.api_get.p95 9.743 8.961 9.396 -8.0 -3.6 56.2
perf.open.long_note.p50 15.84 15.82 16.05 -0.1 +1.3 211.7
perf.open.long_note.p95 53.39 52.11 53.11 -2.4 -0.5 13.9
perf.open.note.p50 0.7156 0.7009 0.7073 -2.1 -1.2 8.7
perf.open.note.p95 1.316 1.299 1.377 -1.3 +4.6 22.5
perf.search.catch_up.p50 2.005 2.005 2.005 -0.0 -0.0 0.0
perf.search.catch_up.p95 4.013 4.009 4.006 -0.1 -0.2 0.2
perf.search.first_query.p50 4.942 5.437 4.577 +10.0 -7.4 56.3
perf.search.first_query.p95 26.52 29.22 26.28 +10.2 -0.9 5.5
perf.search.query.p50 1.446 1.446 1.435 -0.0 -0.8 6.2
perf.search.query.p95 3.974 4.011 3.942 +0.9 -0.8 15.0
perf.shutdown.p50 64.02 64.08 64.01 +0.1 -0.0 33.1
perf.shutdown.p95 64.24 85.28 84.18 +32.8 +31.0 36.1
perf.startup.healthz.p50 4.997 4.964 5.066 -0.6 +1.4 44.7
perf.startup.healthz.p95 5.415 6.009 5.693 +11.0 +5.1 55.8
perf.storm.converge.p50 159.5 159.7 159.2 +0.2 -0.2 6.6
perf.storm.converge.p95 176.5 175.7 174.9 -0.4 -0.9 10.3
perf.storm.edits_per_s.p50 3845 3854 3903 +0.2 +1.5 4.5
perf.storm.edits_per_s.p95 3948 3976 3973 +0.7 +0.6 5.1
perf.storm.outside_edits.p50 2 2 2 +0.0 +0.0 0.0
perf.storm.outside_edits.p95 2 2 2 +0.0 +0.0 0.0
perf.storm.save_ack.p50 7.296 7.247 7.289 -0.7 -0.1 2.0
perf.storm.save_ack.p95 11.86 11.34 11.62 -4.4 -2.0 12.0
perf.storm.typing.p50 0.7802 0.7784 0.7686 -0.2 -1.5 4.6
perf.storm.typing.p95 0.786 0.8078 0.7855 +2.8 -0.1 6.1
perf.sync.durable_write.p50 24.88 24.7 24.67 -0.7 -0.8 1.2
perf.sync.durable_write.p95 37.04 32.69 33.32 -11.8 -10.0 16.9
perf.sync.round_trip.p50 0.2138 0.2133 0.2074 -0.3 -3.0 8.8
perf.sync.round_trip.p95 0.3494 0.3382 0.3474 -3.2 -0.6 12.3
perf.sync.save_ack.p50 3.815 3.723 3.691 -2.4 -3.3 6.8
perf.sync.save_ack.p95 7.401 5.537 5.517 -25.2 -25.5 38.9 better
perf.trash.delete.p50 64.08 72.78 67.79 +13.6 +5.8 24.9
perf.trash.delete.p95 98.77 96.5 98.94 -2.3 +0.2 5.8
perf.trash.forget.p50 11.49 11.64 11.54 +1.3 +0.4 3.1
perf.trash.forget.p95 15.45 15.21 15.91 -1.6 +3.0 44.0
perf.trash.restore.p50 63.41 63.53 64.52 +0.2 +1.7 6.9
perf.trash.restore.p95 106.4 106.3 111.6 -0.0 +5.0 7.0 REGRESS?
perf.uploads.response.p50 142.8 142 142.9 -0.6 +0.0 4.4
perf.uploads.response.p95 165 163.8 163.9 -0.7 -0.6 12.8
perf.uploads.round_trip.p50 0.5014 0.5016 0.4939 +0.0 -1.5 7.0
perf.uploads.round_trip.p95 0.864 0.7296 0.7589 -15.6 -12.2 18.0
perf.uploads.save_ack.p50 4.23 4.196 4.139 -0.8 -2.2 2.9
perf.uploads.save_ack.p95 8.41 8.5 8.537 +1.1 +1.5 17.2
sb-save.max 60.56 63.67 59.41 +5.1 -1.9 42.4
sb-save.p50 20.19 20.6 20.73 +2.0 +2.7 3.5
sb-save.p90 27.73 28.04 28.66 +1.1 +3.4 8.1
sb-save.p99 37.46 36.66 37.77 -2.1 +0.8 10.4
tasks.cold_plain_s 1.796 1.777 1.8 -1.0 +0.2 3.6
tasks.cold_tasks_s 2.14 2.104 2.148 -1.7 +0.4 3.2
tasks/cold_index_ms/growth_pct 19.27 18.09 20.37 -6.1 +5.7 13.1
tasks/cold_index_ms/plain 1796 1777 1800 -1.0 +0.2 3.6
tasks/cold_index_ms/tasks 2140 2104 2148 -1.7 +0.4 3.2
tasks/describe_ms/pass.p50 0.0131 0.01281 0.01376 -2.1 +5.0 6.0 REGRESS?
tasks/describe_ms/pass.p95 0.03557 0.0351 0.03607 -1.3 +1.4 8.6
tasks/describe_ms/pass_and_rows.p50 0.03899 0.03799 0.03994 -2.6 +2.4 4.2
tasks/describe_ms/pass_and_rows.p95 0.07055 0.07091 0.09723 +0.5 +37.8 9.8 REGRESS?
tasks/list_ms/anytime.p50 1.824 1.819 1.843 -0.3 +1.0 9.6
tasks/list_ms/anytime.p95 2.171 2.032 2.064 -6.4 -4.9 24.8
tasks/list_ms/anytime_by_child_tag.p50 2.232 2.316 2.288 +3.7 +2.5 1.7
tasks/list_ms/anytime_by_child_tag.p95 2.61 2.769 2.756 +6.1 +5.6 7.4
tasks/list_ms/counts.p50 0.2496 0.2605 0.2544 +4.4 +1.9 17.5
tasks/list_ms/counts.p95 0.2741 0.2942 0.2923 +7.3 +6.6 30.7
tasks/list_ms/someday.p50 1.795 1.82 1.833 +1.4 +2.1 5.9
tasks/list_ms/someday.p95 2.089 2.13 2.159 +1.9 +3.3 11.0
tasks/list_ms/tag.p50 2.19 2.221 2.246 +1.4 +2.6 8.8
tasks/list_ms/tag.p95 2.528 2.549 2.654 +0.8 +5.0 20.2
tasks/list_ms/today.p50 2.317 2.28 2.301 -1.6 -0.7 6.8
tasks/list_ms/today.p95 2.664 2.539 2.685 -4.7 +0.8 22.6
tasks/list_ms/today_by_priority.p50 2.152 2.207 2.157 +2.6 +0.2 5.4
tasks/list_ms/today_by_priority.p95 2.461 2.605 2.456 +5.8 -0.2 13.6
tasks/list_ms/untracked.p50 1.242 1.248 1.286 +0.5 +3.6 6.4 REGRESS?
tasks/list_ms/untracked.p95 1.359 1.457 1.428 +7.2 +5.0 9.6
tasks/list_ms/upcoming.p50 2.29 2.262 2.333 -1.2 +1.9 4.3
tasks/list_ms/upcoming.p95 2.614 2.582 2.639 -1.2 +1.0 10.8
tasks/notes 1e+04 1e+04 1e+04 +0.0 +0.0 0.0
tasks/tasks 1e+04 1e+04 1e+04 +0.0 +0.0 0.0
tasks/write_ms/first_touch.p50 15.53 15.53 15.81 -0.0 +1.8 4.1
tasks/write_ms/first_touch.p95 64.7 66.9 68.01 +3.4 +5.1 16.9
tasks/write_ms/warm.p50 4.858 4.889 4.97 +0.6 +2.3 1.1
tasks/write_ms/warm.p95 14.3 15.16 14.5 +6.0 +1.4 8.0

9 flagged of 169

Run dir on perf-01: ~/perf/out-rusq-1 (reps 1-3 ran before an API stop; rep 4 was rerun from scratch). Same control gap shows run-to-run noise of ~1-3% on the small metrics.

## Perf: ABAB x5 vs dev, with a dev-copy control (perf-01/perf-02 via `perf-turn`, PR head 60306ce08 vs dev 0878cb550) Setup: 5 reps, rotating order (`dev pr ctl`, `pr ctl dev`, `ctl dev pr`, ...), `dev-ctl` = a second copy of the dev binaries. Per rep and arm: `calternal-perf` (10k notes, 3 warm runs, 2 cold runs, 3000-edit storm; covers cold index/first page, home/notes open/list/append, search, sync round trip, startup, trash, uploads, memory), `tasks-bench` (10k), `storage-bench history/save`, `mail-bench` (100k). Table = median over 5 reps; verdict flags pr worse than dev by >3% AND more than the control's gap / half the dev spread. 169 metrics compared, 12 flagged (3 are "better"). ### Where pr is worse (decision needed) | metric | dev | dev-ctl | pr | pr vs dev | per-rep (dev / pr) | |---|---|---|---|---|---| | mail list_page p50 @100k | 46.1 us | 47.1 us | 48.2 us | +4.5% | 45.8-47.3 / 47.9-48.3, every rep worse | | mail unified_page p50 | 45.9 us | 46.6 us | 48.1 us | +5.0% | | | mail account_page p50 | 56.8 us | 58.2 us | 58.9 us | +3.6% | | | tasks describe pass_and_rows p95 | 70.6 us | 70.9 us | 97.2 us | **+38%** | dev 66-73 / pr 95-102, all 5 reps | | tasks describe pass_and_rows p50 | 38.8 us | 38.0 us | 39.9 us | +2.8% (reps 1-2: +9%) | | | tasks describe pass p50 | 13.1 us | 12.8 us | 13.8 us | +5.0% | | | tasks list untracked p50 | 1.24 ms | 1.25 ms | 1.29 ms | +3.6% | | | idle RSS p50 | 18.8 MB | 18.8 MB | 19.0 MB (+0.2) | +1.2% (p95 +3.9%) | | | RSS after first page p50 | 21.3 MB | 21.3 MB | 22.0 MB | +3.4% | every rep pr higher | | trash restore p95 | 106.4 ms | 106.3 ms | 111.6 ms | +5.0% | spread 7%, borderline | Pattern: microsecond-scale point lookups and the small per-note DB writes, about +2 us on ~46 us (~30 us/lookup is what infraternal measured for SQLite 3.54.1 itself) plus ~0.3-0.7 MB RSS. Not tuned around; I did not find an isolated cause because rusqlite 0.41 and SQLite 3.53.2 -> 3.54.1 change together (a split build would need another perf turn; say if you want it). ### Where pr is better or flat All user-visible paths are flat within the control: notes open p50 0.72 ms, home page p50 -6%, tag page p50 -6.8%, search query p50 1.45 -> 1.44 ms (p95 -4.9%), search first_query, sync round trip p50 0.212 -> 0.207 ms, save ack, typing, storm edits/s, durable write p50 24.9 -> 24.7 ms, cold index p50 1.465 -> 1.422 s, cold first page p50 319 -> 293 ms, cold startup p50 19.9 -> 17.6 ms, healthz startup, storage-bench save p50/p99, mail thread_open and storm. Rest of the table is in the collapsed block. <details><summary>All 169 metrics (median of 5 reps)</summary> reps=5 | metric | dev | dev-ctl | pr | ctl vs dev % | pr vs dev % | dev spread % | verdict | |---|---|---|---|---|---|---|---| | mail.mail.account_page@1accounts@100000.p50 | 0.05679 | 0.05816 | 0.05883 | +2.4 | +3.6 | 3.7 | REGRESS? | | mail.mail.account_page@1accounts@100000.p95 | 0.07195 | 0.07123 | 0.07423 | -1.0 | +3.2 | 8.8 | | | mail.mail.build_s@100000.p50 | 3.521 | 3.527 | 3.568 | +0.2 | +1.3 | 1.1 | | | mail.mail.build_s@100000.p95 | 3.521 | 3.527 | 3.568 | +0.2 | +1.3 | 1.1 | | | mail.mail.fake_headers_per_s.p50 | 2.105e+04 | 2.09e+04 | 2.105e+04 | -0.7 | -0.0 | 0.5 | | | mail.mail.fake_headers_per_s.p95 | 2.105e+04 | 2.09e+04 | 2.105e+04 | -0.7 | -0.0 | 0.5 | | | mail.mail.list_first@100000.p50 | 0.04045 | 0.04111 | 0.04164 | +1.6 | +2.9 | 3.0 | | | mail.mail.list_first@100000.p95 | 0.04899 | 0.05245 | 0.05035 | +7.1 | +2.8 | 8.4 | | | mail.mail.list_page@100000.p50 | 0.04613 | 0.04706 | 0.04821 | +2.0 | +4.5 | 3.3 | REGRESS? | | mail.mail.list_page@100000.p95 | 0.05731 | 0.05912 | 0.05823 | +3.2 | +1.6 | 7.6 | | | mail.mail.thread_open@100000.p50 | 0.04673 | 0.04774 | 0.04788 | +2.2 | +2.5 | 3.1 | | | mail.mail.thread_open@100000.p95 | 0.06332 | 0.06615 | 0.06392 | +4.5 | +0.9 | 3.8 | | | mail.mail.thread_storm_merges@newest@1000000.p50 | 6.155e+05 | 6.155e+05 | 6.155e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@newest@1000000.p95 | 6.155e+05 | 6.155e+05 | 6.155e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@newest@250000.p50 | 1.535e+05 | 1.535e+05 | 1.535e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@newest@250000.p95 | 1.535e+05 | 1.535e+05 | 1.535e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@newest@500000.p50 | 3.074e+05 | 3.074e+05 | 3.074e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@newest@500000.p95 | 3.074e+05 | 3.074e+05 | 3.074e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@oldest@1000000.p50 | 6.155e+05 | 6.155e+05 | 6.155e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@oldest@1000000.p95 | 6.155e+05 | 6.155e+05 | 6.155e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@oldest@250000.p50 | 1.535e+05 | 1.535e+05 | 1.535e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@oldest@250000.p95 | 1.535e+05 | 1.535e+05 | 1.535e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@oldest@500000.p50 | 3.074e+05 | 3.074e+05 | 3.074e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@oldest@500000.p95 | 3.074e+05 | 3.074e+05 | 3.074e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@shuffled@1000000.p50 | 6.155e+05 | 6.155e+05 | 6.155e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@shuffled@1000000.p95 | 6.155e+05 | 6.155e+05 | 6.155e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@shuffled@250000.p50 | 1.535e+05 | 1.535e+05 | 1.535e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@shuffled@250000.p95 | 1.535e+05 | 1.535e+05 | 1.535e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@shuffled@500000.p50 | 3.074e+05 | 3.074e+05 | 3.074e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_merges@shuffled@500000.p95 | 3.074e+05 | 3.074e+05 | 3.074e+05 | +0.0 | +0.0 | 0.0 | | | mail.mail.thread_storm_s@newest@1000000.p50 | 2.585 | 2.612 | 2.564 | +1.0 | -0.8 | 1.8 | | | mail.mail.thread_storm_s@newest@1000000.p95 | 2.585 | 2.612 | 2.564 | +1.0 | -0.8 | 1.8 | | | mail.mail.thread_storm_s@newest@250000.p50 | 0.6123 | 0.6168 | 0.5998 | +0.7 | -2.0 | 4.2 | | | mail.mail.thread_storm_s@newest@250000.p95 | 0.6123 | 0.6168 | 0.5998 | +0.7 | -2.0 | 4.2 | | | mail.mail.thread_storm_s@newest@500000.p50 | 1.254 | 1.264 | 1.243 | +0.8 | -0.9 | 2.8 | | | mail.mail.thread_storm_s@newest@500000.p95 | 1.254 | 1.264 | 1.243 | +0.8 | -0.9 | 2.8 | | | mail.mail.thread_storm_s@oldest@1000000.p50 | 2.608 | 2.649 | 2.582 | +1.6 | -1.0 | 3.5 | | | mail.mail.thread_storm_s@oldest@1000000.p95 | 2.608 | 2.649 | 2.582 | +1.6 | -1.0 | 3.5 | | | mail.mail.thread_storm_s@oldest@250000.p50 | 0.6079 | 0.6209 | 0.6042 | +2.1 | -0.6 | 3.8 | | | mail.mail.thread_storm_s@oldest@250000.p95 | 0.6079 | 0.6209 | 0.6042 | +2.1 | -0.6 | 3.8 | | | mail.mail.thread_storm_s@oldest@500000.p50 | 1.259 | 1.267 | 1.251 | +0.7 | -0.6 | 2.4 | | | mail.mail.thread_storm_s@oldest@500000.p95 | 1.259 | 1.267 | 1.251 | +0.7 | -0.6 | 2.4 | | | mail.mail.thread_storm_s@shuffled@1000000.p50 | 2.887 | 2.887 | 2.855 | +0.0 | -1.1 | 2.7 | | | mail.mail.thread_storm_s@shuffled@1000000.p95 | 2.887 | 2.887 | 2.855 | +0.0 | -1.1 | 2.7 | | | mail.mail.thread_storm_s@shuffled@250000.p50 | 0.6493 | 0.6647 | 0.6414 | +2.4 | -1.2 | 5.7 | | | mail.mail.thread_storm_s@shuffled@250000.p95 | 0.6493 | 0.6647 | 0.6414 | +2.4 | -1.2 | 5.7 | | | mail.mail.thread_storm_s@shuffled@500000.p50 | 1.361 | 1.376 | 1.356 | +1.1 | -0.4 | 3.6 | | | mail.mail.thread_storm_s@shuffled@500000.p95 | 1.361 | 1.376 | 1.356 | +1.1 | -0.4 | 3.6 | | | mail.mail.unified_page@1accounts@100000.p50 | 0.04587 | 0.04661 | 0.04815 | +1.6 | +5.0 | 3.8 | REGRESS? | | mail.mail.unified_page@1accounts@100000.p95 | 0.05913 | 0.05784 | 0.05825 | -2.2 | -1.5 | 28.2 | | | perf.cold.first_page.p50 | 319.3 | 312.5 | 305.3 | -2.1 | -4.4 | 15.3 | | | perf.cold.first_page.p95 | 335.6 | 332.6 | 324.9 | -0.9 | -3.2 | 25.8 | | | perf.cold.index.p50 | 1.465 | 1.449 | 1.444 | -1.1 | -1.4 | 24.6 | | | perf.cold.index.p95 | 1.552 | 1.464 | 1.468 | -5.6 | -5.4 | 38.5 | | | perf.cold.mem_peak.p50 | 142.9 | 142.9 | 143.9 | +0.0 | +0.7 | 1.1 | | | perf.cold.mem_peak.p95 | 143.6 | 143.8 | 144.4 | +0.2 | +0.5 | 1.5 | | | perf.cold.notes_per_s.p50 | 6445 | 6831 | 6810 | +6.0 | +5.7 | 31.1 | | | perf.cold.notes_per_s.p95 | 6826 | 6899 | 6924 | +1.1 | +1.4 | 20.4 | | | perf.cold.startup.p50 | 19.84 | 20.1 | 17.69 | +1.3 | -10.8 | 23.0 | | | perf.cold.startup.p95 | 20.16 | 21.91 | 17.9 | +8.7 | -11.2 | 27.6 | | | perf.home.first_page.p50 | 2.619 | 2.381 | 2.259 | -9.1 | -13.7 | 151.7 | | | perf.home.first_page.p95 | 4.085 | 2.617 | 4.092 | -35.9 | +0.2 | 103.8 | | | perf.home.page.p50 | 0.758 | 0.7539 | 0.7125 | -0.5 | -6.0 | 8.6 | better | | perf.home.page.p95 | 2.876 | 2.896 | 2.993 | +0.7 | +4.1 | 111.3 | | | perf.home.page_big.p50 | 16.57 | 16.27 | 16.6 | -1.8 | +0.2 | 3.9 | | | perf.home.page_big.p95 | 18.14 | 18.57 | 19.23 | +2.4 | +6.0 | 12.9 | | | perf.home.page_next.p50 | 0.7625 | 0.7989 | 0.8043 | +4.8 | +5.5 | 14.7 | | | perf.home.page_next.p95 | 1.121 | 1.195 | 1.168 | +6.6 | +4.1 | 24.2 | | | perf.home.page_tag.p50 | 5.321 | 5.14 | 4.958 | -3.4 | -6.8 | 5.7 | better | | perf.home.page_tag.p95 | 7.249 | 6.469 | 6.862 | -10.8 | -5.3 | 11.3 | | | perf.home.page_title.p50 | 0.6474 | 0.6316 | 0.6388 | -2.4 | -1.3 | 5.9 | | | perf.home.page_title.p95 | 0.7765 | 0.7368 | 0.7403 | -5.1 | -4.7 | 13.2 | | | perf.journal.catch_up.p50 | 28.15 | 28.18 | 28.61 | +0.1 | +1.6 | 7.1 | | | perf.journal.catch_up.p95 | 29.01 | 29.15 | 29.73 | +0.5 | +2.5 | 7.6 | | | perf.journal.entries.p50 | 1.018e+04 | 1.018e+04 | 1.018e+04 | +0.0 | +0.0 | 0.0 | | | perf.journal.entries.p95 | 1.036e+04 | 1.036e+04 | 1.036e+04 | +0.0 | +0.0 | 0.0 | | | perf.journal.page.p50 | 2.4 | 2.382 | 2.398 | -0.8 | -0.1 | 4.7 | | | perf.journal.page.p95 | 2.685 | 2.769 | 2.718 | +3.1 | +1.2 | 15.9 | | | perf.mem.after_first_page.p50 | 21.33 | 21.3 | 22.05 | -0.1 | +3.4 | 3.0 | REGRESS? | | perf.mem.after_first_page.p95 | 22 | 21.73 | 22.44 | -1.3 | +2.0 | 3.4 | | | perf.mem.after_opens.p50 | 41.73 | 41.14 | 41.74 | -1.4 | +0.0 | 6.1 | | | perf.mem.after_opens.p95 | 41.84 | 42.12 | 42.19 | +0.7 | +0.8 | 6.2 | | | perf.mem.after_search.p50 | 47.79 | 47.85 | 47.25 | +0.1 | -1.1 | 8.3 | | | perf.mem.after_search.p95 | 75.29 | 75.34 | 75.65 | +0.1 | +0.5 | 0.9 | | | perf.mem.idle.p50 | 18.78 | 18.77 | 19 | -0.0 | +1.2 | 1.2 | | | perf.mem.idle.p95 | 19.05 | 19.32 | 19.79 | +1.4 | +3.9 | 4.7 | REGRESS? | | perf.mem.peak.p50 | 47.32 | 47.59 | 46.99 | +0.6 | -0.7 | 8.6 | | | perf.mem.peak.p95 | 74.89 | 74.91 | 75.32 | +0.0 | +0.6 | 0.8 | | | perf.open.api_get.p50 | 3.924 | 3.976 | 3.877 | +1.3 | -1.2 | 10.9 | | | perf.open.api_get.p95 | 9.743 | 8.961 | 9.396 | -8.0 | -3.6 | 56.2 | | | perf.open.long_note.p50 | 15.84 | 15.82 | 16.05 | -0.1 | +1.3 | 211.7 | | | perf.open.long_note.p95 | 53.39 | 52.11 | 53.11 | -2.4 | -0.5 | 13.9 | | | perf.open.note.p50 | 0.7156 | 0.7009 | 0.7073 | -2.1 | -1.2 | 8.7 | | | perf.open.note.p95 | 1.316 | 1.299 | 1.377 | -1.3 | +4.6 | 22.5 | | | perf.search.catch_up.p50 | 2.005 | 2.005 | 2.005 | -0.0 | -0.0 | 0.0 | | | perf.search.catch_up.p95 | 4.013 | 4.009 | 4.006 | -0.1 | -0.2 | 0.2 | | | perf.search.first_query.p50 | 4.942 | 5.437 | 4.577 | +10.0 | -7.4 | 56.3 | | | perf.search.first_query.p95 | 26.52 | 29.22 | 26.28 | +10.2 | -0.9 | 5.5 | | | perf.search.query.p50 | 1.446 | 1.446 | 1.435 | -0.0 | -0.8 | 6.2 | | | perf.search.query.p95 | 3.974 | 4.011 | 3.942 | +0.9 | -0.8 | 15.0 | | | perf.shutdown.p50 | 64.02 | 64.08 | 64.01 | +0.1 | -0.0 | 33.1 | | | perf.shutdown.p95 | 64.24 | 85.28 | 84.18 | +32.8 | +31.0 | 36.1 | | | perf.startup.healthz.p50 | 4.997 | 4.964 | 5.066 | -0.6 | +1.4 | 44.7 | | | perf.startup.healthz.p95 | 5.415 | 6.009 | 5.693 | +11.0 | +5.1 | 55.8 | | | perf.storm.converge.p50 | 159.5 | 159.7 | 159.2 | +0.2 | -0.2 | 6.6 | | | perf.storm.converge.p95 | 176.5 | 175.7 | 174.9 | -0.4 | -0.9 | 10.3 | | | perf.storm.edits_per_s.p50 | 3845 | 3854 | 3903 | +0.2 | +1.5 | 4.5 | | | perf.storm.edits_per_s.p95 | 3948 | 3976 | 3973 | +0.7 | +0.6 | 5.1 | | | perf.storm.outside_edits.p50 | 2 | 2 | 2 | +0.0 | +0.0 | 0.0 | | | perf.storm.outside_edits.p95 | 2 | 2 | 2 | +0.0 | +0.0 | 0.0 | | | perf.storm.save_ack.p50 | 7.296 | 7.247 | 7.289 | -0.7 | -0.1 | 2.0 | | | perf.storm.save_ack.p95 | 11.86 | 11.34 | 11.62 | -4.4 | -2.0 | 12.0 | | | perf.storm.typing.p50 | 0.7802 | 0.7784 | 0.7686 | -0.2 | -1.5 | 4.6 | | | perf.storm.typing.p95 | 0.786 | 0.8078 | 0.7855 | +2.8 | -0.1 | 6.1 | | | perf.sync.durable_write.p50 | 24.88 | 24.7 | 24.67 | -0.7 | -0.8 | 1.2 | | | perf.sync.durable_write.p95 | 37.04 | 32.69 | 33.32 | -11.8 | -10.0 | 16.9 | | | perf.sync.round_trip.p50 | 0.2138 | 0.2133 | 0.2074 | -0.3 | -3.0 | 8.8 | | | perf.sync.round_trip.p95 | 0.3494 | 0.3382 | 0.3474 | -3.2 | -0.6 | 12.3 | | | perf.sync.save_ack.p50 | 3.815 | 3.723 | 3.691 | -2.4 | -3.3 | 6.8 | | | perf.sync.save_ack.p95 | 7.401 | 5.537 | 5.517 | -25.2 | -25.5 | 38.9 | better | | perf.trash.delete.p50 | 64.08 | 72.78 | 67.79 | +13.6 | +5.8 | 24.9 | | | perf.trash.delete.p95 | 98.77 | 96.5 | 98.94 | -2.3 | +0.2 | 5.8 | | | perf.trash.forget.p50 | 11.49 | 11.64 | 11.54 | +1.3 | +0.4 | 3.1 | | | perf.trash.forget.p95 | 15.45 | 15.21 | 15.91 | -1.6 | +3.0 | 44.0 | | | perf.trash.restore.p50 | 63.41 | 63.53 | 64.52 | +0.2 | +1.7 | 6.9 | | | perf.trash.restore.p95 | 106.4 | 106.3 | 111.6 | -0.0 | +5.0 | 7.0 | REGRESS? | | perf.uploads.response.p50 | 142.8 | 142 | 142.9 | -0.6 | +0.0 | 4.4 | | | perf.uploads.response.p95 | 165 | 163.8 | 163.9 | -0.7 | -0.6 | 12.8 | | | perf.uploads.round_trip.p50 | 0.5014 | 0.5016 | 0.4939 | +0.0 | -1.5 | 7.0 | | | perf.uploads.round_trip.p95 | 0.864 | 0.7296 | 0.7589 | -15.6 | -12.2 | 18.0 | | | perf.uploads.save_ack.p50 | 4.23 | 4.196 | 4.139 | -0.8 | -2.2 | 2.9 | | | perf.uploads.save_ack.p95 | 8.41 | 8.5 | 8.537 | +1.1 | +1.5 | 17.2 | | | sb-save.max | 60.56 | 63.67 | 59.41 | +5.1 | -1.9 | 42.4 | | | sb-save.p50 | 20.19 | 20.6 | 20.73 | +2.0 | +2.7 | 3.5 | | | sb-save.p90 | 27.73 | 28.04 | 28.66 | +1.1 | +3.4 | 8.1 | | | sb-save.p99 | 37.46 | 36.66 | 37.77 | -2.1 | +0.8 | 10.4 | | | tasks.cold_plain_s | 1.796 | 1.777 | 1.8 | -1.0 | +0.2 | 3.6 | | | tasks.cold_tasks_s | 2.14 | 2.104 | 2.148 | -1.7 | +0.4 | 3.2 | | | tasks/cold_index_ms/growth_pct | 19.27 | 18.09 | 20.37 | -6.1 | +5.7 | 13.1 | | | tasks/cold_index_ms/plain | 1796 | 1777 | 1800 | -1.0 | +0.2 | 3.6 | | | tasks/cold_index_ms/tasks | 2140 | 2104 | 2148 | -1.7 | +0.4 | 3.2 | | | tasks/describe_ms/pass.p50 | 0.0131 | 0.01281 | 0.01376 | -2.1 | +5.0 | 6.0 | REGRESS? | | tasks/describe_ms/pass.p95 | 0.03557 | 0.0351 | 0.03607 | -1.3 | +1.4 | 8.6 | | | tasks/describe_ms/pass_and_rows.p50 | 0.03899 | 0.03799 | 0.03994 | -2.6 | +2.4 | 4.2 | | | tasks/describe_ms/pass_and_rows.p95 | 0.07055 | 0.07091 | 0.09723 | +0.5 | +37.8 | 9.8 | REGRESS? | | tasks/list_ms/anytime.p50 | 1.824 | 1.819 | 1.843 | -0.3 | +1.0 | 9.6 | | | tasks/list_ms/anytime.p95 | 2.171 | 2.032 | 2.064 | -6.4 | -4.9 | 24.8 | | | tasks/list_ms/anytime_by_child_tag.p50 | 2.232 | 2.316 | 2.288 | +3.7 | +2.5 | 1.7 | | | tasks/list_ms/anytime_by_child_tag.p95 | 2.61 | 2.769 | 2.756 | +6.1 | +5.6 | 7.4 | | | tasks/list_ms/counts.p50 | 0.2496 | 0.2605 | 0.2544 | +4.4 | +1.9 | 17.5 | | | tasks/list_ms/counts.p95 | 0.2741 | 0.2942 | 0.2923 | +7.3 | +6.6 | 30.7 | | | tasks/list_ms/someday.p50 | 1.795 | 1.82 | 1.833 | +1.4 | +2.1 | 5.9 | | | tasks/list_ms/someday.p95 | 2.089 | 2.13 | 2.159 | +1.9 | +3.3 | 11.0 | | | tasks/list_ms/tag.p50 | 2.19 | 2.221 | 2.246 | +1.4 | +2.6 | 8.8 | | | tasks/list_ms/tag.p95 | 2.528 | 2.549 | 2.654 | +0.8 | +5.0 | 20.2 | | | tasks/list_ms/today.p50 | 2.317 | 2.28 | 2.301 | -1.6 | -0.7 | 6.8 | | | tasks/list_ms/today.p95 | 2.664 | 2.539 | 2.685 | -4.7 | +0.8 | 22.6 | | | tasks/list_ms/today_by_priority.p50 | 2.152 | 2.207 | 2.157 | +2.6 | +0.2 | 5.4 | | | tasks/list_ms/today_by_priority.p95 | 2.461 | 2.605 | 2.456 | +5.8 | -0.2 | 13.6 | | | tasks/list_ms/untracked.p50 | 1.242 | 1.248 | 1.286 | +0.5 | +3.6 | 6.4 | REGRESS? | | tasks/list_ms/untracked.p95 | 1.359 | 1.457 | 1.428 | +7.2 | +5.0 | 9.6 | | | tasks/list_ms/upcoming.p50 | 2.29 | 2.262 | 2.333 | -1.2 | +1.9 | 4.3 | | | tasks/list_ms/upcoming.p95 | 2.614 | 2.582 | 2.639 | -1.2 | +1.0 | 10.8 | | | tasks/notes | 1e+04 | 1e+04 | 1e+04 | +0.0 | +0.0 | 0.0 | | | tasks/tasks | 1e+04 | 1e+04 | 1e+04 | +0.0 | +0.0 | 0.0 | | | tasks/write_ms/first_touch.p50 | 15.53 | 15.53 | 15.81 | -0.0 | +1.8 | 4.1 | | | tasks/write_ms/first_touch.p95 | 64.7 | 66.9 | 68.01 | +3.4 | +5.1 | 16.9 | | | tasks/write_ms/warm.p50 | 4.858 | 4.889 | 4.97 | +0.6 | +2.3 | 1.1 | | | tasks/write_ms/warm.p95 | 14.3 | 15.16 | 14.5 | +6.0 | +1.4 | 8.0 | | 9 flagged of 169 </details> Run dir on perf-01: `~/perf/out-rusq-1` (reps 1-3 ran before an API stop; rep 4 was rerun from scratch). Same control gap shows run-to-run noise of ~1-3% on the small metrics.
Author
Owner

Rebased onto dev fe2efbf11 (picks up #1039, #1048, #1050); force-pushed, head 8cea6f026. No conflicts, no new rusqlite manifest entries needed. Gates on dev-01 at that head: cargo fmt --check OK, cargo clippy -j4 --workspace --all-targets --locked -- -D warnings exit 0, cargo test -j4 --workspace --locked exit 0 (127 test binaries ok). cargo audit: RUSTSEC-2026-0459 still gone; the 4 remaining vulnerabilities (webpki-roots, rustls-webpki, pulldown-cmark x2) and the 3 warnings are unchanged from dev. Perf not redone (code delta is only the rebase; kayg accepted the earlier numbers).

Rebased onto dev fe2efbf11 (picks up #1039, #1048, #1050); force-pushed, head 8cea6f026. No conflicts, no new `rusqlite` manifest entries needed. Gates on dev-01 at that head: `cargo fmt --check` OK, `cargo clippy -j4 --workspace --all-targets --locked -- -D warnings` exit 0, `cargo test -j4 --workspace --locked` exit 0 (127 test binaries ok). `cargo audit`: RUSTSEC-2026-0459 still gone; the 4 remaining vulnerabilities (webpki-roots, rustls-webpki, pulldown-cmark x2) and the 3 warnings are unchanged from dev. Perf not redone (code delta is only the rebase; kayg accepted the earlier numbers).
Author
Owner

Merged into dev (4274dafb4, integration merge with #1043/#928/#917/#934; clippy -D warnings + workspace tests green on dev-01). Closing.

Merged into dev (4274dafb4, integration merge with #1043/#928/#917/#934; clippy -D warnings + workspace tests green on dev-01). Closing.
kayg closed this pull request 2026-11-10 10:09:22 +00:00
Some checks are pending
CI / server (pull_request) Waiting to run
CI / rust (pull_request) Waiting to run
CI / web (pull_request) Waiting to run
Markdown extraction contract / markdown-native-contract (pull_request) Waiting to run
Markdown extraction contract / markdown-editor-contract (pull_request) Waiting to run

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
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!1043
No description provided.