# Network history How has the devnet changed between observations? Record the public sources in a dated JSON snapshot. Compare block height, accounts, the reported genesis hash and harness claim status across runs. ## Quick start Run from the repository root with Node 22 and pnpm installed: ```sh pnpm install --frozen-lockfile pnpm --filter @flop-lab/recorder build pnpm exec tsx packages/recorder/src/cli.ts analyze --store packages/recorder/test/fixtures/seed ``` ## Record and inspect ```sh node packages/cli/dist/cli.js history record --store ./archive node packages/cli/dist/cli.js history analyze --store ./archive node packages/cli/dist/cli.js history --help ``` Build the suite with `pnpm -r --if-present run build` before using the shared `flop` binary. `flop-recorder verify ` checks a snapshot's content digest. `record --evidence ` also saves the original HTTP responses with their request, source time and duration. These files are for local inspection. The daily archive contains compact snapshots only. ## Importable API ```ts import { recordSnapshot, storeSnapshot, analyze } from "@flop-lab/recorder"; const { snapshot } = await recordSnapshot(); const index = await storeSnapshot("./archive", snapshot); const { series, events } = analyze(index); ``` Each run reads MCP stats, health, a settlement page, the PoUI leaderboard and the trust root. It reads the gateway model list with price sources. Indexer queries read stats, block zero and network value. The schema was introspected before recording the fixtures. The harness runs the fixed `mcp-health`, `price-source-expiry` and `settlement-conservation` claims through its importable runner. It has an eight-request budget. Source reads have a sixteen-request budget. Both include retries. No spending is enabled. The shared transport spaces requests to each host, bounds response size and times out attempts. It retries at most once for retryable failures with backoff. The gateway honors a bounded Retry-After delay on HTTP 429 and 5xx. There is no cross-run source cache. Every run obtains new observations. The public feed uses a five-minute revalidation window. The home panel coalesces fallback requests within that window. Missing, malformed or oversized source data is marked unavailable. It never becomes a zero count. ## Snapshot and archive format Version 1 hashes UTF-8 canonical JSON with SHA-256. Object keys sort recursively. Array order stays fixed. The `id` field is excluded from its own hash. Each source observation carries its request source, measured time, duration, status and value or error. Child fields inherit that observation's source and time. The trust-root digest covers canonical returned JSON. It is distinct from the server's `snapshotHash`. Snapshot JSON is below 100 KB. Raw fixtures are below 200 KB each. A growing source that exceeds its allocation is marked unavailable. Settlement and PoUI samples request at most five rows. The snapshot does not crawl the chain. The local store uses `snapshots/YYYY/MM/DD/