Spaces:
Sleeping
Sleeping
| title: Agent Flight Recorder | |
| emoji: 🏆 | |
| colorFrom: yellow | |
| colorTo: pink | |
| sdk: gradio | |
| sdk_version: 6.2.0 | |
| app_file: app.py | |
| pinned: false | |
| license: other | |
| short_description: Tamper-evident, hash-chained event logging for AI/agent runs | |
| thumbnail: >- | |
| https://cdn-uploads.huggingface.co/production/uploads/685edcb04796127b024b4805/dU9ergQQigecP4D0JYVJY.png | |
| # RFT Agent Flight Recorder — Black Box Trace + Third-Party Verification | |
| A proof-first flight recorder for AI/agent runs. This Space writes an **append-only, hash-chained event log** so you can verify **what happened, when it happened, and what triggered it**—without taking anyone’s word for it. | |
| It’s designed to be boringly audit-friendly: **canonical JSON hashing**, optional **Ed25519 signatures**, **session verification**, and **exportable proof bundles** that third parties can check. | |
| --- | |
| ## Quickstart (recommended) | |
| If you don’t want to guess what to click: | |
| 1. Open **Quickstart (1-click)** | |
| 2. (Optional) tick **Sign everything (Ed25519) + generate fresh keys** | |
| 3. Click **Run Quickstart Demo Now** | |
| That will automatically: | |
| - start a session | |
| - append a realistic event sequence | |
| - verify the chain | |
| - finalise the session (creates an anchor) | |
| - export a ZIP proof bundle | |
| - fan out the `session_id` into the other tabs so you can immediately inspect Timeline / Verify / Export | |
| --- | |
| ## What this Space does | |
| ### ✅ Records a tamper-evident timeline | |
| Each action becomes an **event** (one JSON object per line) written to `flightlog.jsonl`: | |
| - `prompt` | |
| - `output` | |
| - `tool_call` / `tool_result` | |
| - `memory_read` / `memory_write` | |
| - `retrieval` | |
| - `policy_block` | |
| - `error` | |
| - `note` | |
| Every event includes: | |
| - `seq` (monotonic step number) | |
| - `ts_utc` (UTC timestamp) | |
| - `prev_event_hash_sha256` (links to previous event) | |
| - `event_hash_sha256` (hash of this event) | |
| - optional `signature_ed25519` (Ed25519 signature) | |
| If any event is edited, removed, or reordered, verification fails. | |
| ### ✅ Concurrency-safe writes (public Space reality) | |
| Multiple users can click around at the same time. The log uses a **file lock** so “two tabs / two users” don’t corrupt the chain. | |
| ### ✅ Refuses writes after finalisation | |
| Once a session records `session_end`, the recorder **refuses any further writes** to that session. No silent post-hoc edits. | |
| ### ✅ Verifies sessions end-to-end | |
| The verifier recomputes hashes and confirms the chain is intact. Optionally, it can require a valid signature on every event. | |
| ### ✅ Exports proof bundles | |
| Exports `rft_flight_bundle_<session_id>.zip` containing: | |
| - `<session_id>_events.jsonl` (the full session timeline) | |
| - `<session_id>_verify_report.txt` (human-readable verification report) | |
| ### ✅ Imports and verifies third-party bundles | |
| Upload a bundle and verify it locally. Optionally store PASSed events into your local `flightlog.jsonl`. | |
| --- | |
| ## Manual use (step-by-step) | |
| ### 1) Generate keys (optional) | |
| Go to **Keys** → **Generate Keypair**. | |
| - **Private key** signs events (keep it private). | |
| - **Public key** verifies signatures (safe to share). | |
| **Public demo note:** don’t paste production private keys here. | |
| ### 2) Start a session | |
| Go to **Start Session** → **Start New Session**. | |
| Copy the `session_id` (the UI fans it out across tabs). | |
| ### 3) Record events | |
| Go to **Record Event** and append events as they occur. | |
| Payload accepts: | |
| - JSON (recommended) | |
| - plain text (stored under `_text`) | |
| If `parent_event_hash_sha256` is left empty, it defaults to the previous event hash (simple linear causality). | |
| ### 4) View timeline | |
| Go to **Timeline** → **Load timeline**. | |
| ### 5) Verify | |
| Go to **Verify Session** → **Verify**. | |
| Enable **Require signatures** only if you signed every event you expect to verify. | |
| ### 6) Finalise + Export | |
| Go to **Finalise + Export**: | |
| - **Finalise session** appends `session_end` with a **session anchor** | |
| - **Export session bundle** produces the ZIP proof bundle | |
| ### 7) Import bundle (third-party verification) | |
| Go to **Import Bundle**, upload `rft_flight_bundle_*.zip`, and verify. | |
| If you want to retain verified sessions, tick **Store imported events** (only stores on PASS). | |
| --- | |
| ## Data format (high-level) | |
| ### Event (simplified) | |
| ```json | |
| { | |
| "spec": "rft-flight-event-v0", | |
| "ts_utc": "2026-01-08T12:34:56.789+00:00", | |
| "session_id": "…", | |
| "seq": 3, | |
| "event_type": "tool_call", | |
| "parent_event_hash_sha256": "…", | |
| "prev_event_hash_sha256": "…", | |
| "payload": { "tool": "search", "input": { "q": "…" } }, | |
| "meta": { "model_id": "audit-demo", "run_mode": "deterministic" }, | |
| "event_hash_sha256": "…", | |
| "signature_ed25519": "…" | |
| } | |
| Session anchor (what finalisation commits to) | |
| Finalisation creates an anchor that describes the pre-end chain (so it doesn’t depend on itself): | |
| { | |
| "spec": "rft-flight-session-root-v0", | |
| "session_id": "…", | |
| "first_event_hash_sha256": "…", | |
| "last_event_hash_sha256": "…", | |
| "event_count": 42, | |
| "root_hash_sha256": "…", | |
| "signature_ed25519": "…" | |
| } | |
| Brutal tests (included) | |
| This repo includes brutal_test.py with two hard tests: | |
| Two-tab spam test: concurrent writers attempt to append hundreds of events; the session must still verify PASS. | |
| Tamper ZIP test: modifies an exported event payload without updating hashes; import verification must FAIL. | |
| Run locally: | |
| python brutal_test.py | |
| Expected: | |
| both tests PASS | |
| tampered bundle fails verification as intended | |
| Security / limitations (read this) | |
| This Space is a public demo. Treat anything you paste as public. | |
| The log file is shared by all users of the Space instance. | |
| Signatures prove authorship by a key, not “truth”. If you sign lies, you still signed lies—this tool proves integrity and provenance, not honesty. | |
| Files | |
| app.py — Gradio UI | |
| rft_flightrecorder.py — recorder + verification library | |
| brutal_test.py — stress + tamper tests | |
| flightlog.jsonl — append-only log (created at runtime) | |
| LICENCE — licence file | |
| Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference |