route99 benchdocs

Developer documentation.

Everything the bench publishes, where it comes from, and how to read it programmatically. Methodology lives on the method page (generated from the collector, like this one); this page is the developer surface: series, endpoints, storage, repo layout.

1 · The series

seriescadencewhat one record isstorage
edgeevery 30 min (minus borrowed slots) one run: a tick group of the 14-provider panel, one timed quote per (provider × chain) over Ethereum, BSC, Base, Polygon, HyperEVM, Arbitrum, plus untimed dual-engine re-validation KV day:YYYY-MM-DD, index, health
geoevery fourth edge slot one sweep: transport timings (dns/tcp/tls/ttfb/total) for every keyless provider from our 12 Lambda endpoints, one Base quote each KV geo:YYYY-MM-DD, geoindex, geohealth
swapper run (event-scheduled) one round: same-instant delivered-output comparison groups per chain, Base size ladder, 12-datacenter quote consistency; the run publishes its own summary (final: true on the last round) S3 rounds/ (immutable) + KV swapbench (summary)

2 · API

One endpoint, JSON, same-origin on every bench host, cache 300 s:

requestreturns
GET /api/latencythe index: days on record for both KV series, health records (an ok:false with a recent at is a failing run; a stale at — older than 90 min — is a dead cron), and who is unmeasured
?day=YYYY-MM-DDone edge day, exactly as collected: runs with at/tookMs/colo/tick and per-target, per-chain samples (ms, q, sim, sim2, via, err)
?geo=YYYY-MM-DDone geo day: sweeps with per-provider, per-datacenter cells
?window=Nmed/p95 per (provider × chain) over the last N edge days (1..90), error tallies, colo histogram, and sim aggregates (n, reverts, median oq bps, median gas)
?swap=1the swap-benchmark summary as published by its own run: per-chain stats, ladder, consistency, per-round series, and final

Raw responses are the contract; every figure travels with its n. Manual triggers on the collector Worker (never the Pages host): ?run=1[&tick=N] fires an edge run, ?geo=1 a sweep — writes require the trigger, a stray GET cannot mint samples; the swap summary is published by POST ?swap=1, token-gated.

3 · Reading rules that apply everywhere

4 · Repo layout

pathwhat
workers/latency-bench/src/index.jsthe collector: registry (targets, probes, simulators), edge runs, geo sweeps, storage, triggers — the single source of truth every generated page reads
workers/latency-bench/lambda/the 12-datacenter probe fleet (one generic timed fetcher, deployed identically everywhere)
workers/latency-bench/swap-bench/the swap-benchmark orchestrator Lambda: rounds, summary, publish, self-disable, report email
bench/functions/api/latency.jsthe read side (Pages Function)
bench/public/this site: index.html (live cards), swap.html (charts), method.html + docs.html (generated)
bench/gen-method.mjs · bench/gen-docs.mjs · bench/nav.mjs the generators; test/bench.mjs re-renders both pages and the shared nav on every npm test and fails on a byte of drift
The sync guarantee. This page and the method page are rendered from the code they document — collector exports, read-side source, nav module — and the test suite fails when the rendered bytes differ from the committed pages. If you read a cadence, a limit, or an endpoint here, the running system has it.