Search

Search benchmark pages, protocols, published runs and the docs

Rout

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.json

The index: rout-bench-index.v1

FieldMeaning
pathBundle folder, relative to index.json
kindverified_run (E0, A1, A2, B, C) or step0
run_id, protocol_id, protocol_version, experiment, titleIdentity, copied from the manifest and protocol
tier, cluster, started_at, ended_at, verifier_versionProvenance
statusverified, integrity_failed, voided or superseded (STATUS.json in the bundle)
superseded_by, noteCorrection trail; runs are never removed
synthetictrue when the bundle holds a SYNTHETIC marker; production builds hide it
files, sha256sumsWhat 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.

FieldTypeClassRequiredDescription
intent_idstring—yes
signaturestring—yes
foundboolean—yes
slotinteger | null—yes
rpc_labelstring—yes

sha256 c6e4b483…a1867201

attempt.v1.schema.json Attempt v1

One row per signed copy sent to one provider.

FieldTypeClassRequiredDescription
run_idstring—yes
intent_idstring—yes
attempt_idstringengine-assignedyesUnique within the run.
providerstringconfiguredyesSubmission provider label.
endpoint_regionstring—yes
signaturestringmeasuredyesThis copy's signature (copies differ, so each is attributable).
sent_mono_nsintegermeasuredyesMonotonic time the send call returned.
send_result"accepted" | "rejected" | "timeout" | "error"measuredyesProvider's synchronous answer only.
send_errorstring | null——
tip_lamportsstring—yesExact integer in base units, as a decimal string.

sha256 8e769980…bc3168e7

clock.v1.schema.json Clock sample v1

Periodic mapping between a host's monotonic clock and disciplined wall time.

FieldTypeClassRequiredDescription
run_idstring—yes
host_idstring—yes
mono_nsinteger—yes
wall_unix_nsinteger—yes
offset_nsintegermeasuredyesOffset reported by the time daemon.
sourcestring—yes

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.

FieldTypeClassRequiredDescription
run_idstring—yes
intent_idstringengine-assignedyesUnique within the run; the dedup key.
trace_idstringengine-assignedyesJoins engine spans for this intent.
experiment"E0" | "A1" | "A2" | "B" | "C"configuredyesExperiment id.
armstringengine-assignedyesArm chosen by the pre-registered randomizer.
stratumobjectmeasured—
host_idstring—yes
created_mono_nsintegermeasuredyesHost monotonic clock when the intent was created.
decided_mono_nsinteger | nullmeasured—Monotonic time the strategy decided.
signed_mono_nsinteger | nullmeasured—Monotonic time the first copy was signed.
anchorobject—yesThe on-chain reference that Δslot is measured from.
engine_outcome"submitted" | "refused" | "expired_before_submit" | "error"measuredyesWhat the engine did; landing is decided by the chain, not here.
refusal_codestring | null——
side"probe" | "buy" | "sell"—yes
mintstring | nullconfigured—Token mint, null for probes.
size_rawstring | null——Exact integer in base units, as a decimal string.
tip_lamportsstring—yesExact integer in base units, as a decimal string.
slippage_bpsinteger | null——
nonce_mode"durable_nonce" | "recent_blockhash"—yes
nonce_accountstring | null——
quoteobject | null——Pre-trade curve quote at the anchor slot, for fill quality.
seqintegerengine-assignedyesGap-free sequence number from 0 within the run. A gap means a hidden intent; the verifier fails the run.

sha256 91b09ce3…015365f6

observation.v1.schema.json Chain observation v1

Written by the verifier from an independent RPC. Never written by the engine.

FieldTypeClassRequiredDescription
run_idstring—yes
intent_idstring—yes
attempt_idstring—yes
signaturestring—yes
status"landed_ok" | "landed_err" | "not_found"computedyesFrom getSignatureStatuses / getTransaction.
slotinteger | null—yes
errstring | null—yes
fee_lamportsinteger | null—yes
block_timeinteger | null——
rpc_labelstring—yes
commitment"confirmed" | "finalized"—yes

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.

FieldTypeClassRequiredDescription
protocol_idstring—yes
versioninteger—yes
experiment"S0" | "STEP0" | "E0" | "A1" | "A2" | "B" | "C"—yes
status"draft" | "finalized"—yes
titlestring—yes
hypothesisstring—yes
customer_valuestring—yes
unitstring—yes
armsarray—yes
primary_metricobject—yes
secondary_metricsarray—yes
parametersobject—yesNumbers the analysis uses. null = not yet agreed.
randomizationobject—yes
denominatorstring—yes
exclusionsarray—yes
stopping_rulestring—yes
acceptanceobject—yesThresholds agreed with the partner. null = not yet agreed.
redact_by_tierobject—yes
requiresarray—yesDependency ids from 14-backlog (e.g. E1, PARTNER-DATA).

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.

FieldTypeClassRequiredDescription
schema_version"1"—yes
run_idstringengine-assignedyesRandom UUIDv4, immutable.
protocol_idstringconfiguredyesPre-registered protocol id.
protocol_sha256stringcomputedyesrbench.io.protocol_hash of the finalized protocol file.
tier"internal" | "partner_confidential" | "public"configuredyesWho may see this run's raw rows.
cluster"mainnet-beta" | "devnet" | "testnet"configuredyesSolana cluster.
started_atstringmeasuredyesUTC wall time of the first intent.
ended_atstring | nullmeasuredyesUTC wall time of the last intent; null while running.
engineobject—yes
hostsarray—yes
reference_rpcobject—yesWhich independent RPC the verifier used. Never a URL with a key.
operatorstring—yesWho ran it: rout, a partner, or a third party.
notesstring——
scheduleobject | nullconfigured—Slot range for scheduled probes (rbench.assign). Declared before the run; every scheduled slot in it must have an intent.

sha256 610b8c64…4a371d0f

Chart contracts

The same definitions appear under "About this chart" on every chart.

ChartQuestionDataUncertaintyNever
Landed within the windowHow often does each path land in time?metrics.json → arms[arm].landed_within_window {k, n, rate, ci} protocol.json → parameters.landing_window_slots, confidenceWilson score interval at the protocol's confidence (rbench.stats.wilson). Whisker = interval; dot = k/n.A bar (implies a total), an axis that starts above 0%, or a rate without k/n.
Difference between armsIs the difference large enough to act on, and is it real?metrics.json → comparisons[i].landed_within_window_difference {estimate, ci, cluster_bootstrap_ci, cluster_slots} protocol.json → acceptance.*Two intervals per row: Newcombe hybrid score (independent intents) and cluster bootstrap over cluster_slots blocks. The gate uses the wider one; it is drawn darker.Reading overlap of two separate rate intervals as a test; showing only the narrower interval.
Slots to inclusionHow soon after the trigger does a transaction land, across the whole tail?intents.jsonl → intent_id, arm, anchor.slot observations.jsonl → intent_id, status, slot (verifier-written, independent RPC) metrics.json → arms[arm].delta_slot_quantiles (headline quantiles)Curve is the empirical CDF. Quantile intervals come from metrics.json (distribution-free order statistics); a quantile without an interval is marked 'indicative'. The page recomputes the quantiles from rows and flags any mismatch with metrics.json.A ms axis from cross-host clocks; a curve normalised to landed-only intents without saying so.
Δslot quantilesWhat do p50, p90, p95 and p99 look like, and how sure are we?metrics.json → arms[arm].delta_slot_quantiles[] {q, value, ci, note}Order-statistic interval, or the verifier's 'indicative only' note when n is too small for one (p99 at 95% needs n ≥ 368).A p99 printed without its interval or its 'indicative' flag.
Every intent, by outcomeWhere do the failures go? Is anything hidden from the denominator?metrics.json → arms[arm].classes {landed_ok, landed_err, not_landed, refused, expired_before_submit, engine_error} metrics.json → arms[arm].n_intentsCounts, no interval. The stack must sum to n_intents; the page checks and flags it.Dropping refused, expired or engine-error intents.
Δslot shiftAmong landed transactions, is one path earlier?metrics.json → comparisons[i].delta_slot_shift {estimate, ci, method, caveat}Seeded percentile bootstrap interval.Showing the shift without the landing difference beside it (a faster arm that lands less often hasn't won).
Which route's copy landedWhen one intent is sent through several routes, which one wins?metrics.json → arms[arm].provider_win_share[route] {k, n, rate, ci}Wilson interval. Valid as a paired comparison only under durable nonce, where exactly one copy can land.Naming a provider without legal review and consent (legal review first).
By conditionDoes the result hold under congestion, across leader-window positions and regions?metrics.json → strata[key][] {arm, value, k, n, rate, ci}Wilson interval per cell. Descriptive only: strata are not separate significance claims unless the protocol says so (Holm).Promoting a single stratum to a headline.
Cost per landed transactionWhat does each success cost, including what was spent on failures?metrics.json → arms[arm].spend_lamports {fees_chain_observed, tips_engine_reported, per_landed_ok}Point values (no interval in the verifier yet). Fees are chain-observed; tips are engine-reported until E7 lets the verifier match tip transfers.Merging engine-reported tips into a 'verified' total.
Engine-reported timingWhere does time go inside the engine?metrics.json → internal_latency_ns[span] {n, quantiles[]}Order-statistic intervals. Not chain-verifiable: these are the operator's own timestamps.Promoting these spans to a headline, or adding them to Δslot.
Protection gapAfter outside buys cross a guard threshold, how long until the creator exits, and how much flow gets in?step0.json → results[] {threshold_lamports, block0_cohort_counted_as, outcomes, share_crossed, gap_slots[], per_mint[]}Order-statistic intervals on quantiles; Wilson on share crossed. Market-wide baseline, not any one platform's launches unless that platform supplies its mint list.Presenting the market-wide baseline as one platform's launches.
Share of launches that crossedHow often does outside flow reach each threshold at all?step0.json → results[] {threshold_lamports, share_crossed {k, n, ci}}Wilson interval at the protocol's confidence.A denominator other than every launch in the published list.

Page states

StateWhenWhat the reader sees
UnconfiguredNEXT_PUBLIC_BENCH_INDEX_URL is empty"No published runs on this deployment", with links to the method. Never an error.
LoadingFetching index, bundle or rows (TanStack Query)Skeleton at the content's final height; chart frames and questions render at once.
EmptyIndex has no runs for this viewWhat would have to happen for a result to exist, and what to read meanwhile.
Error: networkHost unreachable or non-2xxInline error where the data belongs, the failing URL, Try again (Query refetch).
Error: formatA file fails its schema"This file doesn't match the format this site reads", with the JSON path.
Integrity failedmetrics.integrity_problems is non-emptyRed banner listing each problem above all figures.
SyntheticBundle has SYNTHETIC and the dev build allows itWarning banner and badge on every view. Production never shows these.
DisputedQuantiles recomputed from rows differ from metrics.jsonRed note naming each mismatch.