diff --git a/apps/loopover-ui/content/docs/verify-this-review.mdx b/apps/loopover-ui/content/docs/verify-this-review.mdx index dcef38683..da39dd377 100644 --- a/apps/loopover-ui/content/docs/verify-this-review.mdx +++ b/apps/loopover-ui/content/docs/verify-this-review.mdx @@ -89,18 +89,62 @@ Your replayed `confirmed / decided` for a rule should match the published precis window; the freeze-point checksum ties the published numbers to the exact corpus you just verified. +## 5. Verify an attested run (when a run carries one) + + + **Placeholder pending real hardware.** No production run carries a real attestation envelope + yet — that needs genuine AMD SEV-SNP hardware, tracked as + [#8535](https://github.com/JSONbored/loopover/issues/8535)–[#8537](https://github.com/JSONbored/loopover/issues/8537). + Every command below is exactly what you will run once one exists; the software side (the harness, + the offline verifier, the deploy manifests) is already built and merged. Until then, exercise the + same verification mechanics against the project's own synthetic test fixtures — see + `scripts/verify-attested-run/README.md` — never against a real-looking file you were simply + handed, since that would defeat the entire point of this being independently checkable. + + +Replay (above) proves the *numbers*. Attestation is a second, additional path for a run that also +carries an `AttestationEnvelope` — it proves the *computation that produced those numbers ran +inside genuine, hardware-encrypted memory*, verifiable without contacting LoopOver at all: + +```bash +npx tsx scripts/verify-attested-run.ts \ + --envelope envelope.json --expected expected.json \ + --vcek-cert vcek.pem --product milan +``` + +- **`envelope.json`** — the published `AttestationEnvelope`: `measurement`, `reportData`, `runId`, + the base64 `attestationReport`, and its own `verification` status. +- **`expected.json`** — *your own* pinned expectations: `{ "measurement": "", "corpusChecksum": + "", "headSha": "", "baseSha": "" }` — the same checksum and SHAs from the replay + steps above, so both verification paths are checking the same underlying run. +- **`--vcek-cert`** — the chip's certificate; the tool defaults to this repo's own vendored AMD root + chain, or fetches live from AMD's KDS with `--fetch-vcek`. + +Under the hood, the tool recomputes `reportData` itself — `buildAttestationReportData({ +corpusChecksum, headSha, baseSha, runId })` — and checks it against the report's own user-data +binding, then walks the real certificate chain (ARK → ASK → VCEK, each a genuine X.509 signature +check) and verifies the report's own ECDSA-P384-SHA384 signature against it. Exit `0` means +verified; codes `1`–`8` each name a distinct, specific failure (see the script's own README for the +full table); `9` is a usage/IO error. + ## What this proves — and what it does not **Proved:** the published scores are real computations over a real, checksummed, replayable corpus — not hand-entered numbers. Anyone can independently reproduce them from the snapshot. - - **Not proved:** that the live gate *ran this exact code* when it made its decisions. Verifying - the runtime itself is an attestation problem — a trusted-execution boundary, not a replay - boundary — and is tracked as its own explicitly-scoped decision in + **When a run also carries an attestation envelope**, verifying it (above) additionally proves that + exact computation ran inside genuine hardware-encrypted memory — a stronger, separate claim from + reproducibility, checkable with zero contact with LoopOver. + + **Not proved, either way:** that the live gate *ran this exact code* when it made its decisions. + Attestation (like replay) only ever covers the *offline backtest replay*, never the live + merge/close path — see the permanent-scope callout below. And attestation specifically proves + *computation*, never *data provenance*: a genuinely attested run over dishonestly-recorded + human-override history is still dishonest history, honestly computed. Closing that gap is tracked + as its own explicitly-scoped question in [#8136](https://github.com/JSONbored/loopover/issues/8136) and [#8137](https://github.com/JSONbored/loopover/issues/8137). This walkthrough is honest about - stopping at the reproducibility line rather than implying the stronger guarantee. + stopping at what each path actually proves rather than implying a stronger guarantee. **Live decision execution is permanently out of scope for attestation, by decision.** The attested-evaluation epic ([#8534](https://github.com/JSONbored/loopover/issues/8534)) attests the