Zephr

Evidence / Benchmarks

Real numbers, realenvironment, real limits.

Every metric below is measured on a clean Linux host through the real CLI and MCP tool paths — nothing is modelled, and anything estimated is labelled as estimated by the data itself rather than by the prose around it. The methodology and the limitations come first, because a benchmark without them is a marketing number.

Shipped · measuredLast run 2026-07-23single-node SQLitereproducible
How these numbers were measured

Methodology and limitations

All values are measured on a clean Linux x64 host (AMD EPYC 9454P, 125 GB RAM, Node 24, NVMe) via scripts/perf-benchmark.mjs against the real zephr CLI + MCP tool paths — single-node, local-first SQLite. Recall is the lexical/BM25 hybrid retrieval path (single-threaded); semantic vector recall over Qdrant HNSW is the separate ZEP-25 capacity contract (1M points, 100 tenants, 1,536-dim), whose targets are shown for reference below. See docs/operations/PERFORMANCE-BENCHMARK-2026-07-23.md for full methodology and raw evidence.

  • Environment

    Shipped

    AMD EPYC 9454P, 125 GB RAM, Node 24, NVMe, Linux x64. Single-node, local-first SQLite. This is not a distributed test, and no number here should be read as a cluster result.

  • Corpus

    Shipped

    100 / 1K / 10K stored beliefs in a single worktree. Recall is the lexical/BM25 hybrid path, single-threaded. Vector recall over Qdrant HNSW is a separate capacity contract and is not measured here.

  • Limitations

    Evolving

    No multi-tenant isolation tested. No network latency. No adversarial input. Cross-client handoff is an in-process format round-trip, not a full CLI subprocess end-to-end run.

Host: AMD EPYC 9454P 48-Core Processor / 125.5GB / Node v24.18.0 / linux-x64 · generated 2026-07-23 · source: scripts/benchmark-results.json

Recall latency

Query latency at every scale.

Recall@10 query latency for 100 / 1K / 10K stored beliefs, through the real zephr_recall handler — lexical/BM25 hybrid, single-threaded. The bars share one p99 scale, so the shape of the curve is the honest comparison rather than three independently flattering charts.

  • 100 beliefs

    recall@10: 100%

    ✓ measured
    p50
    1 ms
    p95
    1.6 ms
    p99
    1.7 ms
    row 1 of 3 · measured · lexical/BM25 hybrid
  • 1,000 beliefs

    recall@10: 100%

    ✓ measured
    p50
    2.7 ms
    p95
    3.3 ms
    p99
    3.3 ms
    row 2 of 3 · measured · lexical/BM25 hybrid
  • 10,000 beliefs

    recall@10: 100%

    ✓ measured
    p50
    15.3 ms
    p95
    17.7 ms
    p99
    26.2 ms
    row 3 of 3 · measured · lexical/BM25 hybrid

recall@10 is the measured hit rate of the target belief in the top ten results — not a quality score and not a relevance judgement.

Performance summary

Write, snapshot, and start.

Core operations measured through the real zephr CLI and MCP tool paths. Each card carries the methodology string straight from the benchmark output, so the sentence describing how a number was produced travels with the number.

  • 1,082beliefs/s
    ✓ measured

    Sequential single-writer writes per second — idempotent remember with a content digest.

    real zephr_remember handler, sequential single-writer, file-backed SQLite

  • 6 / 8ms create / verify
    ✓ measured

    Time to create a recovery snapshot and independently verify its integrity.

    create = better-sqlite3 backup (WAL-truncated); verify = store.verifyBackup (integrity_check + schema/table validation); cliTotal = full `zephr-mcp snapshot` subprocess

  • 133ms warm startup
    ✓ measured

    CLI warm-start time — page-cache hot, median of subsequent invocations.

    subprocess wall time; cold = first invocation, warm = median of subsequent (page-cache hot). `project list --help` is not a valid invocation (--help rejected), so `version` (pure startup) and `project list` (startup + registry read) are measured.

Snapshot detail

The snapshot phases separated from the full CLI command, because a number that quietly folds in process startup is a different number.

Create snapshot
6.0 ms
Verify integrity
8.0 mspass
Full CLI command (incl. startup)
155 msinfo
DefinitionVerified

What “measured” means here

Each number is a wall-time sample from the real tool or CLI subprocess on the benchmark host. Nothing is synthetically modelled. If a value were estimated rather than measured, its badge would say so — the label comes from the data file, not from the copy on this page.

scripts/benchmark-resu…

Values are measured — imported from scripts/benchmark-results.json. This card's layout is illustrative; the numbers in it are not.

Cross-client handoff

One format. Every client.

Continuity envelope round-trip — build → canonicalize → parse → validate — with the identical format across Claude Code, Cursor, and Codex. The per-client adapter delta is not isolated, because the format round-trip applies uniformly; presenting three different numbers would imply a measurement that was not taken.

Claude Code → Cursor✓ measured

0.5 ms

measured · in-process format round-trip

Cursor → Codex✓ measured

0.5 ms

measured · in-process format round-trip

Codex → Claude Code✓ measured

0.5 ms

measured · in-process format round-trip

Average round-trip: 0.5 ms. The full CLI command round-trip (269 ms) is the honest end-to-end figure — it includes roughly two Node process startups, and it is the one to quote if you care about the wall time a developer actually waits.

ZEP-25 capacity targets

Qdrant capacity contract targets

Vector recall targets for the separate Qdrant capacity contract — 1M points, 100 tenants, 1,536 dimensions. These are targets, not results from the host above, and they are listed here only so the two evidence streams are not confused for one another.

Reference — not a gate
p99 latency @ 100 concurrenttarget
≤ 150 ms
p95 latency @ 50 concurrenttarget
≤ 80 ms
recall@10target
≥ 0.95

Source: packages/store-qdrant/src/bench/report.json. Measured separately from the SQLite numbers above, on different hardware, against a different storage engine.

Evidence you can inspect.

Every benchmark on this page links to its source, and every source is a file in the repository. The trust model these numbers support is documented the same way.