Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ADR 0028: Ledger Read Tools LR-2

Status: Accepted

Date: 2026-06-18

Context

LR-1 made the durable ledger readable as a signed chain. The next buyer-facing question is not “what happened in every transcript turn,” but “was the contract met, what evidence supports that verdict, and can I take the proof away and verify it offline?”

The existing durable journal already contains the required material: the recorded contract intent, harness-owned check results, optional self_validation evidence, reviewer-panel evidence, the signed verdict entry, hash-chain material, the session signing key id, and any anchor receipts.

Decision

Extend the read-only LedgerReader with two LR-2 views:

  • verdict(<run-id>): renders the recorded verdict bundle for a run.
  • export(<run-id>): emits a portable JSON evidence bundle for offline verification.

Add CLI commands:

  • truss ledger verdict <run-id> with human-readable default output and --json.
  • truss ledger export <run-id> as JSON-native output.

Both commands keep LR-1’s stable schema version, truss.ledger.v1. LR-2 adds new command shapes instead of changing the LR-1 list, show, or get schemas.

JSON Schema

verdict --json:

{
  "schema_version": "truss.ledger.v1",
  "command": "verdict",
  "verdict": {
    "session_id": "...",
    "contract": {
      "id": "...",
      "title": "...",
      "intent": "...",
      "definition_of_done": []
    },
    "evidence": {
      "checks": [],
      "self_validation": [],
      "panel": []
    },
    "recorded_overall": "PASS",
    "overall": "PASS",
    "verdict_entry": {},
    "head_hash": "...",
    "anchor_refs": [],
    "verification": {}
  }
}

export:

{
  "schema_version": "truss.ledger.v1",
  "command": "export",
  "contract": {},
  "evidence": {
    "checks": [],
    "self_validation": [],
    "panel": []
  },
  "verdict": {},
  "ledger": {
    "session_id": "...",
    "pubkey_id": "...",
    "head_hash": "...",
    "verification": {},
    "entries": [
      {
        "seq": 0,
        "kind": "run_started",
        "payload": {},
        "prev_hash": "...",
        "entry_hash": "...",
        "signature": "...",
        "signed": true,
        "verification_status": "verified"
      }
    ],
    "anchor_refs": [],
    "child_sessions": []
  },
  "offline_verification": {
    "algorithm": "sha256(prev_hash || kind || canonical_json(payload) || seq_le)",
    "signature_algorithm": "ed25519",
    "status": "verified"
  }
}

Consequences

The verdict view is a render of already-recorded journal data. It never reruns checks, reconvenes reviewers, or recomputes a verdict. If chain or signature verification fails, the view reports unverified and treats the trusted overall as UNVERIFIABLE while still showing the recorded value as untrusted evidence.

The export bundle is self-contained for offline integrity checks: it carries the signed entries, previous hashes, entry hashes, signatures, session public key id, head hash, anchor references, and recursively included child sessions referenced by child anchors. No storage schema changes or write paths are introduced.

Out of scope remains LR-3/LR-4: recall, ledger verify consolidation, and diffing between runs.