Compare commits

...

2 commits

Author SHA1 Message Date
42e585ac37 Runbook: A3b (key backup) completed by operator, 2026-07-14
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 17:17:27 +02:00
b7ab1811d7 docs: optimistic-accountability essay (rollup ↔ LTL mapping + what the tree actually holds); wired into runbook B7
Parked blog-post source, publishes after entry 13 (so it can end with
a live leaf link). Part I: the tree holds verification-event records
(operator claims that name their own evidence via commit+toolchain
pins), not the Lean proofs; three-layer guarantee table (kernel /
replay pin / accumulator). Part II: the optimistic-rollup resemblance
made precise — two fraud layers (log-layer: Theorem 3 as a
constructive fraud-proof generator; claim-layer: replay with an
infinite challenge window), the honest enforcement gap (reputational
vs economic slashing, CT lineage), the watcher/liveness assumption,
and the inversion (validity-proven payload in an optimistic envelope;
entry 13 = formally verified fraud-proof machinery).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:27:30 +02:00
2 changed files with 140 additions and 2 deletions

View file

@ -44,7 +44,7 @@ Agent Appendix at the end. Every step ends in a mechanical check.
| pacta | github.com/saymrwulf/proof-aware-crypto-tooling-agent | `3d81d53` (change-frozen during paper processing) | | pacta | github.com/saymrwulf/proof-aware-crypto-tooling-agent | `3d81d53` (change-frozen during paper processing) |
| Forgejo mirrors | `https://zkdefi.org/saymrwulf/<repo>.git` (anonymously readable) | pull-synced by server cron nightly 03:00 UTC (`/home/admin/cloud/bin/reconcile-mirrors.py`, log `.reconcile.log`); verify per step A5 | | Forgejo mirrors | `https://zkdefi.org/saymrwulf/<repo>.git` (anonymously readable) | pull-synced by server cron nightly 03:00 UTC (`/home/admin/cloud/bin/reconcile-mirrors.py`, log `.reconcile.log`); verify per step A5 |
| log public key | `lean-transparency-log/provider.ed25519.pub` (PEM) | fingerprint `874c8a00…a56a` in `log-metadata.json` | | log public key | `lean-transparency-log/provider.ed25519.pub` (PEM) | fingerprint `874c8a00…a56a` in `log-metadata.json` |
| log PRIVATE key | **RESOLVED 2026-07-12**: laptop-side, mode 0600, inside a gitignored state dir of the pacta working tree (exact path in operator-private notes, deliberately not in this public file); public half byte-matches `provider.ed25519.pub`. NOT on the droplet. **No second copy exists** — see step A3b | A3 done; A3b (backup) open | | log PRIVATE key | **RESOLVED 2026-07-12**: laptop-side, mode 0600, inside a gitignored state dir of the pacta working tree (exact path in operator-private notes, deliberately not in this public file); public half byte-matches `provider.ed25519.pub`. NOT on the droplet. **No second copy exists** — see step A3b | A3 done; A3b done (operator, 2026-07-14) |
| producer driver | **RESOLVED 2026-07-12**: it exists and is committed — pacta's `provider/` CLI (`python3 -m pacta_provider`: `check` → signed attestation; `log-append` → leaf + signed STH + receipt; `log-publish` → public face). Heads are signed with `signing_backend: verified-dalek-serial` (the dogfooded verified signer), `self_inclusion: verified`. Only the per-run orchestration was session work | see step A4 (rehearsal, not reconstruction) | | producer driver | **RESOLVED 2026-07-12**: it exists and is committed — pacta's `provider/` CLI (`python3 -m pacta_provider`: `check` → signed attestation; `log-append` → leaf + signed STH + receipt; `log-publish` → public face). Heads are signed with `signing_backend: verified-dalek-serial` (the dogfooded verified signer), `self_inclusion: verified`. Only the per-run orchestration was session work | see step A4 (rehearsal, not reconstruction) |
| server deployment | private repo `PersonalCloudServer` (github, `master`) — since `a186bac` includes the ltl vhost/service/reconstruct.py, md5-verified == droplet | see its `DEPLOY.md` § "The LTL service" | | server deployment | private repo `PersonalCloudServer` (github, `master`) — since `a186bac` includes the ltl vhost/service/reconstruct.py, md5-verified == droplet | see its `DEPLOY.md` § "The LTL service" |
@ -115,7 +115,9 @@ throwaway copy is then DELETED (its head was signed with the real key
over a rehearsal tree — it must never be published or retained; if over a rehearsal tree — it must never be published or retained; if
retention is wanted for study, rehearse with a throwaway KEY instead). retention is wanted for study, rehearse with a throwaway KEY instead).
### A3b. Back up the signing key (opened 2026-07-12 — the key has NO second copy) ### A3b. Back up the signing key — **DONE (operator, confirmed 2026-07-14)**
Completed by the operator; the procedure below is retained as the
reference for future key-backup refreshes.
The laptop file is the only copy in existence; a disk failure would The laptop file is the only copy in existence; a disk failure would
freeze the log at its current size forever (still verifiable, never freeze the log at its current size forever (still verifiable, never
extendable). Operator-only: create an ENCRYPTED backup (e.g. extendable). Operator-only: create an ENCRYPTED backup (e.g.
@ -215,6 +217,12 @@ naming. **Check:** SD hashes match the repo files.
specializations; fidelity = pinned-family testing, extensional specializations; fidelity = pinned-family testing, extensional
equality false one-sided; Theorem-3 pinned-pair side condition; equality false one-sided; Theorem-3 pinned-pair side condition;
§10(i)/(v) phrasings) — paper repo, its own commit. §10(i)/(v) phrasings) — paper repo, its own commit.
- Publish the accumulator blog post: source parked at
`docs/optimistic-accountability.md` (this repo) — condense to the
blog's voice, END WITH A LINK TO THE LIVE LEAF (that is why it
waited), operator reviews, then one .md into PersonalCloudServer
`blog/posts/`, `build-blog.py`, rsync per its DEPLOY.md. Closes the
"one post per public repo" gap for this repo.
- One-line note in this file: date, leaf hash, head root. Commit. - One-line note in this file: date, leaf hash, head root. Commit.
--- ---

View file

@ -0,0 +1,130 @@
# Optimistic by construction: what the LTL holds, and what it shares with rollups
Status: essay / parked blog-post source. Per the operator's decision,
the blog version publishes only AFTER entry 13 is live (runbook B7),
when the closing claim — "the log carries kernel-checked proofs of its
own machinery" — becomes literally true and the post can end with a
link to a live leaf the reader can verify in one command.
---
## Part I — What is actually inside the Merkle tree
A persistent misreading of transparency logs is that they "contain the
proofs." The LTL's tree contains none of the Lean mathematics. Each
leaf is (the 32-byte hash of) a **verification-event record**: a
signed attestation stating that the provider, at a given time, ran the
proof checks on a named subject repository at an exact commit, with an
exact toolchain, and observed a specific result — every certificate
verified, each with an exactly-listed axiom cone. The records are
published beside the tree (`entries/`); the proofs themselves live one
hop further away, in the subject git repositories the records pin.
So a leaf is a statement *about the operator's action* — "I verified
X" — and on its face that sounds like "trust me." The design's whole
point is the refinement that removes the trust: **the claim names its
own evidence.** Because the leaf pins commit hash and toolchain,
anyone can replay the verification and check the operator's statement.
The log converts
> "I guarantee I verified the proofs (which live elsewhere)"
into
> "I claim this, permanently and publicly, with enough detail that
> anyone can catch me lying — and I can never unsay it, edit it, or
> show a different history to someone else."
Three layers, three distinct guarantees, and most confusion comes from
expecting one layer to do another's job:
| layer | guarantees | does NOT guarantee |
|---|---|---|
| Lean kernel (inside the subject repos) | the mathematics of the attested proofs is true, given the declared axioms | anything about what the operator later claims |
| replay pin (leaf content) | the operator's claim is CHECKABLE — re-run the pinned commit and compare | that anyone has actually re-run it |
| Merkle accumulator + signed heads | inclusion (Thms 12), append-only history (Thm 3), equivocation evidence (Prop 1): claims cannot be altered, hidden, or forked without producing cryptographic evidence | that any claim is TRUE — the ledger notarizes, it does not referee |
The notary metaphor is exact: a notary does not check that your
contract is wise; the notary makes it impossible to later dispute
*what was stamped and when*, and the bound ledger makes tampering
evident. The LTL is a notary whose every stamped page happens to carry
instructions for independently re-checking the page's claim.
## Part II — The optimistic-rollup resemblance (it is not a metaphor)
Optimistic rollups rest on one bet: *claims are cheap to make and
expensive to get away with*. A sequencer posts state roots without
proof; safety comes from anyone's ability to produce a fraud proof
from public data, and from punishment when they do. The LTL — like its
direct ancestor, Certificate Transparency (RFC 9162) — is built on the
same bet: record everything append-only, and make misbehavior generate
publicly verifiable, transferable evidence.
The fraud-proof analogue exists in the LTL at two distinct layers:
**1. Log-layer fraud (operator rewrites or forks history).** Here the
resemblance is nearly literal, and it is exactly what this corpus
mechanized. Theorem 3 (`extractCons_correct` / `acceptCons_sound`)
states: if the verifier accepts a consistency proof between a pinned
head and a rewritten history, the named extractor **outputs a SHA-256
collision as two concrete byte strings**. That is a fraud proof in the
strict sense — and a constructive one: the adversary's own accepted
messages are compiled into the evidence against them. Equivocation has
the same shape: two conflicting signed heads ARE the fraud proof, and
the consumer's pin-store is the watchtower that collects them. Even
the rollup's liveness assumption transfers: someone must actually
watch (a pinned consumer, a mirror, a `witness-audit` run). An
unwatched log, like an unwatched rollup, is safe only on paper.
**2. Claim-layer fraud (a leaf's content is a lie).** The log does not
validate Lean proofs on append — it records the claim. That is the
optimistic part. The fraud proof here is **replay**: the leaf pins
everything needed to re-run the check, and the failed replay is the
demonstration. Two properties compare favorably with rollups: the
challenge window is *infinite* (append-only preserves the crime scene
forever — a false leaf cannot be reverted, only exposed, and its
permanence is the exposure), and no adjudicator is needed — the fraud
proof is reproducible by every reader independently.
**Where the analogy honestly stops: enforcement.** A rollup's fraud
proof triggers protocol-native consequences — state reverts, bonds are
slashed, money moves. The LTL has no bond, no slashing, no revert.
Evidence leads to out-of-band consequences (consumers stop trusting;
the evidence is publicized), exactly as in CT, where the "slash" is a
browser distrusting a CA. Same detection architecture, different
enforcement layer: cryptographic accountability with reputational
rather than economic stakes. Bolting on economic slashing would
require on-chain adjudication of "the Lean replay failed" — a
fraud-proof VM able to run a proof checker; theoretically the same
construction rollups use, practically a research program. The
pragmatic dual, implemented in this estate, is consumer-side defense:
warden's quorum of independently attested verifiers, instead of
prover-side bonding.
**The inversion worth savoring.** Rollup design treats "optimistic +
fraud proofs" and "validity proofs" as competing answers for the same
object. This stack uses both, one inside the other: each leaf's
*payload* is validity-proven in the strongest available sense (the
Lean kernel — no optimism, no challenge window), while the *envelope*
carrying it is optimistic/accountability-style. And entry 13 closes a
loop that optimistic rollups themselves aspire to and largely lack:
**formally verified fraud-proof machinery**. The mechanized theorems
say precisely "this fraud-proof system cannot fail to convict" — any
accepted rewrite yields the collision, constructively. Production
rollups would love a kernel-checked proof of their fault-proof
interpreters; this log will carry one for its own — inside the very
ledger it protects.
## Pointers (for the eventual blog rendering)
- Mechanized statements: `STATEMENT-MAP.md` (this repo); the fraud-
proof-generator reading of Theorem 3 is `extractCons_correct` +
`acceptCons_sound`; scope boundaries in `KNOWN-GAPS.md` (esp. gap 14:
the deployed-verifier side condition; gap 4: the signature layer,
where equivocation-evidence transferability lives).
- Deployed anatomy: leaf → `entries/NNNNNN.json`; head →
`latest-sth.json` (+ `sth-history.jsonl`); the head is signed by the
dogfooded verified-dalek backend (`self_inclusion: verified`).
- Lineage: RFC 9162 / Certificate Transparency — the original
accountability-over-validity system; the LTL is CT's discipline
applied to formal-verification claims.