MOGOS · verification UX demo Receipt-anchored No private trust required

The receipt anchors the pixels, not just the metadata.

A RELOS receipt proposes a Decision. Its payload.surface.surface_hash field declares which exact rendered UI surface the operator will see at decision time. Anyone — your browser, right now — can hash the rendered PNG and check whether it matches. A rogue agent that ships a different surface is detectable.

The receipt

RELOS Receipt Core Profile v0.1 — schema-valid against the spec's own ajv-cli@5 validator.

id
rcp_019e38fa0bc675c7ae2ab642e8b6facd
payload.surface.surface_hash (the anchor — sha256 of the canonical rendered PNG)
4143980f5dccbb9fad5441469f1f85fcb660836a8019d8179112e722732e1f9f
payload.surface.renderer
telas-render@0.1.0 software backend · viewport 1440 × 1400
Full RELOS receipt JSON
loading…

Verify in your browser

Your browser fetches both rendered PNGs, computes sha256 client-side via crypto.subtle, and compares against the receipt's anchor. No server-side trust.

Canonical checking…

What the operator actually saw at decision time.

Canonical operator approval surface
sha256 (computed in your browser)
pending…
awaiting verification…

Adversarial checking…

Same claimed evidence_refs. Different composition. A rogue agent's drift.

Adversarial composition that hides the destructive Reject and softens risk
sha256 (computed in your browser)
pending…
awaiting verification…

What's different in the adversarial version

  • Top-row badge swapped from Reversible · Expires UTC to Routine merge (green success tone).
  • Blast radius subtitle softened from Medium · kernel + TUI to Low · kernel module.
  • New fake Risk: low / safe badge added to Blast radius card.
  • Destructive Reject button hidden behind a ghost Other options affordance.
  • Body description softened from feature name to Small compositor improvement.

Each individual change is plausible in isolation. Stacked, they nudge the operator toward Approve. The sha256 catches the whole composition deterministically — no human review needed.

Composite verdict surface

The MOGOS substrate explaining its own claim: this PNG was rendered by TELAS and embeds the two surfaces above with their sha256s and match/mismatch verdicts. Determinism is what makes that recursion well-defined.

Composite verdict surface rendered by TELAS

The chain is closed

The proposal receipt is now sealed with real RELOS hashes — content_hash via JCS+SHA-256, chain_hash via sha256(content_hash) as genesis. A second receipt of kind grandos.decision.decided.v1 records the operator's choice (Approve and merge) and chains via prev_chain_hash. Verification follows the spec's normative order (content_hash → prev_chain_hash → chain_hash).

Proposal receipt (genesis)
rcp_019e38fa0bc675c7ae2ab642e8b6facd · chain_hash = 4947b8f067c90bdcb14bde3412c3d8819efa1452759289478c4b32ce405fe706
Decision receipt (chained, sealed)
rcp_019e38fa0bd07e1c8b15ab742f9ec06e · prev_chain_hash = 4947b8f0…fe706 · chain_hash = 4e3ef63b12c2dd3157541ceeb21fd7e5526c32230033b4fa51588fc519716fdd

Both receipts pass ajv-cli@5 schema validation against relos-core/json-schema/receipt.json. The chain itself is verified in eval.py's new chain_continuity P0 metric — any byte-level edit to either receipt would break the chain and fail the gate.

Download proposal receipt JSON · Download decision receipt JSON

Forward arrow: agent intent → verified UI → sealed receipt

The canonical render above was hand-authored as a fixture. The forward arrow is harder: an agent declares an IntentPlan (what it wants the operator to decide); the VASSA compiler turns it into a verified UiPlan deterministically; TELAS renders the pixels; the sha256 gets sealed into the receipt's payload.surface.surface_hash. Below is the substrate's actual output from vassa compile-intent piped into telas-cli render — no hand-authoring.

Compiled from IntentPlan substrate output, not hand-authored

VASSA Dashboard archetype, not yet tuned for decision surfaces — useful as evidence the pipeline closes, not as design target.

UiPlan compiled from an IntentPlan by VASSA, rendered by TELAS
python3 00-CORE/vassa/examples/verification-loop/scripts/compile_intent.py
# IntentPlan (fixtures/intent-plan.json)
#   → vassa compile-intent → CompileOutput { plan, receipts: 2 }
#   → strip pack-namespace + Text variant aliases (interop adapter; see WO-09)
#   → TELAS-consumable UiPlan
# Then: cargo run -p telas-cli -- render approval-mvp-from-intent.json --output approval-mvp-from-intent.png

Honest gap: The compiled UiPlan visibly differs from the canonical (light theme, Stat overlap, no Grid layout). VASSA's Dashboard archetype produces a real UiPlan but not an operator-grade decision surface yet. The interop adapter strips namespacing (essentials.StatStat) and Text variant aliases (h2heading2). These are real cross-system canonicalization gaps — filed as WO-09.

Run the verifier yourself, offline

A 150-line Python script reads the anchor from the receipt and re-runs the proof against fresh renders.

git clone https://github.com/mogos-collective/universe   # not public yet
cd universe
bash 00-CORE/vassa/examples/verification-loop/run.sh
python3 00-CORE/vassa/examples/verification-loop/scripts/replay.py
# Expected verdict: 3/3 PASS
#   ✓ canonical render matches receipt anchor
#   ✓ TELAS replay is deterministic
#   ✓ adversarial drift detected