proof-aware-crypto-tooling-.../docs/cockpit.md

168 lines
10 KiB
Markdown
Raw Permalink Normal View History

cockpit: the bridge — six role stations, the crew law, live liveness Operator verdict on round two: better, but 'still no coherent application'. The cockpit must provide everything a human crew would need if no AI were around — as distinct roles that cooperate through handoffs and never melt into each other. This rebuilds the IA as a bridge with six stations over shared instruments, in the control-room tradition (overview -> station -> instrument -> raw files/CLI), with maker-checker separation of duties encoded in the UI itself. - / is now the Bridge: whole-system verdict strip, six crew cards with live data, and the dispatch (andon) board 'if this happens, who acts' - /station/{proposer,quorum,operator,cryptographer,architect,newcomer}: each console has a fixed anatomy: Mission -> Duties (every duty a runnable, verified-real CLI command - the no-AI drill) -> embedded live instruments -> 'This station never...' (separation of duties) -> Handoffs (receives/delivers) - Operator gets a real liveness board: on-demand parallel probes (HTTP GET on log head/paper/blog/mirror with observed facts + latency; git HEAD/cleanliness on all 9 local repos). Never probes on ordinary page loads. Verified live: caught this very repo as 'alive, dirty' while building it, and confirmed log 13/3488a2d0 + paper 7f140356 - Architect gets the live drift tripwire (ESTATE.md vs estate view) - modularized per the standing separation-of-concerns order: uikit.py (primitives+style), stations.py (role model, pure), liveness.py (probes), walletui.py (collectors, instruments, routes) - crew law test-enforced: bridge crew+dispatch, per-station role contract, station distinctness (signature phrases must not bleed across roles), explicit-probe semantics; read-only byte sweep now covers all 13 routes incl. the probe route - narrow-viewport fix: breakany for unbreakable paths in headings Suite 135 -> 139 green. Read-only guarantee unchanged: no mutating routes; every custody act is a printed command, never a button. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 14:47:43 +00:00
# The custody cockpit — a bridge for the human crew
warden cockpit: local read-only custody UI for the human operator Operator-ordered milestone, built under an explicit no-risk constraint while the paper application is in flight: strictly ADDITIVE (one new module + one CLI subcommand; zero changes to wallet semantics, the public site, or anything the paper describes), LOCAL-ONLY (never deployed; binds 127.0.0.1), and READ-ONLY in v1 (human approve/deny is deliberately deferred — that is a custody-semantics change belonging to a separately reviewed milestone). New: src/pacta/walletui.py — four views over an existing wallet: - Posture: latch state, ledger head with FULL hash-chain re-verification, pinned quorum members, spending policy verbatim. - Signature queue: airgap outbox/inbox, observed never operated. - Incidents & refusals: verbatim records, newest first. - Receipt inspector: paste attestation + receipt + log key; verdict, per-signature results, and diagnostics come verbatim from transparency.verify_receipt — the deployed verifier itself, reused not reimplemented. Design law, stated in the module and enforced by tests: THE COCKPIT RENDERS EVIDENCE, IT NEVER ASSERTS IT. Every panel recomputes at request time and carries a provenance line (function + timestamp); anything unverifiable renders a loud FAILED-TO-VERIFY panel — no cached green, no neutral gray. Panels state what they do NOT prove (e.g. binary pinning vs source-to-binary correspondence). CLI: pacta wallet cockpit --wallet DIR [--host --port]. Tests (10 new, suite 118 -> 128 green): recomputed-evidence rendering, CHAIN BROKEN on tampered ledger, loud failure on collector error, latched-state rendering, airgap queue states, verbatim incident/refusal rendering, fail-closed inspector on garbage, real-evidence roundtrip (skips if example evidence absent), full-sweep BYTE-LEVEL read-only guarantee (wallet dir hash-identical after all GETs + a POST), and fail-fast on non-wallet dirs. Rendering additionally verified visually against a live demo wallet (posture, quorum table, incidents). Docs: docs/cockpit.md; WALLET.md section; ESTATE.md + llms.txt updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 16:02:17 +00:00
`pacta wallet cockpit --wallet <dir>` serves a local web UI
(default `http://127.0.0.1:8471`) over an existing warden wallet.
warden has always been agent-native (MCP) and CLI-native; the cockpit is
cockpit: the bridge — six role stations, the crew law, live liveness Operator verdict on round two: better, but 'still no coherent application'. The cockpit must provide everything a human crew would need if no AI were around — as distinct roles that cooperate through handoffs and never melt into each other. This rebuilds the IA as a bridge with six stations over shared instruments, in the control-room tradition (overview -> station -> instrument -> raw files/CLI), with maker-checker separation of duties encoded in the UI itself. - / is now the Bridge: whole-system verdict strip, six crew cards with live data, and the dispatch (andon) board 'if this happens, who acts' - /station/{proposer,quorum,operator,cryptographer,architect,newcomer}: each console has a fixed anatomy: Mission -> Duties (every duty a runnable, verified-real CLI command - the no-AI drill) -> embedded live instruments -> 'This station never...' (separation of duties) -> Handoffs (receives/delivers) - Operator gets a real liveness board: on-demand parallel probes (HTTP GET on log head/paper/blog/mirror with observed facts + latency; git HEAD/cleanliness on all 9 local repos). Never probes on ordinary page loads. Verified live: caught this very repo as 'alive, dirty' while building it, and confirmed log 13/3488a2d0 + paper 7f140356 - Architect gets the live drift tripwire (ESTATE.md vs estate view) - modularized per the standing separation-of-concerns order: uikit.py (primitives+style), stations.py (role model, pure), liveness.py (probes), walletui.py (collectors, instruments, routes) - crew law test-enforced: bridge crew+dispatch, per-station role contract, station distinctness (signature phrases must not bleed across roles), explicit-probe semantics; read-only byte sweep now covers all 13 routes incl. the probe route - narrow-viewport fix: breakany for unbreakable paths in headings Suite 135 -> 139 green. Read-only guarantee unchanged: no mutating routes; every custody act is a printed command, never a button. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 14:47:43 +00:00
the third surface — for the humans who ultimately answer for the money.
It is organized as a **bridge with six role stations** over shared
evidence instruments, in the control-room tradition (overview → station
→ instrument → raw files/CLI): the cockpit provides everything a human
crew would need to run this estate **if no AI were around**.
warden cockpit: local read-only custody UI for the human operator Operator-ordered milestone, built under an explicit no-risk constraint while the paper application is in flight: strictly ADDITIVE (one new module + one CLI subcommand; zero changes to wallet semantics, the public site, or anything the paper describes), LOCAL-ONLY (never deployed; binds 127.0.0.1), and READ-ONLY in v1 (human approve/deny is deliberately deferred — that is a custody-semantics change belonging to a separately reviewed milestone). New: src/pacta/walletui.py — four views over an existing wallet: - Posture: latch state, ledger head with FULL hash-chain re-verification, pinned quorum members, spending policy verbatim. - Signature queue: airgap outbox/inbox, observed never operated. - Incidents & refusals: verbatim records, newest first. - Receipt inspector: paste attestation + receipt + log key; verdict, per-signature results, and diagnostics come verbatim from transparency.verify_receipt — the deployed verifier itself, reused not reimplemented. Design law, stated in the module and enforced by tests: THE COCKPIT RENDERS EVIDENCE, IT NEVER ASSERTS IT. Every panel recomputes at request time and carries a provenance line (function + timestamp); anything unverifiable renders a loud FAILED-TO-VERIFY panel — no cached green, no neutral gray. Panels state what they do NOT prove (e.g. binary pinning vs source-to-binary correspondence). CLI: pacta wallet cockpit --wallet DIR [--host --port]. Tests (10 new, suite 118 -> 128 green): recomputed-evidence rendering, CHAIN BROKEN on tampered ledger, loud failure on collector error, latched-state rendering, airgap queue states, verbatim incident/refusal rendering, fail-closed inspector on garbage, real-evidence roundtrip (skips if example evidence absent), full-sweep BYTE-LEVEL read-only guarantee (wallet dir hash-identical after all GETs + a POST), and fail-fast on non-wallet dirs. Rendering additionally verified visually against a live demo wallet (posture, quorum table, incidents). Docs: docs/cockpit.md; WALLET.md section; ESTATE.md + llms.txt updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 16:02:17 +00:00
## The design law
**The cockpit renders evidence; it never asserts it.** Every panel is
recomputed at request time by the same functions the wallet itself uses
(`Wallet.posture()`, `Wallet.verify_ledger()`, directory listings,
`transparency.verify_receipt`), and every panel carries a provenance
line naming the function and the timestamp. Anything that cannot be
recomputed renders as a loud red FAILED-TO-VERIFY panel. There is no
cached green and no neutral gray — a cockpit that shows unverified green
lights would be the anti-warden.
## The UX law (the design law's twin)
**The cockpit never leaves a human in the dark.** A person who has never
heard of warden must be able to read every screen. Concretely, every
page is built from the same anatomy, top to bottom:
1. **Verdict in words** — e.g. CUSTODY HEALTHY / CUSTODY FROZEN
(LATCHED) / CUSTODY EVIDENCE BROKEN — before any evidence, with one
sentence saying what that means and what to do.
2. **A plain-language lead** stating what the page shows and what it
cannot do.
3. **Panels that explain themselves**: each opens with a plain sentence,
carries a "How to read this panel" expander interpreting every column
and every pill, and links each jargon term to the glossary via a
small `?`.
4. **Explained empty states** — an empty list says what empty means and
whether it is good news (for incidents, it is).
5. **The provenance line** — the dashed footer naming the exact function
and timestamp that recomputed the panel.
cockpit: the bridge — six role stations, the crew law, live liveness Operator verdict on round two: better, but 'still no coherent application'. The cockpit must provide everything a human crew would need if no AI were around — as distinct roles that cooperate through handoffs and never melt into each other. This rebuilds the IA as a bridge with six stations over shared instruments, in the control-room tradition (overview -> station -> instrument -> raw files/CLI), with maker-checker separation of duties encoded in the UI itself. - / is now the Bridge: whole-system verdict strip, six crew cards with live data, and the dispatch (andon) board 'if this happens, who acts' - /station/{proposer,quorum,operator,cryptographer,architect,newcomer}: each console has a fixed anatomy: Mission -> Duties (every duty a runnable, verified-real CLI command - the no-AI drill) -> embedded live instruments -> 'This station never...' (separation of duties) -> Handoffs (receives/delivers) - Operator gets a real liveness board: on-demand parallel probes (HTTP GET on log head/paper/blog/mirror with observed facts + latency; git HEAD/cleanliness on all 9 local repos). Never probes on ordinary page loads. Verified live: caught this very repo as 'alive, dirty' while building it, and confirmed log 13/3488a2d0 + paper 7f140356 - Architect gets the live drift tripwire (ESTATE.md vs estate view) - modularized per the standing separation-of-concerns order: uikit.py (primitives+style), stations.py (role model, pure), liveness.py (probes), walletui.py (collectors, instruments, routes) - crew law test-enforced: bridge crew+dispatch, per-station role contract, station distinctness (signature phrases must not bleed across roles), explicit-probe semantics; read-only byte sweep now covers all 13 routes incl. the probe route - narrow-viewport fix: breakany for unbreakable paths in headings Suite 135 -> 139 green. Read-only guarantee unchanged: no mutating routes; every custody act is a printed command, never a button. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 14:47:43 +00:00
The `/guide` view is the manual: what warden is, the crew model, how to
read any page, the color code, a five-minute tour, a glossary of every
term (capsule, member, pinning, evidence grades R0R5, ledger, latch,
incident, refusal receipt, air-gap, attestation/receipt, provenance,
station, DEMO), and an honest "what this cockpit cannot tell you"
section. Navigation tabs state the question each view answers. This
contract is enforced by tests (`test_guide_view_explains_every_term`,
`test_every_view_carries_lead_nav_and_explainers`,
`test_empty_states_are_explained`).
cockpit: the bridge — six role stations, the crew law, live liveness Operator verdict on round two: better, but 'still no coherent application'. The cockpit must provide everything a human crew would need if no AI were around — as distinct roles that cooperate through handoffs and never melt into each other. This rebuilds the IA as a bridge with six stations over shared instruments, in the control-room tradition (overview -> station -> instrument -> raw files/CLI), with maker-checker separation of duties encoded in the UI itself. - / is now the Bridge: whole-system verdict strip, six crew cards with live data, and the dispatch (andon) board 'if this happens, who acts' - /station/{proposer,quorum,operator,cryptographer,architect,newcomer}: each console has a fixed anatomy: Mission -> Duties (every duty a runnable, verified-real CLI command - the no-AI drill) -> embedded live instruments -> 'This station never...' (separation of duties) -> Handoffs (receives/delivers) - Operator gets a real liveness board: on-demand parallel probes (HTTP GET on log head/paper/blog/mirror with observed facts + latency; git HEAD/cleanliness on all 9 local repos). Never probes on ordinary page loads. Verified live: caught this very repo as 'alive, dirty' while building it, and confirmed log 13/3488a2d0 + paper 7f140356 - Architect gets the live drift tripwire (ESTATE.md vs estate view) - modularized per the standing separation-of-concerns order: uikit.py (primitives+style), stations.py (role model, pure), liveness.py (probes), walletui.py (collectors, instruments, routes) - crew law test-enforced: bridge crew+dispatch, per-station role contract, station distinctness (signature phrases must not bleed across roles), explicit-probe semantics; read-only byte sweep now covers all 13 routes incl. the probe route - narrow-viewport fix: breakany for unbreakable paths in headings Suite 135 -> 139 green. Read-only guarantee unchanged: no mutating routes; every custody act is a printed command, never a button. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 14:47:43 +00:00
## The crew law (roles, not a blur)
**The crew is a team of distinct roles.** Running the estate takes six
roles; in production one financial agent can play every one of them —
but the roles stay separate, cooperate through explicit handoffs, and
never melt into each other. Separation of duties is a custody control:
the one who proposes never approves, the one who verifies never
proposes, the one who watches never overrides the bench.
The **Bridge** (`/`) is the Level-1 overview: the whole-system verdict
strip (custody verdict in words + quorum/ledger/incident/queue chips),
the six crew cards with live data, and the dispatch (andon) board — "if
this happens, who acts". Each **station** (`/station/<id>`) is one
role's console with a fixed anatomy: *Mission**Duties* (every duty a
runnable command — the no-AI drill) → live embedded instruments →
*"This station never…"* (the separation-of-duties list) → *Handoffs*
(receives ← / delivers →).
| station | question | live instruments on the console |
|---|---|---|
| **Proposer** (`/station/proposer`) | I need something signed — how do I ask, and what do I do with the answer? | the Queue |
| **Quorum bench** (`/station/quorum`) | Would I stake custody on this evidence? Four seats, one answer each. | the live bench roster (capsule members) |
| **Operator** (`/station/operator`) | Is everything that should be running, running — and is custody unfrozen? | the **liveness board** (on-demand probes of every public service + every local repo), latch, recorded history |
| **Cryptographer** (`/station/cryptographer`) | Does the evidence really prove what it claims — no more, no less? | the Inspect verifier |
| **Architect** (`/station/architect`) | Does the map still match the territory? | the live **drift tripwire** (ESTATE.md vs estate view) |
| **Newcomer** (`/station/newcomer`) | What is all this? Where do I start? | the first-hour checklist |
The liveness board probes **only when the operator presses «Probe
now»** — the cockpit never phones home on an ordinary page load. Probes
are read-only observations (HTTP GET on the public services, `git
rev-parse`/`status` on local checkouts) and report observed facts with
latency; liveness is pulses, not honesty — honesty is the
Cryptographer's replay.
The crew law is test-enforced: `test_bridge_shows_crew_and_dispatch`,
`test_every_station_defines_role_contract` (mission/duties/commands/
never-list/handoffs on all six), `test_stations_are_distinct_roles`
(each role's signature phrase appears on its own station and on no
other — no melting), `test_operator_probe_is_explicit_and_live`.
cockpit: the deck — tmux-style pane grid + the color-camouflaged wizard Operator asked for a tmux-type panes grid in the browser (one pane per role, all acting in parallel, like real life) with a wizard on the right that takes a newcomer by the hand through every role's actions, each instruction camouflaged in that role's color. - /deck: CSS-grid of six live panes (2-col, 3-col on wide screens), one per station, each an iframe onto /station/<id>?pane=1. tmux controls per pane: reload, single-pane zoom, open-full. Narrow screens: wizard first, panes stacked. - pane mode (?pane=1): chrome-stripped shell (no h1/banner/nav), same station content, READ-ONLY label kept; an 8-line shim re-carries pane=1 on every same-origin link and form submit, so probes, incident browsing, and inspect verdicts all happen inside the pane. - the wizard: a 10-step guided first watch across all six roles on the live demo wallet. Each step card wears the role's hue with a 'YOU ARE THE <ROLE>' chip, the matching pane glows, and every step states what success looks like + what was just learned. Step remembered per session (sessionStorage). - /inspect?sample=1 pre-fills examples/wallet-evidence so the cryptographer step verifies (then deliberately breaks) real evidence. - verified in a real browser: step navigation moves the glow, panes load their stations, Probe-now inside the pane probed live inside the pane (log head tree_size 13), sample flow prefilled the key in-pane. Suite 139 -> 142 green. Read-only guarantee unchanged; byte sweep covers /deck and pane routes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 15:04:23 +00:00
## The deck (`/deck`) — all roles live, in parallel, with the wizard
The **deck** is the crew law made physical: a tmux-style grid of six
panes, one per role, all live at the same time — because a real crew
works in parallel, roles do not take turns existing. Each pane is an
independent viewport (an iframe onto that role's station in
chrome-stripped **pane mode**, `?pane=1`): it scrolls, reloads (⟳), and
zooms (⤢, tmux-style single-pane zoom) independently, and a tiny shim
keeps every link and form inside the pane (`pane=1` is re-carried), so
pressing «Probe now» in the operator pane runs the probe *in that pane*.
Pane mode strips the page chrome but keeps the READ-ONLY label and the
full station content — one source of truth, two shells.
On the right rides the **wizard**: a ten-step guided first watch that
takes a newcomer by the hand through every role's real actions on the
live demo wallet — probe as the operator, read the queue and a refusal
as the proposer, find the dissenting seat as the bench, verify (and then
deliberately break) real sample evidence as the cryptographer
(`/inspect?sample=1` pre-fills `examples/wallet-evidence/`), check the
drift tripwire as the architect, then run the handoff lap. Each step
card is **camouflaged in the color of the role being lived** ("YOU ARE
THE OPERATOR"), and the matching pane **glows** — instruction and
instrument are bound by hue. Every step states what success looks like
and what was just learned. Step position is remembered per browser
session.
Deck contract tests: `test_deck_serves_all_panes_and_wizard` (six live
panes + all six roles visited by the wizard + success criteria),
`test_pane_mode_is_chromeless_but_labeled` (no chrome, READ-ONLY label,
stay-in-pane shim), `test_inspect_sample_prefill`; the read-only byte
sweep covers `/deck` and pane routes.
warden cockpit: local read-only custody UI for the human operator Operator-ordered milestone, built under an explicit no-risk constraint while the paper application is in flight: strictly ADDITIVE (one new module + one CLI subcommand; zero changes to wallet semantics, the public site, or anything the paper describes), LOCAL-ONLY (never deployed; binds 127.0.0.1), and READ-ONLY in v1 (human approve/deny is deliberately deferred — that is a custody-semantics change belonging to a separately reviewed milestone). New: src/pacta/walletui.py — four views over an existing wallet: - Posture: latch state, ledger head with FULL hash-chain re-verification, pinned quorum members, spending policy verbatim. - Signature queue: airgap outbox/inbox, observed never operated. - Incidents & refusals: verbatim records, newest first. - Receipt inspector: paste attestation + receipt + log key; verdict, per-signature results, and diagnostics come verbatim from transparency.verify_receipt — the deployed verifier itself, reused not reimplemented. Design law, stated in the module and enforced by tests: THE COCKPIT RENDERS EVIDENCE, IT NEVER ASSERTS IT. Every panel recomputes at request time and carries a provenance line (function + timestamp); anything unverifiable renders a loud FAILED-TO-VERIFY panel — no cached green, no neutral gray. Panels state what they do NOT prove (e.g. binary pinning vs source-to-binary correspondence). CLI: pacta wallet cockpit --wallet DIR [--host --port]. Tests (10 new, suite 118 -> 128 green): recomputed-evidence rendering, CHAIN BROKEN on tampered ledger, loud failure on collector error, latched-state rendering, airgap queue states, verbatim incident/refusal rendering, fail-closed inspector on garbage, real-evidence roundtrip (skips if example evidence absent), full-sweep BYTE-LEVEL read-only guarantee (wallet dir hash-identical after all GETs + a POST), and fail-fast on non-wallet dirs. Rendering additionally verified visually against a live demo wallet (posture, quorum table, incidents). Docs: docs/cockpit.md; WALLET.md section; ESTATE.md + llms.txt updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 16:02:17 +00:00
## The read-only guarantee
The cockpit cannot approve, sign, unlatch, or modify custody state. It
calls only read paths; the one POST route (the receipt inspector) parses
submitted artifacts in memory and throwaway temp files, never near the
wallet directory. `tests/test_walletui.py` asserts this at the byte
level: a full request sweep, POST included, leaves every file in the
wallet directory hash-identical. Human approve/deny is deliberately NOT
here — that would be a custody-semantics change, which belongs to a
separate, explicitly reviewed milestone.
cockpit: the bridge — six role stations, the crew law, live liveness Operator verdict on round two: better, but 'still no coherent application'. The cockpit must provide everything a human crew would need if no AI were around — as distinct roles that cooperate through handoffs and never melt into each other. This rebuilds the IA as a bridge with six stations over shared instruments, in the control-room tradition (overview -> station -> instrument -> raw files/CLI), with maker-checker separation of duties encoded in the UI itself. - / is now the Bridge: whole-system verdict strip, six crew cards with live data, and the dispatch (andon) board 'if this happens, who acts' - /station/{proposer,quorum,operator,cryptographer,architect,newcomer}: each console has a fixed anatomy: Mission -> Duties (every duty a runnable, verified-real CLI command - the no-AI drill) -> embedded live instruments -> 'This station never...' (separation of duties) -> Handoffs (receives/delivers) - Operator gets a real liveness board: on-demand parallel probes (HTTP GET on log head/paper/blog/mirror with observed facts + latency; git HEAD/cleanliness on all 9 local repos). Never probes on ordinary page loads. Verified live: caught this very repo as 'alive, dirty' while building it, and confirmed log 13/3488a2d0 + paper 7f140356 - Architect gets the live drift tripwire (ESTATE.md vs estate view) - modularized per the standing separation-of-concerns order: uikit.py (primitives+style), stations.py (role model, pure), liveness.py (probes), walletui.py (collectors, instruments, routes) - crew law test-enforced: bridge crew+dispatch, per-station role contract, station distinctness (signature phrases must not bleed across roles), explicit-probe semantics; read-only byte sweep now covers all 13 routes incl. the probe route - narrow-viewport fix: breakany for unbreakable paths in headings Suite 135 -> 139 green. Read-only guarantee unchanged: no mutating routes; every custody act is a printed command, never a button. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 14:47:43 +00:00
## The instruments (shared evidence views)
warden cockpit: local read-only custody UI for the human operator Operator-ordered milestone, built under an explicit no-risk constraint while the paper application is in flight: strictly ADDITIVE (one new module + one CLI subcommand; zero changes to wallet semantics, the public site, or anything the paper describes), LOCAL-ONLY (never deployed; binds 127.0.0.1), and READ-ONLY in v1 (human approve/deny is deliberately deferred — that is a custody-semantics change belonging to a separately reviewed milestone). New: src/pacta/walletui.py — four views over an existing wallet: - Posture: latch state, ledger head with FULL hash-chain re-verification, pinned quorum members, spending policy verbatim. - Signature queue: airgap outbox/inbox, observed never operated. - Incidents & refusals: verbatim records, newest first. - Receipt inspector: paste attestation + receipt + log key; verdict, per-signature results, and diagnostics come verbatim from transparency.verify_receipt — the deployed verifier itself, reused not reimplemented. Design law, stated in the module and enforced by tests: THE COCKPIT RENDERS EVIDENCE, IT NEVER ASSERTS IT. Every panel recomputes at request time and carries a provenance line (function + timestamp); anything unverifiable renders a loud FAILED-TO-VERIFY panel — no cached green, no neutral gray. Panels state what they do NOT prove (e.g. binary pinning vs source-to-binary correspondence). CLI: pacta wallet cockpit --wallet DIR [--host --port]. Tests (10 new, suite 118 -> 128 green): recomputed-evidence rendering, CHAIN BROKEN on tampered ledger, loud failure on collector error, latched-state rendering, airgap queue states, verbatim incident/refusal rendering, fail-closed inspector on garbage, real-evidence roundtrip (skips if example evidence absent), full-sweep BYTE-LEVEL read-only guarantee (wallet dir hash-identical after all GETs + a POST), and fail-fast on non-wallet dirs. Rendering additionally verified visually against a live demo wallet (posture, quorum table, incidents). Docs: docs/cockpit.md; WALLET.md section; ESTATE.md + llms.txt updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 16:02:17 +00:00
| view | answers | recomputed by |
warden cockpit: local read-only custody UI for the human operator Operator-ordered milestone, built under an explicit no-risk constraint while the paper application is in flight: strictly ADDITIVE (one new module + one CLI subcommand; zero changes to wallet semantics, the public site, or anything the paper describes), LOCAL-ONLY (never deployed; binds 127.0.0.1), and READ-ONLY in v1 (human approve/deny is deliberately deferred — that is a custody-semantics change belonging to a separately reviewed milestone). New: src/pacta/walletui.py — four views over an existing wallet: - Posture: latch state, ledger head with FULL hash-chain re-verification, pinned quorum members, spending policy verbatim. - Signature queue: airgap outbox/inbox, observed never operated. - Incidents & refusals: verbatim records, newest first. - Receipt inspector: paste attestation + receipt + log key; verdict, per-signature results, and diagnostics come verbatim from transparency.verify_receipt — the deployed verifier itself, reused not reimplemented. Design law, stated in the module and enforced by tests: THE COCKPIT RENDERS EVIDENCE, IT NEVER ASSERTS IT. Every panel recomputes at request time and carries a provenance line (function + timestamp); anything unverifiable renders a loud FAILED-TO-VERIFY panel — no cached green, no neutral gray. Panels state what they do NOT prove (e.g. binary pinning vs source-to-binary correspondence). CLI: pacta wallet cockpit --wallet DIR [--host --port]. Tests (10 new, suite 118 -> 128 green): recomputed-evidence rendering, CHAIN BROKEN on tampered ledger, loud failure on collector error, latched-state rendering, airgap queue states, verbatim incident/refusal rendering, fail-closed inspector on garbage, real-evidence roundtrip (skips if example evidence absent), full-sweep BYTE-LEVEL read-only guarantee (wallet dir hash-identical after all GETs + a POST), and fail-fast on non-wallet dirs. Rendering additionally verified visually against a live demo wallet (posture, quorum table, incidents). Docs: docs/cockpit.md; WALLET.md section; ESTATE.md + llms.txt updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 16:02:17 +00:00
|---|---|---|
cockpit: the bridge — six role stations, the crew law, live liveness Operator verdict on round two: better, but 'still no coherent application'. The cockpit must provide everything a human crew would need if no AI were around — as distinct roles that cooperate through handoffs and never melt into each other. This rebuilds the IA as a bridge with six stations over shared instruments, in the control-room tradition (overview -> station -> instrument -> raw files/CLI), with maker-checker separation of duties encoded in the UI itself. - / is now the Bridge: whole-system verdict strip, six crew cards with live data, and the dispatch (andon) board 'if this happens, who acts' - /station/{proposer,quorum,operator,cryptographer,architect,newcomer}: each console has a fixed anatomy: Mission -> Duties (every duty a runnable, verified-real CLI command - the no-AI drill) -> embedded live instruments -> 'This station never...' (separation of duties) -> Handoffs (receives/delivers) - Operator gets a real liveness board: on-demand parallel probes (HTTP GET on log head/paper/blog/mirror with observed facts + latency; git HEAD/cleanliness on all 9 local repos). Never probes on ordinary page loads. Verified live: caught this very repo as 'alive, dirty' while building it, and confirmed log 13/3488a2d0 + paper 7f140356 - Architect gets the live drift tripwire (ESTATE.md vs estate view) - modularized per the standing separation-of-concerns order: uikit.py (primitives+style), stations.py (role model, pure), liveness.py (probes), walletui.py (collectors, instruments, routes) - crew law test-enforced: bridge crew+dispatch, per-station role contract, station distinctness (signature phrases must not bleed across roles), explicit-probe semantics; read-only byte sweep now covers all 13 routes incl. the probe route - narrow-viewport fix: breakany for unbreakable paths in headings Suite 135 -> 139 green. Read-only guarantee unchanged: no mutating routes; every custody act is a printed command, never a button. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 14:47:43 +00:00
| **Posture** (`/posture`) | *Is custody healthy right now?* Verdict banner, then: custody latch, ledger with full hash-chain re-verification, the pinned quorum members (backend, component, evidence grade, source commit, binary fingerprint), signing rules verbatim, incident/refusal counts | `Wallet.posture()` / `Wallet.verify_ledger()` |
| **Queue** (`/queue`) | *What awaits the offline signer?* Parked air-gap signing requests (outbox) and whether the device has answered (inbox) — observed, never operated | airgap outbox/inbox listing |
| **Incidents** (`/incidents`) | *What has ever gone wrong?* Incident records and signed refusal receipts, verbatim, newest first — with the page explaining why empty is the good state | `incidents/*.json`, `receipts/*.json` |
| **Inspect** (`/inspect`) | *Can I check a receipt myself?* Paste an attestation + transparency receipt + log public key; the verdict, per-signature results, and diagnostics come verbatim from the deployed verifier | `pacta.transparency.verify_receipt` |
| **Estate map** (`/estate`) | *Where does this wallet sit in the whole endeavour?* Every repo, service, mirror, loop — with RUNTIME on every entity (always-on / on-demand / not-running / static) | rendering of ESTATE.md's model (drift-guarded by test) |
cockpit: the lab manual — a study-club course in six chairs (/manual) Operator asked for a real big fat user manual: read on one monitor with the deck on the other, worked like a lab from beginning to end, with highest didactical skill — the goal being to educate ONE person in ALL roles, as if to BECOME each role. Shipped as a full course: - docs/warden-lab-manual.md (canonical, ~7100 words): 8 sessions + capstone. Fixed didactic ritual per role-session: why the role exists -> the mind of the role -> concepts -> LAB (numbered machine exercises with checkpoint rails) -> never-list with whys + thought experiment -> handoff artifact -> self-test -> recap card. Notation: do / checkpoint / write / optional. Capstone 'incident day': one incident walked through all six chairs producing seven written artifacts; graduation session maps the path to a real wallet; Appendix A command reference by chair, Appendix B full self-test answers. - Session 4's tamper drill: copy the demo wallet, flip one character of ledger history, watch verify-ledger AND a second cockpit catch it. Every checkpoint in the manual was executed by the author before commit: status fields, intact-chain exit 0, tampered-chain 'entry 0: hash mismatch / BROKEN' exit 1, CUSTODY EVIDENCE BROKEN banner. - src/pacta/mdlite.py: deliberately small stdlib Markdown renderer (headings/anchors+TOC, bold/italic/code with placeholder stashing, fences, lists, quotes, tables, links); tested against the real manual for zero artifact leaks. - /manual route with syllabus TOC; manual typography (checkpoint boxes, session borders); nav tab, deck wizard cross-link, cli hint. Suite 142 -> 144 green; read-only sweep covers /manual. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 15:26:09 +00:00
| **Guide** (`/guide`) | *What does any of this mean?* The reference: plain-language explanations, color code, tour, full glossary, honest limits — static, no live data | — |
| **Lab manual** (`/manual`) | *Teach me every role.* The full study-club course ([docs/warden-lab-manual.md](warden-lab-manual.md), canonical Markdown rendered live): eight sessions + capstone, one chair per role — labs with checkpoints, a safe tamper drill, self-tests with answers, graduation path to a real wallet. Built for two monitors: manual on one, deck on the other. | `mdlite` over the committed file |
warden cockpit: local read-only custody UI for the human operator Operator-ordered milestone, built under an explicit no-risk constraint while the paper application is in flight: strictly ADDITIVE (one new module + one CLI subcommand; zero changes to wallet semantics, the public site, or anything the paper describes), LOCAL-ONLY (never deployed; binds 127.0.0.1), and READ-ONLY in v1 (human approve/deny is deliberately deferred — that is a custody-semantics change belonging to a separately reviewed milestone). New: src/pacta/walletui.py — four views over an existing wallet: - Posture: latch state, ledger head with FULL hash-chain re-verification, pinned quorum members, spending policy verbatim. - Signature queue: airgap outbox/inbox, observed never operated. - Incidents & refusals: verbatim records, newest first. - Receipt inspector: paste attestation + receipt + log key; verdict, per-signature results, and diagnostics come verbatim from transparency.verify_receipt — the deployed verifier itself, reused not reimplemented. Design law, stated in the module and enforced by tests: THE COCKPIT RENDERS EVIDENCE, IT NEVER ASSERTS IT. Every panel recomputes at request time and carries a provenance line (function + timestamp); anything unverifiable renders a loud FAILED-TO-VERIFY panel — no cached green, no neutral gray. Panels state what they do NOT prove (e.g. binary pinning vs source-to-binary correspondence). CLI: pacta wallet cockpit --wallet DIR [--host --port]. Tests (10 new, suite 118 -> 128 green): recomputed-evidence rendering, CHAIN BROKEN on tampered ledger, loud failure on collector error, latched-state rendering, airgap queue states, verbatim incident/refusal rendering, fail-closed inspector on garbage, real-evidence roundtrip (skips if example evidence absent), full-sweep BYTE-LEVEL read-only guarantee (wallet dir hash-identical after all GETs + a POST), and fail-fast on non-wallet dirs. Rendering additionally verified visually against a live demo wallet (posture, quorum table, incidents). Docs: docs/cockpit.md; WALLET.md section; ESTATE.md + llms.txt updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 16:02:17 +00:00
Every panel also states what it does **not** prove (e.g. the quorum
table says binary hashes are pinned but source-to-binary correspondence
is out of scope until reproducible builds).
## Serving
```bash
pacta wallet cockpit --demo # no wallet yet? throwaway
# DEMO wallet, custody-inert
warden cockpit: local read-only custody UI for the human operator Operator-ordered milestone, built under an explicit no-risk constraint while the paper application is in flight: strictly ADDITIVE (one new module + one CLI subcommand; zero changes to wallet semantics, the public site, or anything the paper describes), LOCAL-ONLY (never deployed; binds 127.0.0.1), and READ-ONLY in v1 (human approve/deny is deliberately deferred — that is a custody-semantics change belonging to a separately reviewed milestone). New: src/pacta/walletui.py — four views over an existing wallet: - Posture: latch state, ledger head with FULL hash-chain re-verification, pinned quorum members, spending policy verbatim. - Signature queue: airgap outbox/inbox, observed never operated. - Incidents & refusals: verbatim records, newest first. - Receipt inspector: paste attestation + receipt + log key; verdict, per-signature results, and diagnostics come verbatim from transparency.verify_receipt — the deployed verifier itself, reused not reimplemented. Design law, stated in the module and enforced by tests: THE COCKPIT RENDERS EVIDENCE, IT NEVER ASSERTS IT. Every panel recomputes at request time and carries a provenance line (function + timestamp); anything unverifiable renders a loud FAILED-TO-VERIFY panel — no cached green, no neutral gray. Panels state what they do NOT prove (e.g. binary pinning vs source-to-binary correspondence). CLI: pacta wallet cockpit --wallet DIR [--host --port]. Tests (10 new, suite 118 -> 128 green): recomputed-evidence rendering, CHAIN BROKEN on tampered ledger, loud failure on collector error, latched-state rendering, airgap queue states, verbatim incident/refusal rendering, fail-closed inspector on garbage, real-evidence roundtrip (skips if example evidence absent), full-sweep BYTE-LEVEL read-only guarantee (wallet dir hash-identical after all GETs + a POST), and fail-fast on non-wallet dirs. Rendering additionally verified visually against a live demo wallet (posture, quorum table, incidents). Docs: docs/cockpit.md; WALLET.md section; ESTATE.md + llms.txt updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 16:02:17 +00:00
pacta wallet cockpit --wallet ~/my-wallet # 127.0.0.1:8471
pacta wallet cockpit --wallet ~/my-wallet --port 9000
```
docs: coherence + portability audit — clean-clone bootstrap proven Audit question: is the documentation coherent, and is the app portable to a fresh machine (macOS) with proper isolation? Findings and fixes: - README never mentioned the cockpit/deck/lab manual (three rounds of UI evolution invisible at the front door). Added: human-surface section with the one command, expanded Install (editable-from-clone is the supported mode — repo files are part of the product; zero-install PYTHONPATH=src alternative; fresh-machine skip behavior), macOS openssl/LibreSSL Ed25519 prerequisite with a one-line self-check, wallet commands in the command list. - The lab manual violated the repo's own macOS law (AGENTS.md): GNU sha256sum -> shasum -a 256; GNU sed -i -> portable python3 -c one-liner (executed and output-matched before shipping: entry 0 hash mismatch, BROKEN, exit 1). - Fresh-clone bootstrap was actually tested end to end in a scratch clone: zero-install suite 130 passed / 0 failed / 14 skipped after fixing the one unguarded test (test_ledger_is_hash_chained now skips like its siblings when the dogfood binary is absent - capability gap, not failure); venv + pip install -e . -> pacta console script serves bridge/deck/manual/sample-prefill/drift-tripwire with no PYTHONPATH. - PYTHONPATH incantations simplified: cockpit needs src only (provider never imported by src/pacta); manual + cockpit.md updated. - threat-model.md: cockpit attack-surface note (no mutating routes, no auth because nothing to operate, localhost-only disclosure risk, probe-only network I/O, fake-cockpit = host-compromise boundary). - products.md: cockpit named as the shared human surface of all four profiles. AGENTS.md: doc-portability law + the cockpit's three laws added to the standing guidance. Suite 144 green here; 130/0/14 on a bare clone. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 16:00:08 +00:00
(Installed per the README — venv + `pip install -e .` — the plain `pacta`
command works. Zero-install, from the repo root:
`PYTHONPATH=src python3 -m pacta wallet cockpit --demo`.)
warden cockpit: local read-only custody UI for the human operator Operator-ordered milestone, built under an explicit no-risk constraint while the paper application is in flight: strictly ADDITIVE (one new module + one CLI subcommand; zero changes to wallet semantics, the public site, or anything the paper describes), LOCAL-ONLY (never deployed; binds 127.0.0.1), and READ-ONLY in v1 (human approve/deny is deliberately deferred — that is a custody-semantics change belonging to a separately reviewed milestone). New: src/pacta/walletui.py — four views over an existing wallet: - Posture: latch state, ledger head with FULL hash-chain re-verification, pinned quorum members, spending policy verbatim. - Signature queue: airgap outbox/inbox, observed never operated. - Incidents & refusals: verbatim records, newest first. - Receipt inspector: paste attestation + receipt + log key; verdict, per-signature results, and diagnostics come verbatim from transparency.verify_receipt — the deployed verifier itself, reused not reimplemented. Design law, stated in the module and enforced by tests: THE COCKPIT RENDERS EVIDENCE, IT NEVER ASSERTS IT. Every panel recomputes at request time and carries a provenance line (function + timestamp); anything unverifiable renders a loud FAILED-TO-VERIFY panel — no cached green, no neutral gray. Panels state what they do NOT prove (e.g. binary pinning vs source-to-binary correspondence). CLI: pacta wallet cockpit --wallet DIR [--host --port]. Tests (10 new, suite 118 -> 128 green): recomputed-evidence rendering, CHAIN BROKEN on tampered ledger, loud failure on collector error, latched-state rendering, airgap queue states, verbatim incident/refusal rendering, fail-closed inspector on garbage, real-evidence roundtrip (skips if example evidence absent), full-sweep BYTE-LEVEL read-only guarantee (wallet dir hash-identical after all GETs + a POST), and fail-fast on non-wallet dirs. Rendering additionally verified visually against a live demo wallet (posture, quorum table, incidents). Docs: docs/cockpit.md; WALLET.md section; ESTATE.md + llms.txt updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 16:02:17 +00:00
The server binds localhost by default and is not meant to be exposed;
there is no authentication because there is nothing to operate.