Threat model: verification ledger

Scope: the single-file ledger page at ledger/index.html (served at ainumbers.co/ledger/ and ledger.ainumbers.co). Written from the page and its gates on . All threat models.

Assets

Trust boundaries

Adversaries

In scope and out of scope

In scope: egress beyond the one allowed endpoint; what the page sends when the visitor chooses to anchor or request a signature; browser storage contents; verifier correctness against forged inputs.

Out of scope: a compromised browser; the truth of what a receipt's author claimed; the availability of the anchor service.

Controls

ThreatControlWhere it lives
L2: extra network callGate fails on any fetch(, XMLHttpRequest, WebSocket or EventSource outside the anchor endpointscripts/check-ledger-hermetic.mjs
L2: wider CSPThe ledger CSP permits connect-src https://anchor.ainumbers.co where the standard profile says 'none'; that is the only network allowance in itscripts/check-csp-consistency.mjs, CSP meta tag in ledger/index.html
L1: remote frames, workers, objectsCSP sets frame-src 'none', worker-src 'none', object-src 'none'CSP meta tag in ledger/index.html
Over-sharing on anchorThe anchor call sends the artifact's execution_hash and the chosen authority name; the artifact stays in the tabledger/index.html, the anchor_hash request
Over-sharing on escalationThe signature request sends a record hash, a role, and a short message containing the gate step id and the names of halted steps. That text leaves the browser, so step names should not hold confidential wordingledger/index.html, the create_signature_envelope request
Hammering the relayClient-side cooldown between anchor clicks (a convenience, not a security control); the real limit is server-side_anchorCooldown in ledger/index.html; see anchor model
L4: forged receipt verifiedA separate gate holds verification code to zero network egress; this page makes no claim here about how strong the checks themselves are, which the kernel and parity gates coverscripts/check-verify-no-egress.mjs

What the page keeps in the browser

The page uses localStorage. It keeps a ledger filter choice, a "demo dismissed" flag, and, per escalation request, a pending entry keyed by the record hash. The site-wide rule that tools use no client storage (CONTRACT.md section 1.1) is a rule for tool pages, and the ledger is the documented exception because its interface state has no server to live on. The privacy policy says the site uses no client-side storage for identity or tracking; this list is the full set we know of.

UNTESTABLE claims

Residual risk