release · v0.1.3 · 1 complete · 1 partial · 1 valid negative / 3 lanes

Antfly Circus — v0.1.3

Antfly-only benchmark evidence for the published v0.1.3 Linux ARM64 release, including three fresh VectorDBBench lifecycles, one completed CRAG footprint cell, and a graph correctness-gate outcome.

Reading contract

Each selected outcome binds its Antfly evidence to v0.1.3. Machines, dates, and protocols may differ. Lanes without selected evidence are omitted from this release page.

I

1 of 1 lane measured

VectorDBBench

Qualified vector search quality, throughput, serial latency, serving demand, and database volume across operating points.

i

vector-vdbbench-50k

complete

50K

Three fresh Antfly lifecycles at the calibrated 50K operating point, reporting quality, throughput, latency, serving demand, and database volume.

Methodology scope · protocol · interpretation

VectorDBBench methodology

Antfly subject and execution lane

Circus accepts an explicit subject manifest containing the asserted release tag, commit, and Linux/arm64 Antfly binary. It records the binary path, SHA-256, architecture, and observed --version output, while treating the supplied tag and commit as release metadata. The honed matrix mounts that binary read-only into Antfly’s Linux container. Every comparison engine runs in the same private Docker network; no native macOS database is mixed into this benchmark.

The public benchmarks/VectorDBBench checkout remains clean. Circus-owned parameter selection, compatibility fixes, query partitioning, and diagnostics live in benchmarks/VectorDBBench-harness and are loaded as a runtime overlay.

Workloads and query protocol

The publication matrix contains six engines on both upstream workloads:

  • Performance1536D50K: 50,000 vectors with 1,536 dimensions.
  • Performance768D1M: 1,000,000 vectors with 768 dimensions.

For each workload, the 1,000 upstream query/ground-truth pairs are ranked by a fixed SHA-256 seed and split into 200 calibration queries and 800 publication queries. Their exact overlap is zero; both partition fingerprints are retained.

Each engine/workload trial has one fresh service and one fixed index lifecycle:

  1. Start lifecycle memory sampling before indexing.
  2. Load and build the index once using fixed construction parameters.
  3. Sweep only the query-time parameter on the 200-query calibration partition.
  4. Freeze the lowest setting reaching recall 0.955. If none qualifies, retain the highest-recall setting and mark it below the qualification floor.
  5. Without rebuilding, run the selected setting on the untouched 800-query partition at 1, 5, 10, 20, and 30 concurrent clients for 30 seconds each, followed by the upstream serial quality and latency pass.
  6. Capture one diagnostic post-workload storage observation, gracefully stop and verify the service, capture final storage, retain the artifacts, and only then reclaim the engine’s data.

The 50K and 1M settings are selected independently because the larger graph may need a higher search setting. Publication results never influence selection. A row below the 0.950 publication floor remains visible and is not silently retuned or omitted. No process-restart measurement is published.

Tuned and fixed parameters

EngineFixed index/build parametersQuery-time selection
AntflyAKNN, one shard, packed float32 queriessearch_effort sweep
MilvusHNSW M=16, efConstruction=256ef_search sweep
ChromaHNSW M=16, efConstruction=256fixed ef_search=256 qualification
WeaviateHNSW maxConnections=16, efConstruction=256ef sweep
pgvectorHNSW m=16, ef_construction=128ef_search sweep
ElasticsearchHNSW m=16, ef_construction=100num_candidates sweep

The final report prints the selected value for every workload and engine. Weaviate and Elasticsearch are local containers; their upstream adapter class names (WeaviateCloud and ElasticCloud) do not describe the deployment.

Memory

The headline Demand peak MB is the maximum sampled cgroup-v2 anon + shmem from before indexing through readiness, calibration, and publication queries. It excludes reclaimable file cache and follows MEASURING_ANTFLY.md. Sampling runs every 200 ms and retains a JSONL timeline. Cache-inclusive memory.current and kernel memory.peak are supplementary raw diagnostics.

Honed publication requires three fresh lifecycles per engine/workload. The headline table shows each arithmetic mean; detail artifacts retain every observation, the mean, and the individual-trial range. A trial is rejected if the canonical sampler reports a failure, misses any container in the service stack, starts after indexing, stops before publication finishes, or leaves a timeline gap above five seconds. Peak throughput, its concurrency, C=30 throughput and concurrent p99, recall, nDCG, serial latency, and memory are arithmetic means of the three compatible lifecycle observations. Raw curves and ranges remain retained. The selected setting and protocol identity must match across all three trials.

The complete Antfly standalone container is measured, so all Antfly processes and threads in that cgroup are included. Termite is not part of this workload because VectorDBBench supplies precomputed vectors.

Persistent database volume

Every publication engine receives one newly created, run-labeled Docker local volume at its complete persistence root. The digest-pinned Alpine probe captures whole-volume allocated and apparent bytes once at empty, ready, and post_workload, then at the verified post-stop final barrier. Host-path/no-network Antfly is rejected for comparative storage. Pre-stop background compaction remains diagnostic and does not gate the post-stop metric.

Final allocated bytes are the headline. The same three construction lifecycles define performance, memory, and storage aggregates. Every value, arithmetic mean, range, receipt, and barrier sample remains under raw/storage.

Internal Antfly scale diagnostic

make vdbbench-scale-fast and make vdbbench-scale-big run an Antfly-only diagnostic beside the cross-engine publication matrix. The fast profile uses 20K, 40K, 60K, 80K, and 100K vectors; the big profile uses 200K, 400K, 600K, 800K, and 1M vectors. make vdbbench-scale selects both. All points use 768 dimensions and the same 200-query calibration partition, disjoint 800-query held-out partition, serial pass, and 1/5/10/20/30-client 30-second capped sweep described above.

The diagnostic has exactly two fresh index lifecycles per point. Trial one runs from the smallest to largest selected corpus; trial two reverses that order. This controls simple order effects without claiming the three-lifecycle publication cohort. The aggregate and every row set publication_eligible: false, retain both raw values plus their arithmetic mean and range, and state the two-lifecycle caveat. Scale results must not be merged into the honed cross-engine cohort.

The source corpus is the pinned upstream Cohere 768-dimensional 1M-vector fixture. Circus verifies its immutable source files, computes exact cosine top-k ground truth against deterministic prefix sizes, and writes explicit custom-dataset manifests. A streaming iterator is bounded by the manifest’s declared prefix size; a smaller point cannot consume rows belonging to a larger shared Parquet file.

Each point/trial is an immutable publication-cache cell with workload-specific dataset identity. A cache miss receives one fresh retry, never an in-place resume. Only a complete positive lifecycle or a classified held-out capacity/rejection result can be promoted. The canonical diagnostic artifact retains every cell’s receipt/cache reference, query-partition digest, selected search effort, request-error evidence, memory timeline, final allocated volume, and insert_duration + optimize_duration build time.

Output and retention

The canonical artifact contains report.md, normalized result.json, provenance, a receipt, selected settings, the raw capped-concurrency JSON/CSV diagnostic, memory rows and timelines, logs, supervisor/status evidence, and upstream result JSON. Standard publication runs VectorDBBench’s increasing concurrency progression at 1, 5, 10, 20, and 30 clients. Normalized rows report peak QPS and its concurrency as well as qps_c30 and p99_c30_ms.

A lifecycle that completes the selected-setting, held-out capped sweep but has explicit nonzero request rejections is retained as a classified capacity terminal negative. It is reusable only with the exact concurrency schedule, query partition, selected setting, full memory timeline, quiet-host assertion, logs, and supervisor evidence. Setup/index/configuration failures, crashes, timeouts, partial lifecycles, and unknown failures are never reusable publication cells. Database volumes are deleted only after the verified final capture unless an operator explicitly opts into retaining them for debugging. The retained storage.json receipt and complete optional-trial evidence are results; the live volume is not.

Run evidence parameters · variation · provenance

Benchmark parameters

{"concurrency_duration_seconds":30,"concurrency_schedule":[1,5,10,20,30],"query_count":800,"workloads":["1536d-50K"]}

Trial variation

[{"engine":"Antfly","ranges":{"demand_working_set":{"maximum":1024.7,"mean":967.8,"minimum":916.5,"unit":"MB"},"final_database_volume":{"maximum":538.243072,"mean":534.553941,"minimum":532.553728,"unit":"MB"}},"workload":"1536d-50K"},{"engine":"Chroma","ranges":{"demand_working_set":{"maximum":468.9,"mean":463.3,"minimum":455.4,"unit":"MB"},"p99_at_peak_concurrency":{"maximum":176.7,"mean":176.467,"minimum":176.3,"unit":"ms"}},"workload":"1536d-50K"},{"engine":"ElasticCloud","ranges":{"demand_working_set":{"maximum":1871.2,"mean":1861.3,"minimum":1854.6,"unit":"MB"},"final_database_volume":{"maximum":312.430592,"mean":312.380075,"minimum":312.352768,"unit":"MB"},"p99_at_peak_concurrency":{"maximum":13.7,"mean":13.5,"minimum":13.4,"unit":"ms"}},"workload":"1536d-50K"},{"engine":"Milvus","ranges":{"demand_working_set":{"maximum":2577.1,"mean":2490.3,"minimum":2428.4,"unit":"MB"},"final_database_volume":{"maximum":1741.217792,"mean":1741.202773,"minimum":1741.193216,"unit":"MB"},"p99_at_peak_concurrency":{"maximum":10.6,"mean":10.433,"minimum":10.3,"unit":"ms"}},"workload":"1536d-50K"},{"engine":"PgVector","ranges":{"demand_working_set":{"maximum":2303.9,"mean":2303.8,"minimum":2303.7,"unit":"MB"},"final_database_volume":{"maximum":1523.970048,"mean":1523.965952,"minimum":1523.961856,"unit":"MB"},"p99_at_peak_concurrency":{"maximum":35.6,"mean":33.7,"minimum":32.6,"unit":"ms"}},"workload":"1536d-50K"},{"engine":"WeaviateCloud","ranges":{"demand_working_set":{"maximum":965.9,"mean":938.5,"minimum":912.1,"unit":"MB"},"final_database_volume":{"maximum":391.360512,"mean":391.277227,"minimum":391.172096,"unit":"MB"},"p99_at_peak_concurrency":{"maximum":86.5,"mean":85.533,"minimum":83.7,"unit":"ms"}},"workload":"1536d-50K"}]

Peer versions

Peer versions were not recorded in the published result fields.

Evidence digests

Receipt
c5e1c66b128511a17ed9394d15e5dd888d44424520d7374c794311bc72306bf2
Aggregate
6a14a044e7e414d833a10b34069db8e1e043ae631354ea1cf73b313c4a0d65b3
Provenance
73e2877a476489463206ebfba43923197329a3eae2cd2a002de827940f9f2325
Harness commit
1d66908788c25a92d0a35a01a0230e629d1c97d6

Scope notes

  • This campaign ran Antfly only; the evidence does not support a cross-engine ranking.
  • All three lifecycles reused one independently calibrated configuration and retained disjoint publication measurements.
Selected measurement
Completed
Antfly
v0.1.3 ·
Runtime
45m 37s
Platform
linux · aarch64
Machine
c4a-standard-4 · 4 CPU · 16.7 GB
Build
Not recorded · Zig Not recorded

This campaign ran Antfly only; the evidence does not support a cross-engine ranking.

All three lifecycles reused one independently calibrated configuration and retained disjoint publication measurements.

Peak throughput

Antfly v0.1.3 (1b070b5d) · linux-aarch64 · c4a-standard-4 · 1536d-50K · Higher is better

Serial query p95

Antfly v0.1.3 (1b070b5d) · linux-aarch64 · c4a-standard-4 · 1536d-50K · Lower is better

Demand working set

Antfly v0.1.3 (1b070b5d) · linux-aarch64 · c4a-standard-4 · 1536d-50K · Lower is better

Final database volume

Antfly v0.1.3 (1b070b5d) · linux-aarch64 · c4a-standard-4 · 1536d-50K · Lower is better

Performance, quality, and resource evidence

Antfly v0.1.3 · 1b070b5d

EngineWorkloadRecallnDCGPeak QPS queries/sp95 msDemand working set MBCache-inclusive peak MBFinal database volume MBTrials
Antfly1536d-50K0.9970.99865.520.90967.8 MBNot measured534.6 MB3
Chroma1536d-50K0.9870.989179.98.07463.3 MB809.2 MBNot recorded MB3
ElasticCloud1536d-50K0.9600.9674,600.11.971,861.3 MB4,318.4 MB312.4 MB3
Milvus1536d-50K0.9630.9705,643.11.502,490.3 MB4,565.6 MB1,741.2 MB3
PgVector1536d-50K0.9690.9752,432.34.172,303.8 MB3,265.2 MB1,524.0 MB3
WeaviateCloud1536d-50K0.9550.963995.66.60938.5 MB1,553.7 MB391.3 MB3
II

1 of 1 lane measured

CRAG

Retrieval, ranking, and evaluation lanes over the CRAG corpus and query set.

i

fulltext-crag-footprint

partial

Full-text search

One completed 2,000-document Antfly lifecycle with retrieval quality, latency, serving demand, and post-stop database volume.

Methodology scope · protocol · interpretation

CRAG full-text search

Scope

This lane compares Antfly, Elasticsearch, and Quickwit as full-text retrieval services over the same CRAG Task 1/2 corpus and query sample. At 2,000, 5,000, 9,000, and 13,530 documents it measures cache-excluded working set, cache-inclusive memory, final complete database volume, query p95, QPS, and normalized gold-answer evidence in the top one and top five results.

The main report repeats the honed publication charts for working set, final database volume, and query p95 by corpus size. The tables retain QPS and quality beside those plots. This is a full-text search comparison, not merely a footprint measurement.

Publication protocol

  • Run every engine in a Linux cgroup v2 container on the shared Circus Linux/arm64 lane.
  • Use the same immutable CRAG corpus and query set for all engines.
  • Give Elasticsearch a fixed 1 GiB heap and record that setting.
  • Run three fresh alternating lifecycles, rather than reusing an index or container between repetitions.
  • For each lifecycle, run one deterministic 200-query sample at concurrency 1 after ten warmup queries; require zero query errors.
  • Use product-default full-text analyzers and resolve returned IDs through the same canonical CRAG document map before calculating top-one and top-five gold-answer evidence.
  • Treat sampled cgroup memory.current as cache-inclusive memory and anon + shmem as the cache-excluded working-set comparison.
  • Give every engine one newly created, run-labeled Docker local volume at its complete persistence root: /data, /usr/share/elasticsearch/data, or /quickwit/qwdata. The same digest-pinned Alpine probe measures each whole volume on the shared Linux Docker engine; APFS bind mounts are ineligible.
  • Give every engine the same fixed 30-second post-workload persistence window, then capture allocated and apparent integer bytes once at post_workload. Also capture once at empty and ready, then at the post-stop final barrier. empty permits root directory-block overhead but no entries. Verify graceful stop before the headline final capture; neither the delay nor qualification depends on an engine’s observed bytes.
  • Publish final allocated bytes as the arithmetic mean, every value, and the full range of the three independent construction lifecycles. Retain apparent bytes, lifecycle samples, per-volume manifests, and engine index APIs only as diagnostics. The legacy index_disk_mb field is not comparable.
  • Require storage.json and its validation receipt, which ties the measurement to the sampler hash, probe digest, declared scope, lifecycle barriers, environment identity, and fresh or materialized cell sums.
  • Require the quiet-host gate for latency publication. Memory and storage remain valid only when all engine cells passed their lifecycle and cgroup checks.

The v0.2.0 honed page describes the host as Linux/aarch64 containers under Docker Desktop on Apple Silicon. It does not describe this as bare-metal Linux.

Run evidence parameters · variation · provenance

Benchmark parameters

{"document_counts":[2000],"trial_count":1}

Trial variation

[{"document_count":2000,"engine":"antfly","ranges":{}},{"document_count":2000,"engine":"elasticsearch","ranges":{"demand_working_set":{"maximum":1572.61824,"mean":1539.8175,"minimum":1538.88768,"unit":"MB"},"final_database_volume":{"maximum":28.213248,"mean":28.194133,"minimum":28.176384,"unit":"MB"},"query_p95":{"maximum":3.0325,"mean":2.9416,"minimum":2.8883,"unit":"ms"}}},{"document_count":2000,"engine":"quickwit","ranges":{"demand_working_set":{"maximum":332.013568,"mean":327.3441,"minimum":319.52896,"unit":"MB"},"final_database_volume":{"maximum":62.17728,"mean":62.17728,"minimum":62.17728,"unit":"MB"},"query_p95":{"maximum":2.3361,"mean":2.2917,"minimum":2.2346,"unit":"ms"}}},{"document_count":5000,"engine":"elasticsearch","ranges":{"demand_working_set":{"maximum":1576.349696,"mean":1571.9424,"minimum":1563.181056,"unit":"MB"},"final_database_volume":{"maximum":68.071424,"mean":68.060501,"minimum":68.05504,"unit":"MB"},"query_p95":{"maximum":3.2241,"mean":3.0764,"minimum":2.7218,"unit":"ms"}}},{"document_count":5000,"engine":"quickwit","ranges":{"demand_working_set":{"maximum":413.569024,"mean":409.559,"minimum":406.224896,"unit":"MB"},"final_database_volume":{"maximum":153.464832,"mean":153.464832,"minimum":153.464832,"unit":"MB"},"query_p95":{"maximum":2.7762,"mean":2.6855,"minimum":2.6546,"unit":"ms"}}},{"document_count":9000,"engine":"elasticsearch","ranges":{"demand_working_set":{"maximum":1639.46496,"mean":1613.6151,"minimum":1596.166144,"unit":"MB"},"final_database_volume":{"maximum":121.38496,"mean":121.374037,"minimum":121.368576,"unit":"MB"},"query_p95":{"maximum":3.202,"mean":3.1196,"minimum":3.0971,"unit":"ms"}}},{"document_count":9000,"engine":"quickwit","ranges":{"demand_working_set":{"maximum":570.105856,"mean":565.9402,"minimum":561.577984,"unit":"MB"},"final_database_volume":{"maximum":140.92288,"mean":140.92288,"minimum":140.92288,"unit":"MB"},"query_p95":{"maximum":3.0926,"mean":2.9771,"minimum":2.9173,"unit":"ms"}}},{"document_count":13530,"engine":"elasticsearch","ranges":{"demand_working_set":{"maximum":1646.096384,"mean":1635.1273,"minimum":1611.763712,"unit":"MB"},"final_database_volume":{"maximum":181.460992,"mean":181.455531,"minimum":181.444608,"unit":"MB"},"query_p95":{"maximum":3.525,"mean":3.1883,"minimum":3.138,"unit":"ms"}}},{"document_count":13530,"engine":"quickwit","ranges":{"demand_working_set":{"maximum":685.748224,"mean":685.6253,"minimum":671.8464,"unit":"MB"},"final_database_volume":{"maximum":278.642688,"mean":278.642688,"minimum":278.642688,"unit":"MB"},"query_p95":{"maximum":3.8247,"mean":3.8052,"minimum":3.5119,"unit":"ms"}}}]

Peer versions

Peer versions were not recorded in the published result fields.

Evidence digests

Receipt
8fccc9e9c754af81705af6ea923b0c1098a135f181ed77466430f9da050a4aee
Aggregate
fb71ef697fab8e012ada61904b12f566430fe78ceb8e18b06c074a40015031e7
Provenance
19a0569450796ba386fb5cdc9ad2982507b99c44a17777a1ba4d05cfb3c9051e
Harness commit
1d66908788c25a92d0a35a01a0230e629d1c97d6

Scope notes

  • The planned 5K cell timed out at the 900-second readiness gate, so ten later cells did not run; this section reports only the completed 2K cell.
  • This campaign ran Antfly only; the evidence does not support a cross-engine ranking.
  • Latency and throughput charts are omitted because the canonical result is not successful.
Selected partial evidence
Completed
Antfly
v0.1.3 ·
Runtime
18m 17s
Platform
linux · aarch64
Machine
c4a-standard-4 · 4 CPU · 16.7 GB
Build
Not recorded · Zig Not recorded

The planned 5K cell timed out at the 900-second readiness gate, so ten later cells did not run; this section reports only the completed 2K cell.

This campaign ran Antfly only; the evidence does not support a cross-engine ranking.

Latency and throughput charts are omitted because the canonical result is not successful.

Demand working set

Antfly v0.1.3 (1b070b5d) · linux-aarch64 · c4a-standard-4 · 2,000–2,000 documents · 1 trials · Lower is better

Final database volume

Antfly v0.1.3 (1b070b5d) · linux-aarch64 · c4a-standard-4 · 2,000–2,000 documents · 1 trials · Lower is better

Resource footprint

Antfly v0.1.3 · 1b070b5d

EngineDocumentsDemand working set MBFinal database volume MBTrials
antfly2,000738.2 MB146.0 MB1
elasticsearch2,0001,539.8 MB28.2 MB3
quickwit2,000327.3 MB62.2 MB3

Query behavior and ranking quality

Antfly v0.1.3 · 1b070b5d

EngineDocumentsQPSp95 msTop-1Top-5
antfly2,000503.42.970.1850.240
elasticsearch2,000502.72.940.2000.285
quickwit2,000530.22.290.2150.290
III

graph-benchmark

valid negative

Graph

Graph query performance, Pokec-small cross-engine diagnostics, official LSQB capability, and bounded SNB Interactive qualification.

Methodology scope · protocol · interpretation

Graph Database Benchmark v2 Methodology

Scope and provenance

This benchmark has two lanes and does not calculate a composite winner. LSQB-derived is an Antfly-owned anchored microbenchmark over LSQB data. The Pokec suite is a clean-room implementation informed by the public categories and workload ratios described by Memgraph’s Benchgraph material. It reuses the public Pokec import files, not Benchgraph implementation code. Neither lane is an audited LDBC result.

The scorecard keeps these measurements separate:

LaneScorecard metricsDirection
LSQB-derived F2warm serial p50, warm serial p99latency lower
Pokec W1completed QPS, peak process RSSQPS higher; RSS lower

Full statistics, errors, run ranges, and raw samples remain mandatory even when the scorecard is used.

Engines and equal client work

The comparison is Antfly, Neo4j 5.26.29, and Memgraph 3.12.0. Kuzu is excluded because it is not exercised through a comparable network service. Every timed throughput cell uses the same Go executable, deterministic schedule, quantile implementation, response-consumption rule, worker count, and wall-clock. Antfly is accessed over persistent HTTP/1.1; both peers use the same official Neo4j Go Bolt driver. Transport is part of observed client latency and is reported, not hidden.

Only equivalent User(id) and benchmark-namespace ID indexes are created. There is no engine-specific query tuning. Each run starts from a fresh database and performs complete correctness checks before timing. Mutating cells use a reserved BenchUser namespace so source reads cannot change; that namespace is restored to its 1,024-node ring baseline after every mutating cell. Timed requests are never retried. Errors are retained and exclude a run from the publication gate.

LSQB-derived lane

The pinned source, data loading, parameter selection, BLAKE3 result oracle, and N1/P2/F2 definitions are specified in graph-lsqb-derived.md. The public LSQB-derived metric is warmed serial latency for this exact endpoint-filtered lookup, returning matching Post IDs:

(Forum)-[:CONTAINER_OF]->(Post)-[:HAS_TAG]->(Tag {id: $tag_id})

Unfiltered P2 C12 throughput remains a retained diagnostic. It is not part of the graph scorecard or public filtered-lookup claim. Default, medium, and full use LSQB SF0.003, SF0.1, and SF1 respectively.

Pokec data and parameter oracle

Profiles use the public Memgraph Pokec import files:

ProfileDatasetUsersDirected FRIEND edgesAnchors
quickPokec-small10,000121,71612
mediumPokec-medium100,0001,768,51548
fullPokec-large1,632,80330,622,564128

The harness records the downloaded source SHA-256 and refuses unexpected node or edge counts. Anchors are selected deterministically across out-degree deciles with seed 0xB37C4. Every selected anchor must return its complete result below 900 rows through four hops; this stays below rc18’s 1,000 pattern match ceiling rather than comparing truncated results.

Expansion semantics are one endpoint result per directed walk. Antfly uses a chain of fixed one-hop pattern steps. Cypher uses one fixed MATCH clause per hop, avoiding vendor differences in variable-length path uniqueness. The offline SQLite oracle stores the exact result count and canonical BLAKE3 digest including multiplicity for every parameter. Aggregates and shortest path have exact scalar oracles. All 101 quick-profile checks per engine/run must pass before timing. Writes are executed and verified in the isolated benchmark namespace.

Pokec operations

IDOperation
R1exact indexed node lookup
WNinsert a new benchmark node
U1increment one benchmark-node property
WEinsert one directed benchmark edge
AG1age buckets and counts
AG2age count/min/max/sum/average
E1–E4exact fixed 1-, 2-, 3-, or 4-hop directed expansion
E2Fexact 2-hop expansion with endpoint age >= 18
N2concatenated exact 1-hop and exact 2-hop neighborhood
SPdirected unweighted shortest path, maximum depth 8

Every operation has an unwarmed serial observation and a prewarmed serial distribution. Isolated throughput uses 12 clients. Each non-mutating operation also receives a 70% operation / 30% write cell, split evenly between node and edge insert. The deterministic realistic workloads are:

  • W1: 20% analytical, 40% point read, 10% update, 30% write;
  • W2: 70% point read, 30% write;
  • W3: 50% point read, 50% write;
  • W4: 30% point read, 70% write.

The quick profile uses one-second isolated/mixed cells and two-second W1–W4 cells. Medium uses 5/10 seconds; full uses 15/30 seconds. Warmup is untimed. Every successful timed request is retained in JSONL. Reports contain completed QPS, error counts, p50/p95/p99, per-operation statistics, and peak PID RSS.

Persistent database volume

The honed LSQB SF0.1 F2 lane creates a new, run-labeled Docker local volume for every engine and repetition. Only the complete writable database root is measured (/data for Antfly and Neo4j, /var/lib/memgraph for Memgraph); read-only dataset/tool volumes and client scratch are excluded. A digest-pinned Alpine probe captures whole-volume allocated and apparent bytes once at empty, service-ready-before-ingestion, and post-workload, then at the verified post-stop final barrier. Final allocated bytes are the headline.

All three storage values, their arithmetic mean and range, apparent-byte diagnostics, barrier samples, volume manifests, and lifecycle receipts are retained. A provisional stop timeout remains visible but cannot support a comparative ratio.

Runs, ordering, and reporting

Each profile requires three clean process runs. Engine order rotates by run and uses a different rotation between lanes. Public serial point estimates are the medians of the three run-level p50, p95, and p99 values. Every result row also retains the three run-level percentile records, their min–max ranges, pooled sample percentiles as diagnostics, and all raw samples. Load/index readiness is diagnostic and is never included in query metrics.

summary.json is the machine-readable source of truth. The Markdown report contains the full cell table; scorecard.svg is only the compact two-panel view. There is deliberately no geometric mean or composite rank.

The honed LSQB SF0.1 F2 lane caches only the complete three-engine cohort. Promotion requires Antfly, Neo4j, and Memgraph to each retain three fresh database constructions and process runs, 15,000 timed samples, all three run-level percentile records and ranges, three complete storage receipts and their allocated-byte mean/range, 1,000/1,000 correctness, a valid canonical receipt, and the quiet-host record. The cache identity binds the Antfly subject, both peer image digests, the Linux client and storage-probe image, dataset manifest, harness sources, and protocol. A hit materializes the entire cohort; per-engine cache mixing is not permitted.

Internal fresh-service F2 readiness and convergence

The honed and Circus profiles retain a fresh-service diagnostic that measures how quickly a preloaded graph service becomes useful and settles into its warm filtered-two-hop behavior. It is graph-specific: readiness is followed immediately by the same exact LSQB SF0.1 F2 request used by the warm latency lane. It is not a general process-startup or system-wide Antfly claim.

This cohort is deliberately internal. It is attached to the canonical graph run report and structured result, but the public benchmark-page renderer does not render its table. It is never eligible for the honed publication cache: each honed or gauntlet graph invocation collects it afresh with make graph-f2-warmup-run. The retained diagnostic contract requires:

  • the same Antfly binary, pinned Neo4j and Memgraph images, official LSQB SF0.1 dataset, and Linux/arm64 Docker environment as the primary graph lane;
  • a recorded physical-host state, including whether the honed quiet-host assertion was active, without treating a diagnostic run as publication data;
  • one database construction followed by five fresh service lifecycles per engine, with balanced engine ordering;
  • restart-to-ready measured from immediately before service launch through the first successful engine-native probe: Antfly GET /readyz, Neo4j cypher-shell RETURN 1 plus the pinned-version check, and Memgraph autocommit SHOW VERSION over Bolt;
  • the first F2 latency and first-100 p50/p95 from a fixed 100-anchor panel selected by SHA-256 rank independently of result cardinality;
  • convergence at the first point where three consecutive adjacent 100-query window p50 changes are each within 5%, with a 10,000-query ceiling;
  • steady-state p50/p95 from five deterministic sweeps over all 1,000 anchors after convergence;
  • every timed result checked against the independent count+BLAKE3 oracle, with all 1,000 anchors covered in every engine/lifecycle; and
  • median-of-five run metrics with complete run ranges, raw timestamped samples, lifecycle logs, host evidence, exact schedules, and a canonical receipt.

These seven values are an indivisible internal reporting family: restart-to-ready, first-query, first-100 p50, first-100 p95, queries-to-stable-p50, steady p50, and steady p95. The retained report must show all seven for all three engines; it must not headline convergence while omitting the steady-state latency guardrail or Memgraph.

Qualification and publication

The default command is a small, complete optimization loop with a target wall time below 15 minutes. Medium and full are explicit diagnostic commands. A mixed native-macOS/container run is qualification-only because its process RSS views are not comparable across engines.

The release-facing honed F2 lane is a separate, environment-qualified publication protocol. Antfly, Neo4j, and Memgraph all run sequentially inside the same Docker Desktop Linux/arm64 VM on an explicitly quiescent Apple Silicon host. The published claim must name that environment and is limited to warm serial filtered two-hop latency; it is not a bare-metal Linux result or a claim about general graph-database performance. Publication requires:

  • the exact v0.2.0 Linux/arm64 binary and expected SHA-256;
  • the pinned Neo4j 5.26.29, Memgraph 3.12.0, and Linux client image digests;
  • official LSQB SF0.1 with 432,235 nodes and 1,827,523 relationships;
  • three fresh database constructions and process runs per engine, each on a newly created labeled database volume;
  • five warmed serial sweeps per run over 1,000 deterministic anchors;
  • 1,000/1,000 count+BLAKE3 correctness in every engine/run and zero timed errors;
  • median run-level p50/p95/p99 with all run ranges, pooled diagnostics, raw samples, lifecycle logs, and the physical-host record retained; and
  • a canonical receipt for the indivisible three-engine cohort.

The broader graph-v2/Pokec publication gate remains native-Linux-only and is not satisfied by this bounded F2 artifact.

Run evidence parameters · variation · provenance

Benchmark parameters

{"parameters_checked":1000,"query_ids":["F2"]}

Peer versions

Peer versions were not recorded in the published result fields.

Evidence digests

Receipt
578742a37cc7694631253667aa422d6be4cf3f646fae173d3b4725f05f7377d2
Aggregate
67ac95905cec04a34bf335251698329fc2320299cb184bd1d50af86c3db3cd92
Provenance
954711770bdd716801c40c8ca5e8fd22a12664ad34c93a0fd8402c5a52b47e42
Harness commit
1d66908788c25a92d0a35a01a0230e629d1c97d6

Scope notes

  • Antfly failed all 1,000 query-parameter correctness checks before latency, memory, or storage measurements became publishable.
  • The correctness gate failed before latency, memory, or storage measurements became publishable.
Selected terminal outcome
Completed
Antfly
v0.1.3 ·
Runtime
1m 15s
Platform
linux · aarch64
Machine
c4a-standard-4 · 4 CPU · 16.7 GB
Build
Not recorded · Zig Not recorded

Antfly failed all 1,000 query-parameter correctness checks before latency, memory, or storage measurements became publishable.

The correctness gate failed before latency, memory, or storage measurements became publishable.

Correctness gate outcome

Antfly v0.1.3 · 1b070b5d

CriterionExpectedObservedReason
F2 query correctness gateEvery held-out query parameter passes1,000 / 1,000 failedall-query-parameters-failed