From f304373f1a5bf0b353216c3816b3285f0a5d27c1 Mon Sep 17 00:00:00 2001 From: Aditya Mukhopadhyay Date: Tue, 3 Nov 2026 19:50:18 +0530 Subject: [PATCH] Refs #776 Co-Authored-By: Codex --- docs/bench-coverage-v3.md | 1335 ++++++++++++++++--------------------- 1 file changed, 586 insertions(+), 749 deletions(-) diff --git a/docs/bench-coverage-v3.md b/docs/bench-coverage-v3.md index 5b5817983..09fccd059 100644 --- a/docs/bench-coverage-v3.md +++ b/docs/bench-coverage-v3.md @@ -1,55 +1,71 @@ -# v3 nightly benchmark coverage audit (#776), phase 1 +# v3 nightly benchmark coverage close-out (#776) -Audit date: 2026-11-03. This is an inventory and evidence report, not an -implementation or a claim that issue #776 can close. No benchmark or workflow -was changed. The work supports PHILOSOPHY.md's reliability, performance through -simplicity, and documentation principles; it adds no runtime dependency, public -API, or format change. +Audit date: 2026-11-03. P01–P17 are merged. This closes out the implementation +plan and gives every matrix row a disposition; it does **not** close +[issue #776](https://github.com/project-minigraf/minigraf/issues/776) or certify +every release acceptance condition. Remaining manual checks, exclusions and +unverified reporting/scaling claims are listed below. This documentation-only +update follows PHILOSOPHY.md's reliability, performance through simplicity and +documentation principles; it changes no runtime, dependency, API or file format. ## Revisions and method | Input | Revision | | --- | --- | | Supported v2 baseline | Annotated tag `v2.0.11`, peeled commit `709be06c391086ced67e3b0da4ab677de745ac25` | -| Audited v3 code, HEAD and local `origin/v3` | `4685ca9cb7638353087410c31ad07e3f6261ddb0` | -| Local `origin/main`, default-branch workflow inspected | `cabd3e2bfb90ceb354217f74033665d6d4af398a` | +| Audited and measured v3 | `0394c90ad90e9b95d416f4a0ec4a4c78b16e5b57` | +| Default-branch workflow/reporting revision, and inspected `origin/main` | `4d65022ac963a10b582ac762c4ab2e73935c9115` | | `merge-base v2.0.11 origin/v3` | `75ffc9b11f58cee3494430677465d553e582847b` | -| Default-branch workflow revision for both inspected scheduled runs | `4a77092aa8baffee58a8cf57f2d7c8805abf2d9c` | -| Actual v3 checkout in every job of both inspected runs | `29dd5888498a55b4be24db08f1250ca5571bbd44` | - -Sources: [issue #776](https://github.com/project-minigraf/minigraf/issues/776), -[CHANGELOG.md](../CHANGELOG.md) Unreleased section, -[ROADMAP.md](../ROADMAP.md) v3.0.0 scope, -[CLAUDE.md](../CLAUDE.md), [PHILOSOPHY.md](../PHILOSOPHY.md), -`git log v2.0.11..origin/v3` (including inspection without merge commits), and -endpoint diffs of `src/lib.rs`, `src/db.rs`, `src/query/datalog/prepared.rs`, -`Cargo.toml` and the browser module. Endpoint diffs matter: cherry-picked v2 -backports have different commit identities, so the log range alone overcounts -v3-only work. The v3 Cargo package still says 2.0.5; that is not the baseline. - -The two `bench.yml` files at the audited v3 and `origin/main` revisions are -identical. The workflow used by the inspected runs is also identical to that -`origin/main` file. `benches/`, `Cargo.toml` and `bench.yml` have no differences -between the actual measured v3 checkout and the audited HEAD. Thus the names and -routes can be compared directly; the runs do **not** prove execution at HEAD. - -**Criterion IDs below are derived statically, not listed.** A requested -`cargo bench --bench minigraf_bench -- --list` build was interrupted before -enumeration. The user subsequently prohibited remote builds and all new timed -runs, and authorized static derivation. No completed listing or new performance -measurement is claimed. The interrupted build's remote scratch was deleted. -Static expansion uses each `benchmark_group`, `BenchmarkId`, loop and conditional -in [benches/minigraf_bench.rs](../benches/minigraf_bench.rs), and the final -`criterion_group!` registration. Every one of its 31 registered functions and -73 group names is accounted for: **458 IDs, 270 selected, 188 unselected**. -Both inspected runs independently confirm the complete selected set through -`Benchmarking : Analyzing` and Bencher `View results` lines. - -`Cargo.toml` explicitly declares `minigraf_bench` with `harness = false`. -`cargo metadata --no-deps --format-version 1` also reports an automatically -discovered `simd_helpers` bench target. That file contains helper functions, no -Criterion groups or benchmark registrations; compiling it adds no Criterion -coverage. No feature flags are passed by `bench.yml` (default features are empty). +| Original feature inventory revision | `4685ca9cb7638353087410c31ad07e3f6261ddb0` | + +The feature inventory below retains the original v2 endpoint comparison of +[CHANGELOG.md](../CHANGELOG.md), [ROADMAP.md](../ROADMAP.md), public APIs, +features and binding additions. `git diff` from the original inventory revision +to the audited v3 revision is empty for `src/`, `Cargo.toml`, `ROADMAP.md` and +`CHANGELOG.md`: the follow-ups add benchmark/workflow coverage, not production +features. Cherry-picked v2 backports are compared by endpoint behavior rather +than commit identity. The v3 Cargo package's old version is not the baseline. +Refresh this inventory again for production changes before the v3.0.0 cut. + +The inspected main/v3 copies of `bench.yml`, `smoke.yml` and `.github/bench/` +are byte-identical. Main owns schedules; the measured checkout is separately +pinned. **V** below is the actual v3 validation dispatch +[41642356471](https://github.com/project-minigraf/minigraf/actions/runs/41642356471), +using those exact source/workflow revisions. All **31 jobs** succeeded: +compile, **26 native suites** and **four binding jobs**. + +Verification used the downloaded `bench-enumeration`, all `bench-evidence-*` +and all `binding-evidence-*` artifacts, plus job metadata and the supplied +concatenated logs/ID list. Native enumeration contains **583 registered IDs**: +**427 selected, analyzed and uploaded**, and **156 deliberately unselected**. +The selected sets are nonempty and disjoint. Each raw Criterion `Analyzing` +set was independently compared with selection JSON, final report JSON and raw +Bencher result URLs. All sets match, all 26 native reports have zero errors and +zero alerts, and their union matches the supplied 427-ID list. + +The query job's API-downloaded console log is truncated. Its check-run output +has null summary/text, so it does not supply the counts. The retained +`bench-evidence-2` artifact supplies the complete raw query log, upload output +and report: **146 selected; 146 analyzed; 146 uploaded; alerts 0**. The other +25 native suites total **281**. The four binding reports separately verify +**26 foreign-runtime IDs**, all executed/uploaded with zero errors/alerts; +these are not Criterion IDs and are not included in 427. + +**B** means the public Bencher `/perf` API was checked for every result URL: +all 427 native and 26 binding IDs have a metric with version hash equal to the +audited v3 SHA, on branch `v3`, with t-test upper boundary **0.999** and maximum +sample size **30**. This establishes stored observations and threshold models, +not mature regression baselines. At inspection, numeric comparison baselines +exist for **183 native IDs**; they are null for **244 native IDs and all 26 +binding IDs**. Those comparisons are not enforceable yet; baseline accumulation +and live alert delivery remain follow-ups. Returned older metrics can include +inherited main history and must not be counted as independent v3 runs. + +No new build, enumeration or timed workload was run for this doc-only update; +all execution evidence comes from Actions artifacts. `simd_helpers` is an +automatically discovered helper target without Criterion registrations; +`minigraf_bench` is the explicit `harness = false` target. Native jobs use +default features (no test-hooks); browser binding builds use the browser target. ## Feature inventory: additions and changed v3 paths @@ -120,349 +136,255 @@ statement ordering and atomic save (#371/#435/#477/#374) are **not** backported. ### Binding evidence and distinct costs -The following v3 source revisions were read through GitHub's API. Links pin -`src/lib.rs`; `Cargo.toml` was also inspected. These are source audits, not -consumer executions or verification of released package artifacts. +V records exact binding and core revisions. Each measured binding is built +with a Cargo patch to the measured core checkout; the helper verifies Cargo +metadata and retains it with the metrics. These are source builds, not a +verification of published package artifacts. Source entry points at the pinned +revisions were checked against the executed IDs and measurements. -| Binding | Inspected source | Additions/costs requiring their own disposition | +| Binding | Inspected/measured source revision | Disposition | | --- | --- | --- | -| Python | [ade0eeadf2e2b2db3b4d18c529e4d2420fbb07ef](https://github.com/project-minigraf/minigraf-python/blob/ade0eeadf2e2b2db3b4d18c529e4d2420fbb07ef/src/lib.rs) | UniFFI prepare/execute/query, set values and bind conversion, foreign predicate/aggregate callbacks, open options/read-only/memory limit, cursor/log/log writer; Python allocation and crossing costs | -| Java | [68de43c6c37e19c4783f7f709448429d52c6d4f3](https://github.com/project-minigraf/minigraf-java/blob/68de43c6c37e19c4783f7f709448429d52c6d4f3/src/lib.rs) | Same exposed UniFFI paths; JVM conversion/callback costs | -| Android | [110a9dc58aa61934f65eb026ba88792c35f413b5](https://github.com/project-minigraf/minigraf-android/blob/110a9dc58aa61934f65eb026ba88792c35f413b5/src/lib.rs) | Same UniFFI paths; mobile runtime cost unmeasured here | -| Swift | [4f2b296d081491ac1185052404f46e03cbd9dd19](https://github.com/project-minigraf/minigraf-swift/blob/4f2b296d081491ac1185052404f46e03cbd9dd19/src/lib.rs) | Same UniFFI paths; Swift conversion/callback costs | -| Node | [823cf3a83a157fd22178f928dfb3ce562170ea07](https://github.com/project-minigraf/minigraf-node/blob/823cf3a83a157fd22178f928dfb3ce562170ea07/src/lib.rs) | Prepared/cursor objects, recursive set JSON/FactValue conversion, thread-safe JS predicate/aggregate callbacks, open options and logs | -| C | [22e4a8521018ce00c5d70ced3283b81dbb2bcbf8](https://github.com/project-minigraf/minigraf-c/blob/22e4a8521018ce00c5d70ced3283b81dbb2bcbf8/src/lib.rs) | Prepared handles/execute/query/free, JSON bindings/results/sets, callback contexts, registration, options, cursor/log/writer handles | -| Browser | Core `src/browser/{mod,binds,udfs,buffer,indexeddb}.rs` at audited HEAD; [WASM wrapper 7f69e78250575840c4bedf97b46f6f73cad12455](https://github.com/project-minigraf/minigraf-wasm/blob/7f69e78250575840c4bedf97b46f6f73cad12455/src/lib.rs) re-exports core | `BrowserPreparedQuery::execute/query`, `BrowserCursor::next_batch`, typed binds/JS Set, synchronous JS UDF conversions/registry, IndexedDB flush/migration/pins; needs browser target + `browser` feature | -| WASI | Same WASM repository | WASI runtime overhead, separate from browser persistence; no native file backend on wasm32 | - -The UniFFI sources expose `MiniGrafError.Api` and foreign callback traits; -`query_memory_limit` and `read_only` are visible in their options. Core's new -`transaction_chunk_facts` option is not present in the inspected UniFFI, Node or -C options structs; do not assume every core option has reached every binding. -Python's existing [bench/envelope.py](https://github.com/project-minigraf/minigraf-python/blob/ade0eeadf2e2b2db3b4d18c529e4d2420fbb07ef/bench/envelope.py) -drains `db.query` with `next_batch(1000)` and measures latency/RSS. It is -MANUAL-or-ENVELOPE-ONLY for this audit: no Python invocation exists in the core -nightly benchmark workflow. Other repositories' scheduled performance histories -were not audited and are **unverified**, not evidence of core nightly coverage. +| Python | [16f54fef94c75272873b3381fc83cf264ed05e99](https://github.com/project-minigraf/minigraf-python/blob/16f54fef94c75272873b3381fc83cf264ed05e99/bench/nightly.py) | COVERED six foreign-runtime cases in V; UniFFI/Python allocation, prepared integer/set binds, cursor batches, predicate/aggregate callbacks | +| Browser | [da29682e34e6f0a32a1d63882becfeb01dd5d55d](https://github.com/project-minigraf/minigraf-wasm/blob/da29682e34e6f0a32a1d63882becfeb01dd5d55d/bench/browser.mjs), core browser module at audited SHA | COVERED eight cases in V, including IndexedDB write-through and reopen | +| Node | [96fe7a1a9f7521007fefdfee54142694ab39251d](https://github.com/project-minigraf/minigraf-node/blob/96fe7a1a9f7521007fefdfee54142694ab39251d/bench/cases.mjs) | COVERED six N-API/JS cases in V | +| C | [653af45e874b15e54564a2d5e12d5583784c7861](https://github.com/project-minigraf/minigraf-c/blob/653af45e874b15e54564a2d5e12d5583784c7861/bench/nightly.c) | COVERED six C/JSON/handle/callback cases in V | +| Java/JVM | Original source audit [68de43c6c37e19c4783f7f709448429d52c6d4f3](https://github.com/project-minigraf/minigraf-java/blob/68de43c6c37e19c4783f7f709448429d52c6d4f3/src/lib.rs) | MANUAL JVM/JNI/allocation/callback timing; no V job | +| Android | Original source audit [110a9dc58aa61934f65eb026ba88792c35f413b5](https://github.com/project-minigraf/minigraf-android/blob/110a9dc58aa61934f65eb026ba88792c35f413b5/src/lib.rs) | MANUAL ART/ABI/device storage; fixed-device release sign-off required | +| Swift | Original source audit [4f2b296d081491ac1185052404f46e03cbd9dd19](https://github.com/project-minigraf/minigraf-swift/blob/4f2b296d081491ac1185052404f46e03cbd9dd19/src/lib.rs) | MANUAL ARC/callback/Apple-device storage; release sign-off required | +| WASI | Original WASM source audit [7f69e78250575840c4bedf97b46f6f73cad12455](https://github.com/project-minigraf/minigraf-wasm/blob/7f69e78250575840c4bedf97b46f6f73cad12455/src/lib.rs) | MANUAL separate runtime/startup overhead; browser timing does not measure WASI | + +Other binding-repository performance histories are **unverified** here. +The originally inspected UniFFI/Node/C option structs expose read-only and query +memory limits, but not core `transaction_chunk_facts`; do not assume every +option has reached every binding. The measured shortlist does not exercise +option/error latency or foreign FactLog/LogWriter conversion. See +[BINDING_BENCHMARKS.md](BINDING_BENCHMARKS.md) for fixture/timing boundaries and +manual release checks. Python's larger cursor envelope remains separate from +its new 1k nightly shortlist. ## Coverage matrix -`COVERED` means the named representative case has a selecting scheduled filter, -actual v3 execution/upload evidence and public latency history. It does not -mean every semantic variant or a memory bound is covered. A separate row marks -each materially different uncovered subpath. `MISSING` includes registered but -unrouted cases; `MANUAL-or-ENVELOPE-ONLY` includes reports/acceptance tests without -Criterion/Bencher coverage; `EXCLUDED` states a deliberate reason. - -Fixture keys (from `benches/helpers/mod.rs` and benchmark bodies): - -- **M4**: pending in-memory `:e{i} :val i`, 1k/10k/100k/1m facts, inserted in - 100-fact statements. **M3/M2**: first three/two sizes. Multi-attribute helpers - add facts beyond the named entity count (e.g. names, department, tags, edges). -- **F4**: fully checkpointed scalar `.graph`, same four sizes, page cache 256. - **F3/F2**: stated subsets. File fixtures are copied and fsynced; OS cache state - is not controlled. Query proof fixtures open read-only before the timed loop. -- **W**: file + uncheckpointed WAL, never-checkpoint sentinel. Not a single - transaction of that many facts. **CF**: F fixture plus pending writes during - a mixed/writer run; automatic checkpoints suppressed. -- Every case here is native Rust with default features unless explicitly - described as missing binding coverage. No registered case sets a nonzero - `query_memory_limit` or custom `transaction_chunk_facts`. - -Group prefixes in the matrix expand to the exact IDs in the route appendix. -`R1/R2 + B` means execution and successful upload in both scheduled runs below, -plus public Bencher latency history on project `minigraf`, branch `v3`, testbed -`ubuntu-latest`. Thresholds **T99/T999** mean requested t-test upper probability -0.99/0.999 with max sample size 30, not a 1%/0.1% latency budget; see reporting -audit. `None` in evidence/reporting means no verified scheduled evidence or -Bencher history for that subpath. - -| Row | Feature/subpath | Criterion IDs / code evidence | Fixture and mode | Scheduled job/filter; evidence/reporting | Disposition | +`COVERED` means the named representative IDs are selected by the nightly route, +executed/uploaded in V, and have a stored v3 metric/threshold model (B). It does +not mean every semantic variant, memory bound or numeric comparison baseline +exists. `MANUAL` and `ENVELOPE` explicitly lack verified nightly latency +coverage; `EXCLUDED` gives a deliberate reason. All covered rows cite **V+B**; +Appendix A links the individual jobs, exact filters and every selected ID. + +Fixture shorthand: **M4** is pending in-memory scalar data at 1k/10k/100k/1m; +**M3/M2** are its first three/two sizes. **F4** is the corresponding checkpointed +file data, page cache 256; **W** adds uncheckpointed WAL. Multi-attribute fixture +sizes count entities/rows unless stated otherwise. New fixture modes are stated +per row. File copies/fsync/setup and checks stay outside measured operations +unless the case explicitly measures open/write/checkpoint; OS cache is warm, +with no cold-cache guarantee. ID prefixes/ellipses expand only to the actual +selected IDs in Appendix A, not every registered case in a family. + +| Row | Feature/subpath | Benchmark IDs / source evidence | Fixture and measured operation | Nightly job/filter; evidence | Final disposition | | --- | --- | --- | --- | --- | --- | -| C01 | Streaming scalar point/scan and expression paths | `query/point_entity/…`, `query/point_attribute/…`, `expr/{filter_scale,binding_scale,binding_into_agg}/…`, `query/regex_filter/…` | M4 for points/scans; M3 expr; M2 string regex | query `^query/`, expr `^expr/`; R1/R2 + B, T99 | COVERED (native pending paths) | -| C02 | v8 committed scalar reads, UUID projection (#530), B+tree cursor | `query/ordered_groups/…`, `query/partition_windows/…`, `concurrent_btree_scan/…` | F4 IDs projected through cursor groups; F 10k/100k, 2/4/8 threads for entity point reads | query `^query/`, concurrent_btree_scan `^concurrent_btree_scan`; R1/R2 + B, T99/T999 | COVERED (representatives; sparse/repeated-ref projection unverified) | -| C03 | v8 checkpoint/COW allocation/meta/CRC cost | `checkpoint/{1k,10k,100k,1m}`, `checkpoint/after_1_fact/{10k,100k,1m}`, `checkpoint/after_100k_facts/{10k,100k}` | W full flush; F + one new fact; F + 100k added as 100 independent 1k statements | checkpoint `^checkpoint`; R1/R2 + B, T999 | COVERED; fixture grows across incremental samples | -| C04 | Long string value pages, dedup, multi-valued batches and file bounds | No representative long-value/multivalue Criterion case; scalar checkpoint is insufficient | Missing file inline/long, repeated/unique payload, multiple values per triple prefix | None | MISSING (G12); invalid bounds deliberately use correctness tests | -| C05 | v8 write/WAL append and explicit small transaction | `insert/…`, `insert_file/…` (single_fact, batch_100, explicit_tx) | M4; F4 + pending WAL writes; repeated writes of the same benchmark triples, not unbounded live-key growth | insert `^insert/`, insert_file `^insert_file/`; R1/R2 + B, T99/T999 | COVERED for small writes; not chunked transactions | -| C06 | Open checkpointed v8 and replay WAL v2 | `open/checkpointed/…`, `open/wal_replay/…` | F4 read-write open/drop; W 1k/10k/100k facts in 100-fact transactions, page cache 256 | open `^open/`; R1/R2 + B, T999 | COVERED; no large-entry replay fixture | -| C07 | v7→v8 migration, nonmigrating read-only v7, browser migration | No Criterion IDs; `persistent_facts.rs` and browser source | Missing historical v7 files/large dictionaries/browser persistence | None | MISSING (G12/G15); v1–v6 rejection and corrupt-page errors EXCLUDED from latency benchmarking (correctness paths) | -| C08 | verify/rebuild_indexes | No Criterion IDs; `storage/verify.rs`, `db.rs` | Missing file scale, history and rebuild after damage | None | MISSING (G12); refusing mismatched WAL #535/short files is correctness-only EXCLUDED | -| C09 | Long-history committed net-assert, current/as-of | `point_query_chain_depth/{churned_attr,sibling_attr,attr_scan,churned_attr_as_of}/{1,500,2000}` | Checkpointed file, 2,000 filler facts + hot triple history/sibling; depth includes initial version | No filter selects these 12 IDs; no R1/R2/B | MISSING (G13); envelope `hot_current/hot_as_of` does not route them | -| C10 | Retraction/last statement/window replacement | `retract/{single_fact,batch_100}/…` only tests repeated in-memory retractions | M4; no timed replace-window or multi-statement last-write fixture | No filter selects these 8 IDs; no R1/R2/B | MISSING (G13/G10) | -| C11 | Read-only query versus read-only open itself | Query proof groups use `.read_only(true)` outside loop | F4 open cost excluded from query iteration; no read-only WAL/open timing | query `^query/` covers queries only; R1/R2 + B, T99 | COVERED for read-only queries; MISSING open/WAL variant (G12) | -| C12 | Cursor full draining and built-in early limits | `query/ordered_groups/…`, `query/partition_windows/…` call `query`/`next_batch(1000)`; `_limit` modes request 10 | F4, one row per group/partition | query `^query/`; R1/R2 + B, T99 | COVERED for these cursor pulls | -| C13 | Cursor first batch/close/iterator, held snapshot across writes/checkpoints, pin/quarantine overhead | No dedicated IDs. `concurrent*/…` queries capture snapshots but do not hold a cursor across checkpoints | M and CF 10k/100k, 4/8/16 readers (writers also 2 threads); no held-generation churn | concurrent job filters in appendix; R1/R2 + B for baseline concurrency only | MISSING requested lifecycle/pin path (G09) | -| C14 | Entity nested-loop joins, native pending filters and selective recursion probes | `query/join_3pattern/…`, `query/predicate_pushdown/…`, `recursion/ancestors/w10_d4` | M4 chain, value+next facts; names/value M3 with top 10% filter; reversed 10-ary depth-4 tree (11,110 edges) | query `^query/`, recursion `^recursion/`; R1/R2 + B, T99 | COVERED for these queries (#672/#694/#721/#723 paths not individually instrumented) | -| C15 | Committed/pending value-probe vs hash join, pseudo source across joins, cross-kind keys | No paired Criterion IDs; envelope `join_2_pseudo`, `join_3_selective`, `join_3_scan`; tests cover plan forms | File envelope 100k/1m/10m; `query/join_3pattern` is pending entity probes | None for committed/hash controls | MANUAL-or-ENVELOPE-ONLY (G08) | -| C16 | Anti/union paths and rule bodies | `negation/{not_scale,not_join_scale,not_selectivity,not_pushdown_selectivity,not_rule_body}/…`, `disjunction/{or_scale,or_join_scale,or_selectivity,or_short_circuit,or_join_short_circuit,or_rule_body}/…` | M2, 10% exclusion; 10k varying exclusion/matches; tag/exclusion helpers add facts | negation `^negation/`, disjunction `^disjunction/`; R1/R2 + B, T99 | COVERED for listed pending queries; forced hash/correlated, committed and nested expression branches MISSING (G08) | -| C17 | Pseudo metadata and time travel on new engine | `temporal_metadata/{tx_time,valid_from,valid_to}/…`, `time_travel/{as_of_counter,valid_at}/…` | M3 metadata, M4 entity points; `tx_time` actually queries `:db/tx-count`; counter 999999 and valid-at 2099 let all fixture facts pass | temporal_metadata `^temporal_metadata/`, time_travel `^time_travel/`; R1/R2 + B, T99 | COVERED for these simple cases; committed timestamp/irregular TxBound path envelope-only (G08) | -| C18 | General aggregate holder, exact numeric sum, :with | `aggregation/{count_scale,grouped_count_scale,sum_scale,with_grouped_sum,count_distinct_scale}/…` | M2 integers; 10 department keys; count-distinct 50% duplication | aggregation `^aggregation/`; R1/R2 + B, T99 | COVERED for integer/count/:with representatives | -| C19 | Recursive relations, semi-naive/demand and rule limit checking | `recursion/chain/{depth_10,depth_100}`, `recursion/fanout/w10_d3`, `recursion/ancestors/w10_d4`; negation/disjunction rule-body IDs | M chains, 1,110-edge down tree and 11,110-edge up tree; no configured-limit exhaustion or recursive committed control | recursion `^recursion/` plus rule-body jobs; R1/R2 + B, T99 | COVERED for positive pending recursion; multistratum/nonlinear/committed/limit scaling MISSING (G08) | -| C20 | Ordinary avg, mixed-type/float exact aggregates, effective grouping tuples | `query/ordered_groups/avg/…` and ordered built-ins cover integer singleton groups only; no hash-avg/mixed/extrema/domain-proof fallback cases | F4 integer key/value; no big exact sums, skew, mixed types, hidden :with tuple or repeated dimension fixture | query `^query/`; R1/R2 + B only for singleton cases | MISSING additional #547/#777/#789/#781 costs (G16) | -| C21 | Scalar Sort omission and UUID tie fallback, top-k control | `query/ordered_values/{index,uuid_ties}/…` | F4 ascending integers, :limit 10; index omits Sort, UUID suffix retains it | query `^query/`; R1/R2 + B, T99 | COVERED for this #641 pair | -| C22 | Ordered aggregates (#641/#781) | `query/ordered_groups/{count,distinct,avg,sum,min,max,sum_distinct,count_limit,distinct_limit,avg_limit,sum_limit,min_limit,max_limit,sum_distinct_limit}/…` | F4 unique integer groups, full drains or :limit 10; `distinct` here is **count-distinct**, not final :distinct | query `^query/`; R1/R2 + B, T99 | COVERED for all 14 modes (56 IDs); skew/proof/fallback controls missing in C20 | -| C23 | Ordered partition-at-a-time window | `query/partition_windows/{value,entity,value_limit,entity_limit}/…` | F4 one-row partitions, row-number, full drain/:limit 10 | query `^query/`; R1/R2 + B, T99 | COVERED for 16 IDs; growing/multirow and incompatible-window controls MISSING (G08) | -| C24 | Meter overhead, memory limits, RSS/scaling | No Criterion ID sets a memory limit or uploads memory metrics; tests `memory_limit_acceptance_test`, `recursive_acceptance_test`, `limit_acceptance_test`, `large_transaction_acceptance_test` | Manual/acceptance and envelope scales up to 10m; retained-state estimates differ from process RSS | No Bencher memory measure; default-main smoke scheduling does not check out v3 | MANUAL-or-ENVELOPE-ONLY (G07); v3 nightly acceptance execution unverified | -| C25 | General limit/offset/order/top-k/slots | C21/C22/C23 cover fixed limit 10 and one ascending tie fallback; no offset, descending k sweep, pending top-k, compound output or slot IDs | Envelope `limit`, `top_k`; no Criterion offset/prepared counts | query only covers named controls; none for remaining paths | MANUAL-or-ENVELOPE-ONLY for broader sorting/limit, MISSING offset/slots (G04/G02) | -| C26 | Final output :distinct | No IDs contain or execute `:distinct`; aggregate count-distinct is different | Missing duplicate-heavy mixed/set tuples, bag control, pagination | None | MISSING (G03) | -| C27 | lag/lead | No Criterion query uses either function; existing `window/…` is sum/rank/row-number only | Missing one/many partitions, peer/tie and large partition cost | None | MISSING (G06) | -| C28 | Bounded rows and registered frame replay | `window_rows/…` (128 IDs, exact expansion below) | M 10k/100k rows, 2n facts (:val + :part), one/100 partitions; built-ins sum/count/min/max/avg, six widths; UDF zero/two/half at 10k and prefix at 100k | `^window/` selects **zero** of these; no other job selects them | MISSING nightly route (G01); existing manual #183 evidence is not nightly history | -| C29 | Set storage/serde/binds/predicates/collect-set | No Criterion case uses a set, membership predicate or collect-set | Missing inline ≤64 bytes/long sets, cardinality, exact-value index scans, per-row collection, pending/committed storage | None | MISSING (G05); #794 manual set measurements do not establish nightly coverage | -| C30 | Chunked parser/execute/retract/WriteTransaction, staged reads/rollback | No large-transaction IDs; insert explicit_tx stages one fact, checkpoint/after_100k uses independent 1k statements | No statement crossing 65,536 in measured loop; ignored million-fact acceptance exists | None; default-main smoke does not select v3 | MANUAL-or-ENVELOPE-ONLY acceptance; MISSING regression benches (G10/G09) | -| C31 | FactLog orders/filters/window/pinned reader | No Criterion IDs | Missing pending+committed history, tx vs storage order, selective filters, window sweeps | None | MISSING (G11) | -| C32 | LogWriter preserving history/holes/windows | No Criterion IDs; envelope fixture/acceptance setup uses it, outside query timing | Missing append/finish, checkpoint-boundary scaling, long/set values | None | MISSING (G11); fixture construction is not measurement | -| C33 | UDF registry snapshot baseline vs new fallible/re-entry paths | `udf/{aggregate_sum_dispatch,predicate_filter_dispatch}/…` use old infallible registration, query after setup | M2, integer aggregation/predicate; no registration churn, try_register, failure/re-entry or foreign callbacks | udf `^udf/`; R1/R2 + B, T99 for baseline dispatch only | COVERED baseline; MISSING #180-specific costs (G14) | -| C34 | Prepared execute/planning/substitution | `prepared/{value_lookup,threshold_filter}/{1k,10k}` | M2 integer slots, prepare outside timed loop; no prepared cursor, set/entity/time/count binds or preparation timing | No scheduled prepared filter; no R1/R2/B | MISSING (G02); old Rust API still matters to new bindings/#795 | -| C35 | Expression literal-keyword UUID cache (#774), plan/source metadata | No expression benchmark compares keyword/ref: existing expr cases use numeric <, arithmetic and sum | Manual `docs/benchmarks/774-expression-keywords.md`; no literal/dynamic/nested/prepared controls | None for keyword cases | MANUAL-or-ENVELOPE-ONLY (G17) | -| C36 | Binding prepare/UDF/set/options/cursor/log overhead, IndexedDB/browser snapshots | No binding execution in `benches/*.rs` or core `bench.yml`; Python manual envelope above | No JS/WASM/foreign conversion fixture, callback crossing or browser persistence | None in core nightly; other-repo histories unverified | MISSING (G15), Python cursor MANUAL-or-ENVELOPE-ONLY | -| C37 | Error contracts / changed validation, limit exhaustion | PRS/API/QRY codes, failed-checkpoint retry refusal (#390), corrupt-tree monotonicity/cycle refusal (#597), and derived-fact metadata/alias changes in inventory | Existing successful queries pay normal validation; no need for timing of every invalid input | None specific | EXCLUDED individual failure-code latency; preserve correctness tests. Rule/memory/large-write scaling remains C19/C24/C30 | -| C38 | Synthetic SIMD candidates | `simd_{temporal,as_of,aggregate}/{scalar,simd}/{100,1k,10k,100k,1m}` | Vec slices, neither database nor streaming query engine | No scheduled filter, no R1/R2/B | EXCLUDED from v3 feature obligations: pre-existing experimental helper kernels, not production feature coverage | -| C39 | Test/proof/documentation changes, uuid features, release LTO (#796), shared-reader study (#797) | Kani, Shuttle, fault/property/fuzz/soak, binary-size workflow; #797 adds audit harness/docs, not production shared-reader implementation | Normal builds exclude proof/schedule cfgs; bench already specifies full LTO, so it is not a before/after dist-profile test | Not a latency feature job | EXCLUDED from Criterion obligations; size gate/manual dist measurements are separate. Any future shipped profiler/runtime change needs a new row | -| C40 | Planned public profiler (#185), OPFS/rule persistence | #185 open; OPFS #441 and rule persistence #241 are ROADMAP v3.next | Not shipped at audited revision | None | EXCLUDED until implemented/in release; refresh before release cut | -| C41 | Older lookup groups, despite their B+tree name | `btree_lookup/{entity_point,attribute_scan}/{1k,10k,100k}` | In-memory names+values, no committed B+tree fixture | No filter selects these 6 IDs | EXCLUDED from required routing as redundant pending scalar lookup coverage; C01 supplies that path. Add a committed fixture rather than calling these file coverage | - -## Workflow and regression-reporting audit - -The authoritative scheduled file is `origin/main:.github/workflows/bench.yml`, -not the copy checked out from v3. Its cron is `0 2 * * *` for main and -`0 14 * * *` for v3. `BENCH_REF`, run-name and checkout use the cron string; -manual dispatch selects `inputs.ref`. Actual start times can be much later than -the cron, as R1 shows. `gh run list --branch v3` returned no runs; these schedules -are recorded under main even when `BENCH_REF=v3`. - -Compile runs `cargo bench --no-run`, timeout 120 minutes. Each of 21 parallel -suite jobs depends on compile, restores target, and runs -`CARGO_TERM_COLOR=never cargo bench -- "${{ matrix.filter }}" 2>&1 | tee FILE` -with `pipefail`, timeout 360 minutes, fail-fast false. Workflow concurrency group -`bench` queues runs rather than cancelling. Compile success proves no case ran. -There is no step asserting the expected selected ID count; an empty filter is -not explicitly rejected by the workflow. Static matching finds **no currently -empty filters**, and no ID matches two scheduled filters. - -Bencher CLI is pinned to v0.4.25, project `minigraf`, branch `$BENCH_REF`, -testbed `ubuntu-latest`, adapter `rust_criterion`, measure `latency`, test -`t_test`, `max-sample-size 30`, upper boundary from each matrix entry, `--err`. -Non-main uploads use `--start-point main --start-point-clone-thresholds`. -Only latency is configured; throughput annotations do not establish an RSS, -allocation, retained-state or bounded-memory regression gate. - -Upload is `continue-on-error: true`. A failing upload invokes Report regression: -it parses latency alert URLs, reads up to 20 completed default-branch workflow -runs, chooses the previous same-title branch run, and matches the same suite job. -Only benchmark names alerting in both runs trigger a performance issue/comment. -An upload failure with no parsed alerts is reported immediately. Issues are -per suite and branch; existing issues receive comments. A previous-log lookup -failure warns and leaves the previous alert set empty, suppressing repeat-alert -reporting for that invocation. These are code-verified behaviors, not a tested -alert injection in this audit. R1/R2 had successful uploads and skipped reporting; -the issue-creation/notification path is **unverified end to end** here. - -**Threshold scope needs a follow-up (G18).** The public `/thresholds` response -contains one active v3/ubuntu-latest/latency threshold, UUID -`01a11620-46a3-7582-b2b1-ab58de905220`, whose latest model is t_test, max 30, -upper boundary 0.999. All suites send the same branch/testbed/measure tuple, -although their commands request different boundaries. They do not create -per-suite thresholds: successive uploads replace this shared model. Historical -API points inspected for `window/rank/100k`, `query/ordered_groups/avg/1m`, -`udf/predicate_filter_dispatch/1k` and `checkpoint/after_1_fact/1m` have their -intended 0.99/0.999 values in each of the latest five reports. Thus a wrong -boundary was **not demonstrated** for those samples; stable isolation between -parallel suite uploads is not established. Choose a common boundary or separate -testbeds/measures and verify resulting boundaries before claiming per-suite -threshold isolation. - -The v3 `.github/workflows/smoke.yml` defines ignored memory/recursion/limit/large -transaction acceptance jobs, but its `actions/checkout` has no ref override. -`origin/main`'s smoke file only has the original smoke job. Its default-branch -schedule therefore cannot supply the v3-only acceptance jobs claimed by v3's -comments. Their actual scheduled v3 execution is unverified; unit tests and -manual results cannot substitute for Bencher history (G07). - -## Run evidence and public history - -Read-only commands used: - -```sh -gh issue view 776 -git rev-parse 'v2.0.11^{commit}' origin/v3 origin/main -git merge-base v2.0.11 origin/v3 -git log v2.0.11..origin/v3 -git diff v2.0.11 HEAD -- src/lib.rs src/db.rs Cargo.toml -git show origin/main:.github/workflows/bench.yml -gh run list --workflow bench.yml --branch main --limit 12 --json databaseId,event,headBranch,headSha,status,conclusion,createdAt,url -gh run list --workflow bench.yml --branch v3 --limit 8 --json databaseId,event,headBranch,headSha,status,conclusion,createdAt,url -gh run view 41538175832 --json displayTitle,headSha,event,jobs,url -gh run view 41538175832 --log -gh run view 41337918695 --json displayTitle,headSha,event,jobs,url -gh run view 41337918695 --log -``` - -| Evidence | Run | Result verified from logs and job metadata | +| C01 | Streaming scalar points/scans and expressions | `query/point_{entity,attribute}/…`, `query/regex_filter/…`, `expr/{filter_scale,binding_scale,binding_into_agg}/…` | M4 scalar, M3 expressions, M2 regex | query `^query/`; expr `^expr/`; V+B | COVERED native pending representatives | +| C02 | Committed scalar reads, UUID projection, B+tree cursor | `query/ordered_groups/…`, `query/partition_windows/…`, `concurrent_btree_scan/…` | F4 groups/windows; F 10k/100k, 2/4/8 reader threads | query; concurrent_btree_scan `^concurrent_btree_scan`; V+B | COVERED; sparse/repeated-ref projection remains MANUAL (X06) | +| C03 | COW checkpoint/allocation/meta/CRC | `checkpoint/{1k,10k,100k,1m}`, `checkpoint/{after_1_fact,after_100k_facts}/…` | W full flush; F + one fact or 100k in independent 1k statements; incremental fixture grows across samples | checkpoint `^checkpoint`; V+B | COVERED; X06 for sustained pin/churn scaling | +| C04 | Long values, dedup and same-statement multivalues | `checkpoint/storage_v3/multivalue_{inline_unique,long_repeated,long_unique}/10k`, `query/storage_v3/multivalue_long_scan/10k`; `storage_v3.rs` | 2,500 entities × four values, 32/256-byte strings; fresh-copy checkpoint or committed full scan | checkpoint; query; V+B | COVERED; invalid size bounds EXCLUDED as correctness paths (X08) | +| C05 | WAL append and explicit small transactions | `insert/{single_fact,batch_100,explicit_tx}/…`, `insert_file/{single_fact,batch_100,explicit_tx}/…` | M4/F4 plus pending writes; repeated benchmark triples | insert `^insert/`; insert_file `^insert_file/`; V+B | COVERED; chunked paths in C30 | +| C06 | Checkpointed v8 open and WAL v2 replay | `open/{checkpointed,wal_replay}/…` | F4 checkpointed; W 1k/10k/100k facts in 100-fact statements, read-write open/drop | open `^open/`; V+B | COVERED; million-fact single-entry replay EXCLUDED from latency timing; correctness-only (X08) | +| C07 | Native v7 migration and nonmigrating read-only v7 | `open/storage_v3/{migrate_v7,read_only_v7}/multi_checkpoint`; `storage_v3.rs` | Frozen v7 multi-checkpoint corpus, all manifest queries validated; copies outside timed open | open; V+B | COVERED small native representative; large/browser migration MANUAL (X03) | +| C08 | Integrity verification and index rebuild | `checkpoint/storage_v3/verify/100k_history`, `checkpoint/storage_v3/rebuild_damaged_avet/100k_history` | 100,150 stored/99,950 live facts; rebuild starts from CRC-damaged current AVET root, copied per iteration | checkpoint; V+B | COVERED; arbitrary failure-code latency EXCLUDED (X08) | +| C09 | Committed net-assert/history, current and as-of | `point_query_chain_depth/{churned_attr,sibling_attr,attr_scan,churned_attr_as_of}/{1,2000}`; `history.rs` | 2,000 filler facts, churned triple and sibling; depth includes initial assertion; checkpointed | history_retract shortlist in Appendix A; V+B | COVERED eight IDs; intermediate depth 500 EXCLUDED as redundant (X01) | +| C10 | Retraction, last statement and window replacement | `retract/{single_fact,batch_100}/10k`, `insert_file/chunked/{retract,write_tx}/{65535,65537}` | M 10k repeated retracts; fresh file chunk controls include later-statement window replacement | history_retract; insert_file; V+B | COVERED; other retract scales EXCLUDED (X01) | +| C11 | Read-only open/query and in-memory WAL replay | `open/storage_v3/read_only_v8/10k`, `open/storage_v3/read_only_wal/10k_plus_1k`, C07; ordered query groups | F 10k with/without 1k WAL facts; source bytes checked unchanged; read-only query fixtures | open; query; V+B | COVERED representative native opens and reads | +| C12 | Cursor full draining and early limit | `query/ordered_groups/…`, `query/partition_windows/…`, `query/cursor_lifecycle/drain/{10k,100k}` | F4 proof groups use batch 1000/full drain or limit 10; dedicated drain uses batch 256 | query; V+B | COVERED | +| C13 | Cursor lifecycle, pins and staged snapshot reads | `query/cursor_lifecycle/…`; `cursor_lifecycle.rs` | F 10k open/first batch/iterator/close; 10k/100k drain; old 10k snapshot across two setup checkpoints; staged 10k+100 pending+100 uncommitted | query; V+B | COVERED eight IDs; checkpoint setup is untimed, sustained quarantine growth MANUAL (X06) | +| C14 | Entity probes, pending filters and selective recursion | `query/join_3pattern/…`, `query/predicate_pushdown/…`, `query/operator_paths/entity_{pending,committed}/10k`, `recursion/ancestors/w10_d4` | M4 joins, M3 selective filters; paired 20k-fact joins; 11,110-edge ancestor tree | query; recursion `^recursion/`; V+B | COVERED; optimization-specific isolation remains MANUAL (X06) | +| C15 | Value/hash joins and per-fact metadata source | `query/operator_paths/{entity,value,hash}_{pending,committed}/10k`; `operator_paths.rs` | 10k output rows/20k facts; pending memory vs committed file; hash deliberately scans broader attribute domain; preflight operator checks | query; V+B | COVERED six natural-plan controls; exhaustive cross-kind/forced variants EXCLUDED (X07) | +| C16 | Anti/union operators and rule bodies | `negation/…`, `disjunction/…`, `query/operator_paths/{anti_committed,union_committed}/10k` | M 1k/10k selectivity/rule cases; committed correlated not plus hashed not-join, union with nested outer-variable expressions | negation `^negation/`; disjunction `^disjunction/`; query; V+B | COVERED representatives; forced strategy permutations EXCLUDED (X07) | +| C17 | Pseudo metadata and transaction/valid-time bounds | `temporal_metadata/…`, `time_travel/{as_of_counter,valid_at}/…`, `time_travel/operator_paths/timestamp_{monotone,irregular}/10k` | M3 metadata (tx_time case reads tx-count), M4 broad temporal points; committed 10k records, irregular timestamps require non-prefix cutoff | temporal_metadata `^temporal_metadata/`; time_travel `^time_travel/`; V+B | COVERED broad and selective committed timestamp representatives | +| C18 | General aggregates, exact arithmetic and :with | `aggregation/{count_scale,grouped_count_scale,sum_scale,with_grouped_sum,count_distinct_scale}/…` | M2 integer/count/:with; 10 departments, 50% count-distinct duplication | aggregation `^aggregation/`; V+B | COVERED; mixed/exact controls in C20 | +| C19 | Recursive engine/demand and rule limit checking | `recursion/{chain,fanout,ancestors}/…`, `recursion/operator_paths/ancestors_committed/10k`; rule-body negation/disjunction | Pending chain/tree; committed 10-edge ancestor chain amid 10k filler facts | recursion; negation; disjunction; V+B | COVERED positive recursion; nonlinear/multistratum/limit scaling ENVELOPE/acceptance (X02) | +| C20 | Ordinary avg, mixed/exact sums/extrema, tuple fallbacks | `aggregation/v3_controls/…`; `aggregate_controls.rs` | Four hash cases, M 10k mixed numerics/extrema; six 100k skew/tuple controls, pending or committed/read-only | aggregation; V+B | COVERED ten cases; exhaustive numeric permutations EXCLUDED (X07) | +| C21 | Sort omission/UUID tie fallback and top-k | `query/ordered_values/{index,uuid_ties}/…`, `query/pagination/…` | F4 ascending limit 10; pending/committed offset and descending controls in C25 | query; V+B | COVERED | +| C22 | Ordered aggregation and effective tuple proofs | `query/ordered_groups/…`, `aggregation/v3_controls/{skew_count_committed,skew_count_pending,skew_avg_committed,tuple_repeated_constant,tuple_float_constant_fallback,tuple_hidden_with_fallback}/100k` | F4 14 singleton modes (56 IDs), plus skew: 90k rows in one bucket/100 buckets of 100; hidden :with and float fallback | query; aggregation; V+B | COVERED; ordered_groups/distinct means count-distinct, not final :distinct | +| C23 | Partition streaming and incompatible windows | `query/partition_windows/{value,entity,value_limit,entity_limit}/…`, `query/operator_paths/windows_committed/10k` | F4 singleton partitions plus 100×100 rows and two incompatible window orders | query; V+B | COVERED; larger shape sweeps ENVELOPE (X06) | +| C24 | Memory-limit enforcement overhead and bounds | `memory_meter/{count,hash_groups}/{unlimited,limited}/10k`; `memory_meter.rs` | F 10k read-only; unlimited vs 8 MiB finite limit; 4 KiB QRY-012 preflight is untimed; accounting always enabled | memory_meter `^memory_meter/`; V+B | COVERED four latency controls; RSS/state bounds ENVELOPE and revised acceptance execution unverified (X02) | +| C25 | Limit/offset/order/top-k and prepared count slots | `query/pagination/…`, `prepared/{count_slots,unprepared_count_slots}/10k`; `pagination.rs`, `prepared.rs` | Eight 100k pending/committed controls, offset 0/half, descending k=10/1000; compound ties 10k/100k; prepared limit 10/offset 100 | query; prepared `^prepared/`; V+B | COVERED; 10m sweeps ENVELOPE (X06) | +| C26 | Final projected-tuple :distinct | `query/distinct/{bag,scalar,sorted_page,float_set_tuple}/{10k,100k}`; `distinct.rs` | M duplicate-heavy input, 1,000 unique keys/tuples; float/set signed zeros, descending sort/offset/limit composition | query; V+B | COVERED eight IDs | +| C27 | lag/lead | `window/neighbors/{lag,lead}/{one,hundred}/10k`, `window/neighbors/lag_lead/{one,hundred}/100k` | M 10k/100k rows, one/100 partitions, four-row peer groups and boundary nulls | window `^window/`; V+B | COVERED six IDs | +| C28 | Bounded rows and registered aggregate replay | 18 `window_rows/…` IDs; exact shortlist in Appendix A | M 10k/100k rows, 2n facts; sum zero/two/prefix one/100 partitions; min/max and bounded/full-prefix UDF controls | window_rows exact anchored shortlist in Appendix A; V+B | COVERED 18 IDs; remaining 110 MANUAL, not nightly (X01) | +| C29 | Set storage/queries/binds and collect-set | `{insert_file,checkpoint,query}/set_storage/…`, `query/set_queries/{in,not_in,all_in,any_none,collect}/{pending,committed}/10k` | 10k storage facts, 4-element inline/32-element long repeated/unique sets; 10k entities for pending/committed membership and empty collection; binds in C36 | insert_file; checkpoint; query; V+B | COVERED ten storage + ten query cases; host set binds in C36; cardinality sweeps MANUAL (X06) | +| C30 | Chunked execute/retract/write transactions/rollback | `insert_file/chunked/{execute,retract,write_tx}/{65535,65537}`, `insert_file/chunked/statement_rollback/65537`, C13 staged_read | Default 65,536-fact boundary, fresh file per iteration; two staged statements; late API-011 after first chunk, then valid commit | insert_file; query; V+B | COVERED seven chunk IDs and staged-read control; million-fact/scaling bounds ENVELOPE/acceptance (X02) | +| C31 | FactLog storage/tx order, filters and bounded window | `fact_log/…`; `fact_log.rs` | 10k/100k historical records +100 pending; batch 1024, default/4096 window, attribute-only and entity/prefix/tx-range filters | fact_log `^(fact_log\|log_writer)/`; V+B | COVERED six IDs; long-held log pin/churn MANUAL (X06) | +| C32 | LogWriter history/holes/windows and finish | `log_writer/{append,finish}/{10k,100k}`; `fact_log.rs` | Four historical phases, tx holes, long strings/sets; 10k below and 100k above 65,536 writer batch; append and finish isolated | fact_log; V+B | COVERED four IDs; foreign conversions MANUAL (X04) | +| C33 | Fallible UDFs, registry snapshot churn and re-entry | `udf/{aggregate_sum_dispatch,predicate_filter_dispatch}/…`, `udf/v3/…`; `udf_v3.rs` | Matched 10k fallible/infallible successful callbacks; fixed 32-UDF registry with held cursor; 1k callbacks re-enter same database | udf `^udf/`; V+B | COVERED baseline four + six v3 IDs; deliberate callback error timing EXCLUDED (X08) | +| C34 | Prepared planning/substitution/execute/cursor and slots | `prepared/…`; `prepared.rs` | M 1k/10k execute; 10k preparation + unprepared controls, cursor drain batch 256, count/time/entity slots | prepared; V+B | COVERED 12 IDs; foreign set binding in C36; exhaustive binds EXCLUDED (X07) | +| C35 | Expression-local literal keyword/ref cache | `expr/keyword_equality/{literal_eq,dynamic_eq,literal_neq,dynamic_neq,nested_literal_eq,prepared_keyword_eq}/10k` | Same M 10k keyword rows; literal/dynamic include different bind/clone costs, not an isolated cache-off switch | expr `^expr/`; V+B | COVERED six IDs, including nested/prepared cache construction | +| C36 | Foreign prepare/cursor/set/callback and browser persistence | `binding/{python,browser,node,c}/…` (Appendix B); binding sources above | 1k integer facts + one two-element set; full cursor drains batch 1/256, JSON/host conversions; browser fresh IndexedDB 1k write/reopen | binding_python/browser/node/c fixed shortlists; dedicated testbeds; V+B | COVERED 26 non-Criterion IDs; no numeric comparison baselines yet; remaining hosts/APIs MANUAL (X04) | +| C37 | Changed error/validation contracts | PRS/API/QRY codes, failed checkpoint retry refusal, corrupt-tree checks; correctness suites | Successful queries pay validation; rollback cost represented in C30 | No separate error-code latency route; no dedicated timed V case | EXCLUDED individual invalid-input timing; correctness tests retain the contracts (X08) | +| C38 | Synthetic SIMD candidates | `simd_{temporal,as_of,aggregate}/{scalar,simd}/…` (30 unselected) | Vec slices, not the database/streaming engine | No selecting nightly filter; no dedicated timed V case | EXCLUDED pre-existing experimental helper kernels; no production-feature claim | +| C39 | Proof/test/docs/release changes and shared-reader study | Kani/Shuttle/fault/property/fuzz/soak, uuid features, binary-size workflow, #796/#797 | Proof cfgs absent from normal builds; bench already full LTO; #797 is a study, not shipped shared-reader implementation | Separate correctness/size gates, no feature latency route; no dedicated timed V case | EXCLUDED from Criterion obligations; manual dist-size measurements and runtime verification stay separate | +| C40 | Planned profiler/OPFS/rule persistence | Public profiler #185, OPFS #441, rule persistence #241 remain open; no shipped API at audited revision | Not implemented/in the audited release code | No route; no dedicated timed V case | EXCLUDED until shipped; refresh inventory before release cut (X09) | +| C41 | Older btree_lookup groups | `btree_lookup/{entity_point,attribute_scan}/{1k,10k,100k}` (six unselected) | Pending memory fixture despite name; duplicates C01 scalar lookups | No selecting nightly filter; no dedicated timed V case | EXCLUDED redundant pending coverage; not committed B+tree evidence | + +## Workflow, reporting and run evidence + +The scheduled workflow is main's `.github/workflows/bench.yml`. Its unchanged +crons select main at 02:00 UTC and v3 at 14:00 UTC; dispatch selects `inputs.ref`. +V is a **workflow_dispatch**, not a newly observed cron run. `headSha` is the +main workflow revision; compile resolves v3 once, and every native/binding job +checks out the compile SHA. Reporting helpers separately use `workflow_sha`. +Suite availability is checked in the measured source so main/old refs skip +absent suites consistently rather than upload empty results. + +Compile builds only `minigraf_bench` and enumerates IDs once with `--list`. +Each required native route selects from the shared listing, rejects empty or +duplicate selections, then checks exact analyzed and uploaded sets. The native +jobs use `pipefail`, ten-or-existing sample settings, 360-minute timeouts and +fail-fast false; compile timeout is 120 minutes. Workflow concurrency queues +runs rather than cancelling them. Binding jobs have 60-minute timeouts, verify +every case untimed, then validate finite JSON nanosecond latency metrics and +exact executed/uploaded sets. + +Bencher CLI remains pinned to v0.4.25. Native data uses project `minigraf`, +branch `v3`, testbed `ubuntu-latest`, adapter `rust_criterion`, measure latency; +non-main native uploads inherit main's start point. Every suite now uses one +common upper probability **0.999**, maximum 30 samples. This resolves the former +parallel replacement of different models on the same branch/testbed/measure +threshold. It is a probability threshold, not a 0.1% latency budget. Previously +0.99 suites are less sensitive. Binding JSON uploads use separate +`binding-{python,browser,node,c}-ubuntu24-v1` testbeds, branch `v3`, with the same +model settings and no native-testbed history inheritance. Experimental binding +refs use separate history branches. + +Uploads remain `continue-on-error`, but the always-run final audit fails missing, +partial, duplicate, unexpected or API-error uploads. Reports and artifacts +retain filters, exact IDs, measured/workflow hashes, outcome and alerts for +30 days. All V uploads succeeded and every Report regression step was skipped. +The source's notification policy still reports latency alerts only if the same +benchmark alerted in the previous same-branch/suite run; upload failures without +alerts are reported immediately. A previous-log lookup failure warns and leaves +an empty previous-alert set. Parser/audit tests cover success, alert and upload +failure formats, but **live failed-upload/alert notification delivery is +unverified end to end**. No alert injection was performed for this update. + +P15's main/v3 `smoke.yml` now agrees: main smoke at 05:00 UTC, pinned v3 acceptance +at 17:00 UTC. The acceptance matrix selects recursion, memory-limit, limit, +large-transaction (`test-hooks`) and size-per-fact tests, with retained test/source +logs. This is a source-verified routing fix, **not observed v3 acceptance +execution**. The latest inspected smoke run +[41637991836](https://github.com/project-minigraf/minigraf/actions/runs/41637991836) +used the earlier `e82e8740402366a9b339be21817583e3fdaaea55` workflow and had only +the main smoke job. V does not invoke smoke acceptance. RSS/state high-water, +QRY-012 exhaustion and million-fact bounds therefore remain separate from V's +latency evidence; execution of the revised schedule is **unverified**. + +| Evidence | Run | Verified scope | | --- | --- | --- | -| R1 | [41538175832](https://github.com/project-minigraf/minigraf/actions/runs/41538175832), scheduled 2026-11-02 22:32:48 UTC, title Nightly Benchmarks (v3) | All 21 suites successful; 270 distinct `Analyzing` names, 270 matching Bencher result names, all uploads success | -| R2 | [41337918695](https://github.com/project-minigraf/minigraf/actions/runs/41337918695), scheduled 2026-11-01 18:41:40 UTC, same title | Same exact 270 executed/uploaded IDs, all 21 uploads success | +| Before #776 (original audit) | [41538175832](https://github.com/project-minigraf/minigraf/actions/runs/41538175832), [41337918695](https://github.com/project-minigraf/minigraf/actions/runs/41337918695) | Original audit recorded 270 native IDs, 21 suites; measured `29dd5888498a55b4be24db08f1250ca5571bbd44`; these are historical evidence, not final v3 execution | +| Batch 1 | [41603905357](https://github.com/project-minigraf/minigraf/actions/runs/41603905357) | Issue comment records 338 native IDs/25 green jobs; run metadata rechecked successful. Its individual sets were not re-audited here | +| V, final dispatch | [41642356471](https://github.com/project-minigraf/minigraf/actions/runs/41642356471) | 31/31 successful; 427 native IDs across 26 suites +26 foreign IDs across four jobs; exact selection/analysis/upload sets and stored SHA-specific metrics independently checked | -Every job's checkout `git log -1 --format=%H` returned the measured v3 hash in -the revisions table, not the workflow's main `headSha`. No benchmark difference -between that checkout and HEAD was inferred from a green badge: `git diff` of -the benchmark sources/Cargo/workflow was checked separately. +Final native suite counts (each column has the same count; **all alerts 0**): -Examples from R1 (timestamps UTC, job prefix abbreviated): - -```text -compile 22:32:56 git log -1 --format=%H -compile 22:32:56 29dd5888498a55b4be24db08f1250ca5571bbd44 -query 22:47:07 Benchmarking query/ordered_values/index/1k: Collecting ... -window 22:36:42 Benchmarking window/running_sum/1k -query 23:04:03 View results: -query 23:04:03 - query/join_3pattern/100k (Latency): https://bencher.dev/console/projects/minigraf/perf?... -``` - -Neither full log contains executed or uploaded `window_rows/`, `prepared/`, -`retract/`, `btree_lookup/`, `point_query_chain_depth/` or `simd_` names. The route -appendix enumerates what each scheduled job did select and the exact omitted -names; this verifies the issue's `window_rows/` versus `^window/` observation. - -Public API checks on the audit date (no credentials): - -- [Project](https://api.bencher.dev/v0/projects/minigraf) returned HTTP 200, - visibility `public`, UUID `b4d413b8-c826-4017-9ddf-40a20d282766`. -- [v3 branch](https://api.bencher.dev/v0/projects/minigraf/branches/v3) UUID - `01a11620-4681-7f30-801b-d9ad268088ca`; current head - `01a18921-537c-719a-9b63-5f2b0506420a` was created 2026-10-29 and has a main - start point. [Testbed](https://api.bencher.dev/v0/projects/minigraf/testbeds/ubuntu-latest) - UUID `4ea63737-9f02-4ea0-8058-13ed4f643b49`; latency measure - `92472195-78d4-4ba0-ac1f-b575b6498171`. -- For **every one of the 270 uploaded IDs**, the benchmark UUID in R1's result - URL was queried at `/v0/projects/minigraf/perf` with `branches`, `heads`, - `testbeds`, `benchmarks`, `measures` set to the above UUIDs. Every response - contained metrics, latest date 2026-11-02, and non-null boundaries on every - returned point: 5–33 points per ID. Example: - [ancestors history](https://api.bencher.dev/v0/projects/minigraf/perf?branches=01a11620-4681-7f30-801b-d9ad268088ca&heads=01a18921-537c-719a-9b63-5f2b0506420a&testbeds=4ea63737-9f02-4ea0-8058-13ed4f643b49&benchmarks=01a16ee6-0eae-7468-afee-d067fc3b9513&measures=92472195-78d4-4ba0-ac1f-b575b6498171). - **Returned historical points can include inherited main history.** They are - not 5–33 independent scheduled v3 runs. R1/R2 establish two genuine v3 - observations for all selected IDs; the newer ordered-group modes have five - API points, not a filled 30-sample v3-only baseline. -- Paginated [benchmark catalogue](https://api.bencher.dev/v0/projects/minigraf/benchmarks?per_page=255&page=1) - (pages 1–2, 293 entries) contains none of the eight omitted families. This - checks the active returned catalogue, not deleted/archived historical data. -- [Thresholds](https://api.bencher.dev/v0/projects/minigraf/thresholds?per_page=100) - confirms the shared threshold described above. The browser-facing project - page returned a Cloudflare challenge to the command-line request; the API - was usable. Dashboard rendering and delivery of notifications were not - verified. - -The following appendices preserve the derived names, run comparison, history -counts, and source function mapping so this report does not depend on retained -local log files. Temporary audit downloads are deleted at completion. - -## Gaps and follow-up plan - -There are **18 follow-up gap categories** below. This is a count of work areas, -not missing individual benchmark IDs or release features. Partial coverage in -a feature's other matrix rows does not close the listed subpath. EXCLUDED -error-code timing, synthetic SIMD, redundant pending lookup cases and unshipped -features do not count as gaps. - -| Gap | What must be resolved | Matrix | -| --- | --- | --- | -| G01 | Route a practical bounded-row-frame selection; all 128 registered IDs are currently omitted | C28 | -| G02 | Route prepared execute and add representative preparation, prepared cursor and new slot/bind costs | C25/C34 | -| G03 | Add final `:distinct` performance cases, including duplicates and composition | C26 | -| G04 | Add offset, descending/general top-k and compound/tie/fallback cases; current fixed limit 10 is narrow | C25 | -| G05 | Add inline/long set writes/reads, membership and collect-set | C29 | -| G06 | Add lag/lead, including partition scaling | C27 | -| G07 | Enforce/observe v3 memory scaling and metering, and correctly schedule v3 acceptance jobs | C24 | -| G08 | Add committed/pending operator controls: value/hash joins, anti/union forms, timestamp bounds, recursive and window partition shape | C15–C17/C19/C23 | -| G09 | Add cursor lifecycle, snapshot pin/churn and staged transaction read costs | C13/C30 | -| G10 | Add transactions around the chunk boundary, chunked retract, multiple statements and rollback paths | C10/C30 | -| G11 | Add FactLog orders/filters/window scaling and LogWriter append/finish | C31/C32 | -| G12 | Add migration, verify/rebuild, long/multivalue storage and read-only open/WAL costs | C04/C07/C08/C11 | -| G13 | Route representative committed-history and retraction cases; assess duplicate pending lookup groups explicitly | C09/C10/C41 | -| G14 | Add #180 fallible registry/callback/re-entry costs beyond baseline infallible dispatch | C33 | -| G15 | Add binding conversion/callback/cursor/persistence coverage, starting with Tier 1 Python and browser | C36 | -| G16 | Add ordinary hash avg, mixed/exact sums/extrema, skewed groups and effective tuple/proof fallbacks | C20/C22 | -| G17 | Add literal/dynamic keyword equality cache controls (#774), including nested/prepared use | C35 | -| G18 | Resolve shared threshold isolation, assert ID selection, retain measured-checkout provenance and validate reporting end to end | Workflow/reporting audit | - -Suggested PR sequence below deliberately separates code additions from shared -workflow changes. All implementation/benchmark PRs target **v3**. Every shared -workflow change must also land on **main in a separate companion PR** per -CLAUDE.md, since main owns schedules. V3-only benchmarks must not be copied to -v2 just to make a main workflow route work: the workflow checks out v3 before -running them. Gate v3-only suites by the selected ref to avoid empty main jobs. - -**Runtime estimates are unverified planning allowances**, not measured results. -No new timed runs were permitted. Existing Criterion setup uses mostly ten -samples and the usual 3-second warmup/5-second target (visible in R1); small -cases have roughly an eight-second sampling floor, but fixture construction, -fsyncs, long iterations, repeated benchmark setup and job setup can dominate. -R1's query job was 29m39s, checkpoint 41m13s and compile 1m44s. Do not assume a -new case costs eight seconds or that parallel jobs have no billable runtime. -Measure shortlisted cases on idle hardware later, cap case counts, and revise -these allowances before enabling the routes. - -| PR | Small reviewable scope / files | Gaps | Provisional incremental nightly allowance and validation | +| Job in V | Filter | Selected = analyzed = uploaded | Elapsed including setup/upload | +| --- | --- | ---: | --- | +| [insert](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939774972) | `^insert/` | 12 | 13m 51s | +| [insert_file](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939774931) | `^insert_file/` | 23 | 6m 58s | +| [query](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939774955) | `^query/` | 146 | 44m 44s | +| [memory_meter](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775113) | `^memory_meter/` | 4 | 2m 01s | +| [prepared](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939774899) | `^prepared/` | 12 | 3m 27s | +| [history_retract](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939774980) | `^(point_query_chain_depth/(churned_attr\|sibling_attr\|attr_scan\|churned_attr_as_of)/(1\|2000)\|retract/(single_fact\|batch_100)/10k)$` | 10 | 4m 08s | +| [fact_log](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775081) | `^(fact_log\|log_writer)/` | 10 | 3m 13s | +| [time_travel](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939774937) | `^time_travel/` | 10 | 8m 30s | +| [recursion](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775090) | `^recursion/` | 5 | 2m 55s | +| [open](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939774998) | `^open/` | 11 | 4m 30s | +| [checkpoint](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939774925) | `^checkpoint` | 17 | 39m 43s | +| [concurrent/readers](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775314) | `^concurrent/readers/` | 6 | 3m 34s | +| [concurrent/readers_plus_writer](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775238) | `^concurrent/readers_plus_writer/` | 6 | 3m 33s | +| [concurrent/serialized_writers](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775269) | `^concurrent/serialized_writers/` | 8 | 4m 27s | +| [concurrent_file/readers](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775285) | `^concurrent_file/readers/` | 6 | 3m 24s | +| [concurrent_file/readers_plus_writer](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775219) | `^concurrent_file/readers_plus_writer/` | 6 | 3m 26s | +| [concurrent_file/serialized_writers](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775220) | `^concurrent_file/serialized_writers/` | 8 | 3m 58s | +| [concurrent_btree_scan](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775276) | `^concurrent_btree_scan` | 6 | 2m 50s | +| [negation](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775366) | `^negation/` | 16 | 5m 05s | +| [disjunction](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775292) | `^disjunction/` | 15 | 4m 17s | +| [aggregation](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775454) | `^aggregation/` | 20 | 5m 27s | +| [expr](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775272) | `^expr/` | 15 | 5m 00s | +| [window](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775437) | `^window/` | 18 | 5m 59s | +| [window_rows](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775341) | `^window_rows/((10000\|100000)/(one\|hundred)/sum/(zero\|two\|prefix)\|100000/hundred/(min\|max)/(two\|prefix)\|10000/hundred/frame_bench_sum/two\|100000/hundred/frame_bench_sum/prefix)$` | 18 | 6m 03s | +| [temporal_metadata](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775273) | `^temporal_metadata/` | 9 | 4m 26s | +| [udf](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939775260) | `^udf/` | 10 | 3m 23s | + +These are whole-job elapsed times from V, not isolated incremental allowances +or portable latency promises. The run's sampling finished within the configured +job timeouts. New histories still need observations: a green upload plus a +threshold model cannot supply a missing numeric comparison baseline. + +Public-history examples (the same SHA/threshold checks were made for every ID): + +- [query/distinct/scalar/100k](https://api.bencher.dev/v0/projects/minigraf/perf?branches=01a11620-4681-7f30-801b-d9ad268088ca&heads=01a1a18f-7bfd-70cf-b3f9-61d5e0a8b037&testbeds=4ea63737-9f02-4ea0-8058-13ed4f643b49&benchmarks=01a1a0b4-6f2c-73c8-8c3b-9df292492271&measures=92472195-78d4-4ba0-ac1f-b575b6498171&start_time=1791122585000&end_time=1793714585000) +- [prepared/count_slots/10k](https://api.bencher.dev/v0/projects/minigraf/perf?branches=01a11620-4681-7f30-801b-d9ad268088ca&heads=01a1a18f-7bfd-70cf-b3f9-61d5e0a8b037&testbeds=4ea63737-9f02-4ea0-8058-13ed4f643b49&benchmarks=01a1a08f-0347-72a8-b841-f46c383b1acc&measures=92472195-78d4-4ba0-ac1f-b575b6498171&start_time=1791119902000&end_time=1793711902000) +- [binding/python/prepared_execute/1k](https://api.bencher.dev/v0/projects/minigraf/perf?branches=01a11620-4681-7f30-801b-d9ad268088ca&heads=01a1a18f-7bfd-70cf-b3f9-61d5e0a8b037&testbeds=01a1a191-294c-75f5-8458-9712f085ff64&benchmarks=01a1a191-294e-7569-9217-bd0cf33ae8d4&measures=92472195-78d4-4ba0-ac1f-b575b6498171&start_time=1791120007000&end_time=1793712007000) + +## Closed-out G01–G18 implementation plan + +All P01–P17 PRs below are **merged**, checked through GitHub PR metadata; +every core v3 merge is an ancestor of the audited SHA. Shared workflow changes +also landed on main in separate companion PRs. “Closed out” means implemented +representatives or an explicit residual disposition, not that every manual +release check has run. Source modules are under `benches/minigraf_bench/` unless +otherwise stated. V supplies the final execution/upload evidence for all the +native/foreign shortlists; exclusions remain in the next section. + +| Gap | Merged follow-up PRs | Final resolution / remaining disposition | Matrix | | --- | --- | --- | --- | -| P01 | Route a shortlist of `window_rows/` in `.github/workflows/bench.yml`; keep IDs unchanged. Cover built-in zero/two versus prefix, one/100 partitions, 10k/100k, and a bounded UDF plus full-prefix UDF control. Document remaining manual sweep | G01 | About 12–18 cases, reserve 5–15 job-minutes; full 128-case expansion has >17 minutes of sampling targets alone and expensive replay cases may take much longer. Workflow main companion required; inspect dispatch names/uploads | -| P02 | Add prepared routing, then preparation/cursor/new count/time/entity slot cases in `benches/minigraf_bench.rs`; `.github/workflows/bench.yml` v3 gate + main companion | G02 | Existing four cases: reserve 2–5 minutes; 4–8 new cases another 2–5 minutes. Verify prepared versus unprepared controls and fresh v3 history | -| P03 | Add `:distinct` cases in `benches/minigraf_bench.rs`, helper duplicate fixture if needed; use a covered prefix or explicit route | G03 | 4–8 cases at 10k/100k, reserve 2–5 minutes; bag/control and set/float tuple variants | -| P04 | Add general sorting/pagination controls: offset 0/large, descending k=10/1000, committed/pending and complete tie order in benchmark/helpers files | G04 | 6–10 cases at 10k/100k, reserve 3–8 minutes; keep 10m envelope manual. Include no-Sort versus retained-Sort controls | -| P05 | Set storage benchmarks: inline/long, repeated/unique sets, ingest/checkpoint/exact lookup/scan; `benches/minigraf_bench.rs`, `benches/helpers/mod.rs` | G05 (storage) | 6–10 cases, reserve 3–10 minutes; avoid 100k×large cardinality by default. Validate runtime, files and scalar controls before routing | -| P06 | Membership/collect-set query cases and lag/lead cases, split into two PRs if fixture changes grow; same bench/helper files | G05 (queries), G06 | 6–10 set-query + 4–6 neighbor cases, reserve 4–10 minutes combined; compare one large versus many partitions and pending/committed probes | -| P07 | Operator fixtures: paired value/hash/entity joins, forced-body controls only where a stable test-hook build is needed, timestamp/irregular as-of, committed recursion; benchmark/helpers files | G08 | 8–12 representative cases, reserve 5–15 minutes. Keep deep nonlinear recursion in manual/acceptance suites; verify strategy using existing counters/test controls, not names alone | -| P08 | Cursor open/first-batch/drain/close with held snapshots across checkpoint; staged transaction reads, same source files | G09 | 6–8 cases, reserve 3–8 minutes. Separate query timing from setup/teardown/checkpoint timing and verify bounded batches | -| P09 | Chunked execute/retract/write-transaction benchmarks at just below/above 65,536; statement rollback control, custom small chunk only in a separately routed test-hooks target if justified | G10 | 4–8 cases, reserve 5–20 minutes; large writes/fsync cost unmeasured. No 1m statement in every latency iteration until measured; acceptance covers large bound separately | -| P10 | FactLog order/filter/window and LogWriter append/finish fixtures preserving temporal records; bench/helper files | G11 | 6–10 cases at 10k/100k, reserve 5–15 minutes; verify record/tx counts outside timing and separate append from finish | -| P11 | Route `point_query_chain_depth/` and useful `retract/` subset; leave `btree_lookup/` duplicate pending groups excluded with explanation. `.github/workflows/bench.yml` + main companion | G13 | About 6–10 cases, reserve 3–10 minutes. Beware history fixtures built outside filtered closures even on unselected jobs; make setup lazy in a separate benchmark-only change | -| P12 | v7 migration + verify/rebuild + long/multivalue/read-only-WAL storage cases; bench/helper files, use existing frozen v7 fixtures | G12 | Split migration/repair from storage values if >8–10 cases; reserve 5–15 minutes per split. Copy/prepare fixtures outside timed routine, validate migrated facts/verify result | -| P13 | Fallible successful UDF vs infallible control, registration/registry snapshot churn, callback re-entry representative; keyword literal/dynamic/prepared controls; bench/helper files, split by concern | G14/G17 | Two small PRs, each 4–6 cases, reserve 2–5 minutes each; deliberate callback errors stay correctness tests unless latency is a product concern | -| P14 | Hash avg/exact floats/mixed extrema plus skewed ordered group and effective-tuple fallback controls; bench/helper files | G16 | 6–10 cases, reserve 3–8 minutes; keep exhaustive numeric permutations in tests, not nightly timing | -| P15 | Route v3 memory acceptance from default-main schedule; add a small explicit metering-on/off latency pair and a separate RSS/state metric or fixed-bound gate. `.github/workflows/smoke.yml`, `bench.yml`, existing acceptance tests/benchmark files only as needed | G07 | Acceptance jobs already declare 30/45-minute budgets; actual added schedule runtime **unverified**. Reserve 2–5 minutes for 4 small latency cases. Main companion mandatory; record actual v3 checkout and executed test names, not v3 comments | -| P16 | Binding PRs in Python first, browser second: prepared execute/cursor batches/set conversion and foreign callbacks, then Node/C; Java/Android/Swift targeted follow-ups or documented hardware exclusions | G15 | Reserve 5–15 minutes per initial binding job plus build/runtime setup (unverified). Reuse Python envelope where useful; add serializable metrics and stable dedicated testbeds, do not pretend native Criterion times cover FFI. Device-only timing can remain deliberate manual coverage with release sign-off | -| P17 | Workflow selection/reporting hardening: compare enumerated IDs with expected filters, fail empty required routes, report executed counts and checkout hash, resolve threshold tuple scope, inspect successful/failed upload handling | G18 | Negligible sampling cost; enumeration/setup overhead unverified. May need two small PRs (selection/provenance and thresholds/alerts), each with a main companion. Validate via later v3 dispatch and inspect Bencher point boundaries and reporting summaries | - -No dispatch, new benchmark, envelope run or alert injection was performed in -phase 1. Before closing #776, run the accepted changes later on idle hardware, -dispatch from the correct default workflow with v3 selected, compare actual IDs -to the intended set, confirm uploads and meaningful branch/testbed history, and -update this document for additions through the release cut. An omitted heavy -case needs a specific manual/envelope exclusion, not an assumed nightly route. - -## Appendix A: every scheduled filter and its selected IDs -All IDs in this appendix are **derived statically, not listed**, then matched -against execution and upload records in **both R1 and R2**. All 21 filters are -nonempty; their sets are disjoint. Every selected ID has public history B. -`P` is the range of returned public metric-point counts per ID (including -inherited history). Job elapsed time is from R1 job metadata, including setup, -benchmarking and upload; it is not a new measurement. -| Job (`bench / …`) | Filter | IDs | Requested upper boundary | Public points P | R1 job elapsed | -| --- | --- | ---: | --- | --- | --- | -| insert | `^insert/` | 12 | 0.99 | 33–33 | 10m 49s | -| insert_file | `^insert_file/` | 12 | 0.999 | 33–33 | 5m 37s | -| query | `^query/` | 97 | 0.99 | 5–33 | 29m 39s | -| time_travel | `^time_travel/` | 8 | 0.99 | 33–33 | 9m 44s | -| recursion | `^recursion/` | 4 | 0.99 | 5–33 | 3m 29s | -| open | `^open/` | 7 | 0.999 | 33–33 | 4m 57s | -| checkpoint | `^checkpoint` | 9 | 0.999 | 5–33 | 41m 13s | -| concurrent/readers | `^concurrent/readers/` | 6 | 0.999 | 33–33 | 7m 05s | -| concurrent/readers_plus_writer | `^concurrent/readers_plus_writer/` | 6 | 0.999 | 33–33 | 4m 37s | -| concurrent/serialized_writers | `^concurrent/serialized_writers/` | 8 | 0.999 | 33–33 | 5m 00s | -| concurrent_file/readers | `^concurrent_file/readers/` | 6 | 0.999 | 33–33 | 4m 03s | -| concurrent_file/readers_plus_writer | `^concurrent_file/readers_plus_writer/` | 6 | 0.999 | 33–33 | 4m 15s | -| concurrent_file/serialized_writers | `^concurrent_file/serialized_writers/` | 8 | 0.999 | 33–33 | 4m 01s | -| concurrent_btree_scan | `^concurrent_btree_scan` | 6 | 0.999 | 33–33 | 3m 17s | -| negation | `^negation/` | 16 | 0.99 | 33–33 | 7m 37s | -| disjunction | `^disjunction/` | 15 | 0.99 | 33–33 | 4m 51s | -| aggregation | `^aggregation/` | 10 | 0.99 | 33–33 | 6m 13s | -| expr | `^expr/` | 9 | 0.99 | 33–33 | 4m 55s | -| window | `^window/` | 12 | 0.99 | 5–33 | 5m 31s | -| temporal_metadata | `^temporal_metadata/` | 9 | 0.99 | 33–33 | 5m 42s | -| udf | `^udf/` | 4 | 0.99 | 33–33 | 3m 38s | - -### `insert` — `^insert/` - -Output file: `bench_insert.txt`. R1/R2 + B, requested 0.99. +| G01 | P01 [#812](https://github.com/project-minigraf/minigraf/pull/812) (main [#813](https://github.com/project-minigraf/minigraf/pull/813)) | 18 routed bounded-frame IDs; 110-case manual sweep X01 | C28 | +| G02 | P02 [#815](https://github.com/project-minigraf/minigraf/pull/815) (main [#814](https://github.com/project-minigraf/minigraf/pull/814)) | `prepared.rs`, 12 routed preparation/execute/cursor/typed-slot controls | C25/C34 | +| G03 | P03 [#817](https://github.com/project-minigraf/minigraf/pull/817) | `distinct.rs`, eight bag/scalar/float-set/pagination cases | C26 | +| G04 | P04 [#818](https://github.com/project-minigraf/minigraf/pull/818) | `pagination.rs`, ten offset/descending/compound-tie controls; 10m envelope X06 | C25 | +| G05 | P05 [#819](https://github.com/project-minigraf/minigraf/pull/819) + P06 [#820](https://github.com/project-minigraf/minigraf/pull/820) | `set_storage.rs` ten storage cases + `set_queries.rs` ten pending/committed membership/collection cases | C29 | +| G06 | P06 [#820](https://github.com/project-minigraf/minigraf/pull/820) | `window_neighbors.rs`, six one/100-partition lag/lead cases | C27 | +| G07 | P15 [#831](https://github.com/project-minigraf/minigraf/pull/831) (main [#830](https://github.com/project-minigraf/minigraf/pull/830)) | `memory_meter.rs`, four finite/unlimited latency controls; v3 acceptance routing fixed, actual revised schedule unverified X02 | C24 | +| G08 | P07 [#821](https://github.com/project-minigraf/minigraf/pull/821) | `operator_paths.rs`, 12 join/anti/union/window/time/committed-recursion controls; deeper scaling X02/X06 | C15–C17/C19/C23 | +| G09 | P08 [#822](https://github.com/project-minigraf/minigraf/pull/822) | `cursor_lifecycle.rs`, eight lifecycle/pin/staged-read cases; sustained churn X06 | C13/C30 | +| G10 | P09 [#823](https://github.com/project-minigraf/minigraf/pull/823) | `chunked_transactions.rs`, seven boundary/retract/multi-statement/rollback cases; large-bound acceptance X02 | C10/C30 | +| G11 | P10 [#826](https://github.com/project-minigraf/minigraf/pull/826) (main [#825](https://github.com/project-minigraf/minigraf/pull/825)) | `fact_log.rs`, six log reads +four writer append/finish cases | C31/C32 | +| G12 | P12 [#827](https://github.com/project-minigraf/minigraf/pull/827) | `storage_v3.rs`, ten migration/repair/long-multivalue/read-only cases; large/browser migration X03 | C04/C07/C08/C11 | +| G13 | P11 [#816](https://github.com/project-minigraf/minigraf/pull/816) (main [#809](https://github.com/project-minigraf/minigraf/pull/809)) | `history.rs`, eight history +two retract IDs; redundant lookups/scales excluded X01 | C09/C10/C41 | +| G14 | P13 [#828](https://github.com/project-minigraf/minigraf/pull/828) | `udf_v3.rs`, six fallible/control/churn/re-entry cases; error timing X08 | C33 | +| G15 | P16 core [#832](https://github.com/project-minigraf/minigraf/pull/832) (main [#833](https://github.com/project-minigraf/minigraf/pull/833)); [Python #17](https://github.com/project-minigraf/minigraf-python/pull/17), [browser #21](https://github.com/project-minigraf/minigraf-wasm/pull/21), [Node #21](https://github.com/project-minigraf/minigraf-node/pull/21), [C #14](https://github.com/project-minigraf/minigraf-c/pull/14) | 26 foreign metrics in V; remaining hosts/APIs/manual sign-off X04 | C36 | +| G16 | P14 [#829](https://github.com/project-minigraf/minigraf/pull/829) | `aggregate_controls.rs`, ten mixed/exact/hash/skew/effective-tuple controls | C20/C22 | +| G17 | P13 [#828](https://github.com/project-minigraf/minigraf/pull/828) | `keyword_equality.rs`, six literal/dynamic/nested/prepared cases | C35 | +| G18 | P17 [#810](https://github.com/project-minigraf/minigraf/pull/810) (main [#811](https://github.com/project-minigraf/minigraf/pull/811)), P16 reporting additions [#832](https://github.com/project-minigraf/minigraf/pull/832)/#833 | Enumeration/selection/provenance, complete uploads, common threshold; V+B verifies successful reporting, live alert path and baseline maturation remain X05 | Workflow audit | + +## Remaining exclusions and follow-ups + +Every item here lacks some nightly evidence or is deliberately outside the +shortlist. No manual timing or release sign-off is implied by this close-out. + +| ID | Disposition | Remaining scope and reason | +| --- | --- | --- | +| X01 | MANUAL / EXCLUDED registered cases | Of 583 registered native IDs, 156 are unselected: 110 `window_rows/` cases are MANUAL wider width/function/partition sweeps; four history depth-500 IDs and six retract 1k/100k/1m IDs are EXCLUDED redundant intermediate/scaling points; six pending `btree_lookup/` IDs are EXCLUDED duplicates of C01; 30 synthetic SIMD IDs are EXCLUDED experimental non-engine kernels. Exact expansions are in Appendix C. Full-prefix one-partition UDF replay is expensive and stays manual; the unregistered 100k UDF half-frame is also excluded for quadratic callback cost | +| X02 | ENVELOPE / acceptance, execution unverified | Retained-state/RSS/scaling bounds, nonlinear/multistratum recursion and derived-fact exhaustion, million-fact transactions and custom chunk bounds are not Bencher memory metrics. Observe the revised v3 smoke schedule or dispatch it and inspect exact SHA/test names/bounds before claiming these enforced in nightly CI. Accounting itself has no disabled-engine control; unlimited only disables the finite cap | +| X03 | MANUAL migration | Native migration uses one small frozen v7 fixture, not a large dictionary/scale sweep. Browser migration and migration with pinned-reader churn have no V timing; IndexedDB open/write coverage is not migration coverage | +| X04 | MANUAL binding checks | JVM/JNI, Android ART/ABI/device storage, Swift ARC/Apple storage and WASI need distinct runtime evidence/release sign-off. Options/error paths, foreign FactLog/LogWriter conversion, foreign preparation/registration latency and browser pinned-reader churn remain unmeasured. Python shared UniFFI coverage does not measure other host runtimes; no binding RSS bound is asserted | +| X05 | Unverified operational follow-ups | Accumulate numeric regression baselines for 244 native and 26 foreign IDs (all have stored v3 observations/model settings, but baseline null in V). Verify live failed-upload and repeated-alert notification delivery; successful uploads and parser/audit unit tests do not exercise it. Cron execution of the final routes is unverified here: V was a dispatch. Preserve/refresh evidence beyond the 30-day artifact retention | +| X06 | MANUAL / ENVELOPE scaling and isolation | Large 10m sorting/window/envelope sweeps, wider set cardinalities, sustained pin/quarantine/log-reader churn and sparse/repeated-ref UUID projection are outside V's fixed shortlists. Dedicated isolation of each recursive-probe optimization is unverified; representative queries do not establish per-optimization timings | +| X07 | EXCLUDED exhaustive semantics | All numeric, bind, cross-kind join and forced-planner permutations remain correctness tests. Nightly controls select representative natural plans; broader hash controls include broader scans and keyword dynamic controls include binding/clone work | +| X08 | EXCLUDED individual failure latency | Invalid bounds/windows/binds, deliberate callback errors, corrupt-page rejection, v1–v6 refusal, heavy single-entry WAL replay and individual PRS/API/QRY codes belong to correctness testing. C08 measures a successful repair of known damage and C30 measures cross-chunk rollback; neither claims exhaustive failure timing | +| X09 | EXCLUDED unshipped/non-runtime scope | Public profiler #185, OPFS #441 and rule persistence #241 are open/unshipped at the audited revision. Proof/test/docs infrastructure and #797's study add no shipped latency path; production uuid/dist size uses separate size gates. Re-audit new production features through the release cut | + +Issue #776 remains open. Its final release decision still needs the explicit +manual sign-offs and verification above; this PR neither closes it nor checks +its acceptance boxes automatically. + +## Appendix A: exact native IDs executed and uploaded in V + +These are **artifact-verified**, not statically inferred. Each block is the +actual selected set, independently matched to completed analyses and Bencher +result URLs. The filter/count/job link is in the suite table above. B confirms +a stored metric at the audited SHA for each ID. All native IDs use the shared +0.999/30 threshold on `v3`/`ubuntu-latest`/latency. + +### `insert` — 12 IDs ```text insert/single_fact/1k @@ -479,9 +401,7 @@ insert/explicit_tx/100k insert/explicit_tx/1m ``` -### `insert_file` — `^insert_file/` - -Output file: `bench_insert_file.txt`. R1/R2 + B, requested 0.999. +### `insert_file` — 23 IDs ```text insert_file/single_fact/1k @@ -496,13 +416,25 @@ insert_file/explicit_tx/1k insert_file/explicit_tx/10k insert_file/explicit_tx/100k insert_file/explicit_tx/1m +insert_file/set_storage/scalar/10k +insert_file/set_storage/inline_unique/10k +insert_file/set_storage/long_repeated/10k +insert_file/set_storage/long_unique/10k +insert_file/chunked/execute/65535 +insert_file/chunked/retract/65535 +insert_file/chunked/write_tx/65535 +insert_file/chunked/execute/65537 +insert_file/chunked/retract/65537 +insert_file/chunked/write_tx/65537 +insert_file/chunked/statement_rollback/65537 ``` -### `query` — `^query/` - -Output file: `bench_query.txt`. R1/R2 + B, requested 0.99. +### `query` — 146 IDs ```text +query/set_storage/exact_inline_unique/10k +query/set_storage/exact_long_unique/10k +query/set_storage/scan_long_unique/10k query/point_entity/1k query/point_entity/10k query/point_entity/100k @@ -515,11 +447,49 @@ query/join_3pattern/1k query/join_3pattern/10k query/join_3pattern/100k query/join_3pattern/1m -query/regex_filter/1k -query/regex_filter/10k -query/predicate_pushdown/1k -query/predicate_pushdown/10k -query/predicate_pushdown/100k +query/distinct/bag/10k +query/distinct/scalar/10k +query/distinct/sorted_page/10k +query/distinct/float_set_tuple/10k +query/distinct/bag/100k +query/distinct/scalar/100k +query/distinct/sorted_page/100k +query/distinct/float_set_tuple/100k +query/pagination/committed_asc_offset0_k10/100k +query/pagination/committed_asc_offset_half_k10/100k +query/pagination/committed_desc_k10/100k +query/pagination/committed_desc_k1000/100k +query/pagination/pending_asc_offset0_k10/100k +query/pagination/pending_asc_offset_half_k10/100k +query/pagination/pending_desc_k10/100k +query/pagination/pending_desc_k1000/100k +query/pagination/committed_compound_ties/10k +query/pagination/committed_compound_ties/100k +query/operator_paths/entity_pending/10k +query/operator_paths/value_pending/10k +query/operator_paths/hash_pending/10k +query/operator_paths/entity_committed/10k +query/operator_paths/value_committed/10k +query/operator_paths/hash_committed/10k +query/operator_paths/anti_committed/10k +query/operator_paths/union_committed/10k +query/operator_paths/windows_committed/10k +query/cursor_lifecycle/open/10k +query/cursor_lifecycle/first_batch/10k +query/cursor_lifecycle/drain/10k +query/cursor_lifecycle/drain/100k +query/cursor_lifecycle/iterator/10k +query/cursor_lifecycle/held_checkpoint_drain/10k +query/cursor_lifecycle/held_checkpoint_close/10k +query/cursor_lifecycle/staged_read/10k_plus_200 +query/ordered_values/index/1k +query/ordered_values/uuid_ties/1k +query/ordered_values/index/10k +query/ordered_values/uuid_ties/10k +query/ordered_values/index/100k +query/ordered_values/uuid_ties/100k +query/ordered_values/index/1m +query/ordered_values/uuid_ties/1m query/ordered_groups/count/1k query/ordered_groups/distinct/1k query/ordered_groups/count_limit/1k @@ -592,21 +562,85 @@ query/partition_windows/value/1m query/partition_windows/entity/1m query/partition_windows/value_limit/1m query/partition_windows/entity_limit/1m -query/ordered_values/index/1k -query/ordered_values/uuid_ties/1k -query/ordered_values/index/10k -query/ordered_values/uuid_ties/10k -query/ordered_values/index/100k -query/ordered_values/uuid_ties/100k -query/ordered_values/index/1m -query/ordered_values/uuid_ties/1m +query/set_queries/in/pending/10k +query/set_queries/not_in/pending/10k +query/set_queries/all_in/pending/10k +query/set_queries/any_none/pending/10k +query/set_queries/collect/pending/10k +query/set_queries/in/committed/10k +query/set_queries/not_in/committed/10k +query/set_queries/all_in/committed/10k +query/set_queries/any_none/committed/10k +query/set_queries/collect/committed/10k +query/regex_filter/1k +query/regex_filter/10k +query/storage_v3/multivalue_long_scan/10k +query/predicate_pushdown/1k +query/predicate_pushdown/10k +query/predicate_pushdown/100k +``` + +### `memory_meter` — 4 IDs + +```text +memory_meter/count/unlimited/10k +memory_meter/count/limited/10k +memory_meter/hash_groups/unlimited/10k +memory_meter/hash_groups/limited/10k ``` -### `time_travel` — `^time_travel/` +### `prepared` — 12 IDs -Output file: `bench_time_travel.txt`. R1/R2 + B, requested 0.99. +```text +prepared/value_lookup/1k +prepared/value_lookup/10k +prepared/threshold_filter/1k +prepared/threshold_filter/10k +prepared/prepare_value_lookup/10k +prepared/unprepared_value_lookup/10k +prepared/cursor_drain/10k +prepared/unprepared_cursor_drain/10k +prepared/count_slots/10k +prepared/unprepared_count_slots/10k +prepared/time_entity_slots/10k +prepared/unprepared_time_entity_slots/10k +``` + +### `history_retract` — 10 IDs ```text +retract/single_fact/10k +retract/batch_100/10k +point_query_chain_depth/churned_attr/1 +point_query_chain_depth/churned_attr/2000 +point_query_chain_depth/sibling_attr/1 +point_query_chain_depth/sibling_attr/2000 +point_query_chain_depth/attr_scan/1 +point_query_chain_depth/attr_scan/2000 +point_query_chain_depth/churned_attr_as_of/1 +point_query_chain_depth/churned_attr_as_of/2000 +``` + +### `fact_log` — 10 IDs + +```text +fact_log/attribute_only_storage/10k +fact_log/tx_mixed_default/10k +fact_log/storage_mixed/100k +fact_log/tx_mixed_default/100k +fact_log/tx_mixed_window_4096/100k +fact_log/filter_attribute_entity_tx/100k +log_writer/append/10k +log_writer/finish/10k +log_writer/append/100k +log_writer/finish/100k +``` + +### `time_travel` — 10 IDs + +```text +time_travel/operator_paths/timestamp_monotone/10k +time_travel/operator_paths/timestamp_irregular/10k time_travel/as_of_counter/1k time_travel/as_of_counter/10k time_travel/as_of_counter/100k @@ -617,20 +651,17 @@ time_travel/valid_at/100k time_travel/valid_at/1m ``` -### `recursion` — `^recursion/` - -Output file: `bench_recursion.txt`. R1/R2 + B, requested 0.99. +### `recursion` — 5 IDs ```text +recursion/operator_paths/ancestors_committed/10k recursion/chain/depth_10 recursion/chain/depth_100 recursion/fanout/w10_d3 recursion/ancestors/w10_d4 ``` -### `open` — `^open/` - -Output file: `bench_open.txt`. R1/R2 + B, requested 0.999. +### `open` — 11 IDs ```text open/checkpointed/1k @@ -640,13 +671,18 @@ open/checkpointed/1m open/wal_replay/1k open/wal_replay/10k open/wal_replay/100k +open/storage_v3/migrate_v7/multi_checkpoint +open/storage_v3/read_only_v7/multi_checkpoint +open/storage_v3/read_only_v8/10k +open/storage_v3/read_only_wal/10k_plus_1k ``` -### `checkpoint` — `^checkpoint` - -Output file: `bench_checkpoint.txt`. R1/R2 + B, requested 0.999. +### `checkpoint` — 17 IDs ```text +checkpoint/set_storage/inline_unique/10k +checkpoint/set_storage/long_repeated/10k +checkpoint/set_storage/long_unique/10k checkpoint/1k checkpoint/10k checkpoint/100k @@ -656,11 +692,14 @@ checkpoint/after_1_fact/100k checkpoint/after_1_fact/1m checkpoint/after_100k_facts/10k checkpoint/after_100k_facts/100k +checkpoint/storage_v3/verify/100k_history +checkpoint/storage_v3/rebuild_damaged_avet/100k_history +checkpoint/storage_v3/multivalue_inline_unique/10k +checkpoint/storage_v3/multivalue_long_repeated/10k +checkpoint/storage_v3/multivalue_long_unique/10k ``` -### `concurrent/readers` — `^concurrent/readers/` - -Output file: `bench_concurrent_readers.txt`. R1/R2 + B, requested 0.999. +### `concurrent/readers` — 6 IDs ```text concurrent/readers/10k_4t @@ -671,9 +710,7 @@ concurrent/readers/100k_8t concurrent/readers/100k_16t ``` -### `concurrent/readers_plus_writer` — `^concurrent/readers_plus_writer/` - -Output file: `bench_concurrent_mixed.txt`. R1/R2 + B, requested 0.999. +### `concurrent/readers_plus_writer` — 6 IDs ```text concurrent/readers_plus_writer/10k_4t @@ -684,9 +721,7 @@ concurrent/readers_plus_writer/100k_8t concurrent/readers_plus_writer/100k_16t ``` -### `concurrent/serialized_writers` — `^concurrent/serialized_writers/` - -Output file: `bench_concurrent_writers.txt`. R1/R2 + B, requested 0.999. +### `concurrent/serialized_writers` — 8 IDs ```text concurrent/serialized_writers/10k_2t @@ -699,9 +734,7 @@ concurrent/serialized_writers/100k_8t concurrent/serialized_writers/100k_16t ``` -### `concurrent_file/readers` — `^concurrent_file/readers/` - -Output file: `bench_concurrent_file_readers.txt`. R1/R2 + B, requested 0.999. +### `concurrent_file/readers` — 6 IDs ```text concurrent_file/readers/10k_4t @@ -712,9 +745,7 @@ concurrent_file/readers/100k_8t concurrent_file/readers/100k_16t ``` -### `concurrent_file/readers_plus_writer` — `^concurrent_file/readers_plus_writer/` - -Output file: `bench_concurrent_file_mixed.txt`. R1/R2 + B, requested 0.999. +### `concurrent_file/readers_plus_writer` — 6 IDs ```text concurrent_file/readers_plus_writer/10k_4t @@ -725,9 +756,7 @@ concurrent_file/readers_plus_writer/100k_8t concurrent_file/readers_plus_writer/100k_16t ``` -### `concurrent_file/serialized_writers` — `^concurrent_file/serialized_writers/` - -Output file: `bench_concurrent_file_writers.txt`. R1/R2 + B, requested 0.999. +### `concurrent_file/serialized_writers` — 8 IDs ```text concurrent_file/serialized_writers/10k_2t @@ -740,9 +769,7 @@ concurrent_file/serialized_writers/100k_8t concurrent_file/serialized_writers/100k_16t ``` -### `concurrent_btree_scan` — `^concurrent_btree_scan` - -Output file: `bench_concurrent_btree_scan.txt`. R1/R2 + B, requested 0.999. +### `concurrent_btree_scan` — 6 IDs ```text concurrent_btree_scan/10k_2t @@ -753,9 +780,7 @@ concurrent_btree_scan/100k_4t concurrent_btree_scan/100k_8t ``` -### `negation` — `^negation/` - -Output file: `bench_negation.txt`. R1/R2 + B, requested 0.99. +### `negation` — 16 IDs ```text negation/not_scale/1k @@ -776,9 +801,7 @@ negation/not_rule_body/1k negation/not_rule_body/10k ``` -### `disjunction` — `^disjunction/` - -Output file: `bench_disjunction.txt`. R1/R2 + B, requested 0.99. +### `disjunction` — 15 IDs ```text disjunction/or_scale/1k @@ -798,9 +821,7 @@ disjunction/or_rule_body/1k disjunction/or_rule_body/10k ``` -### `aggregation` — `^aggregation/` - -Output file: `bench_aggregation.txt`. R1/R2 + B, requested 0.99. +### `aggregation` — 20 IDs ```text aggregation/count_scale/1k @@ -811,13 +832,21 @@ aggregation/sum_scale/1k aggregation/sum_scale/10k aggregation/with_grouped_sum/1k aggregation/with_grouped_sum/10k +aggregation/v3_controls/hash_avg/10k +aggregation/v3_controls/hash_exact_float_sum/10k +aggregation/v3_controls/hash_mixed_sum_distinct/10k +aggregation/v3_controls/hash_mixed_extrema/10k +aggregation/v3_controls/skew_count_committed/100k +aggregation/v3_controls/skew_count_pending/100k +aggregation/v3_controls/skew_avg_committed/100k +aggregation/v3_controls/tuple_repeated_constant/100k +aggregation/v3_controls/tuple_float_constant_fallback/100k +aggregation/v3_controls/tuple_hidden_with_fallback/100k aggregation/count_distinct_scale/1k aggregation/count_distinct_scale/10k ``` -### `expr` — `^expr/` - -Output file: `bench_expr.txt`. R1/R2 + B, requested 0.99. +### `expr` — 15 IDs ```text expr/filter_scale/1k @@ -829,11 +858,15 @@ expr/binding_scale/100k expr/binding_into_agg/1k expr/binding_into_agg/10k expr/binding_into_agg/100k +expr/keyword_equality/literal_eq/10k +expr/keyword_equality/dynamic_eq/10k +expr/keyword_equality/literal_neq/10k +expr/keyword_equality/dynamic_neq/10k +expr/keyword_equality/nested_literal_eq/10k +expr/keyword_equality/prepared_keyword_eq/10k ``` -### `window` — `^window/` - -Output file: `bench_window.txt`. R1/R2 + B, requested 0.99. +### `window` — 18 IDs ```text window/running_sum/1k @@ -848,365 +881,169 @@ window/many_partitions/100k window/row_number/1k window/row_number/10k window/row_number/100k +window/neighbors/lag/one/10k +window/neighbors/lag/hundred/10k +window/neighbors/lead/one/10k +window/neighbors/lead/hundred/10k +window/neighbors/lag_lead/one/100k +window/neighbors/lag_lead/hundred/100k ``` -### `temporal_metadata` — `^temporal_metadata/` - -Output file: `bench_temporal_metadata.txt`. R1/R2 + B, requested 0.99. +### `window_rows` — 18 IDs ```text -temporal_metadata/tx_time/1k -temporal_metadata/tx_time/10k -temporal_metadata/tx_time/100k -temporal_metadata/valid_from/1k -temporal_metadata/valid_from/10k -temporal_metadata/valid_from/100k -temporal_metadata/valid_to/1k -temporal_metadata/valid_to/10k -temporal_metadata/valid_to/100k -``` - -### `udf` — `^udf/` - -Output file: `bench_udf.txt`. R1/R2 + B, requested 0.99. - -```text -udf/aggregate_sum_dispatch/1k -udf/aggregate_sum_dispatch/10k -udf/predicate_filter_dispatch/1k -udf/predicate_filter_dispatch/10k -``` - -## Appendix B: registered IDs selected by no scheduled job -**Derived statically, not listed.** These 188 IDs belong to 14 Criterion group -names in eight top-level families. None occurs in R1/R2 executed/uploaded sets -or the returned public Bencher benchmark catalogue. SIMD kernels (30 IDs) are -deliberately EXCLUDED from v3 runtime-feature requirements; the remaining -158 unrouted IDs require routing decisions. `^window/` does select the four -`window/…` groups in Appendix A; it does not match the underscore in -`window_rows/`. `^query/` similarly does not match `prepared/`, -`btree_lookup/` or `point_query_chain_depth/`. - -### `prepared/value_lookup` (2 IDs) - -Source: `bench_prepared`, [minigraf_bench.rs:1781](../benches/minigraf_bench.rs#L1781). - -```text -prepared/value_lookup/1k -prepared/value_lookup/10k -``` - -### `prepared/threshold_filter` (2 IDs) - -Source: `bench_prepared`, [minigraf_bench.rs:1781](../benches/minigraf_bench.rs#L1781). - -```text -prepared/threshold_filter/1k -prepared/threshold_filter/10k -``` - -### `retract/single_fact` (4 IDs) - -Source: `bench_retract`, [minigraf_bench.rs:1836](../benches/minigraf_bench.rs#L1836). - -```text -retract/single_fact/1k -retract/single_fact/10k -retract/single_fact/100k -retract/single_fact/1m -``` - -### `retract/batch_100` (4 IDs) - -Source: `bench_retract`, [minigraf_bench.rs:1836](../benches/minigraf_bench.rs#L1836). - -```text -retract/batch_100/1k -retract/batch_100/10k -retract/batch_100/100k -retract/batch_100/1m -``` - -### `btree_lookup/entity_point` (3 IDs) - -Source: `bench_btree_lookup`, [minigraf_bench.rs:1890](../benches/minigraf_bench.rs#L1890). - -```text -btree_lookup/entity_point/1k -btree_lookup/entity_point/10k -btree_lookup/entity_point/100k -``` - -### `btree_lookup/attribute_scan` (3 IDs) - -Source: `bench_btree_lookup`, [minigraf_bench.rs:1890](../benches/minigraf_bench.rs#L1890). - -```text -btree_lookup/attribute_scan/1k -btree_lookup/attribute_scan/10k -btree_lookup/attribute_scan/100k -``` - -### `window_rows` (128 IDs) - -Source: `bench_window_rows`, [minigraf_bench.rs:1536](../benches/minigraf_bench.rs#L1536). - -```text -window_rows/10000/one/sum/default window_rows/10000/one/sum/zero window_rows/10000/one/sum/two -window_rows/10000/one/sum/sqrt -window_rows/10000/one/sum/half window_rows/10000/one/sum/prefix -window_rows/10000/one/count/default -window_rows/10000/one/count/zero -window_rows/10000/one/count/two -window_rows/10000/one/count/sqrt -window_rows/10000/one/count/half -window_rows/10000/one/count/prefix -window_rows/10000/one/min/default -window_rows/10000/one/min/zero -window_rows/10000/one/min/two -window_rows/10000/one/min/sqrt -window_rows/10000/one/min/half -window_rows/10000/one/min/prefix -window_rows/10000/one/max/default -window_rows/10000/one/max/zero -window_rows/10000/one/max/two -window_rows/10000/one/max/sqrt -window_rows/10000/one/max/half -window_rows/10000/one/max/prefix -window_rows/10000/one/avg/default -window_rows/10000/one/avg/zero -window_rows/10000/one/avg/two -window_rows/10000/one/avg/sqrt -window_rows/10000/one/avg/half -window_rows/10000/one/avg/prefix -window_rows/10000/one/frame_bench_sum/zero -window_rows/10000/one/frame_bench_sum/two -window_rows/10000/one/frame_bench_sum/half -window_rows/10000/hundred/sum/default window_rows/10000/hundred/sum/zero window_rows/10000/hundred/sum/two -window_rows/10000/hundred/sum/sqrt -window_rows/10000/hundred/sum/half window_rows/10000/hundred/sum/prefix -window_rows/10000/hundred/count/default -window_rows/10000/hundred/count/zero -window_rows/10000/hundred/count/two -window_rows/10000/hundred/count/sqrt -window_rows/10000/hundred/count/half -window_rows/10000/hundred/count/prefix -window_rows/10000/hundred/min/default -window_rows/10000/hundred/min/zero -window_rows/10000/hundred/min/two -window_rows/10000/hundred/min/sqrt -window_rows/10000/hundred/min/half -window_rows/10000/hundred/min/prefix -window_rows/10000/hundred/max/default -window_rows/10000/hundred/max/zero -window_rows/10000/hundred/max/two -window_rows/10000/hundred/max/sqrt -window_rows/10000/hundred/max/half -window_rows/10000/hundred/max/prefix -window_rows/10000/hundred/avg/default -window_rows/10000/hundred/avg/zero -window_rows/10000/hundred/avg/two -window_rows/10000/hundred/avg/sqrt -window_rows/10000/hundred/avg/half -window_rows/10000/hundred/avg/prefix -window_rows/10000/hundred/frame_bench_sum/zero window_rows/10000/hundred/frame_bench_sum/two -window_rows/10000/hundred/frame_bench_sum/half -window_rows/100000/one/sum/default window_rows/100000/one/sum/zero window_rows/100000/one/sum/two -window_rows/100000/one/sum/sqrt -window_rows/100000/one/sum/half window_rows/100000/one/sum/prefix -window_rows/100000/one/count/default -window_rows/100000/one/count/zero -window_rows/100000/one/count/two -window_rows/100000/one/count/sqrt -window_rows/100000/one/count/half -window_rows/100000/one/count/prefix -window_rows/100000/one/min/default -window_rows/100000/one/min/zero -window_rows/100000/one/min/two -window_rows/100000/one/min/sqrt -window_rows/100000/one/min/half -window_rows/100000/one/min/prefix -window_rows/100000/one/max/default -window_rows/100000/one/max/zero -window_rows/100000/one/max/two -window_rows/100000/one/max/sqrt -window_rows/100000/one/max/half -window_rows/100000/one/max/prefix -window_rows/100000/one/avg/default -window_rows/100000/one/avg/zero -window_rows/100000/one/avg/two -window_rows/100000/one/avg/sqrt -window_rows/100000/one/avg/half -window_rows/100000/one/avg/prefix -window_rows/100000/one/frame_bench_sum/prefix -window_rows/100000/hundred/sum/default window_rows/100000/hundred/sum/zero window_rows/100000/hundred/sum/two -window_rows/100000/hundred/sum/sqrt -window_rows/100000/hundred/sum/half window_rows/100000/hundred/sum/prefix -window_rows/100000/hundred/count/default -window_rows/100000/hundred/count/zero -window_rows/100000/hundred/count/two -window_rows/100000/hundred/count/sqrt -window_rows/100000/hundred/count/half -window_rows/100000/hundred/count/prefix -window_rows/100000/hundred/min/default -window_rows/100000/hundred/min/zero window_rows/100000/hundred/min/two -window_rows/100000/hundred/min/sqrt -window_rows/100000/hundred/min/half window_rows/100000/hundred/min/prefix -window_rows/100000/hundred/max/default -window_rows/100000/hundred/max/zero window_rows/100000/hundred/max/two -window_rows/100000/hundred/max/sqrt -window_rows/100000/hundred/max/half window_rows/100000/hundred/max/prefix -window_rows/100000/hundred/avg/default -window_rows/100000/hundred/avg/zero -window_rows/100000/hundred/avg/two -window_rows/100000/hundred/avg/sqrt -window_rows/100000/hundred/avg/half -window_rows/100000/hundred/avg/prefix window_rows/100000/hundred/frame_bench_sum/prefix ``` -### `point_query_chain_depth/churned_attr` (3 IDs) - -Source: `bench_point_query_chain_depth`, [minigraf_bench.rs:1931](../benches/minigraf_bench.rs#L1931). +### `temporal_metadata` — 9 IDs ```text -point_query_chain_depth/churned_attr/1 -point_query_chain_depth/churned_attr/500 -point_query_chain_depth/churned_attr/2000 +temporal_metadata/tx_time/1k +temporal_metadata/tx_time/10k +temporal_metadata/tx_time/100k +temporal_metadata/valid_from/1k +temporal_metadata/valid_from/10k +temporal_metadata/valid_from/100k +temporal_metadata/valid_to/1k +temporal_metadata/valid_to/10k +temporal_metadata/valid_to/100k ``` -### `point_query_chain_depth/sibling_attr` (3 IDs) - -Source: `bench_point_query_chain_depth`, [minigraf_bench.rs:1931](../benches/minigraf_bench.rs#L1931). +### `udf` — 10 IDs ```text -point_query_chain_depth/sibling_attr/1 -point_query_chain_depth/sibling_attr/500 -point_query_chain_depth/sibling_attr/2000 +udf/aggregate_sum_dispatch/1k +udf/aggregate_sum_dispatch/10k +udf/predicate_filter_dispatch/1k +udf/predicate_filter_dispatch/10k +udf/v3/predicate_infallible/10k +udf/v3/aggregate_infallible/10k +udf/v3/predicate_fallible/10k +udf/v3/aggregate_fallible/10k +udf/v3/registry_snapshot_churn/32 +udf/v3/callback_reentry/1k ``` -### `point_query_chain_depth/attr_scan` (3 IDs) +## Appendix B: exact foreign-runtime IDs in V + +Fixed shortlists, no Criterion regex. Each case includes the actual host +conversion/result handling. All use 1k scalar facts plus a two-element set; +IndexedDB cases use a fresh 1k-fact database. Fixtures, preparation and callback +registration are untimed. Full cursor drains use batches 1/256. Browser reopen +is in the same page/context, not cold browser startup. Native and foreign +results have distinct testbeds and must not be combined into one latency series. -Source: `bench_point_query_chain_depth`, [minigraf_bench.rs:1931](../benches/minigraf_bench.rs#L1931). +### [browser](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939774470) — 8 IDs + +Binding `da29682e34e6f0a32a1d63882becfeb01dd5d55d`; testbed `binding-browser-ubuntu24-v1`; selected = executed = uploaded **8**, alerts **0**. V+B; numeric comparison baselines absent. ```text -point_query_chain_depth/attr_scan/1 -point_query_chain_depth/attr_scan/500 -point_query_chain_depth/attr_scan/2000 +binding/browser/prepared_execute/1k +binding/browser/cursor_batch_1/1k +binding/browser/cursor_batch_256/1k +binding/browser/set_roundtrip/2 +binding/browser/predicate/1k +binding/browser/aggregate/1k +binding/browser/indexeddb_write/1k +binding/browser/indexeddb_reopen/1k ``` -### `point_query_chain_depth/churned_attr_as_of` (3 IDs) +### [c](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939774245) — 6 IDs -Source: `bench_point_query_chain_depth`, [minigraf_bench.rs:1931](../benches/minigraf_bench.rs#L1931). +Binding `653af45e874b15e54564a2d5e12d5583784c7861`; testbed `binding-c-ubuntu24-v1`; selected = executed = uploaded **6**, alerts **0**. V+B; numeric comparison baselines absent. ```text -point_query_chain_depth/churned_attr_as_of/1 -point_query_chain_depth/churned_attr_as_of/500 -point_query_chain_depth/churned_attr_as_of/2000 +binding/c/prepared_execute/1k +binding/c/cursor_batch_1/1k +binding/c/cursor_batch_256/1k +binding/c/set_roundtrip/2 +binding/c/predicate/1k +binding/c/aggregate/1k ``` -### `simd_temporal` (10 IDs) +### [node](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939774523) — 6 IDs -Source: `bench_simd`, [minigraf_bench.rs:2020](../benches/minigraf_bench.rs#L2020). +Binding `96fe7a1a9f7521007fefdfee54142694ab39251d`; testbed `binding-node-ubuntu24-v1`; selected = executed = uploaded **6**, alerts **0**. V+B; numeric comparison baselines absent. ```text -simd_temporal/scalar/100 -simd_temporal/simd/100 -simd_temporal/scalar/1k -simd_temporal/simd/1k -simd_temporal/scalar/10k -simd_temporal/simd/10k -simd_temporal/scalar/100k -simd_temporal/simd/100k -simd_temporal/scalar/1m -simd_temporal/simd/1m +binding/node/prepared_execute/1k +binding/node/cursor_batch_1/1k +binding/node/cursor_batch_256/1k +binding/node/set_roundtrip/2 +binding/node/predicate/1k +binding/node/aggregate/1k ``` -### `simd_as_of` (10 IDs) +### [python](https://github.com/project-minigraf/minigraf/actions/runs/41642356471/job/125939774468) — 6 IDs -Source: `bench_simd`, [minigraf_bench.rs:2020](../benches/minigraf_bench.rs#L2020). +Binding `16f54fef94c75272873b3381fc83cf264ed05e99`; testbed `binding-python-ubuntu24-v1`; selected = executed = uploaded **6**, alerts **0**. V+B; numeric comparison baselines absent. ```text -simd_as_of/scalar/100 -simd_as_of/simd/100 -simd_as_of/scalar/1k -simd_as_of/simd/1k -simd_as_of/scalar/10k -simd_as_of/simd/10k -simd_as_of/scalar/100k -simd_as_of/simd/100k -simd_as_of/scalar/1m -simd_as_of/simd/1m +binding/python/prepared_execute/1k +binding/python/cursor_batch_1/1k +binding/python/cursor_batch_256/1k +binding/python/set_roundtrip/2 +binding/python/predicate/1k +binding/python/aggregate/1k ``` -### `simd_aggregate` (10 IDs) +## Appendix C: all deliberately unselected registered IDs -Source: `bench_simd`, [minigraf_bench.rs:2020](../benches/minigraf_bench.rs#L2020). +The enumeration/selected-set difference is exactly **156** IDs. These have no +V analysis or upload. Counts below are not omitted-feature counts. -```text -simd_aggregate/scalar/100 -simd_aggregate/simd/100 -simd_aggregate/scalar/1k -simd_aggregate/simd/1k -simd_aggregate/scalar/10k -simd_aggregate/simd/10k -simd_aggregate/scalar/100k -simd_aggregate/simd/100k -simd_aggregate/scalar/1m -simd_aggregate/simd/1m +| Prefix / expansion | Count | Disposition and reason | +| --- | ---: | --- | +| `window_rows/…` | 110 | MANUAL wider sweep; C28's 18 representatives bound routine nightly work | +| `point_query_chain_depth/{churned_attr,sibling_attr,attr_scan,churned_attr_as_of}/500` | 4 | EXCLUDED intermediate depth; 1/2000 endpoints are routed | +| `retract/{single_fact,batch_100}/{1k,100k,1m}` | 6 | EXCLUDED extra scales; 10k and chunk-boundary retractions are routed | +| `btree_lookup/{entity_point,attribute_scan}/{1k,10k,100k}` | 6 | EXCLUDED duplicate pending lookups, not committed storage | +| `simd_{temporal,as_of,aggregate}/{scalar,simd}/{100,1k,10k,100k,1m}` | 30 | EXCLUDED synthetic helper kernels, no shipped database path | + +The complete 128 registered `window_rows` IDs expand from: +`{10000,100000}/{one,hundred}/{sum,count,min,max,avg}/{default,zero,two,sqrt,half,prefix}` +(120), plus `10000/{one,hundred}/frame_bench_sum/{zero,two,half}` (six) and +`100000/{one,hundred}/frame_bench_sum/prefix` (two). Subtract the 18 literal +selected IDs in Appendix A to obtain the exact 110 manual cases. Shapes each +have 2n facts; widths are zero, two, square root, half or prefix of partition +size, with default using the peer frame. No other registered prefix is omitted. + +## Reproducing the audit (read-only) + +```sh +gh issue view 776 --comments +git rev-parse 'v2.0.11^{commit}' origin/v3 origin/main +git merge-base v2.0.11 origin/v3 +git diff 4685ca9cb7638353087410c31ad07e3f6261ddb0 0394c90ad90e9b95d416f4a0ec4a4c78b16e5b57 -- src Cargo.toml ROADMAP.md CHANGELOG.md +git diff origin/main origin/v3 -- .github/workflows/bench.yml .github/workflows/smoke.yml .github/bench +gh run view 41642356471 --json headSha,conclusion,jobs +gh api repos/project-minigraf/minigraf/actions/jobs/125939774955 +gh api repos/project-minigraf/minigraf/check-runs/125939774955 +gh run download 41642356471 -D /tmp/776-evidence ``` -## Appendix C: source registration and fixture map -All functions below appear in `criterion_group!(benches, …)`; names are -Criterion group names, not inferred aliases from comments. Fixtures are built -in `benches/helpers/mod.rs` unless the benchmark body does so directly. -| Registered function / definition | Group names | Cases | Fixture note | -| --- | --- | ---: | --- | -| [`bench_insert`](../benches/minigraf_bench.rs#L29) | `insert/single_fact`, `insert/batch_100`, `insert/explicit_tx` | 12 | M4; single/100/explicit transaction, repeated benchmark triples | -| [`bench_insert_file`](../benches/minigraf_bench.rs#L97) | `insert_file/single_fact`, `insert_file/batch_100`, `insert_file/explicit_tx` | 12 | F4 + pending WAL, checkpoint suppressed | -| [`bench_query`](../benches/minigraf_bench.rs#L176) | `query/point_entity`, `query/point_attribute`, `query/join_3pattern` | 12 | M4; join fixture adds next edges | -| [`bench_ordered_groups`](../benches/minigraf_bench.rs#L237) | `query/ordered_groups` | 56 | F4 read-only; unique integer groups, full drain/limit 10, 14 modes | -| [`bench_partition_windows`](../benches/minigraf_bench.rs#L297) | `query/partition_windows` | 16 | F4 read-only; one-row value/entity partitions, full drain/limit 10 | -| [`bench_input_order`](../benches/minigraf_bench.rs#L344) | `query/ordered_values` | 8 | F4 read-only, fixed limit 10; index and UUID-tie control | -| [`bench_time_travel`](../benches/minigraf_bench.rs#L387) | `time_travel/as_of_counter`, `time_travel/valid_at` | 8 | M4 point query; no timestamp as-of shape | -| [`bench_recursion`](../benches/minigraf_bench.rs#L436) | `recursion/chain`, `recursion/fanout`, `recursion/ancestors` | 4 | M, chain depth 10/100; fanout w10_d3; ancestors w10_d4 | -| [`bench_open`](../benches/minigraf_bench.rs#L498) | `open/checkpointed`, `open/wal_replay` | 7 | F4 read-write checkpointed; W first 3 sizes, open/drop | -| [`bench_checkpoint`](../benches/minigraf_bench.rs#L558) | `checkpoint` | 4 | W at all four scales; full initial flush | -| [`bench_checkpoint_after_1_fact`](../benches/minigraf_bench.rs#L595) | `checkpoint/after_1_fact` | 3 | F 10k/100k/1m + one fact per iteration; growing history | -| [`bench_checkpoint_after_100k_facts`](../benches/minigraf_bench.rs#L631) | `checkpoint/after_100k_facts` | 2 | F 10k/100k + 100k more per iteration, inserted as 100 x 1k | -| [`bench_concurrent`](../benches/minigraf_bench.rs#L667) | `concurrent/readers`, `concurrent/readers_plus_writer`, `concurrent/serialized_writers` | 20 | M 10k/100k; readers/mixed 4/8/16 threads; writers 2/4/8/16 | -| [`bench_concurrent_file`](../benches/minigraf_bench.rs#L826) | `concurrent_file/readers`, `concurrent_file/readers_plus_writer`, `concurrent_file/serialized_writers` | 20 | CF 10k/100k; same thread counts | -| [`bench_negation`](../benches/minigraf_bench.rs#L992) | `negation/not_scale`, `negation/not_join_scale`, `negation/not_selectivity`, `negation/not_pushdown_selectivity`, `negation/not_rule_body` | 16 | M2 for scale/rule cases; 10k 0/25/50/75/100% exclusions; extra attributes | -| [`bench_concurrent_btree_scan`](../benches/minigraf_bench.rs#L1123) | `concurrent_btree_scan` | 6 | F 10k/100k; 2/4/8 threads, entity point read | -| [`bench_disjunction`](../benches/minigraf_bench.rs#L1179) | `disjunction/or_scale`, `disjunction/or_join_scale`, `disjunction/or_selectivity`, `disjunction/or_short_circuit`, `disjunction/or_join_short_circuit`, `disjunction/or_rule_body` | 15 | M2 scale/rule/short-circuit; 10k 0/25/50/75/100% matches; extra tags | -| [`bench_aggregation`](../benches/minigraf_bench.rs#L1322) | `aggregation/count_scale`, `aggregation/grouped_count_scale`, `aggregation/sum_scale`, `aggregation/with_grouped_sum` | 8 | M2; integer/count, 10 department keys, :with | -| [`bench_expr`](../benches/minigraf_bench.rs#L1398) | `expr/filter_scale`, `expr/binding_scale`, `expr/binding_into_agg` | 9 | M3 numeric filter/arithmetic/sum | -| [`bench_window`](../benches/minigraf_bench.rs#L1461) | `window/running_sum`, `window/rank`, `window/many_partitions`, `window/row_number` | 12 | M3 unpartitioned sum/rank/row-number or singleton value partitions | -| [`bench_window_rows`](../benches/minigraf_bench.rs#L1536) | `window_rows` | 128 | M 10k/100k rows, 2n facts; one/100 partitions; frame widths default/0/2/sqrt/half/prefix; UDF subset | -| [`bench_temporal_metadata`](../benches/minigraf_bench.rs#L1613) | `temporal_metadata/tx_time`, `temporal_metadata/valid_from`, `temporal_metadata/valid_to` | 9 | M3; tx-count (group named tx_time), valid-from/to | -| [`bench_udf`](../benches/minigraf_bench.rs#L1667) | `udf/aggregate_sum_dispatch`, `udf/predicate_filter_dispatch` | 4 | M2 integers; infallible predicate/aggregate, registration outside timing | -| [`bench_aggregation_extras`](../benches/minigraf_bench.rs#L1726) | `aggregation/count_distinct_scale` | 2 | M2 with 50% duplicate values, count-distinct | -| [`bench_query_extras`](../benches/minigraf_bench.rs#L1749) | `query/regex_filter` | 2 | M2 string values and regex predicate | -| [`bench_prepared`](../benches/minigraf_bench.rs#L1781) | `prepared/value_lookup`, `prepared/threshold_filter` | 4 | M2 integer value/threshold slots; prepare outside timing | -| [`bench_retract`](../benches/minigraf_bench.rs#L1836) | `retract/single_fact`, `retract/batch_100` | 8 | M4 repeated single/100 retractions | -| [`bench_btree_lookup`](../benches/minigraf_bench.rs#L1890) | `btree_lookup/entity_point`, `btree_lookup/attribute_scan` | 6 | M3 names+values (pending, despite btree name) | -| [`bench_point_query_chain_depth`](../benches/minigraf_bench.rs#L1931) | `point_query_chain_depth/churned_attr`, `point_query_chain_depth/sibling_attr`, `point_query_chain_depth/attr_scan`, `point_query_chain_depth/churned_attr_as_of` | 12 | F, 2k filler facts + sibling + hot history, depth 1/500/2000 | -| [`bench_predicate_pushdown`](../benches/minigraf_bench.rs#L1981) | `query/predicate_pushdown` | 3 | M3 names+values; upper 10% pass numeric filter | -| [`bench_simd`](../benches/minigraf_bench.rs#L2020) | `simd_temporal`, `simd_as_of`, `simd_aggregate` | 30 | Synthetic Vec slices, 100/1k/10k/100k/1m; scalar and SIMD kernels | +For each native report, compare its `selected`, `executed` and `uploaded` +arrays with the raw Criterion `Benchmarking : Analyzing` lines and Bencher +`- (Latency): …/perf?…` lines. Compare the disjoint union with the listing +and Appendix A. For bindings, compare their fixed shortlist, `ok:` execution +lines, raw JSON latency keys, report/upload arrays and retained Cargo metadata. +Resolve public result URLs through `https://api.bencher.dev/v0/projects/minigraf/perf` +using their branch/head/testbed/benchmark/measure/time query parameters; inspect +the metric version hash, threshold model and numeric baseline separately.