SENTINEL
Glass Ledger

Do not trust us. Verify the receipts.

Public receipt-tier records live in an operationally append-only, SHA-256 hash-chained ledger, red rows included. It contains a mixed population: some registration events were appended strictly before their stored resolution timestamp, while older rows were harvested after resolution. Editing a hash-covered field, or deleting, inserting, or reordering an event, without recomputing the following chain breaks the hash check. The legacy top-level ts field is not hash-covered, and internal consistency does not make a later historical harvest forward proof.

Public boundary

Glass Ledger currently covers CORE receipt tiers sweet and liqsqueeze, plus Research Lab super public receipts when applicable. Historical alpha receipts may remain verifiable when they were public, but alpha is paused and not live delivery. That is intentionally broader than the CORE-only public signals API while still excluding admin, private, shadow, trap, wallet, subscriber, and non-public signal data.

Anchor boundary

Each event hash covers prevHash, seq, eventType, predictionId, the canonical payload, and createdAtMs. The public legacy top-level ts field is context only and is outside the hash; a registered event's firedAtMs is covered only where it appears inside the payload. “Appended before” compares the earliest registration createdAtMs with the earliest resolved payload's numeric resolvedAtMs. The API's OpenTimestamps state is server-reported. Only an independently verified external anchor can establish that a chain head existed no later than its attested time. Internal fields alone do not prove when the outcome became known.

Verify it yourself

  1. Pull the raw ledger: https://sentinelresearch.app/api/ledger/verify
  2. Download the zero-dependency checker: verify.mjs
  3. Run it against the live API:
curl -s https://sentinelresearch.app/verify.mjs -o verify.mjs
node verify.mjs https://sentinelresearch.app
# → "N events, current chain internally consistent. Head: <hash>"

The script freezes the first-page head, requests every later page through that exact sequence, validates canonical event envelopes, re-derives each covered hash, and recomputes event counts and timing classes using only Node built-ins. V1 uses an untyped pipe-delimited hash material. The writer escapes future payload pipes as JSON \u007c without changing their parsed value or existing pipe-free hashes; the strict verifier rejects a served literal pipe. A future version needs a typed canonical tuple or length-prefixed fields without rewriting V1 history. It does not hash the legacy top-level ts field, verify an external timestamp, or exclude coordinated same-server recomputation or truncation. A verifier cached before this snapshot protocol may use the clearly labelled rolling legacy API mode and can race a live append; refresh /verify.mjs before relying on the current checks.

Counts and receipts only. Info only. Not financial advice. · See losses · Public receipts