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

Ledger Export Consumer

examples/plugin-ledger-consumer.py is a tiny read-only consumer for truss ledger export. It demonstrates the safest plugin class: observe a signed evidence bundle, verify the status, and render a derived view without touching the runtime database.

truss --db harness.db ledger export <run-id> \
  | python3 examples/plugin-ledger-consumer.py --fail-on-unverified
#!/usr/bin/env python3
"""Read a Truss ledger export bundle from stdin and summarize it.

This is intentionally a consumer, not a runtime plugin: it never opens the Truss
SQLite database and never writes journal entries. Feed it:

    truss --db harness.db ledger export <run-id> | python3 examples/plugin-ledger-consumer.py
"""

import argparse
import json
import sys


def status_name(value):
    if isinstance(value, str):
        return value
    if isinstance(value, dict):
        return value.get("status", "unknown")
    return "unknown"


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--fail-on-unverified",
        action="store_true",
        help="exit non-zero when offline verification is not verified",
    )
    args = parser.parse_args()

    bundle = json.load(sys.stdin)
    ledger = bundle.get("ledger", {})
    verdict = bundle.get("verdict", {})
    evidence = bundle.get("evidence", {})
    verification = bundle.get("offline_verification", {})

    status = status_name(verification.get("status"))
    entries = ledger.get("entries", [])
    children = ledger.get("child_sessions", [])
    anchors = ledger.get("anchor_refs", [])

    print(f"schema: {bundle.get('schema_version', 'unknown')}")
    print(f"session: {ledger.get('session_id', 'unknown')}")
    print(f"overall: {verdict.get('overall', 'unknown')}")
    print(f"offline_verification: {status}")
    print(f"entries: {len(entries)}")
    print(f"child_sessions: {len(children)}")
    print(f"anchors: {len(anchors)}")
    print(f"checks: {len(evidence.get('checks', []))}")
    print(f"panel_results: {len(evidence.get('panel', []))}")
    print(f"self_validation: {len(evidence.get('self_validation', []))}")

    if args.fail_on_unverified and status != "verified":
        return 2
    return 0


if __name__ == "__main__":
    raise SystemExit(main())