proof-aware-crypto-tooling-.../docs/warden-lab-manual.md

998 lines
48 KiB
Markdown
Raw Permalink Normal View History

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
# The warden lab manual — one person, six roles
*A study-club course in verified custody. You will not read about the roles —
you will sit in each chair, do each job with your own hands on a live (and
harmless) wallet, and only leave a chair when you can say what that role
does, why it exists, and what it must never do.*
---
## How to use this manual
**Two monitors.** Put this manual on one screen. On the other, start the
cockpit and keep it open for the whole course:
```
cd proof-aware-crypto-tooling-agent
PYTHONPATH=src:provider/src python3 -m pacta wallet cockpit --demo
```
The command prints two things you need:
1. the **demo wallet path** (something like `/tmp/warden-DEMO-xxxxxxxx/wallet`), and
2. the address `http://127.0.0.1:8471` with its `/deck` and `/guide` pointers.
Open **http://127.0.0.1:8471/deck** on the second monitor. For the terminal
exercises, open a *second* terminal in the same repo directory and set up two
things once (the server keeps running in the first terminal):
```
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
alias pacta='PYTHONPATH=src python3 -m pacta'
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
export W=/tmp/warden-DEMO-xxxxxxxx/wallet # <- your printed demo path
```
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
(If you installed per the README — venv plus `pip install -e .` — skip the
alias: plain `pacta` already works. The alias is the zero-install path
straight from a clone; both are equivalent for this course.)
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
**Time.** The course is eight sessions plus a capstone: roughly four to six
hours total. Every session is self-contained — stopping after any session and
resuming tomorrow is fine. The demo wallet is throwaway: if you come back
later, just start `--demo` again and re-export `W`.
**Notation.** Four marks carry the whole manual:
- **▶ Do** — an action at the machine (deck pane, page, or terminal).
- **✔ Checkpoint** — what you must be seeing before you continue. If you do
not see it, stop and re-do the step; checkpoints are the course's rails.
- **✎ Write** — answer in your own words, on paper or in a scratch file.
Writing is not optional; it is how the role gets into your hands.
- **⌂ Optional** — needs internet, or goes beyond the demo. Skip freely.
**The two rules of the lab.**
1. Everything in the cockpit is **read-only** — you cannot break custody from
a browser, so click with total freedom.
2. When we *deliberately* break things (and we will — that is Session 4's
best moment), we break **copies**, never originals. The demo wallet is
custody-inert anyway; the discipline is the point.
> ✔ **Checkpoint.** Your second monitor shows the deck: six colored panes and
> the wizard rail. Your second terminal answers `pacta --help` without an
> error. If both are true, you are ready.
---
## Session 0 — the world you are entering
**Goal of this session:** hold the whole system in your head at low
resolution, so every later session has a place to hang its detail.
### 0.1 The one idea
warden is a prototype custody wallet built on a single idea: **no single
program is trusted.** Before this wallet trusts a piece of cryptography, four
verifier programs — each built from a *different*, formally verified codebase
— must independently agree. If they ever disagree, the wallet freezes itself
and writes down what happened. Every decision leaves a tamper-evident trace.
Why so paranoid? Because in custody, the failure mode is not a crash — it is
a *quiet lie*: a verifier that says "valid" when it should say "invalid," a
history that has been edited, a green light nobody actually checked. Every
mechanism you will meet in this course exists to make a quiet lie either
impossible or loud.
### 0.2 The estate in five minutes
warden does not float alone. It is the custody corner of a larger estate:
- **Four verified forks** (`dalek`, `anza`, `risc0`, `betrusted`
`-ed25519-verified`): four independent Ed25519 implementations, each with
machine-checked proofs (in the Lean 4 proof assistant) that the code
matches the mathematics, each fork from a different upstream lineage.
- **The Lean Transparency Log** (LTL, live at `ltl.zkdefi.org`): a public,
append-only log. Each entry is a signed statement — *"this repository, at
this exact commit, was verified with this exact toolchain, with this
result"* — recorded so it can never be quietly edited or denied.
- **pacta** (this repository): the tooling that verifies, grades, and
consumes that evidence — and warden, the wallet that stakes custody on it.
- **The public faces**: the log's API, the paper, the blog, the mirror.
You will meet all of these from inside the cockpit. You do not need to
memorize the estate — that is the Architect's chair, Session 6, and there is
a live map.
### 0.3 The three laws of the cockpit
Everything you look at for the rest of the course obeys three laws. Learn
them now; test them all course long:
1. **The design law — it renders evidence, it never asserts it.** Every panel
is recomputed from the wallet's files at the moment the page loads, by the
same functions the wallet itself uses. Every panel ends with a dashed
*provenance line* naming the function and timestamp that produced it.
What cannot be recomputed shows a red FAILED TO VERIFY — never a stale
green, never a neutral gray.
2. **The UX law — it never leaves a human in the dark.** Verdicts come in
words before colors; every panel has a "How to read this panel" expander;
every term links to the glossary.
3. **The crew law — roles are distinct and cooperate through handoffs.** Six
roles run this estate. The one who proposes never approves; the one who
verifies never proposes; the one who watches never overrides the bench.
You are about to become all six — *one at a time*.
### LAB 0
1. ▶ On the deck, read each pane's header: name and italic question. Say each
role's question out loud (yes, out loud — it works).
2. ▶ Click **← Bridge** in the deck's top bar. Read the verdict banner and
the strip of chips under it.
3. ▶ Find the **"If this happens, who acts"** dispatch table. ✎ Copy the
two-column skeleton (event → station) onto paper. This is your course map:
each row is a session.
4. ▶ Return to the deck (the STATIONS row of tabs, or your browser's back).
> ✔ **Checkpoint.** The bridge said **CUSTODY HEALTHY** in words, the chips
> said `4 pinned` and `chain verified`, and your paper holds a seven-row
> dispatch table.
### Self-test 0 *(answers in Appendix B)*
1. What is the one idea warden is built on, in one sentence?
2. Why does the cockpit refuse to show a "neutral gray" state?
3. Name the six roles without looking.
---
## Session 1 — the Newcomer: learning to read evidence
**You are becoming:** the person who reads evidence correctly and whose
confusion is a diagnostic instrument, not an embarrassment.
### 1.1 Why this role exists
Every other role assumes a skill nobody is born with: reading a security
surface *without trusting it*. The Newcomer chair is where that skill is
built. It is also the estate's quality sensor: veterans stop seeing gaps;
fresh eyes find them. That is why the Newcomer's report — "this page confused
me" — is treated as a bug report about the page, never about the reader.
### 1.2 The mind of the Newcomer
Adopt these three postures for this session (and keep them forever):
- **Verdict first.** On any page, read the words at the top before any
numbers. If you read nothing else, read the verdict.
- **Provenance always.** Before believing a panel, glance at its dashed
footer: *what function recomputed this, and when?* No footer, no belief.
- **Ask the page.** Every panel has a "How to read this panel" expander and
little `?` marks. Using them is the skill, not a failure of it.
### 1.3 Concepts: the reading system
- **Colors mean one thing each.** Green = re-checked just now and passed.
Amber = waiting, or needs attention. Red = failed, or *could not be
checked*. That last part matters: the cockpit treats "I don't know" as red,
because in custody, unverified and broken deserve the same caution.
- **The provenance line is the anti-cache.** It names the exact function
(e.g. `Wallet.verify_ledger()`) and the UTC second of recomputation.
- **FAILED TO VERIFY is honesty, not breakage.** It means: this panel refused
to guess.
### LAB 1
1. ▶ Open the **Guide** (INSTRUMENTS row). Read it fully once — ten minutes,
no skimming. It is the reference the rest of the course leans on.
2. ▶ Open **Posture**. Read only the verdict banner and each panel's *first
sentence*. ✎ In one line each: what do the latch, ledger, quorum, signing
rules, and recorded-history panels answer?
3. ▶ The recompute proof: note the timestamp in the Ledger panel's provenance
line. Reload the page. Compare.
4. ▶ Open one `?` mark (any panel) and follow it to the glossary and back.
5. ▶ On the deck, run wizard steps 13 if you have not already (the wizard is
this session's condensed twin).
> ✔ **Checkpoint.** The provenance timestamp *changed* when you reloaded —
> you watched the ledger's full hash chain being re-verified for you,
> live, both times. That is the design law observed with your own eyes.
### What the Newcomer never does
- Never pretends to understand. Every other chair once sat here.
- Never assumes a confusing page is their fault — they report it.
*Thought experiment:* if newcomers politely stayed quiet, which of the three
laws would rot first, and who would notice — and when?
### Handoff
The Newcomer **delivers** confusion reports to the Architect and Operator,
and **receives** the guide, the demo, and patient answers. ✎ Write one real
confusion report from your Lab 1 (there is always one). Keep it — you will
deliver it in Session 6.
### Self-test 1
1. A panel shows green. What two things did the cockpit do before showing it?
2. What is the difference between red-failed and red-could-not-check, and why
does the cockpit refuse to distinguish them visually?
3. Where do you look first on any page?
> **Recap card — NEWCOMER.** Question: *what is all this?* Reads verdict
> first, provenance always. Confusion = instrument. Never silent, never
> ashamed. Delivers: fresh eyes.
---
## Session 2 — the Proposer: asking precisely
**You are becoming:** the origin of every signature — the one who asks, and
who lives with written answers.
### 2.1 Why this role exists
Somebody has to want something signed; in production that is the financial
agent. The danger of the asking role is scope creep: the asker who also
approves, or who "just quickly" adjusts policy to fit their own request, has
dismantled the whole trust story alone. So the estate gives asking its own
chair with hard walls — and in exchange, the Proposer gets something rare:
**every "no" arrives in writing, with instructions.**
### 2.2 The mind of the Proposer
- **Precision or nothing.** A proposal is the exact bytes to be signed, named
by their SHA-256 fingerprint. "Roughly this transaction" does not exist.
- **A refusal is a to-do list.** Not an insult, not a negotiation opening —
a machine-readable statement of what rule fired and what would satisfy it.
- **I ask; I never approve.** Even when — especially when — I am sure.
### 2.3 Concepts
- **The payload fingerprint.** SHA-256 of the exact bytes to sign. The
offline signer signs those bytes and nothing else; both sides of the
air gap can compare fingerprints before anything happens. Every later
dispute is settled by this hash.
- **The front door.** Proposals enter through the wallet's agent-native MCP
surface — the `request_signature` tool on `pacta wallet mcp`. There is
deliberately no cozier side entrance.
- **The refusal receipt.** `code` (which rule fired), `missing` (the exact
unmet precondition), `remediation` (what would make the same request
succeed). Machine-readable so an agent — or you — can correct and retry
without guessing.
- **Queue states.** *awaiting device* = parked in the outbox, the offline
signer has not answered; *answered* = a response file arrived in the inbox.
### LAB 2
1. ▶ In the **amber Proposer pane** (or the full station page), find the
queue. One request sits *awaiting device*. ✎ Note the first 12 characters
of its payload fingerprint.
2. ▶ Watch a fingerprint being born. In your second terminal:
```
printf 'pay 5 to bob' > /tmp/payload.demo
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
shasum -a 256 /tmp/payload.demo # GNU/Linux equivalent: sha256sum
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
```
Change one character (`5` → `6`) and hash again. ✎ How much of the
fingerprint changed? What does that mean for "roughly this transaction"?
3. ▶ From the Proposer station's instrument links, open **Incidents** and
read the demo refusal receipt. ✎ Fill this sentence from its fields: *"My
request was refused under rule ________ because ________ was missing; it
would succeed if I ________."*
4. ▶ Read the Proposer station's Duties top to bottom — every command shown
is the real CLI. (⌂ The JSON-RPC lines for driving `request_signature` by
hand are in `WALLET.md` — worth a look, not required.)
> ✔ **Checkpoint.** Your two hashes differ completely (an avalanche — one
> character flipped roughly half the bits), and your refusal sentence reads:
> rule `POLICY_DENIED`, missing *allowlisted destination*, succeed after
> *adding the destination to the policy allowlist*.
### What the Proposer never does — and why
- **Never approves or verifies their own proposal.** Self-approval is the
single cheapest attack on any custody system: no cryptography needs to be
broken, only one person's honesty. The wall is load-bearing.
- **Never touches the air-gap device or its folders.** The walk belongs to
the Operator; splitting request-maker from request-carrier means collusion,
not error, is required for abuse.
- **Never edits `policy.json` to fit their own request.** Policy changes are
the Operator's deliberate act — and the ledger records them permanently.
### Handoff
Delivers: fingerprinted requests → the signing firewall; escalations after
repeated refusals → the Operator. Receives: a signature, or a refusal
receipt ← the wallet. ✎ Draft a two-line escalation note for the demo
refusal, addressed to the Operator. Keep it for the capstone.
### Self-test 2
1. Why is the payload fingerprint the thing both sides of the air gap
compare, rather than a human-readable description?
2. Name the three fields of a refusal receipt and each one's job.
3. Your request keeps being refused and you are *certain* it is fine. List
your legal moves.
> **Recap card — PROPOSER.** Question: *how do I ask?* Exact bytes,
> fingerprinted. Refusals are instructions. Asks through the front door;
> never approves, never carries, never bends policy.
---
## Session 3 — the Quorum bench: four seats, one answer each
**You are becoming:** one seat of four — a verifier whose entire value is
that its judgment is nobody else's.
### 3.1 Why this role exists
One verifier — however carefully built — is one bug, one backdoor, one
compromised build machine away from a quiet lie. warden's answer is not "be
more careful"; it is **independence multiplied**: four verifier programs,
each built from a *different* formally verified Ed25519 codebase from a
different upstream lineage. For a wrong verdict to pass, the same lie would
have to exist independently in all four — not one mistake, but a coordinated
miracle.
### 3.2 The mind of a seat
- **My verdict is mine alone.** Built from my sources, computed by my
binary. I do not preview, harmonize, or average with the other seats.
- **Dissent is my job working.** If I say INVALID while three say OK, I have
either caught the failure of the century or found a bug in myself — both
are exactly what four seats exist to surface. Custody freezes; humans look.
- **My independence is my hygiene.** A shared toolchain, cache, or patch
with another seat is a shared bug: four seats that secretly agree because
they are one seat protect nothing.
### 3.3 Concepts
- **Unanimity or latch.** All members must independently accept, or custody
freezes. Not majority — a 3-of-4 design would trade the estate's whole
premise (catch the quiet lie) for availability. Here, one honest dissenter
outvotes three comfortable agreements — by design.
- **Pinning.** The custody capsule stores each member binary's SHA-256. On
use, the file on disk is re-hashed and compared: a swapped or modified
binary fails and is rejected. Pinning proves the file is *unchanged*
and, honestly, nothing more.
- **Evidence grades R0R5.** This estate's scale for formal evidence:
R0 = no usable evidence … R4 = machine-checked proofs covering the full
documented boundary … R5 would add reproducible builds and side-channel
assurance. **Nothing holds R5 yet**, so pinning cannot prove a binary was
honestly *built* from its attested sources. The capsule requires R4 of
every member, and the gap to R5 is stated everywhere it matters — an
honest system states its own boundary.
- **The capsule.** The wallet's founding document: members, pins, policy.
Its own SHA-256 is anchored in the ledger's first entry — so even the list
of who is trusted cannot be quietly swapped.
### LAB 3
1.**Indigo Quorum pane** (or full Posture): the bench roster. ✎ For each
of the four seats: backend name, the repo it is built from, and the first
8 characters of its binary fingerprint. Write all four — the act of
copying fingerprints by hand is the point.
2. ▶ Open the roster's "How to read this panel" expander and read the
*evidence grade* bullet. ✎ In one line: what exactly would R5 add, and
what attack does its absence leave open?
3. ▶ In the terminal:
```
pacta wallet status --wallet "$W"
```
✎ Find the members and the capsule hash in the output. Does the capsule
hash's first 24 hex match what the cockpit's quorum panel shows?
4. ▶ Open **Incidents** and read the demo divergence: `risc0` answered
INVALID where three answered OK. ✎ As the risc0 seat, write two sentences
defending your dissent to the Operator *without apologizing*.
> ✔ **Checkpoint.** Four seats on paper with four distinct fingerprints; the
> CLI's capsule hash matches the cockpit's; your dissent defense states what
> you observed and refuses to guess at what the others did.
### What the bench never does — and why
- **Never proposes.** The bench judges evidence; the moment it originates
spends, judge and party have merged.
- **Never harmonizes before answering.** Pre-agreement converts four
independent measurements into one measurement with four signatures.
- **Never clears a latch its own dissent caused.** You are a witness to your
own alarm, not its judge.
*Thought experiment:* an attacker can fully compromise the build of exactly
one seat. Walk through what happens on the next verification — and what the
attacker would have needed instead for the lie to go through.
### Handoff
Delivers: unanimous admits, or a latch-tripping dissent → the wallet;
divergence incidents → the Operator. Receives: component evidence ← the
wallet's inbound boundary; rebuilt pinned sources ← the Architect's forks.
### Self-test 3
1. Why unanimity instead of 3-of-4 majority — what is being traded for what?
2. What does a pinned fingerprint prove, and what does it *not* prove? Name
the grade that would close the gap.
3. Your seat dissents and custody freezes trading for a day. Was this a
success or a failure? For whom?
> **Recap card — QUORUM SEAT.** Question: *would I stake custody on this?*
> One seat, one codebase, one verdict. Unanimity or latch. Independence is
> hygiene; dissent is the job working; never proposes, never averages.
---
## Session 4 — the Operator: watching, and the day something breaks
**You are becoming:** the person who watches the pulses, holds the brakes,
and writes the permanent notes — the calm in the estate.
### 4.1 Why this role exists
Every guarantee you have met so far is *checkable* — but checkable is
worthless if nobody checks. An unwatched log, an unprobed service, an
unverified ledger are safe only on paper. The Operator is the estate's
standing answer to "who actually looks?" — and, when the latch trips, the
one chair with the authority (and the obligation) to run the recovery by the
book.
### 4.2 The mind of the Operator
- **Liveness is not honesty.** My probes tell me something *answered* — not
that it told the truth. Truth is the Cryptographer's replay; I check
pulses, daily, on demand, never on autopilot.
- **Procedures over improvisation.** When the latch trips, I open the
runbook. Excitement is for people without checklists.
- **Permanent notes.** My unlatch decision goes into the ledger with a
written root cause, forever. If I cannot write the cause, I am not done
investigating.
### 4.3 Concepts
- **The liveness board.** On-demand probes: HTTP GET on each public service
(status, observed facts, latency), `git` checks on each local working copy
(present, HEAD, clean/dirty). It runs only when you press **Probe now**
the cockpit never phones home on an ordinary page load.
- **The latch lifecycle.** Trips on quorum divergence or suspected tampering
→ all outbound signing refused (with receipts) → investigation per
`docs/runbook-latch.md` → root cause fixed → `pacta wallet unlatch` with a
mandatory note, recorded permanently.
- **Append-only ethics.** The transparency log's operator side has four
absolute nevers: never force-push the log repo, never edit or delete under
`entries/`, never re-sign a published head, never backdate. An append-only
log that gets "corrected" once is not append-only — it is marketing.
- **Advancing the pin.** `pacta sth-refresh` fetches the log's newest signed
head, verifies its signature *and its consistency with the previously
pinned tree size*, then advances the local pin — the defense against a log
that shows different histories to different people (split view) or rolls
back.
### LAB 4
1.**Green Operator pane**: press **Probe now**. ✎ Record: the log head's
`tree_size` and root prefix; the slowest probe's latency; any repo marked
*dirty* (uncommitted changes) — dirty is amber, not red: alive, but with
local work in progress.
2. ▶ Daily wallet checks, from the terminal:
```
pacta wallet status --wallet "$W"
pacta wallet verify-ledger --wallet "$W"
```
✎ What did verify-ledger actually recompute? (The Ledger panel's
explainer has the exact answer.)
3.**The tamper drill.** You will now watch the system catch history
editing — on a **copy**:
```
cp -r "$W" /tmp/tamper-lab-wallet
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
python3 -c "p='/tmp/tamper-lab-wallet/ledger.jsonl'; s=open(p).read(); \
open(p,'w').write(s.replace('genesis','gene-sis'))"
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
pacta wallet verify-ledger --wallet /tmp/tamper-lab-wallet
```
One character of history changed. ✔ The verifier reports the chain broken
at the first entry — loudly, non-zero exit.
4. ▶ Now see it as the crew would: point a *second* cockpit at the corpse:
```
pacta wallet cockpit --wallet /tmp/tamper-lab-wallet --port 8481
```
Open `http://127.0.0.1:8481/posture`. Read the banner. Then stop that
server (Ctrl-C) and destroy the evidence of your crime:
```
rm -rf /tmp/tamper-lab-wallet /tmp/payload.demo
```
5. ▶ Read the Operator station's Duties 2 and 3 (`sth-refresh`,
`witness-audit`) — these are the same watching, aimed at the public log.
(⌂ With internet and a clone of `lean-transparency-log`, run
`pacta witness-audit --published-dir <clone>` and watch every historical
head re-verified.)
> ✔ **Checkpoint.** The tampered copy produced (a) a failing
> `verify-ledger` naming the broken entry and (b) a cockpit banner reading
> **CUSTODY EVIDENCE BROKEN** with the ledger panel red. You edited one
> character of one file, and two independent surfaces caught it instantly.
> *That* is what a hash chain buys.
### What the Operator never does — and why
- **Never unlatches without a written root cause.** The CLI refuses an empty
note; the ledger keeps it forever. An unexplained unlatch is a future
incident with a head start.
- **Never rewrites history** — the four log nevers above. The log's entire
value is that this never happened, not that it rarely happens.
- **Never overrides the bench.** A divergence gets investigation, not a
fifth vote.
- **Never signs or proposes.** The brakes and the pen live in different
chairs.
### Handoff
Delivers: unlatch decisions with permanent notes → the ledger; outage and
repair notes → the Architect. Receives: incidents ← wallet and bench;
escalations ← the Proposer (you are holding one from Session 2 — file it
mentally under "capstone").
### Self-test 4
1. Alive and honest — whose job is each, and with which tools?
2. Recite the four log nevers. Which one would be the *most* tempting on a
bad day, and why is it still absolute?
3. In the tamper drill, why did changing bytes in entry 1 break the chain at
entry 1 rather than at the newest entry?
> **Recap card — OPERATOR.** Question: *is everything running, and is
> custody unfrozen?* Probes on demand; verifies the chain daily; runs the
> runbook when the latch trips; writes permanent notes; never rewrites,
> never overrides, never signs.
---
## Session 5 — the Cryptographer: recompute everything
**You are becoming:** the person who accepts nothing they did not recompute
— and who knows *exactly* where each guarantee stops.
### 5.1 Why this role exists
Everything in this estate ultimately reduces to a claim someone could check.
The Cryptographer is the someone. Without this chair, "verifiable" quietly
degrades into "verified by nobody" — and the estate becomes exactly the
kind of trust-me system it was built to replace.
### 5.2 The mind of the Cryptographer
- **Recompute, don't trust.** A green light I did not recompute is a rumor —
including the cockpit's own green lights.
- **Boundaries are sacred.** "Verified" means precisely what the certificate
says — never one theorem more. Stretching a claim past its boundary is not
enthusiasm, it is a false claim.
- **The log is not an oracle.** It is an accountability ledger: it makes
claims permanent and attributable, not true. A lie recorded in the log is
still a lie — permanently on the record, and catchable by replay.
### 5.3 Concepts
- **Attestation.** A signed statement: repository X, at exact commit C, was
verified with exact toolchain T, with result R (every certificate, every
axiom listed). It names its own evidence precisely enough to replay.
- **Transparency receipt.** Proof that the attestation is recorded in the
public log: an *inclusion proof* (a short chain of hashes showing the
leaf is under the log's signed root) plus the *signed tree head*. Verify
both and you know: this exact statement is permanently in the public
record — the operator can never unsay, edit, or deny it.
- **What the log guarantees — and what it does not.** The Merkle machinery
guarantees inclusion, append-only history, and transferable evidence of
equivocation (two conflicting signed heads at the same size, in one log
context, convict the key holder). It does **not** referee truth: a leaf's
*content* can be false, and only independent replay — off-protocol work
with the proof assistant — catches that. The design's honest slogan:
cheap to claim, impossible to unsay, catchable forever.
- **Claim boundaries you must be able to recite.** The Ed25519 proofs treat
SHA-512 as an opaque function (its correctness is assumed, not proven);
reproducible builds are out of scope (the R4/R5 gap); the mechanized
results cover the accumulator model as stated in the paper, with a
published ledger of what is *not* proven. Where the mathematics stops,
the certificate says so.
### LAB 5
1.**Purple Cryptographer pane**: click **Load the sample evidence**, then
**Verify (read-only)**. Do not just admire the green: ✎ copy out the
diagnostics list and annotate each line with what check it was
(signature? inclusion? hash equality? freshness?). Use the panel's
explainers.
2. ▶ Break it, three ways. After each, restore (reload the sample) before
the next:
- delete one character from the **receipt** box → verify;
- delete one character from the **attestation** box → verify;
- delete one character from the **public key** box → verify.
✎ For each: what failed, and *at which layer*? Notice the error surfaces
are different — a verifier that fails identically for every cause is a
verifier you cannot debug.
3. ▶ Boundary recitation, closed-book: ✎ write the three claim boundaries
from 5.3 from memory. Check yourself against the guide's "What this
cockpit cannot tell you."
4.**The full replay** (internet + a clone):
```
pacta log-fetch --url https://ltl.zkdefi.org --component dalek-ed25519-verified
git clone https://zkdefi.org/saymrwulf/lean-transparency-log
cd lean-transparency-log && python3 verify.py --all && python3 verify_selftest.py
```
`verify.py --all` re-checks every leaf, every signed head, every receipt,
offline, fail-closed — and `verify_selftest.py` then attacks the verifier
itself with corrupted inputs to prove it *would* fail if lied to.
✎ Why does shipping the self-test beside the verifier matter?
> ✔ **Checkpoint.** One ACCEPTED verdict whose every diagnostic line you can
> name; three different refusals you caused on purpose and can tell apart;
> three boundaries recited without looking.
### What the Cryptographer never does — and why
- **Never accepts an unrecomputed green** — the chair exists to be the
recomputation.
- **Never extends a claim past its boundary.** The estate's credibility is
the sum of its stated limits; one stretched claim spends all of it.
- **Never treats the log as a truth oracle.** Permanence is not truth;
replay is truth's only entrance.
### Handoff
Delivers: audit verdicts → Operator and Proposer; boundary corrections →
the Architect (docs and map). Receives: artifacts to audit ← anyone; fresh
evidence ← the live log.
### Self-test 5
1. An attestation verifies perfectly: signatures good, inclusion proven,
head signed. List everything this does — and does not — tell you.
2. What is equivocation evidence, and why is it the one misbehavior directly
attributable to the log operator?
3. Why did the three sabotages in Lab 5 fail *differently*, and why is that
a feature?
> **Recap card — CRYPTOGRAPHER.** Question: *does the evidence prove what it
> claims?* Recomputes everything, everywhere, including the cockpit. Knows
> each boundary by heart. Log = permanent, not true; replay decides. Never
> stretches, never trusts, never tires.
---
## Session 6 — the Architect: the map and the territory
**You are becoming:** the person who keeps the whole estate tellable — every
repo, service, mirror, and loop — and who guards what may be said in public.
### 6.1 Why this role exists
The estate is many repositories, services, mirrors, and two self-referential
loops. No head holds that reliably — and an estate nobody can hold is an
estate where drift, duplication, and quiet inconsistency breed. The
Architect's answer is a *map that is recomputed, never remembered* — and a
tripwire that screams when the map forks from itself.
### 6.2 The mind of the Architect
- **The map is recomputed, never remembered.** If I "know" the estate from
memory, I know last month's estate.
- **Two renderings of one model need a tripwire.** Anything that exists
twice will drift; the only question is whether the drift is caught.
- **Public is a one-way door.** A name published once is published forever.
Public documents list only entities whose existence is already public or
must be public for trust.
### 6.3 Concepts
- **The estate map.** Five lanes of custody (upstream sources → verified
subjects → machinery and operator-held → published faces → consumers),
with every entity carrying its *runtime* (always-on / on-demand /
not-running / static) and mutability class.
- **The two loops** — the estate's hardest furniture, each tellable in one
breath:
- **Loop 1, the dogfood signer:** the log's own signing machinery uses an
Ed25519 implementation that is itself verified and attested *inside the
log it signs* (leaf 8). The tool guards the evidence; the evidence
covers the tool.
- **Loop 2, the self-attesting mechanization:** leaf 12 of the log (its thirteenth entry) is the
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
kernel-checked mechanization of the very soundness arguments the log's
accumulator relies on. The proofs about the machinery live inside the
ledger the machinery protects — scoped honestly, with a published list
of what is *not* proven.
- **The drift tripwire.** The map exists twice (committed `ESTATE.md`; the
cockpit's estate view). A name-level comparison runs live on the Architect
station and in the test suite; if the renderings disagree, the suite fails.
- **The generated-file lesson** (a true war story): a published verifier
once got hardened at its destination while the *template that generates
it* kept the old, weaker code — a time bomb where the next publish would
have silently un-fixed it. It was caught in an audit and now has its own
tripwire test. The Architect's rule ever since: **when you fix a
generated file, find and fix its generator in the same change.**
### LAB 6
1.**Slate Architect pane**: read the **drift tripwire** result. Then open
the **Estate map** (instrument link). Click the transparency-log card and
read its dossier. ✎ Which lane is it in, what is its runtime, what is its
mutability?
2. ▶ Find warden/pacta on the map. ✎ Which entities *consume* the log's
evidence, per the map's edges?
3. ▶ Trace Loop 2 on the map until you can tell it in one breath. ✎ Write
both loops, one sentence each, closed-book.
4. ▶ Close the map. ✎ Draw the five lanes from memory — boxes and arrows,
ninety seconds, ugly is fine. Reopen and compare. What did you misplace?
5. ▶ Deliver the Newcomer's confusion report from Session 1 (you kept it):
decide *as the Architect* — is it a page bug, a glossary gap, or a map
gap? ✎ Write the one-line disposition.
> ✔ **Checkpoint.** The tripwire says the renderings agree; both loops exist
> as single sentences in your handwriting; the confusion report has a
> disposition.
### What the Architect never does — and why
- **Never names private infrastructure in public artifacts.** Existence
disclosure is irreversible and someone else's risk to accept, not yours.
- **Never fixes a generated file without its generator** — the war story
above is why this is a never and not a tip.
- **Never redraws the map from memory.** Memory is where drift lives.
### Handoff
Delivers: the updated, drift-guarded map → everyone. Receives: outage and
repair notes ← the Operator; boundary corrections ← the Cryptographer;
confusion reports ← the Newcomer.
### Self-test 6
1. Tell both loops, one sentence each.
2. Why is "runtime" (always-on / on-demand / static) a property the *map*
must carry, rather than something people just know?
3. A teammate fixed a bug directly in a published, generated file and
pushed. What do you do, in order?
> **Recap card — ARCHITECT.** Question: *does the map match the territory?*
> Five lanes, two loops, runtime on everything. Tripwires over trust;
> generators with their outputs; public is forever. Never draws from memory.
---
## Session 7 — Capstone: the incident day
*One person, six chairs, one incident, no AI. You will walk a single event
through every role, producing each role's real artifact. Do this with the
deck open — move your eyes to each pane as you take its chair. If you run a
study club (see Session 8), this is the session to run as a group, one chair
per person.*
**The scenario.** A routine component re-verification comes through the
wallet's inbound boundary. Seat `risc0` answers INVALID; `dalek`, `anza`,
`betrusted` answer OK. The latch trips. (This is exactly the incident your
demo wallet carries — the deck is your set dressing.)
Work the stations **in this order**, writing each artifact (✎) before
moving to the next chair. Do not blend chairs — that is the whole exam:
1. **The wallet speaks first** (no chair): an incident file exists; the
latch is on; every signing request now gets a refusal receipt citing
`CUSTODY_LATCHED`. ▶ Find all three facts in the cockpit (incidents
list; latch panel wording; refusal-code explainer).
2. **Proposer.** Your pending payment just got refused. ✎ Artifact 1: the
escalation note to the Operator — request id, payload fingerprint,
refusal code, and the sentence "awaiting custody recovery; will resubmit
unchanged." (No pressure on anyone to hurry — note that restraint; it is
the role.)
3. **Operator.** Open the runbook mentally: freeze confirmed, incident read.
✎ Artifact 2: the investigation plan — three numbered checks you will
run, in order, and who you will hear from before any unlatch (the bench
and the cryptographer). *Hint: your Session 4 daily checks are two of the
three.*
4. **Quorum seat (risc0).** ✎ Artifact 3: the dissent defense — what your
seat observed, refusal to speculate about other seats, and the one thing
that would change your verdict (a re-run on your rebuilt, re-pinned
binary).
5. **Cryptographer.** ✎ Artifact 4: the audit verdict — what you recomputed
(the payload against each seat's verifier, the members' pins, the
evidence receipts), what you found (in this scenario's story: the risc0
seat's binary was faulty *at sealing time* — its pin verified, meaning
unchanged since sealing, which is exactly why pin-checking could not
catch it; a rebuild from the pinned proven sources produced a differing,
correct binary), and the boundary sentence: "this attributes the
divergence; it does not prove the other three correct — their pins
verified, and unchanged-since-sealing is all a pin ever proves."
6. **Operator again.** Root cause in hand (stale seat binary; rebuilt and
re-pinned by the bench). ✎ Artifact 5: the permanent unlatch note —
cause, fix, evidence checked, date. One paragraph you would sign with
your name, knowing the ledger keeps it forever.
7. **Architect.** ✎ Artifact 6: the map disposition — does anything on the
estate map change? (A seat was rebuilt and re-pinned: the capsule's pin
set changed, which is a re-sealing event the wallet's dossier must
reflect — and the incident is now permanent recorded history. One line
each.)
8. **Newcomer** (yes, last chair): reread all six artifacts as someone who
joined today. ✎ Artifact 7: the one place the paper trail would confuse a
fresh reader, and the one-line fix.
> ✔ **Checkpoint — the debrief.** Lay the seven artifacts in a row. Notice
> three things. *Every handoff is written* — nothing moved by hallway
> conversation. *No chair did another chair's job* — the proposer never
> argued innocence, the bench never touched the latch, the operator never
> re-verified crypto. And *the system was never trusted to be fine* — it
> was recomputed fine, at every step. That is the crew law, lived once,
> end to end.
---
## Session 8 — Graduation: toward the real thing
### 8.1 What changes with a real wallet
The demo you have been flying is custody-inert: fake members, throwaway
keys. The real path — read it now, walk it when you mean it:
1. **Build the quorum from the pinned proven sources:**
`pacta wallet build-quorum --sources-root <fork-checkouts>` — four real
verifier binaries, four real fingerprints.
2. **Fetch real evidence** for every member from the live log:
`pacta log-fetch --url https://ltl.zkdefi.org --component <each>`.
3. **Seal the wallet — the R4 gate in executable form:**
`pacta wallet init --wallet <dir> --evidence <dir> --log-public-key
log.pub --trusted-provider <name>` — it *refuses* to seal below
end-to-end evidence coverage. A wallet that cannot prove its bench is a
wallet that does not open.
4. **Write policy before you need it:** `pacta wallet policy --wallet <dir>
--init-template`, then edit limits and allowlists while nothing is at
stake.
5. **Decide the air-gap story** (which machine holds the key, who walks the
files) — and only then let value near it.
### 8.2 Running this as a study club
The capstone was built for a table of people: one chair each, artifacts
passed as real handoffs, the deck on a shared screen. Rotate chairs and
re-run it — the incident reads completely differently from inside another
role, and *that* discovery is the club's graduation. (One person plus an AI
agent works too: the agent takes the chairs you are not sitting in — but it
must obey the same law you learned: one chair at a time, handoffs in
writing.)
### 8.3 Where this manual ends
- The **paper** — the transparency model, the accountability games, and the
honest limits, with full rigor: linked from the estate map's log dossier
and at `ltl.zkdefi.org/paper`.
- The **blog** (`blog.zkdefi.org`) — the narrative pieces, including what
the log does and does not promise.
- **`WALLET.md`** and **`docs/`** in this repository — the wallet's
reference documentation, threat model, runbooks, product lineup.
- The **curriculum repository** (`verifying-crypto-with-lean`) — if Session
5 left you wanting the mathematics itself, that is its course.
You came in as one person. You leave as a crew that happens to share a
body — and you know which chair you are sitting in at every moment.
---
## Appendix A — command reference by chair
*All read-only against the demo wallet except where marked ⚠ (mutates
wallet state — real operations, operator's deliberate acts).*
| Chair | Command | What it does |
|---|---|---|
| any | `pacta wallet cockpit --demo` | seal + serve a throwaway demo wallet |
| any | `pacta wallet cockpit --wallet DIR` | serve the cockpit over a wallet |
| any | `pacta wallet status --wallet DIR` | custody posture (capsule, latch, ledger) |
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
| Proposer | `shasum -a 256 payload.bin` | the payload fingerprint, born |
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
| Proposer | `pacta wallet mcp --wallet DIR` | the front door (then `request_signature`) |
| Proposer | `pacta wallet treasury-verify --wallet DIR --tx-file f` | quorum-verify a transaction's signatures |
| Quorum | `pacta wallet build-quorum --sources-root DIR` | rebuild members from pinned proven sources |
| Operator | `pacta wallet verify-ledger --wallet DIR` | recompute the full hash chain |
| Operator | `pacta sth-refresh --url URL --sth-store F --log-public-key K` | advance the log pin (split-view defense) |
| Operator | `pacta witness-audit --published-dir DIR` | re-verify a log clone's entire history |
| Operator ⚠ | `pacta wallet unlatch --wallet DIR --note "cause"` | clear the latch; note recorded forever |
| Cryptographer | `pacta receipt-verify --attestation A --receipt R --log-public-key K` | verify one receipt (add `--sth-store`, `--max-sth-age-seconds`, `--require-verified-verifier` to harden) |
| Cryptographer | `pacta log-fetch --url URL --component C` | fetch + locally verify fresh evidence |
| Cryptographer | `python3 verify.py --all` (in a log clone) | replay the whole log offline |
| Architect | `python3 scripts/mini_pytest.py` | run the suite, incl. the drift tripwire |
## Appendix B — self-test answers
**0.1** No single program is trusted: four independently built, formally
verified verifiers must unanimously agree before the wallet trusts a
component; disagreement freezes custody and is recorded.
**0.2** Gray would mean "status unknown, presumed fine." In custody,
unverified must look as alarming as broken — so unknown renders red
(FAILED TO VERIFY), never neutral.
**0.3** Newcomer, Proposer, Quorum bench, Operator, Cryptographer,
Architect.
**1.1** It recomputed the underlying fact from the wallet's files at
request time, and it stamped a provenance line naming the function and
timestamp that did it.
**1.2** Red-failed = a check ran and failed; red-could-not-check = the check
could not run. Visually identical on purpose: both must stop you, and a
distinction would invite "it's probably just the checker."
**1.3** The verdict, in words, at the top.
**2.1** The fingerprint commits to the exact bytes; a description can match
many byte strings (and can be argued about later). Both sides hash
independently and compare — no trust in transcription needed.
**2.2** `code` = which rule fired; `missing` = the precise unmet
precondition; `remediation` = what would make the same request succeed.
**2.3** Read the receipt and remediate; resubmit unchanged if the receipt
says the block is temporary (e.g. latch); escalate in writing to the
Operator. Not on the list, ever: self-approve, touch the device, edit
policy.
**3.1** Unanimity trades availability (any seat can halt custody) for the
guarantee that a single honest seat defeats a quiet lie. Majority would
keep trading through exactly the event the system exists to catch.
**3.2** Pinning proves the binary on disk is byte-identical to the one
sealed in the capsule. It does not prove the binary was honestly built from
the attested sources — that is the reproducible-builds gap, closed only at
grade R5 (which nothing holds yet, and the estate says so).
**3.3** A success of the mechanism (the lie or fault did not pass), whatever
it cost in downtime. For the seat: the job working. For the estate: the
premium it agreed to pay.
**4.1** Alive = Operator, with probes (HTTP GET, git checks). Honest =
Cryptographer, with recomputation (receipt-verify, offline replay).
**4.2** Never force-push, never edit/delete under `entries/`, never re-sign
a published head, never backdate. The tempting one is re-signing "to fix a
mistake" — and it is absolute because one corrected head destroys the only
thing the log sells: that this never happens.
**4.3** Because every entry contains the hash of the previous one, the
chain is checked from genesis forward; the first entry whose stored link
fails to recompute is where verification stops and reports. The tamper was
*in* entry 1, so the chain broke *at* entry 1.
**5.1** It tells you: this exact statement is permanently recorded in the
log under a validly signed head, and the artifacts are internally
consistent. It does not tell you: that the statement's content is true
(replay decides that), that the verification it describes was competent, or
anything beyond the certificate's stated boundary.
**5.2** Two conflicting signed tree heads at the same tree size, in one log
context. Only the operator's key can produce signed heads, so two
conflicting ones are transferable proof of double-speak, attributable to
the key holder — no interpretation needed.
**5.3** Each sabotage hit a different layer (log signature chain,
attestation content hash, key parsing), and the verifier reports the layer
that failed. Distinct failures mean a debuggable verifier — and are
themselves evidence the checks are real and separate, not one theatrical
boolean.
**6.1** Loop 1: the log's signing machinery runs on an Ed25519
implementation that is itself verified and attested inside the log it
signs (leaf 8). Loop 2: leaf 12 is the kernel-checked mechanization of
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
the accumulator arguments the log itself relies on — the proofs about the
machinery live in the ledger the machinery protects.
**6.2** Because "what is running" is invisible from any single machine and
rots fastest in memory; carrying runtime on the map makes staleness a
checkable property instead of folklore.
**6.3** (1) Check whether the generator still produces the old file — if
so, the fix is a time bomb. (2) Fix the generator, regenerate, verify
byte-identity with the intended output. (3) Add the tripwire test that
fails on generator/output drift. (4) Only then consider the incident
closed — and write the note.
## Appendix C — glossary and further reading
Every term this manual uses — capsule, seat, pin, grade, ledger, latch,
incident, refusal receipt, air gap, attestation, receipt, provenance,
station — is defined in plain language in the cockpit's **Guide**
(`/guide`), which is the manual's companion reference. The estate map
(`/estate`) is the territory's picture; `ESTATE.md` is its committed twin;
the paper and blog (Session 8.3) are the deep end. Go sit in a chair.