From f54e47778bad60e9d4f0f7de367be30a0f991290 Mon Sep 17 00:00:00 2001
From: mrwulf
Date: Sun, 16 Aug 2026 16:49:44 +0200
Subject: [PATCH] =?UTF-8?q?site:=20the=20socratic=20round=20=E2=80=94=20ev?=
=?UTF-8?q?ery=20stale=20claim=20fixed,=20every=20printed=20command=20runs?=
=?UTF-8?q?,=20first-use=20glosses?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Operator-found (and root-caused): the v0.11 card replace had silently
no-opped on an invisible NBSP in 'vs.\xa0today' — the page said 23 pages
and still carried the July-snapshot card one paragraph under the 'New in
v0.11' sentence. Fixed by byte-anchored replace with post-assert; a
source regression test now forbids the stale markers outright and
check-paper.sh binds the page-count claim to pdfinfo.
Executability (tested by actually running them): the printed curl had no
scheme and returned empty through the redirect -> https form; the
zero-install one-liner was missing its cd -> added; 'Standard-library
Python only' contradicted the openssl requirement stated 20 lines
earlier -> made honest; 'table above' pointed at a table that is below
-> below; '~25 lines of Python' vs the 346-line fail-closed verify.py ->
'one-page core (paper Appendix C), shipped verify.py wraps it'.
Comprehensibility (fresh-eyes audit, 28 findings triaged): first-use
glosses for STH, axiom cones, certificates, pinning, split view,
pins.json, trusted base, residual-risk list, R0-R5, signature tiers;
Lean 4 linked; Merkle accumulator glossed; operator=provider declared;
the ✗-leaves explained as the failed round 1 vs clean re-attest; the
flagship self-reference gets a plain lead sentence; TOFU named and
bounded; pacta install source at the first pacta command; coined verb
'machine-re-check' uncoined; pitch parenthetical trimmed (SLH detail
lives in its own block).
Suite 153 green (new: webdocs stale-claim regression test).
---
paper/check-paper.sh | 8 +++
paper/ltl.pdf | Bin 219017 -> 219017 bytes
provider/src/pacta_provider/webdocs.py | 69 ++++++++++++-------------
tests/test_web_and_witness.py | 22 ++++++++
4 files changed, 64 insertions(+), 35 deletions(-)
diff --git a/paper/check-paper.sh b/paper/check-paper.sh
index 755fd94..4624af8 100755
--- a/paper/check-paper.sh
+++ b/paper/check-paper.sh
@@ -69,6 +69,14 @@ VERSION=$(grep -oP '\\date\{[^}]*---\s*\Kv[0-9.]+' ltl.tex || true)
pdftotext -f 1 -l 1 ltl.pdf - | grep -q "$VERSION" || fail "title page does not carry $VERSION"
! pdftotext ltl.pdf - | grep -q '??' || fail "unresolved ?? reference in PDF"
+# --- 5b. site claim binding: the webdocs paper card's page count ---------
+WEBDOCS=../provider/src/pacta_provider/webdocs.py
+if [[ -f "$WEBDOCS" ]]; then
+ STATED=$(grep -oP '\(PDF, \K[0-9]+(?= pages)' "$WEBDOCS" || true)
+ [[ -n "$STATED" ]] || fail "webdocs paper card lost its '(PDF, N pages' claim"
+ [[ "$STATED" -eq "$NPAGES" ]] || fail "webdocs says $STATED pages, PDF has $NPAGES"
+fi
+
# --- 6. render for the mandatory eye pass --------------------------------
rm -rf "$PAGES_DIR"; mkdir -p "$PAGES_DIR"
pdftoppm -png -r 110 ltl.pdf "$PAGES_DIR/p"
diff --git a/paper/ltl.pdf b/paper/ltl.pdf
index 1935968e111b527e96cd6ad9a93d494a58baef5e..6921d7da68fcb353b7bbe4152c701cb9d4c683ff 100644
GIT binary patch
delta 4654
zcmV+}64C96uMLT>4S<9JgaWh!TRsFBqgA|@Up@nwe?j6zhZ0AY%M5MK@eU>07`{hk
zJR&`;7vf0q1}1$(an4vteYkK$n{_1aS+CH_1j8~SxzV;JaimZGYwWEU{fIvu0_2ju
zOZhQxqWx*^HQ%KUx^2HzqnqQFq{Vh!z6)s>sY!PH-D;!dkv`yCtdH~;l-r^CJvc&!
zB8y`|e-UYs%>TuihCo(p;Hj%03+GDC8(mgs9d
zN9v=OKdxaVl^a8JmghQineM4Pf?+Fcu2LD>o=l@?Loy*Ab>ksYpL{Ozk-y19w5;>`
zKVSIL{u+o(JvX-Q?mvi+o6-gS
zfA~KIkg0zUpTrmGAempdU2HQAw7XJRUCdS5+TAgS)7lNe>Jl&W#5>_fChH_l3ZZ&;lwKK-b}srO@QM12G?4#qY;LyVDW
z2-PA}~Zj_|vY4>~-r$Be}-86*kWKS_{!R`ijgEiRUiqfP2~>N1lW~h+UKgg
zBF;nf#59$IVcNt^t%Bh@(T#NglVCYG5H7h(W{TvFA}M^n7r6y9C4J(7jw-dubX$?<
zSm9KwaXzI4inh_88i7i@AC_`066R=q?M$iy*#*f(6peuZ+89k+f14SGe-D<6h;bUu
zLdlww9qx!GoK&60rDu<%HQXmrM9eG$sy5B27m|q&>&_kT{HJZ%G~tN^2Br=jL^-DZ
zkc1N`koS#rRH<@Id=&GbBtv?0gWeZtD9_`jc_+^cdDlG)qq)%>$=0$IcsD;0P9G*5
zf|8EGb1Gvb4o;PYBA_4@fApBsEh;o9qzO6^ZG|FUAX30608JhmMMv3AfqrWv+bL~P
z){*U$!YK&R5|?gFuNZI%h9olR%@1$cOckVVX*z286NTX-r{UB|l(0=;4c(B5T1h4f
zUxj2^ap&HSqop?<1P?%_>CCz}Pdneq3hC7kI1@I}$hPS;@1WsQf17PHwPF>J&!JYE
zdyxnNd?mB&_=O+n2%NHg;s#@zk7S=xCfh`#jB$RYM3SUDxP)gQTx+ryd_2AGLT}xq
zYc^d}CRqExmDiB=ELtihQ+5f_sdLDZUb=DI1xXACNGy3FPaD~@X~VCuPqXwQ3VI51
zoI4#kHU@x5MEbDMf6xtJOx;jrg0Vs&y*WdE0ToNC7{ZdQOEvd6{#)(Y4G_svf*WU8
zbjBsuX2_L5bTlZ54t-}-szf9qkw{@AZhQy5R0Az&w8*Xxs3rN~id-LIII>d)lrRH5
z^(q}w6=GfU%RubiBF%a=eaOpU0!&^Gae}=ZRg%Ken!u=Of5aY+JRNy9C)u;neWET<
z=p&L4xrro179z>=i!hQrvJQq#mM#hO^fnmWBZ1y3qLdGoO_PI=Pfdg3u1PtlK$Iqb
zjCme|x#^Rs4RW-(j!XqnN!MA1^u`)kB^i3j{+8ZOz=z&ZF&22Vbc@C6C5sg|iGF%{
zDSrZkzz`o)e~F}xCKOZ+v%*)fJwjpXhhb+}?w$}Q=)=wvRmpLh#G6o~RKYS)dBB7;
zB9I-YAE$efyXJsHuL%juT%;(<$B>RH4W9Hw;v?wfaA^`3NfQb-Oyq0!Hy#m~$VVBG
zFH%s%6$M4=7ZTS_W~et3&XYrya6W~U*Qa_td*n;5e^16=+~pEDfvsCy>(t4u5|B;@
zFSbg&O(nitvaS(Y1CdIaQ;ugi=yXV9#L(9hD`@-PHe2Kl($VE(NJq7iQPPt&k@Xal
zp6CE^E5rvww#4}IA)~-Gjn*P=L~BJlBsnyKQsXV*u#VUAXtT?zE?C+k|8)IG@?<_+
z(SxKFe=lc0x=+_sAga5QWzD6J9v(k>|K@K`p1z!ap3J1WeRqC&PIX`XwOrMoAI&c2
z{IK@pbh%pmb?f+i{-OSn99zb#+;PrYER^-ZVhx_v_`^
zVtTcjFZlI1T3EmTmR=;S-tzl;?Puxj7S-|ce~kJH!c}ya&Tq?Ts#l=u4edCp?oF;9
z*3*xlQl;ZRKE9ovuRhTl9rtyY9;@Cq@LabQy+mj|1y4kS>d|U)IXyd`eY~tkqB^;p
zd|Zx{Q_>3b{?}yJu^V!CK?--8xshrojDpacs-{%v|Ancml=7wHDT;s$YIci?1DekD|F
z8!G+)s0{UgC|bfcTEgLIdGzk&`0ej&e`>@{q9t_D(t17QaI_4%7KDKkEm{CAkzUN@
zH^+Z0S_b7;q9wM_(t63{TE{Zb|DkA+VjC{;aJanw?e)W#PYQBwC=R7p8cM8~?}|gx
z48|d?O0WcqL($R}JdQ*9hsU9Q5f*T1Ue{>gVh?~zZ|4VNMQvflio>z;_XofKfByVl
zK}!FuG^>VZv2C#2mgYzx+mAZfj2kb$$;%9hvP6w<
zqb44Jnt|>Q#*Nv=jXWGT$B!T0d;hqhCfr~|Qr&DYhj9~HPR6p6q2G{*z6Uqo
z7mO&IUf$k5*ik910G1rkHD;DRHe}7gf?N3}R
zSNA?m79(l-CE9eZ6e3q;parBg+i^(JNv;sGSG)FDJ`S)koSQS_9tI-RfR-zj{(VtDaXc
zs^2Qet(sIHsJvCpa-)}t
zMpn?r!jb-KOEtR$a#$*L|Nf%~Z{MP)SCiTDMi&ircOgiBf7e2g4}+xKYhN
z(@DR*C$0IBsnn48id0Is7lHI4i$DY2ADT*;?X=tJ{Zpy*j%s1cZZMU)-bdem|I6d!
zlYWV{%-HR1#=yiuK00KTn`>ZF8nA5}aFYi;s7|V1s)yC1>T&gyGoqK(E12?|Eie1e
zwx8|Eiv}dKf2WRIM@MBC6~0uF-%?R%tLT?spFVtiH+z>?e|`Qizuc**xWB_)Yf7y3
zBzE~))0^pHc5*xNFLlz-P5Mqa^=(ysp3aZ~rNov7tQYk;r?x3f=FB!-OcsmzpE*j>
z>G_9Cj-Sm%Dw@?F`F*LB8edLUtLa(2nqSc%{1ZQCe=H}$$b;&vo?cFgHFT5DQ!gJ-
z1t0WUU|_fC_k=>|rc|LcSFv#!Z>O{4*>bwRE-;aklFbb0(d&D!ej~!>v-u7%IJq|%
zkf%3hi_^8)Dy0rclHqV}YeE58t&pw_h1iC|I*IyPPDlDV+fUZ%-S{74cE8`f``hbh
zZQT#2e>qOwpw+qF`6WDLq#u~2pD*=3wnUwOPM~9T5C!aR`OnYbsJdEAA?_{6?__&V
zEvSwbqW|_u#FH1#e|hj*llJ;y1>D$l(Dx!eG)qF1O=1$!4p8~6%C-FWP4Wl0-Ba#n
zXOgcDO7egC?e9;1d(z5jcL?A7TatX)W@Oky-Xc8DLQ%l;@4Nt
zwu9XbOp3bCJN16gJ3W%vR>bVtNkMfslOiE@ht0k@k>4>Vii2~aA?cNKqV^+BeaIuu
ze}V1~ofG-($5uY?9^ZS$5s(u9IPCLoY(^Aa-;4+o*W2{=jWmv)
ziQ9IX9mMvGD9wk`Y-l|fDonGV(ftG-x(iBDv~n$RP_Q|Ebobu#hb>3EL-78FgN+J9
zvz)Y^PwzN%qD|wBdoXP=x2Arj$agWhr_8$#tXz>yxx*G&PVT;YaQ{XB6TX(T<4xtT
zQS?Rjp2wP{u)EKwXii?PdiHa*r+B-MjPypjCLDz5_wSy)JLyc)-Jp!UxVed%f9=gu
z4FFC5E`^2%@u58>4xPtF+cUI6;5!-JQ|xiqV#I-u>h3;%^z6l({!I=ok;|Kcbh&+mcRS0^N!_RNhL~Yi3tTw>weo~L!U};_9OUij!o;nvo&ojx*^U-Jbo<3|`
z+k>yGdbWfE+_41Y_nw=H>)^g~f9;2#xbQL{c@ytdTk4$vNsqv4T7_F(ZO%WeHs_zG
z=joy@SBI|SeouYqU9&cESh{%k)vqTnUga!mc!9{^y9}e>o9i6H0xv
z9CR}~RtF?m%;rpc6QVg}6Jmew2k%#vdTTZp?e(*{vU*BB))w1M7kn|>h~7i{z??Xe(7|LvUq{P5uLBx^P#gjxb*WrhW
zln-;-P1EYu?2_`dp=XP{-ZAuKk$&R7c)ED7z+9OtkxGhmiMAe=850qilO`JH{{aA-
ztRt842m=$BsZawNLNhsIG-EVnHf3QpHZW!|Wj8c7V=^>0Vqs!pIb>xuVm>@GIb$?q
kG-WnrVKz1}W-w(pG&W;0G&W*kVq!UDWi?{A1yKWp26AFBtN;K2
delta 4654
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
slh_block = ""
return f"""
This key is the sole cryptographic identity anchor: it
-authenticates that these statements were made by the operator. It does not, by itself, make
+authenticates that these statements were made by the operator (the same party the artifacts call “the provider”). It does not, by itself, make
those statements true — each attestation's truth additionally rests on the replay, theorem,
-extraction and toolchain assumptions stated in that leaf. Every tree head and attestation is
+extraction and toolchain assumptions stated in that leaf (one signed entry of the tree below). Every tree head and attestation is
signature-checked against this key.
-Pin it, and compare this copy byte-for-byte with the independently hosted
-mirror copy; they must be identical.
+Pin it (save your own copy; from then on trust only what checks against that copy), and compare this copy byte-for-byte with the independently hosted
+
mirror copy; they must be identical. The first fetch is trust-on-first-use; the two-host byte-comparison is what bounds it.
{pem}
SHA-256 fingerprint {escape(fingerprint)}
· raw: {base or ''}/log-public-key
- · curl -s ltl.zkdefi.org/log-public-key
+ ·
curl -s https://ltl.zkdefi.org/log-public-key
{slh_block}
"""
@@ -197,11 +197,10 @@ def render_docs(log: TransparencyLog, base_path: str) -> str:
· cv
LTL — the Lean Transparency Log
One sentence: a public, append-only Merkle
-accumulator of signed statements that the Lean 4 formal proofs of specific
-cryptographic Rust libraries, at specific git commits, machine-re-check with exactly
+accumulator (a hash tree that only ever grows) of signed statements that the Lean 4 formal proofs of specific
+cryptographic Rust libraries, at specific git commits, re-check by machine with exactly
their documented assumptions — so that you can trust a proof result by checking
-one required signature (Ed25519; heads from tree 14 add an additive post-quantum
-SLH-DSA signature) and ~{max(1,(latest.get('tree_size') or 1).bit_length())} hashes in
+one required signature (Ed25519) and ~{max(1,(latest.get('tree_size') or 1).bit_length())} hashes in
milliseconds, instead of running a theorem prover for hours.
The trust anchor — pin this key
@@ -211,10 +210,10 @@ milliseconds, instead of running a theorem prover for hours.
{tree_svg}
verified attestation (all certificates proven, axiom cones boundary-exact)
-historical audit-failure attestation — kept forever; an append-only ledger does not erase its bad day
+historical audit-failure attestation — kept forever; an append-only ledger does not erase its bad day (leaves 0–3: an early audit round that failed; leaves 4–7 re-attest the same four libraries cleanly)
Every box above is computed from the live log at page render — leaf hashes,
-internal nodes, the root, and the signature are the real ones. Before signing this
+internal nodes, the root, and the signature are the real ones. The code that signs the log is itself an entry in the log — and checks its own entry before signing. In detail: before signing this
root, the provider Merkle-verified its own signing library's leaf
(index {provenance.get('signing_library_leaf_index','?')},
certificates {escape(str(provenance.get('signing_library_certificates_proven','?')))})
@@ -237,12 +236,12 @@ identical.
this site · mirror |
| 2 | <library>.attestation.json |
The claim. Which repo, which exact git commit, which theorems,
-which observed axiom cones, what machine protection — signed by the provider. |
-table above, or mirror entries/ |
+which observed axiom cones (the exact set of assumptions each proof ultimately rests on), what machine protection — signed by the provider.
+table below, or mirror entries/ |
| 3 | <library>.receipt.json |
The proof of inclusion. Binds artifact 2 into the signed tree:
-leaf index, sibling hashes, the Signed Tree Head. ~25 lines of Python verify it (stdlib hashing; signature checks shell out to the openssl binary). |
-table above, or mirror receipts/ |
+leaf index, sibling hashes, the Signed Tree Head (STH). A one-page Python core verifies it — printed as Appendix C of the paper; the shipped verify.py wraps that core with full fail-closed binding checks (stdlib hashing; signature checks shell out to the openssl binary).
+table below, or mirror receipts/ |
| + | the full mirror clone |
Maximal benefit: become a witness. Every leaf + every signed head
ever issued + verify.py (Python stdlib + the openssl binary for
@@ -257,17 +256,19 @@ consumers.) |
Attested libraries
| component | artifact 2 | artifact 3 | status |
{rows}
+One certificate = one machine-checked theorem together with its exact assumption set (its axiom cone).
+
Three ways to use it
Quick check (any machine, milliseconds): download
artifacts 1–3, then
pacta receipt-verify --attestation … --receipt … --log-public-key provider.ed25519.pub
-
No Lean, no Rust, no account. Add --sth-store pins.json for split-view defense.
-
Zero-install audit: git clone {mirror} && python3 verify.py --all
-
Standard-library Python only. You become a witness of the whole history.
+
No Lean, no Rust, no account. The pacta CLI ships in the pacta repository (pip install . from a clone). Add --sth-store pins.json to remember every Signed Tree Head (STH) you accept — your defense against a split view (the operator showing different histories to different consumers).
+Zero-install audit: git clone {mirror} && cd lean-transparency-log && python3 verify.py --all
+
Standard-library Python plus the system openssl binary (signature checks fail closed without it). You become a witness of the whole history.
Autonomous agent: the
pacta
tool adds STH pinning, freshness policy, online refresh from this service, risk scoring
-(R0–R5) with policy-gated consequences, and optionally verifies every signature through
+(R0–R5, six named residual-risk classes) with policy-gated consequences, and optionally verifies every signature through
the proof-attested Ed25519 code path itself (
--require-verified-verifier).
@@ -290,19 +291,19 @@ view.
does not mean A verified binary. The
proofs cover Rust source; clone the attested commit (the commit id identifies the
committed git tree — not external dependencies, toolchain downloads, or generated artifacts) and
-build it yourself — compiler and build are declared trusted base
-until the reproducible-builds program (R5) lands. Every attestation carries its full
-residual-risk list. Honesty about the boundary is the product.
+build it yourself — compiler and build are declared trusted base (assumed, not proven)
+until the reproducible-builds program lands and retires risk class R5. Every attestation carries its full
+residual-risk list — the enumerated assumptions inside its attestation.json. Honesty about the boundary is the product.
You hold the ruler
The list of assumptions a certificate is allowed to rest on
is not something this site hands you at verification time — it is a
requirements card that lives in your tooling, on
your disk, and that you can read in five minutes or rewrite from first
-principles: Lean's three foundational axioms, plus — for the signature tiers only —
+principles: Lean's three foundational axioms, plus — for the signature tiers only (the top proof layers, where full signature verification is proven) —
named placeholders for SHA-512 and the wire format. Your tooling ignores this
operator's pass/fail labels entirely and re-derives every verdict by comparing the
-attestation's observed axiom list against your card, name by name.
+attestation's observed axiom list (its cone) against your card, name by name.
The operator is trusted to copy down what the proof kernel printed — never to
interpret it.
A card you write yourself will match this log's supply
@@ -312,13 +313,13 @@ shrunk until every remaining axiom justifies its existence. If your card is
negotiate — the gap is itemized, never blurred, and you have three honest options:
accept a
named line item, walk away, or prove the missing piece and enter it
into this same log.
If your ruler is stricter than our supply, your ruler is
-our roadmap. (The full walk-through is lecture 11 in the
-
course.)
+our roadmap. (The full walk-through is lecture 11 of the Jupyter course in the
+pacta repo.)
The paper
Accountable Distribution of Machine-Checked
Correctness Evidence: A Transparency Model and the Lean Transparency Log
-(PDF, 23 pages,
v0.11 — revised August 2026; the version is printed on the
+(PDF, 25 pages,
v0.11 — revised August 2026; the version is printed on the
title page) — the trust decomposition (expensive verification produces an
observation; transparency makes the observation accountable; consumer-local policy decides
acceptance), collision-extracting soundness for inclusion and consistency, scheme-level
@@ -334,14 +335,12 @@ instantiation section for the SLH-DSA (FIPS 205) verify path — eleven cer
five uninterpreted hash oracles, exact cones — and a certificate appendix mirroring the
Ed25519 tiers.
-The paper's snapshot vs. today's log. The paper analyses
-the log's 16 July 2026 snapshot — thirteen leaves, still leaves 0–12 today,
-byte-identical, its pinned head still head #5 of sth-history.jsonl. Everything
-since is additive: the four Ed25519 corpora re-attested at 44 certificates each
-(leaves 13–16), the accumulator's hardened model (leaf 17), the first post-quantum
-subject (leaf 18), and dual-signed heads from tree 14 on.
-python3 verify.py --all re-verifies the paper-era prefix together with everything
-after it.
+Paper and log, one story. Since v0.11 the paper
+describes this deployment as it runs — nineteen leaves, dual-signed heads, the
+post-quantum verify path as leaf 18 with its own certificate appendix. The log is
+append-only and keeps growing past any paper revision; every number the paper states
+stays checkable against the retained history: python3 verify.py --all
+re-verifies all of it, paper-era and after, from a clone of the mirror.
Log heads are signed offline; this service is read-only and holds no
key material. Provider tooling, agent tooling, and the full Jupyter course live in the pacta repository.
diff --git a/tests/test_web_and_witness.py b/tests/test_web_and_witness.py
index 30995e4..27870a5 100644
--- a/tests/test_web_and_witness.py
+++ b/tests/test_web_and_witness.py
@@ -159,3 +159,25 @@ def test_standalone_verify_py_runs(tmp_path):
assert result.returncode == 0, result.stdout + result.stderr
# hardened verifier: full mode (signatures verified) must report exactly this
assert "RESULT: OK [full]" in result.stdout
+
+
+def test_webdocs_source_carries_no_stale_paper_claims():
+ # Regression for the 2026-08-16 operator finding: the paper card said
+ # "23 pages" and the July-snapshot card survived a silently failed
+ # replace (an invisible NBSP defeated the pattern). Guard the shipped
+ # STRINGS, not just version markers.
+ from pathlib import Path
+
+ source = Path(__file__).resolve().parents[1] / "provider" / "src" / "pacta_provider" / "webdocs.py"
+ text = source.read_text(encoding="utf-8")
+ for stale in ("snapshot", "thirteen leaves", "16 July", "16 July",
+ "16\xa0July", "v0.9", "v0.10", "23 pages"):
+ assert stale not in text, f"stale marker {stale!r} in webdocs"
+ # printed commands must work as printed: curl needs the scheme
+ # (http->https redirect yields empty output), the clone one-liner
+ # needs the cd into the cloned directory
+ assert "curl -s ltl.zkdefi.org" not in text
+ assert "cd lean-transparency-log" in text
+ # first-use glosses the page promised: STH and axiom cones
+ assert "Signed Tree Head (STH)" in text
+ assert "axiom cones (the exact set of assumptions" in text