Status: Accepted Date: 2026-06-19 Deciders: Achref Soua
ADR-0037 established the scientific multi-DB benchmark suite (eight competitor adapters; recall@k,
QPS, latency percentiles, build time, on-disk size, steady-state RSS; a reproducibility manifest). To
date only a full multi-DB smoke has run (SIFTSMALL, 10k×128) plus a partial SIFT1M; that is not
enough to understand Quiver's position against the field on realistic data. The state-of-Quiver
assessment (docs/analysis/state-of-quiver-v0.17.md) records the coverage gaps: larger datasets,
filtered search, concurrent throughput, churn/incremental workloads, memory-under-load,
restart/cold-open timing, denser recall↔QPS Pareto curves, and quantization tradeoff curves.
The benchmark environment is already provisioned: the bench/ uv venv has FAISS, LanceDB, Chroma,
Milvus Lite, Qdrant, Weaviate, and the Quiver SDK; Docker 29.4.3 is available; SIFT1M is extracted at
bench/datasets/sift/. The constraint is honesty under the PRIME RULE and the risk register: this is a
resource-shared WSL2 box (i7-12700H, 20 logical cores, 15.5 GiB RAM, ext4-on-VHDX). Per R6,
comparisons on identical hardware are a fair, publishable result; per R5, absolute headline RSS and the
10M disk path are distorted by a VM and stay reference-hardware-pending.
Extend the suite (not replace it) with deep dimensions, and run locally what is honest to run now.
- SIFT1M (1M×128, L2) — run now; data already local.
- GIST1M (1M×960, L2) — add a checksummed downloader (
datasets._load_datasetalready accepts a.fvecsdirectory); run if the box has headroom, else mark pending. - Deep1M / Deep10M (96-d, L2) — Deep1M run if feasible; Deep10M stays
[reference-hardware-pending](the memory-frugality headline the VM distorts).
- Concurrent throughput (multi-thread QPS). The methodology already names QPS(NT); add a
harness-level concurrent driver (
--concurrency N) that runsquery_onefrom a thread pool and records saturated QPS alongside single-thread QPS. Adapter-agnostic; each adapter's client must be usable from multiple threads (documented per adapter). - Denser recall↔QPS Pareto curve. Already supported by widening the
--efsweep; standardise a dense default for the published curves. - Quantization tradeoff curve (Quiver, single-DB). Recall@10 vs RSS across scalar / product /
binary quantization and the disk-resident path — the memory-frugality wedge. Lives in the
single-DB
run.pypath (no competitor needed); feedsquantization-tradeoffs.md. - Build + memory at scale.
build_sand steady-staterss_mbare already captured; publish them at SIFT1M for every runnable competitor, with the absolute-RSS caveat.
- Filtered-search selectivity sweep and churn / incremental insert-delete workloads require
per-adapter
insert/delete/ filtered-query support that the competitors implement differently; they are scoped as a follow-up ADR once the larger-data comparison lands, rather than half-done here. - Restart / cold-open timing is Quiver-specific and folded into the single-DB path opportunistically.
- Every result carries the
manifest.jsonmachine spec (captured automatically). Comparative head-to-head numbers run on the identical box are published as real results. Only absolute RSS and the 10M disk path are labelledindicative — reference-hardware-pending. - Publish wins and losses. Pin competitor versions and configs. No fabricated or extrapolated number; a run that OOMs or cannot complete is reported as such, not estimated.
- Output goes to
docs/benchmarks/results/comparison-v0.18.0/; the report is regenerated byjust bench-report. The methodology and reference-hardware runbook gain the new dimensions for the eventual reference run.
- A genuine large-data picture of Quiver vs the field (recall, QPS single+concurrent, build, memory) on SIFT1M, with the memory wedge shown via the quantization curve — answering "where does Quiver stand" with real, reproducible numbers.
- The harness gains a reusable concurrency driver and dataset downloaders.
- Filtered/churn coverage is explicitly deferred (not silently missing), keeping this change bounded.
- No CI change: heavy runs stay manual; the smoke dataset remains the regression gate (ADR-0037).
- Run the full filtered + churn matrix across all eight competitors now. Rejected for this round: competitors expose filtering and incremental updates too differently to compare fairly without significant per-adapter work; doing it half-way would produce misleading numbers. Deferred to a dedicated follow-up.
- Publish absolute RSS / 10M as headline numbers from this box. Rejected: a VM distorts exactly those metrics (R5); publishing them as official would misrepresent — under- or over-stating — Quiver's memory wedge. They stay reference-hardware-pending.