Bundle data contracts
What a published run contains, how /benchmarks finds and reads it, and the exact data contract behind each chart. Wiring real data means publishing bundles in this format; no page code changes.
From engine to page
engine host (append-only) verifier (anyone, read-only) publication
manifest.json intents.jsonl rbench.verify → verified/metrics.json rbench.publish --tier public → dist/<run>/
attempts.jsonl clock.jsonl (recomputed from chain via your RPC) rbench.index --dist dist → dist/index.json
site: NEXT_PUBLIC_BENCH_INDEX_URL=<…>/index.jsonThe index: rout-bench-index.v1
| Field | Meaning |
|---|---|
path | Bundle folder, relative to index.json |
kind | verified_run (E0, A1, A2, B, C) or step0 |
run_id, protocol_id, protocol_version, experiment, title | Identity, copied from the manifest and protocol |
tier, cluster, started_at, ended_at, verifier_version | Provenance |
status | verified, integrity_failed, voided or superseded (STATUS.json in the bundle) |
superseded_by, note | Correction trail; runs are never removed |
synthetic | true when the bundle holds a SYNTHETIC marker; production builds hide it |
files, sha256sums | What can be downloaded, and the hash of SHA256SUMS |
The index carries no metric values. Every number comes from a bundle's own metrics.json or step0.json, parsed against the Zod contracts in src/adapters/schemas.ts. A file that doesn't parse shows an error, never a guess.
Row schemas
Every field carries x-field-class: measured, engine-assigned, configured or computed (verifier only).
anchor-observation.v1.schema.json Anchor observation v1
Written by the verifier: the chain's slot for each anchor that has a signature. A mismatch with the engine's anchor.slot fails the run.
sha256 c6e4b483…a1867201
attempt.v1.schema.json Attempt v1
One row per signed copy sent to one provider.
sha256 8e769980…bc3168e7
clock.v1.schema.json Clock sample v1
Periodic mapping between a host's monotonic clock and disciplined wall time.
sha256 838608e8…0c64179b
intent.v1.schema.json Intent v1
One row per intent the engine created, including refused and failed ones. The denominator of every rate.
sha256 91b09ce3…015365f6
observation.v1.schema.json Chain observation v1
Written by the verifier from an independent RPC. Never written by the engine.
sha256 1cbd121e…c2a53af5
protocol.v1.schema.json Pre-registered protocol v1
Hashed and published before the first intent. status=finalized requires every parameter and acceptance value to be non-null.
sha256 1e55ba58…7fd31c7c
run-manifest.v1.schema.json Run manifest v1
One per run. Written before the first intent and never edited; the verifier refuses a run whose protocol hash does not match.
sha256 610b8c64…4a371d0f
Chart contracts
The same definitions appear under "About this chart" on every chart.
Page states
| State | When | What the reader sees |
|---|---|---|
| Unconfigured | NEXT_PUBLIC_BENCH_INDEX_URL is empty | "No published runs on this deployment", with links to the method. Never an error. |
| Loading | Fetching index, bundle or rows (TanStack Query) | Skeleton at the content's final height; chart frames and questions render at once. |
| Empty | Index has no runs for this view | What would have to happen for a result to exist, and what to read meanwhile. |
| Error: network | Host unreachable or non-2xx | Inline error where the data belongs, the failing URL, Try again (Query refetch). |
| Error: format | A file fails its schema | "This file doesn't match the format this site reads", with the JSON path. |
| Integrity failed | metrics.integrity_problems is non-empty | Red banner listing each problem above all figures. |
| Synthetic | Bundle has SYNTHETIC and the dev build allows it | Warning banner and badge on every view. Production never shows these. |
| Disputed | Quantiles recomputed from rows differ from metrics.json | Red note naming each mismatch. |
Exits that stay inside a price bound
Sell rules that land when the market moves fast without accepting any price. Every order states its slippage; a reverted sale widens only up to a ceiling you set.
Verifier CLI
rbench is a read-only verifier in Python's standard library (3.10+). RPC endpoints come only from RBENCH_RPC_URL or --rpc-url, and every analysis number comes from a finalized protocol.