Full Simeon ingestion oracle¶
This contract defines the correctness and identity gates for optimizing the full YAMS ingestion
pipeline with built-in Simeon embeddings. It complements
tests/benchmarks/xplan/plans/ingest_pipeline.json; synthetic text is valid here for throughput
and lifecycle attribution, but not for retrieval-quality claims.
Existing execution path¶
| Surface | Path |
|---|---|
| Plan | tests/benchmarks/xplan/plans/ingest_pipeline.json |
| Worker | tests/benchmarks/xplan/workers/ingestion_e2e.py |
| Benchmark | tests/benchmarks/search/ingestion_e2e_bench.cpp |
| Binary | build/release/tests/benchmarks/ingestion_e2e_bench |
The benchmark uses an isolated in-process daemon and temporary data, state, socket, PID, and log
paths. Its measured path is directory admission followed by content storage, extraction, metadata
and FTS updates, Simeon embedding inference, vector writes, KG/post-ingest work, queue drain,
WriteCoordinator flush, fixed search probes, and clean daemon shutdown.
Run the existing plan through xplan; do not create a parallel multi-arm shell matrix:
python3 tests/benchmarks/xplan/runner.py self-test
python3 tests/benchmarks/xplan/runner.py run ingest_pipeline \
--build-dir build/release --arm baseline
Use the baseline arm first. Run all ablation arms only after the full-path oracle below passes.
Decision-grade measurements require at least three repeats and immutable artifacts under
build/benchmarks/ingest_pipeline/<stamp>/.
Workload tiers¶
Smoke contract¶
The fast smoke fixture is five generated text documents, 1,000 target bytes per document, seed 42,
directory ingestion, concurrency 1, 20 ms polling, 2 ms post-ingest coalescing, vectors/KG enabled,
and the benchmark’s fixed simeon-default embedding identity. The isolated fixture pins Simeon
through typed config and ignores inherited backend/model selection. It proves wiring only; it is
not a performance or SPQ persistence baseline.
env -u YAMS_DISABLE_VECTORS -u YAMS_BENCH_FORCE_MOCK_EMBEDDINGS \
-u YAMS_BENCH_DISABLE_KG -u YAMS_DISABLE_GLINER_TITLES \
YAMS_TEST_SAFE_SINGLE_INSTANCE=1 \
YAMS_BENCH_CORPUS_SIZE=5 YAMS_BENCH_DOC_SIZE=1000 \
YAMS_BENCH_POLL_INTERVAL_MS=20 YAMS_BENCH_INGEST_MODE=directory \
YAMS_BENCH_INGEST_CONCURRENCY=1 YAMS_BENCH_POST_INGEST_COALESCE_MS=2 \
build/release/tests/benchmarks/ingestion_e2e_bench
Decision contract¶
The decision fixture retains seed 42 and directory ingestion. Decision evidence uses two complementary isolated lanes:
- A combined real-GLiNER lane uses five 1,000-byte documents and proves the exact local model, exact post/embed/KG/title accounting, Simeon identity, stable search paths, inference timing, and clean lifecycle.
- A multi-chunk persistence lane disables GLiNER and uses 100 documents of 8,192 target bytes. It must produce at least 256 vector rows, train and persist SPQ, reload the persisted generation, and preserve exact output fingerprints.
Both lanes require three repeats with identical workload identities. The combined lane must consume all five KG and title jobs; partial progress is a liveness failure, not a timeout to relax. A product decision also requires a fresh-process SPQ restart-reuse check.
Any before/after comparison must use the identical generated corpus fingerprint and parameters. Record the selected values in the run report rather than silently changing this contract.
Fresh-process restart and replay¶
The benchmark accepts harness-only YAMS_BENCH_PHASE=initial|replay|resume and
YAMS_BENCH_FIXTURE_ROOT. An explicit root must be an isolated yams_e2e_bench_* directory below
the system temporary directory; the external driver owns that root and must remove it in a
finally/signal-cleanup path. Default invocations remain self-cleaning.
A restart gate runs initial, replay, and a second replay in separate benchmark processes over
the same root. Each replay must observe the complete corpus before admission, reuse the persisted
SPQ generation, and preserve exact document/vector counts, embedding bits, direct-vector top-k
identities and score bits, normalized application top-k paths, and clean shutdown. Startup and
post-replay fingerprints must match, as must both replay processes. Application fusion scores may
only be compared exactly within the same persisted fixture because KG edges carry creation times;
across independently timestamped fixtures, compare the exact direct-vector score fingerprint and
normalized application result identities unless the KG timestamp identity is also pinned.
An interruption gate sends termination only to the isolated child during serial admission, requires
normal daemon shutdown, then runs resume over the retained partial fixture. Resume must report the
partial startup counts and converge to the exact full document/vector fingerprints without drops,
duplicates, lock errors, writer errors, or remnants.
Required experiment identity¶
Every run must record these fields in machine-readable output:
- Git revision, dirty state, build type, compiler/architecture, and benchmark binary SHA-256;
- corpus seed, corpus fingerprint, corpus size, document size, ingest mode/concurrency, coalesce window, and batch size;
- embedding backend and model name;
- provider name/version and model URI or artifact path;
- embedding dimension and embedding-space/recipe identity;
- KG, vector, GLiNER/title-extraction, and plugin activation state; and
- SPQ recipe/generation relevant to persisted-index reuse.
For the built-in default used by the smoke fixture, there is no external model file to download or hash. Its artifact identity is the benchmark binary plus:
provider=Simeon
provider_version=1.0.0
model_uri=simeon://simeon-default
model=simeon-default
embedding_dimension=1024
recipe=simeon-config-v1:char_and_word:3-5:sketch=4096:output=1024:projection=fwht:l2=1
Do not substitute an ONNX model, mock provider, or different Simeon encoder recipe under the same experiment identity.
Lossless correctness oracle¶
A valid run satisfies all of the following:
- Admission failures are zero and stored document count equals generated document count.
observed_post == expected_post,observed_embed == expected_embed, andobserved_kg == expected_kg; over-counts are duplicate work and fail the run.- Extraction, embedding, post-ingest, KG, symbol, entity, and title queues are drained with zero
dropped work; the
WriteCoordinatorflushes with zero commit errors or capacity rejection. - Stored vector count equals the emitted chunk-vector count. Every vector has the declared
dimension and only finite values. A deterministic ordering of normalized
(document identity, chunk identity, offsets, model identity, embedding bits)has the same fingerprint across repeats and before/after runs. A canonical direct-vector query returns finite top-k scores and an exact identity/score-bit fingerprint. - Keyword, semantic, and graph/hybrid probes succeed after drain. Their fingerprint uses stable document/hash or normalized corpus-relative path identities, not transient numeric row IDs. Required score vectors are finite and aligned with those identities.
- A corpus large enough for PQ records the current vector generation, persists the SPQ snapshot, reopens it as reusable, and returns the same direct-vector top-k identity/score fingerprint before and after restart.
- Content hashes and document/chunk/vector identities are unchanged by an optimization.
- Shutdown succeeds without an isolated socket, PID, WAL, SHM, queue worker, or lease remaining.
A run that misses an oracle field is incomplete evidence, even if pipeline_complete is true.
Performance evidence¶
Keep correctness gates separate from optimization KPIs. Record at minimum:
- admission, storage-ready, pipeline-drain, enrichment-ready, and searchability-ready time;
- documents/s and MiB/s;
- content-store, extraction/chunking, metadata transaction, Simeon gather/infer/build-record, vector insertion, KG, and post-ingest phase distributions;
- embedding batch p50/p95/p99 and batch sizes;
- queue depth/in-flight high-water marks, DB lock/retry counts, and writer queue/apply time;
- SPQ build/persist/reload time and generation;
- process CPU, peak RSS, WAL growth, and shutdown latency.
Use the same workload for profiling and before/after runs. Reject changes within pooled variance or with an unplanned identity, quality, tail-latency, RSS, or durability regression.
Evidence storage¶
Keep generated JSON, CSV, reports, logs, machine-specific paths, binary hashes, and measured run
summaries out of the public source tree. They remain in gitignored build/benchmarks/** locally and
are stored in YAMS with task, phase, owner, and source=evidence metadata for retrieval and
handoff. This document records only the stable benchmark contract and acceptance gates.