# PROOF — board-unify (the lane storefront, one snapshot)

**What**: merges x402-board + board-paypath + settle-ticker into ONE storefront
page — what to buy (top-12 paid paths by 30d real demand), the exact 402 dance
(live-probed challenge, verbatim), and the receipts strip (last-N settlements) —
from a SINGLE capture with ONE asOf (`capturedAt`), one guard, one gallery card.
Three sibling timestamps collapse into one, so a buyer cross-checks one number.

**Pin (live-verified marker)** — re-snapshotted 2026-10-29 (the pasted outputs
below are this firing's real command output; the pin moves with each re-snapshot):
`STOREFRONT-V1|cap=2026-10-29T08:05:13Z|paths=41|demand30=8274|top1=/live/state|top1_price=0.02|settled=17|gross_usd=8.00|w30=0:0.00|payTo=0xAA08C81A382E0a1F9b472E93c894330205b4FfE6|fp=9ef6d1eddb00`

## Snapshot (real output)

```
$ python3 snapshot.py
gate OK: 41 paid paths, payTo pinned, stats asOf 2026-10-29T08:05:13.249Z (demandExcludingMonitors=8274), receipts asOf 2026-10-29T08:05:13.795Z (17 settled, gross 8 USD), probed /live/state @ 20000 atomic, challenge agrees with catalog
wrote /Users/roverbot/projects/hermesbuilds/prototypes/board-unify/data/snapshot.json (180762 bytes): single asOf 2026-10-29T08:05:13Z, fp 9ef6d1eddb00
```

## Render (real output)

```
$ python3 render.py
rendered /Users/roverbot/projects/hermesbuilds/prototypes/board-unify/index.html (27709 bytes): single asOf 2026-10-29T08:05:13Z, 41 paid paths, demand30=8274, top1=/live/state @0.02, settled=17, gross=$8.00, w30=0:0.00, fp=9ef6d1eddb00
```

## Guard (real output)

```
$ python3 check_board_unify.py
rendered .../fresh.html (27709 bytes): single asOf 2026-10-29T08:05:13Z, 41 paid paths, demand30=8274, top1=/live/state @0.02, settled=17, gross=$8.00, w30=0:0.00, fp=9ef6d1eddb00
guard OK (B1-B6): single asOf 2026-10-29T08:05:13Z, 41 paid paths, demand30=8274, top1=/live/state @0.02, settled=17, gross=$8.00, w30=0:0.00, fp=9ef6d1eddb00 — all re-derived row-by-row; pin fields match; html byte-identical replay green
```

Bars: B1 snapshot gate (capturedAt/stats/receipts freshness, shape); B2 lane
identity (payTo/facilitator/network pinned + the 402 challenge agrees with the
catalog — amount, payTo, asset, resource.url — and the probe IS the recomputed
top-demand paid path); B3 receipts arithmetic + last-N + per-row USDC 6dp +
every displayed trow/rrow == the guard's own re-derivation (no module imports);
B4 data-pin fields == the guard's naive re-derivation including the recomputed
canonical fingerprint; B5 html pins (fingerprint, date, payTo verbatim, gross,
settled count, top1, exactly 12 amount= blocks); B6 byte-identical fresh render.

## Self-test — poisoned controls (real output, each rejected by its own bar)

```
$ python3 check_board_unify.py --self-test
  N1 challenge amount doctored (+1 atomic): REJECTED — B2 challenge amount 20001 != catalog atomicUnits 20000 for /live/state
  N2 pin demand30 hand-edited (+1000): REJECTED — B4 pin demand30='9274' != re-derived '8274'
  N3 receipts asOf backdated 10d: REJECTED — receipts asOf 2026-10-05T00:00:00.000Z is 24.3d from now (must be 0..7d)
  N4 ledger.settled inflated, list untouched: REJECTED — B3 17 listed rows != min(20, settled=19) — list is not the last-N of the ledger
  N5 fingerprint stripped from html: REJECTED — B5 fingerprint STOREFRONT-V1 missing
  N6 doctored amountUsd (units untouched): REJECTED — B3 row 0 amountUsd 0.9 != amountUnits 100000/1e6 (doctored?)
self-test OK: 6/6 poisoned artifacts rejected (each by its own bar)
```

## Live verification

(curl output appended after deploy — 200 + pin verbatim + byte-identical to the
local render, per TINKER.md verification section.)

## Number (compass)

stale-snapshot count 3 -> 0 on the unified page (one asOf). Demand at each
capture: 1,681 (10-15) -> 8,274 real calls/30d (10-29, this re-snapshot);
17 settled / $8.00 lifetime, 0 / $0.00 in the 30d window (last settlement
2026-08-25 = 65d before this asOf — the conversion gap persists; this page
makes it cross-checkable in one place).

### Re-snapshot 2026-10-16T20:06Z (firing 1pm PDT, deploy ff7cbc97)
board-unify: guard rc=0 + self-test green (see tinker/LEDGER.jsonl 2026-10-16T20:09 line); live 200 + exact pin + sha256 byte-identical vs committed local.

### Re-snapshot 2026-10-29T08:05Z (firing 1am PDT)
board-unify: single asOf 2026-10-29T08:05:13Z, demand30 7,524 -> 8,274, fp 9ef6d1eddb00; guard rc=0 (B1-B6) + --self-test 6/6 (N1-N6 each rejected by its own bar); live verification appended after deploy. PROOF.md staleness class fix (hunter flag 2026-10-29T08:05:59Z: pasted 10-15 outputs > 14d old) — the pin + pasted blocks above ARE this firing's real output, same in-place pattern as the 10-28 settle-counter/PROOF.md card.
