proof-aware-crypto-tooling-.../provider/src/pacta_provider/webdocs.py

373 lines
25 KiB
Python
Raw Normal View History

The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
"""The LTL website, served at the log's base path — one self-contained HTML
page (inline CSS + inline SVG, no external assets: works air-gapped behind
any reverse proxy). Rendered from the LIVE log state, so the graphic and
every number on the page are the accumulator, not a brochure about it."""
The log goes public: git-published mirror, online service, witnesses Three synchronized faces of one log - transport orthogonal to trust: - PUBLISHED GIT MIRROR: log-publish exports the public face (one file per leaf so git history mirrors log history; the FULL STH history as the witness channel; per-component attestations + receipts; the provider public key; a standalone stdlib-only verify.py and customer README). Live at github.com/saymrwulf/lean-transparency-log (genesis: 8 leaves incl. the honest failed-run entries, dogfood-signed head). - ONLINE SERVICE (pacta_provider serve): read-only, zero-dependency HTTP with CT-style endpoints under a base path for zkdefi.org/lean-transparency-log - /v1/sth, /v1/sth-history, /v1/sth-consistency?first=N, /v1/proof, /v1/attestation, /v1/entries, /v1/metadata, /healthz - plus self-contained customer documentation at /docs (current state, attested components, API, the verify- without-trusting-this-site path, and the means/does-NOT-mean boundary). The process never loads private keys: heads are signed offline; a compromised server can withhold or replay (pinning + freshness detect both) but never forge. STH history now recorded append-only by the provider (with a backfill head signed for the existing log). - AGENT ONLINE CLIENT: pacta log-fetch (download evidence; explicitly UNVERIFIED until receipt-verify runs - transport is not trust) and pacta sth-refresh (fetch head, verify signature, advance the pin via an online consistency proof from the pinned size; fail closed). - WITNESSES: pacta witness-audit over a clone of the published mirror recomputes every prefix root from the public leaves and checks every historical head + signature - no consistency proofs needed when the leaves are public. Tampering one published entry trips both the leaf-hash check and the prefix-root check (tested). verify.py gives customers the same audit with zero installation. - DEPLOY.md: the complete server-session checklist for zkdefi.org - reconstruct the servable log FROM the published mirror (the server stays in witness trust-position), hardened systemd unit, nginx/Caddy path routing, Forgejo mirror setup, the provider->world update cycle, and remote smoke tests. Validated end-to-end on the REAL log: all 10 endpoints, online-fetched proof re-verified locally through the dogfood verifier with pinning, online pin refresh, publish + witness audit green, tamper caught, standalone verify.py green in the published clone. 54/54 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:20 +00:00
from __future__ import annotations
from html import escape
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
from typing import Any
The log goes public: git-published mirror, online service, witnesses Three synchronized faces of one log - transport orthogonal to trust: - PUBLISHED GIT MIRROR: log-publish exports the public face (one file per leaf so git history mirrors log history; the FULL STH history as the witness channel; per-component attestations + receipts; the provider public key; a standalone stdlib-only verify.py and customer README). Live at github.com/saymrwulf/lean-transparency-log (genesis: 8 leaves incl. the honest failed-run entries, dogfood-signed head). - ONLINE SERVICE (pacta_provider serve): read-only, zero-dependency HTTP with CT-style endpoints under a base path for zkdefi.org/lean-transparency-log - /v1/sth, /v1/sth-history, /v1/sth-consistency?first=N, /v1/proof, /v1/attestation, /v1/entries, /v1/metadata, /healthz - plus self-contained customer documentation at /docs (current state, attested components, API, the verify- without-trusting-this-site path, and the means/does-NOT-mean boundary). The process never loads private keys: heads are signed offline; a compromised server can withhold or replay (pinning + freshness detect both) but never forge. STH history now recorded append-only by the provider (with a backfill head signed for the existing log). - AGENT ONLINE CLIENT: pacta log-fetch (download evidence; explicitly UNVERIFIED until receipt-verify runs - transport is not trust) and pacta sth-refresh (fetch head, verify signature, advance the pin via an online consistency proof from the pinned size; fail closed). - WITNESSES: pacta witness-audit over a clone of the published mirror recomputes every prefix root from the public leaves and checks every historical head + signature - no consistency proofs needed when the leaves are public. Tampering one published entry trips both the leaf-hash check and the prefix-root check (tested). verify.py gives customers the same audit with zero installation. - DEPLOY.md: the complete server-session checklist for zkdefi.org - reconstruct the servable log FROM the published mirror (the server stays in witness trust-position), hardened systemd unit, nginx/Caddy path routing, Forgejo mirror setup, the provider->world update cycle, and remote smoke tests. Validated end-to-end on the REAL log: all 10 endpoints, online-fetched proof re-verified locally through the dogfood verifier with pinning, online pin refresh, publish + witness audit green, tamper caught, standalone verify.py green in the published clone. 54/54 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:20 +00:00
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
from pacta.transparency import node_hash
from .transparency_log import LogEntry, TransparencyLog
The log goes public: git-published mirror, online service, witnesses Three synchronized faces of one log - transport orthogonal to trust: - PUBLISHED GIT MIRROR: log-publish exports the public face (one file per leaf so git history mirrors log history; the FULL STH history as the witness channel; per-component attestations + receipts; the provider public key; a standalone stdlib-only verify.py and customer README). Live at github.com/saymrwulf/lean-transparency-log (genesis: 8 leaves incl. the honest failed-run entries, dogfood-signed head). - ONLINE SERVICE (pacta_provider serve): read-only, zero-dependency HTTP with CT-style endpoints under a base path for zkdefi.org/lean-transparency-log - /v1/sth, /v1/sth-history, /v1/sth-consistency?first=N, /v1/proof, /v1/attestation, /v1/entries, /v1/metadata, /healthz - plus self-contained customer documentation at /docs (current state, attested components, API, the verify- without-trusting-this-site path, and the means/does-NOT-mean boundary). The process never loads private keys: heads are signed offline; a compromised server can withhold or replay (pinning + freshness detect both) but never forge. STH history now recorded append-only by the provider (with a backfill head signed for the existing log). - AGENT ONLINE CLIENT: pacta log-fetch (download evidence; explicitly UNVERIFIED until receipt-verify runs - transport is not trust) and pacta sth-refresh (fetch head, verify signature, advance the pin via an online consistency proof from the pinned size; fail closed). - WITNESSES: pacta witness-audit over a clone of the published mirror recomputes every prefix root from the public leaves and checks every historical head + signature - no consistency proofs needed when the leaves are public. Tampering one published entry trips both the leaf-hash check and the prefix-root check (tested). verify.py gives customers the same audit with zero installation. - DEPLOY.md: the complete server-session checklist for zkdefi.org - reconstruct the servable log FROM the published mirror (the server stays in witness trust-position), hardened systemd unit, nginx/Caddy path routing, Forgejo mirror setup, the provider->world update cycle, and remote smoke tests. Validated end-to-end on the REAL log: all 10 endpoints, online-fetched proof re-verified locally through the dogfood verifier with pinning, online pin refresh, publish + witness audit green, tamper caught, standalone verify.py green in the published clone. 54/54 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:20 +00:00
_STYLE = """
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
:root{--ink:#1c2430;--ink2:#5a6675;--line:#dde2e9;--ok:#1e7f4f;--okbg:#e2f2e9;
--warn:#a86a10;--warnbg:#fdf0da;--accent:#3b4d8f;--accentbg:#eef0f7;--bg:#f8f9fa}
*{box-sizing:border-box}
body{font-family:system-ui,sans-serif;max-width:66rem;margin:0 auto;padding:2rem 1.2rem 4rem;
color:var(--ink);line-height:1.6;background:var(--bg)}
h1{font-size:2rem;margin:.2rem 0 0;letter-spacing:-.01em}
h2{font-size:1.2rem;margin-top:2.6rem;border-bottom:2px solid var(--line);padding-bottom:.3rem}
.tagline{font-size:1.05rem;color:var(--ink2);max-width:46rem}
The log goes public: git-published mirror, online service, witnesses Three synchronized faces of one log - transport orthogonal to trust: - PUBLISHED GIT MIRROR: log-publish exports the public face (one file per leaf so git history mirrors log history; the FULL STH history as the witness channel; per-component attestations + receipts; the provider public key; a standalone stdlib-only verify.py and customer README). Live at github.com/saymrwulf/lean-transparency-log (genesis: 8 leaves incl. the honest failed-run entries, dogfood-signed head). - ONLINE SERVICE (pacta_provider serve): read-only, zero-dependency HTTP with CT-style endpoints under a base path for zkdefi.org/lean-transparency-log - /v1/sth, /v1/sth-history, /v1/sth-consistency?first=N, /v1/proof, /v1/attestation, /v1/entries, /v1/metadata, /healthz - plus self-contained customer documentation at /docs (current state, attested components, API, the verify- without-trusting-this-site path, and the means/does-NOT-mean boundary). The process never loads private keys: heads are signed offline; a compromised server can withhold or replay (pinning + freshness detect both) but never forge. STH history now recorded append-only by the provider (with a backfill head signed for the existing log). - AGENT ONLINE CLIENT: pacta log-fetch (download evidence; explicitly UNVERIFIED until receipt-verify runs - transport is not trust) and pacta sth-refresh (fetch head, verify signature, advance the pin via an online consistency proof from the pinned size; fail closed). - WITNESSES: pacta witness-audit over a clone of the published mirror recomputes every prefix root from the public leaves and checks every historical head + signature - no consistency proofs needed when the leaves are public. Tampering one published entry trips both the leaf-hash check and the prefix-root check (tested). verify.py gives customers the same audit with zero installation. - DEPLOY.md: the complete server-session checklist for zkdefi.org - reconstruct the servable log FROM the published mirror (the server stays in witness trust-position), hardened systemd unit, nginx/Caddy path routing, Forgejo mirror setup, the provider->world update cycle, and remote smoke tests. Validated end-to-end on the REAL log: all 10 endpoints, online-fetched proof re-verified locally through the dogfood verifier with pinning, online pin refresh, publish + witness audit green, tamper caught, standalone verify.py green in the published clone. 54/54 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:20 +00:00
code,pre{font-family:ui-monospace,Menlo,Consolas,monospace;background:#eef0f3;border-radius:4px}
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
code{padding:.1rem .3rem;font-size:.9em} pre{padding:.9rem;overflow-x:auto;font-size:.85rem}
table{border-collapse:collapse;width:100%;font-size:.93rem;background:#fff}
td,th{border:1px solid var(--line);padding:.5rem .7rem;text-align:left;vertical-align:top}
th{background:var(--accentbg)}
.pill{display:inline-block;border-radius:9px;padding:.08rem .6rem;font-size:.78rem;font-weight:600}
.ok{background:var(--okbg);color:var(--ok)} .warn{background:var(--warnbg);color:var(--warn)}
.acc{background:var(--accentbg);color:var(--accent)}
.muted{color:var(--ink2);font-size:.9rem}
.card{background:#fff;border:1px solid var(--line);border-radius:8px;padding:1rem 1.2rem;margin:.8rem 0}
.steps{counter-reset:s} .steps .card{position:relative;padding-left:3.2rem}
.steps .card::before{counter-increment:s;content:counter(s);position:absolute;left:1rem;top:1rem;
width:1.6rem;height:1.6rem;border-radius:50%;background:var(--accent);color:#fff;
display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.9rem}
svg{max-width:100%;height:auto;display:block;margin:1rem auto;background:#fff;
border:1px solid var(--line);border-radius:8px}
a{color:var(--accent)}
.legend{display:flex;gap:1.4rem;flex-wrap:wrap;font-size:.85rem;color:var(--ink2);justify-content:center}
.sw{display:inline-block;width:.8rem;height:.8rem;border-radius:3px;vertical-align:-1px;margin-right:.3rem}
The log goes public: git-published mirror, online service, witnesses Three synchronized faces of one log - transport orthogonal to trust: - PUBLISHED GIT MIRROR: log-publish exports the public face (one file per leaf so git history mirrors log history; the FULL STH history as the witness channel; per-component attestations + receipts; the provider public key; a standalone stdlib-only verify.py and customer README). Live at github.com/saymrwulf/lean-transparency-log (genesis: 8 leaves incl. the honest failed-run entries, dogfood-signed head). - ONLINE SERVICE (pacta_provider serve): read-only, zero-dependency HTTP with CT-style endpoints under a base path for zkdefi.org/lean-transparency-log - /v1/sth, /v1/sth-history, /v1/sth-consistency?first=N, /v1/proof, /v1/attestation, /v1/entries, /v1/metadata, /healthz - plus self-contained customer documentation at /docs (current state, attested components, API, the verify- without-trusting-this-site path, and the means/does-NOT-mean boundary). The process never loads private keys: heads are signed offline; a compromised server can withhold or replay (pinning + freshness detect both) but never forge. STH history now recorded append-only by the provider (with a backfill head signed for the existing log). - AGENT ONLINE CLIENT: pacta log-fetch (download evidence; explicitly UNVERIFIED until receipt-verify runs - transport is not trust) and pacta sth-refresh (fetch head, verify signature, advance the pin via an online consistency proof from the pinned size; fail closed). - WITNESSES: pacta witness-audit over a clone of the published mirror recomputes every prefix root from the public leaves and checks every historical head + signature - no consistency proofs needed when the leaves are public. Tampering one published entry trips both the leaf-hash check and the prefix-root check (tested). verify.py gives customers the same audit with zero installation. - DEPLOY.md: the complete server-session checklist for zkdefi.org - reconstruct the servable log FROM the published mirror (the server stays in witness trust-position), hardened systemd unit, nginx/Caddy path routing, Forgejo mirror setup, the provider->world update cycle, and remote smoke tests. Validated end-to-end on the REAL log: all 10 endpoints, online-fetched proof re-verified locally through the dogfood verifier with pinning, online pin refresh, publish + witness audit green, tamper caught, standalone verify.py green in the published clone. 54/54 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:20 +00:00
"""
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
def _leaf_ok(entry: LogEntry) -> bool:
certificates = ((entry.leaf.get("attestation") or {}).get("certificates")) or []
return bool(certificates) and all(
certificate.get("status") == "proven" and certificate.get("axiom_status") == "clean"
for certificate in certificates
)
def _leaf_short(component: str) -> str:
"""Compact display name for a leaf box at small spans."""
return (component.replace("-ed25519-verified", "")
.replace("ltl-accumulator-verified", "accum")
.replace("fips205-slhdsa-verified", "slh-dsa"))
site: the homepage tells the truth about tree 19 — dual anchors, honest tooling, and a note to the paper's readers The estate doc audit scoped itself to *.md and missed the text a site visitor actually reads: the string constants in webdocs.py. Fixed here, verified by RENDERING the page from the live 19-leaf state and checking each block: - The SVG head label reads "Ed25519 + SLH-DSA" when the live head is dual-signed, "Ed25519" when it is not — computed, not asserted. - The trust-anchor card now carries BOTH keys the same way: full PEM, SHA-256 fingerprint, raw endpoint (/v1/log-slhdsa-public-key), mirror comparison link. The Ed25519 key stays the required anchor; the SLH-DSA key is the additive post-quantum one, and the card says whose proof subject its verify path is (leaf 18). - The registered homepage overclaim (register: homepage-stdlib-claim) is closed: "stdlib-only" wording replaced with the truth — stdlib hashing, signature checks shell out to the openssl binary, fails closed without. - "one signature and ~N hashes" became "one REQUIRED signature (Ed25519; heads from tree 14 add an additive post-quantum SLH-DSA signature)". - The paper card is reframed (frozen under review, describes the 16 July snapshot, "then-thirteen-leaf") and followed by a new reader-guidance card (operator-ordered): the paper-era prefix is unchanged inside the live history — leaves 0-12 byte-identical, the paper's head still head #5 of sth-history — verify.py --all checks both eras at once; the advances are additive (44-cert re-attestations, leaf 18, dual-signed heads, ABSENT on older heads by design); and the 3,867 divergence the paper honestly reports has since been CLOSED (sn==0 fix, 2026-07-23, pinned count now 0) — both the divergence and the fix are part of the retained record. Layout fact the render surfaced: the served log dir must contain the .pub files (that is what /v1/log-public-key reads); the SLH-DSA pub joins the Ed25519 one there. Suite 152/0/0. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-07 16:11:42 +00:00
def _svg_tree(entries: list[LogEntry], root_hex: str, signing_backend: str, head_label: str = "Ed25519") -> str:
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
"""The accumulator, drawn from its real leaves."""
if not entries:
return "<p class='muted'>(log is empty)</p>"
hashes = [bytes.fromhex(entry.leaf_hash) for entry in entries]
levels: list[list[bytes]] = [hashes]
while len(levels[-1]) > 1:
level = levels[-1]
nxt = [node_hash(level[i], level[i + 1]) for i in range(0, len(level) - 1, 2)]
if len(level) % 2:
nxt.append(level[-1])
levels.append(nxt)
width, level_gap = 1000, 86
height = 150 + level_gap * len(levels)
out = [f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 {width} {height}" font-family="ui-monospace,monospace" font-size="11">']
positions: dict[tuple[int, int], tuple[float, float]] = {}
for level_index, level in enumerate(levels):
y = height - 56 - level_index * level_gap
span = width / (len(level) + 1)
for node_index, node in enumerate(level):
x = span * (node_index + 1)
positions[(level_index, node_index)] = (x, y)
if level_index == 0:
entry = entries[node_index]
ok = _leaf_ok(entry)
component = (((entry.leaf.get("attestation") or {}).get("subject")) or {}).get("component", "?")
fill, stroke = ("#e2f2e9", "#1e7f4f") if ok else ("#f4f4f6", "#8a93a0")
# Boxes must FIT the per-leaf span at any tree size (the
# 2026-08-16 lesson: fixed 112px boxes shingled at 19
# leaves). Rich boxes while they fit, compact ones after.
box_w = min(112.0, span * 0.94)
compact = box_w < 100
short = escape(_leaf_short(str(component)))
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
label = short if ok else f"{short}"
if compact:
out.append(f'<rect x="{x-box_w/2:.1f}" y="{y-18}" width="{box_w:.1f}" height="36" rx="4" fill="{fill}" stroke="{stroke}" stroke-width="1.2"/>')
out.append(f'<text x="{x}" y="{y-4}" text-anchor="middle" fill="#333" font-size="8">leaf {node_index}</text>')
out.append(f'<text x="{x}" y="{y+9}" text-anchor="middle" fill="{stroke}" font-size="7">{label}</text>')
else:
out.append(f'<rect x="{x-box_w/2:.1f}" y="{y-22}" width="{box_w:.1f}" height="44" rx="5" fill="{fill}" stroke="{stroke}" stroke-width="1.4"/>')
out.append(f'<text x="{x}" y="{y-6}" text-anchor="middle" fill="#333">leaf {node_index}</text>')
out.append(f'<text x="{x}" y="{y+8}" text-anchor="middle" fill="{stroke}">{label}</text>')
out.append(f'<text x="{x}" y="{y+19}" text-anchor="middle" fill="#999" font-size="9">{node.hex()[:10]}…</text>')
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
else:
is_root = level_index == len(levels) - 1
out.append(f'<rect x="{x-50}" y="{y-15}" width="100" height="30" rx="5" fill="{"#eef0f7" if is_root else "#fff"}" stroke="{"#3b4d8f" if is_root else "#bbb"}" stroke-width="{1.6 if is_root else 1}"/>')
out.append(f'<text x="{x}" y="{y-2}" text-anchor="middle" fill="#333">{"ROOT" if is_root else "node"}</text>')
out.append(f'<text x="{x}" y="{y+10}" text-anchor="middle" fill="#999" font-size="9">{node.hex()[:10]}…</text>')
for child in (2 * node_index, 2 * node_index + 1):
if (level_index - 1, child) in positions:
cx, cy = positions[(level_index - 1, child)]
leaf_top = 18 if len(entries) > 9 else 22
out.append(f'<line x1="{x}" y1="{y+15}" x2="{cx}" y2="{cy-leaf_top if level_index==1 else cy-15}" stroke="#ccc"/>')
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
root_x, root_y = positions[(len(levels) - 1, 0)]
# The head box sizes itself to its longest line (the 2026-08-16
# lesson: a fixed 380px box let a growing caption spill both sides).
title = f"Signed Tree Head — {head_label}({root_hex[:12]}…)"
line2 = f"signed by: {signing_backend}"
line3 = "(verify path attested; signing itself not proven)"
head_w = max(len(title) * 7.0, len(line2) * 5.3, len(line3) * 5.3) + 28
out.append(f'<rect x="{root_x-head_w/2:.1f}" y="{root_y-84}" width="{head_w:.1f}" height="46" rx="6" fill="#e2f2e9" stroke="#1e7f4f" stroke-width="1.6"/>')
out.append(f'<text x="{root_x}" y="{root_y-70}" text-anchor="middle" fill="#1e7f4f" font-weight="bold">{escape(title)}</text>')
out.append(f'<text x="{root_x}" y="{root_y-58}" text-anchor="middle" fill="#1e7f4f" font-size="9">{escape(line2)}</text>')
out.append(f'<text x="{root_x}" y="{root_y-47}" text-anchor="middle" fill="#1e7f4f" font-size="9">{escape(line3)}</text>')
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
out.append(f'<line x1="{root_x}" y1="{root_y-38}" x2="{root_x}" y2="{root_y-15}" stroke="#1e7f4f" stroke-width="1.4"/>')
out.append("</svg>")
return "".join(out)
def _trust_anchor_html(log: TransparencyLog, metadata: dict[str, Any], base: str, mirror: str) -> str:
"""The provider public key, displayed in full on the front page. The key
is the one thing a consumer takes on trust, once - hiding it behind a
path would invert the page's priorities."""
key_path = log.log_dir / "provider.ed25519.pub"
fingerprint = str(metadata.get("ed25519_public_key_fingerprint_sha256", ""))
if not key_path.is_file():
return (
'<div class="card"><span class="pill warn">missing</span> This deployment '
"does not expose its public key in the log directory - fetch it from the "
f'<a href="{mirror}/blob/main/provider.ed25519.pub">mirror</a> instead.</div>'
)
pem = escape(key_path.read_text(encoding="utf-8").strip())
site: the homepage tells the truth about tree 19 — dual anchors, honest tooling, and a note to the paper's readers The estate doc audit scoped itself to *.md and missed the text a site visitor actually reads: the string constants in webdocs.py. Fixed here, verified by RENDERING the page from the live 19-leaf state and checking each block: - The SVG head label reads "Ed25519 + SLH-DSA" when the live head is dual-signed, "Ed25519" when it is not — computed, not asserted. - The trust-anchor card now carries BOTH keys the same way: full PEM, SHA-256 fingerprint, raw endpoint (/v1/log-slhdsa-public-key), mirror comparison link. The Ed25519 key stays the required anchor; the SLH-DSA key is the additive post-quantum one, and the card says whose proof subject its verify path is (leaf 18). - The registered homepage overclaim (register: homepage-stdlib-claim) is closed: "stdlib-only" wording replaced with the truth — stdlib hashing, signature checks shell out to the openssl binary, fails closed without. - "one signature and ~N hashes" became "one REQUIRED signature (Ed25519; heads from tree 14 add an additive post-quantum SLH-DSA signature)". - The paper card is reframed (frozen under review, describes the 16 July snapshot, "then-thirteen-leaf") and followed by a new reader-guidance card (operator-ordered): the paper-era prefix is unchanged inside the live history — leaves 0-12 byte-identical, the paper's head still head #5 of sth-history — verify.py --all checks both eras at once; the advances are additive (44-cert re-attestations, leaf 18, dual-signed heads, ABSENT on older heads by design); and the 3,867 divergence the paper honestly reports has since been CLOSED (sn==0 fix, 2026-07-23, pinned count now 0) — both the divergence and the fix are part of the retained record. Layout fact the render surfaced: the served log dir must contain the .pub files (that is what /v1/log-public-key reads); the SLH-DSA pub joins the Ed25519 one there. Suite 152/0/0. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-07 16:11:42 +00:00
# The SLH-DSA verification key (additive post-quantum head signature,
# 2026-08) is published THE SAME WAY: full PEM on the page, raw endpoint,
# mirror comparison. Heads before tree 14 carry no SLH-DSA signature and
# verify.py reports them ABSENT — allowed; an append-only log keeps its
# history.
slh_path = log.log_dir / "provider.slhdsa.pub"
if slh_path.is_file():
import hashlib as _h
slh_pem = escape(slh_path.read_text(encoding="utf-8").strip())
slh_fp = _h.sha256(slh_path.read_bytes()).hexdigest()
slh_block = f"""<hr style="border:none;border-top:1px solid #ddd;margin:.8rem 0">
<p style="margin-top:0"><strong>Second, additive anchor post-quantum.</strong> Heads from
tree&nbsp;14 on additionally carry a deterministic <strong>SLH-DSA-SHA2-128s</strong> (FIPS&nbsp;205)
signature over the same payload. The Ed25519 signature above remains the one every consumer must
check; this one is checked where tooling allows (OpenSSL&nbsp;&nbsp;3.5). Its verify path is the
proof subject of leaf&nbsp;18.</p>
<pre style="margin-bottom:.4rem">{slh_pem}</pre>
<p class="muted" style="margin:.2rem 0 0">SHA-256 fingerprint <code>{slh_fp}</code>
&nbsp;·&nbsp; raw: <a href="{base}/log-slhdsa-public-key"><code>{base or ''}/log-slhdsa-public-key</code></a>
&nbsp;·&nbsp; mirror: <a href="{mirror}/blob/main/provider.slhdsa.pub">provider.slhdsa.pub</a></p>"""
else:
slh_block = ""
return f"""<div class="card">
<p style="margin-top:0">This key is the <strong>sole cryptographic identity anchor</strong>: it
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
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,
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
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.
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
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
<a href="{mirror}/blob/main/provider.ed25519.pub">mirror copy</a>; they must be identical. The first fetch is trust-on-first-use; the two-host byte-comparison is what bounds it.</p>
<pre style="margin-bottom:.4rem">{pem}</pre>
<p class="muted" style="margin:.2rem 0 0">SHA-256 fingerprint <code>{escape(fingerprint)}</code>
&nbsp;·&nbsp; raw: <a href="{base}/log-public-key"><code>{base or ''}/log-public-key</code></a>
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
&nbsp;·&nbsp; <code>curl -s https://ltl.zkdefi.org/log-public-key</code></p>
site: the homepage tells the truth about tree 19 — dual anchors, honest tooling, and a note to the paper's readers The estate doc audit scoped itself to *.md and missed the text a site visitor actually reads: the string constants in webdocs.py. Fixed here, verified by RENDERING the page from the live 19-leaf state and checking each block: - The SVG head label reads "Ed25519 + SLH-DSA" when the live head is dual-signed, "Ed25519" when it is not — computed, not asserted. - The trust-anchor card now carries BOTH keys the same way: full PEM, SHA-256 fingerprint, raw endpoint (/v1/log-slhdsa-public-key), mirror comparison link. The Ed25519 key stays the required anchor; the SLH-DSA key is the additive post-quantum one, and the card says whose proof subject its verify path is (leaf 18). - The registered homepage overclaim (register: homepage-stdlib-claim) is closed: "stdlib-only" wording replaced with the truth — stdlib hashing, signature checks shell out to the openssl binary, fails closed without. - "one signature and ~N hashes" became "one REQUIRED signature (Ed25519; heads from tree 14 add an additive post-quantum SLH-DSA signature)". - The paper card is reframed (frozen under review, describes the 16 July snapshot, "then-thirteen-leaf") and followed by a new reader-guidance card (operator-ordered): the paper-era prefix is unchanged inside the live history — leaves 0-12 byte-identical, the paper's head still head #5 of sth-history — verify.py --all checks both eras at once; the advances are additive (44-cert re-attestations, leaf 18, dual-signed heads, ABSENT on older heads by design); and the 3,867 divergence the paper honestly reports has since been CLOSED (sn==0 fix, 2026-07-23, pinned count now 0) — both the divergence and the fix are part of the retained record. Layout fact the render surfaced: the served log dir must contain the .pub files (that is what /v1/log-public-key reads); the SLH-DSA pub joins the Ed25519 one there. Suite 152/0/0. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-07 16:11:42 +00:00
{slh_block}</div>"""
The log goes public: git-published mirror, online service, witnesses Three synchronized faces of one log - transport orthogonal to trust: - PUBLISHED GIT MIRROR: log-publish exports the public face (one file per leaf so git history mirrors log history; the FULL STH history as the witness channel; per-component attestations + receipts; the provider public key; a standalone stdlib-only verify.py and customer README). Live at github.com/saymrwulf/lean-transparency-log (genesis: 8 leaves incl. the honest failed-run entries, dogfood-signed head). - ONLINE SERVICE (pacta_provider serve): read-only, zero-dependency HTTP with CT-style endpoints under a base path for zkdefi.org/lean-transparency-log - /v1/sth, /v1/sth-history, /v1/sth-consistency?first=N, /v1/proof, /v1/attestation, /v1/entries, /v1/metadata, /healthz - plus self-contained customer documentation at /docs (current state, attested components, API, the verify- without-trusting-this-site path, and the means/does-NOT-mean boundary). The process never loads private keys: heads are signed offline; a compromised server can withhold or replay (pinning + freshness detect both) but never forge. STH history now recorded append-only by the provider (with a backfill head signed for the existing log). - AGENT ONLINE CLIENT: pacta log-fetch (download evidence; explicitly UNVERIFIED until receipt-verify runs - transport is not trust) and pacta sth-refresh (fetch head, verify signature, advance the pin via an online consistency proof from the pinned size; fail closed). - WITNESSES: pacta witness-audit over a clone of the published mirror recomputes every prefix root from the public leaves and checks every historical head + signature - no consistency proofs needed when the leaves are public. Tampering one published entry trips both the leaf-hash check and the prefix-root check (tested). verify.py gives customers the same audit with zero installation. - DEPLOY.md: the complete server-session checklist for zkdefi.org - reconstruct the servable log FROM the published mirror (the server stays in witness trust-position), hardened systemd unit, nginx/Caddy path routing, Forgejo mirror setup, the provider->world update cycle, and remote smoke tests. Validated end-to-end on the REAL log: all 10 endpoints, online-fetched proof re-verified locally through the dogfood verifier with pinning, online pin refresh, publish + witness audit green, tamper caught, standalone verify.py green in the published clone. 54/54 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:20 +00:00
def render_docs(log: TransparencyLog, base_path: str) -> str:
base = "/" + base_path.strip("/") if base_path.strip("/") else ""
The log goes public: git-published mirror, online service, witnesses Three synchronized faces of one log - transport orthogonal to trust: - PUBLISHED GIT MIRROR: log-publish exports the public face (one file per leaf so git history mirrors log history; the FULL STH history as the witness channel; per-component attestations + receipts; the provider public key; a standalone stdlib-only verify.py and customer README). Live at github.com/saymrwulf/lean-transparency-log (genesis: 8 leaves incl. the honest failed-run entries, dogfood-signed head). - ONLINE SERVICE (pacta_provider serve): read-only, zero-dependency HTTP with CT-style endpoints under a base path for zkdefi.org/lean-transparency-log - /v1/sth, /v1/sth-history, /v1/sth-consistency?first=N, /v1/proof, /v1/attestation, /v1/entries, /v1/metadata, /healthz - plus self-contained customer documentation at /docs (current state, attested components, API, the verify- without-trusting-this-site path, and the means/does-NOT-mean boundary). The process never loads private keys: heads are signed offline; a compromised server can withhold or replay (pinning + freshness detect both) but never forge. STH history now recorded append-only by the provider (with a backfill head signed for the existing log). - AGENT ONLINE CLIENT: pacta log-fetch (download evidence; explicitly UNVERIFIED until receipt-verify runs - transport is not trust) and pacta sth-refresh (fetch head, verify signature, advance the pin via an online consistency proof from the pinned size; fail closed). - WITNESSES: pacta witness-audit over a clone of the published mirror recomputes every prefix root from the public leaves and checks every historical head + signature - no consistency proofs needed when the leaves are public. Tampering one published entry trips both the leaf-hash check and the prefix-root check (tested). verify.py gives customers the same audit with zero installation. - DEPLOY.md: the complete server-session checklist for zkdefi.org - reconstruct the servable log FROM the published mirror (the server stays in witness trust-position), hardened systemd unit, nginx/Caddy path routing, Forgejo mirror setup, the provider->world update cycle, and remote smoke tests. Validated end-to-end on the REAL log: all 10 endpoints, online-fetched proof re-verified locally through the dogfood verifier with pinning, online pin refresh, publish + witness audit green, tamper caught, standalone verify.py green in the published clone. 54/54 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:20 +00:00
metadata = log.metadata()
history = log.sth_history()
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
latest: dict[str, Any] = history[-1] if history else {}
The log goes public: git-published mirror, online service, witnesses Three synchronized faces of one log - transport orthogonal to trust: - PUBLISHED GIT MIRROR: log-publish exports the public face (one file per leaf so git history mirrors log history; the FULL STH history as the witness channel; per-component attestations + receipts; the provider public key; a standalone stdlib-only verify.py and customer README). Live at github.com/saymrwulf/lean-transparency-log (genesis: 8 leaves incl. the honest failed-run entries, dogfood-signed head). - ONLINE SERVICE (pacta_provider serve): read-only, zero-dependency HTTP with CT-style endpoints under a base path for zkdefi.org/lean-transparency-log - /v1/sth, /v1/sth-history, /v1/sth-consistency?first=N, /v1/proof, /v1/attestation, /v1/entries, /v1/metadata, /healthz - plus self-contained customer documentation at /docs (current state, attested components, API, the verify- without-trusting-this-site path, and the means/does-NOT-mean boundary). The process never loads private keys: heads are signed offline; a compromised server can withhold or replay (pinning + freshness detect both) but never forge. STH history now recorded append-only by the provider (with a backfill head signed for the existing log). - AGENT ONLINE CLIENT: pacta log-fetch (download evidence; explicitly UNVERIFIED until receipt-verify runs - transport is not trust) and pacta sth-refresh (fetch head, verify signature, advance the pin via an online consistency proof from the pinned size; fail closed). - WITNESSES: pacta witness-audit over a clone of the published mirror recomputes every prefix root from the public leaves and checks every historical head + signature - no consistency proofs needed when the leaves are public. Tampering one published entry trips both the leaf-hash check and the prefix-root check (tested). verify.py gives customers the same audit with zero installation. - DEPLOY.md: the complete server-session checklist for zkdefi.org - reconstruct the servable log FROM the published mirror (the server stays in witness trust-position), hardened systemd unit, nginx/Caddy path routing, Forgejo mirror setup, the provider->world update cycle, and remote smoke tests. Validated end-to-end on the REAL log: all 10 endpoints, online-fetched proof re-verified locally through the dogfood verifier with pinning, online pin refresh, publish + witness audit green, tamper caught, standalone verify.py green in the published clone. 54/54 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:20 +00:00
entries = log.entries()
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
ed = (latest.get("signatures") or {}).get("ed25519") or {}
provenance = ed.get("signing_provenance") or {}
signing_backend = str(ed.get("signing_backend", "openssl"))
# newest entry per component, with its real proven/total from the leaf
newest: dict[str, Any] = {}
for entry in entries:
if not _leaf_ok(entry):
continue
comp = ((entry.leaf.get("attestation") or {}).get("subject") or {}).get("component")
if comp:
newest[comp] = entry
def _counts(entry) -> str:
certs = ((entry.leaf.get("attestation") or {}).get("certificates")) or []
total = len(certs)
proven = sum(1 for c in certs
if c.get("status") == "proven" and c.get("axiom_status") == "clean")
return f"{proven}/{total} proven"
components = sorted(newest)
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
mirror = "https://github.com/saymrwulf/lean-transparency-log"
The log goes public: git-published mirror, online service, witnesses Three synchronized faces of one log - transport orthogonal to trust: - PUBLISHED GIT MIRROR: log-publish exports the public face (one file per leaf so git history mirrors log history; the FULL STH history as the witness channel; per-component attestations + receipts; the provider public key; a standalone stdlib-only verify.py and customer README). Live at github.com/saymrwulf/lean-transparency-log (genesis: 8 leaves incl. the honest failed-run entries, dogfood-signed head). - ONLINE SERVICE (pacta_provider serve): read-only, zero-dependency HTTP with CT-style endpoints under a base path for zkdefi.org/lean-transparency-log - /v1/sth, /v1/sth-history, /v1/sth-consistency?first=N, /v1/proof, /v1/attestation, /v1/entries, /v1/metadata, /healthz - plus self-contained customer documentation at /docs (current state, attested components, API, the verify- without-trusting-this-site path, and the means/does-NOT-mean boundary). The process never loads private keys: heads are signed offline; a compromised server can withhold or replay (pinning + freshness detect both) but never forge. STH history now recorded append-only by the provider (with a backfill head signed for the existing log). - AGENT ONLINE CLIENT: pacta log-fetch (download evidence; explicitly UNVERIFIED until receipt-verify runs - transport is not trust) and pacta sth-refresh (fetch head, verify signature, advance the pin via an online consistency proof from the pinned size; fail closed). - WITNESSES: pacta witness-audit over a clone of the published mirror recomputes every prefix root from the public leaves and checks every historical head + signature - no consistency proofs needed when the leaves are public. Tampering one published entry trips both the leaf-hash check and the prefix-root check (tested). verify.py gives customers the same audit with zero installation. - DEPLOY.md: the complete server-session checklist for zkdefi.org - reconstruct the servable log FROM the published mirror (the server stays in witness trust-position), hardened systemd unit, nginx/Caddy path routing, Forgejo mirror setup, the provider->world update cycle, and remote smoke tests. Validated end-to-end on the REAL log: all 10 endpoints, online-fetched proof re-verified locally through the dogfood verifier with pinning, online pin refresh, publish + witness audit green, tamper caught, standalone verify.py green in the published clone. 54/54 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:20 +00:00
rows = "".join(
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
f"<tr><td><code>{escape(c)}</code></td>"
f"<td><a href='{base}/v1/attestation?component={escape(c)}'>attestation</a></td>"
f"<td><a href='{base}/v1/proof?component={escape(c)}'>inclusion proof</a></td>"
f"<td><span class='pill ok'>{escape(_counts(newest[c]))}</span></td></tr>"
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
for c in components
The log goes public: git-published mirror, online service, witnesses Three synchronized faces of one log - transport orthogonal to trust: - PUBLISHED GIT MIRROR: log-publish exports the public face (one file per leaf so git history mirrors log history; the FULL STH history as the witness channel; per-component attestations + receipts; the provider public key; a standalone stdlib-only verify.py and customer README). Live at github.com/saymrwulf/lean-transparency-log (genesis: 8 leaves incl. the honest failed-run entries, dogfood-signed head). - ONLINE SERVICE (pacta_provider serve): read-only, zero-dependency HTTP with CT-style endpoints under a base path for zkdefi.org/lean-transparency-log - /v1/sth, /v1/sth-history, /v1/sth-consistency?first=N, /v1/proof, /v1/attestation, /v1/entries, /v1/metadata, /healthz - plus self-contained customer documentation at /docs (current state, attested components, API, the verify- without-trusting-this-site path, and the means/does-NOT-mean boundary). The process never loads private keys: heads are signed offline; a compromised server can withhold or replay (pinning + freshness detect both) but never forge. STH history now recorded append-only by the provider (with a backfill head signed for the existing log). - AGENT ONLINE CLIENT: pacta log-fetch (download evidence; explicitly UNVERIFIED until receipt-verify runs - transport is not trust) and pacta sth-refresh (fetch head, verify signature, advance the pin via an online consistency proof from the pinned size; fail closed). - WITNESSES: pacta witness-audit over a clone of the published mirror recomputes every prefix root from the public leaves and checks every historical head + signature - no consistency proofs needed when the leaves are public. Tampering one published entry trips both the leaf-hash check and the prefix-root check (tested). verify.py gives customers the same audit with zero installation. - DEPLOY.md: the complete server-session checklist for zkdefi.org - reconstruct the servable log FROM the published mirror (the server stays in witness trust-position), hardened systemd unit, nginx/Caddy path routing, Forgejo mirror setup, the provider->world update cycle, and remote smoke tests. Validated end-to-end on the REAL log: all 10 endpoints, online-fetched proof re-verified locally through the dogfood verifier with pinning, online pin refresh, publish + witness audit green, tamper caught, standalone verify.py green in the published clone. 54/54 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:20 +00:00
)
site: the homepage tells the truth about tree 19 — dual anchors, honest tooling, and a note to the paper's readers The estate doc audit scoped itself to *.md and missed the text a site visitor actually reads: the string constants in webdocs.py. Fixed here, verified by RENDERING the page from the live 19-leaf state and checking each block: - The SVG head label reads "Ed25519 + SLH-DSA" when the live head is dual-signed, "Ed25519" when it is not — computed, not asserted. - The trust-anchor card now carries BOTH keys the same way: full PEM, SHA-256 fingerprint, raw endpoint (/v1/log-slhdsa-public-key), mirror comparison link. The Ed25519 key stays the required anchor; the SLH-DSA key is the additive post-quantum one, and the card says whose proof subject its verify path is (leaf 18). - The registered homepage overclaim (register: homepage-stdlib-claim) is closed: "stdlib-only" wording replaced with the truth — stdlib hashing, signature checks shell out to the openssl binary, fails closed without. - "one signature and ~N hashes" became "one REQUIRED signature (Ed25519; heads from tree 14 add an additive post-quantum SLH-DSA signature)". - The paper card is reframed (frozen under review, describes the 16 July snapshot, "then-thirteen-leaf") and followed by a new reader-guidance card (operator-ordered): the paper-era prefix is unchanged inside the live history — leaves 0-12 byte-identical, the paper's head still head #5 of sth-history — verify.py --all checks both eras at once; the advances are additive (44-cert re-attestations, leaf 18, dual-signed heads, ABSENT on older heads by design); and the 3,867 divergence the paper honestly reports has since been CLOSED (sn==0 fix, 2026-07-23, pinned count now 0) — both the divergence and the fix are part of the retained record. Layout fact the render surfaced: the served log dir must contain the .pub files (that is what /v1/log-public-key reads); the SLH-DSA pub joins the Ed25519 one there. Suite 152/0/0. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-07 16:11:42 +00:00
slh_signed = ((latest.get("signatures") or {}).get("slh_dsa") or {}).get("status") == "signed"
head_label = "Ed25519 + SLH-DSA" if slh_signed else "Ed25519"
tree_svg = _svg_tree(entries, str(latest.get("root_hash", "")), signing_backend, head_label)
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
return f"""<!doctype html><html lang="en"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>LTL Lean Transparency Log</title><style>{_STYLE}</style></head><body>
<p class="muted" style="margin-bottom:0">zkdefi
· <a href="https://blog.zkdefi.org/">notes</a>
· <a href="https://zkdefi.org/saymrwulf">code</a>
· <a href="https://zkdefi.com/">cv</a></p>
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
<h1>LTL the Lean Transparency Log</h1>
<p class="tagline"><strong>One sentence:</strong> a public, append-only Merkle
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
accumulator (a hash tree that only ever grows) of <em>signed statements that the <a href="https://lean-lang.org">Lean&nbsp;4</a> formal proofs of specific
cryptographic Rust libraries, at specific git commits, re-check by machine with exactly
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
their documented assumptions</em> so that you can trust a proof result by checking
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
<strong>one required signature (Ed25519) and ~{max(1,(latest.get('tree_size') or 1).bit_length())} hashes in
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
milliseconds</strong>, instead of running a theorem prover for hours.</p>
<h2>The trust anchor pin this key</h2>
{_trust_anchor_html(log, metadata, base, mirror)}
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
<h2>The accumulator, live</h2>
{tree_svg}
<p class="legend">
<span><span class="sw" style="background:#e2f2e9;border:1px solid #1e7f4f"></span>verified attestation (all certificates proven, axiom cones boundary-exact)</span>
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
<span><span class="sw" style="background:#f4f4f6;border:1px solid #8a93a0"></span>historical audit-failure attestation kept forever; an append-only ledger does not erase its bad day (leaves&nbsp;03: an early audit round that failed; leaves&nbsp;47 re-attest the same four libraries cleanly)</span>
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
</p>
<p class="muted">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. The library that signs the log is itself an entry in the log what that entry proves is its <em>verify</em> path (no signing code is proven, here or anywhere) and it checks its own entry before signing. In detail: before signing this
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
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','?')))})
against this very tree so the signed tree <em>contains</em> an attestation of the source the
operator reports its signing binary was built from. (An Ed25519 signature cannot by itself prove
which binary generated it; execution provenance is reported, not proven, and the provenance
fields live in the unsigned signature metadata.) Tree size {latest.get('tree_size',0)},
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
log id <code>{escape(str(metadata.get('log_id',''))[:16])}</code>.</p>
<h2>What do I download? the three artifacts, unambiguously</h2>
<p>To benefit from the accumulator you need <strong>exactly three files</strong> per
library, plus optionally the whole mirror. Nothing else.</p>
The log goes public: git-published mirror, online service, witnesses Three synchronized faces of one log - transport orthogonal to trust: - PUBLISHED GIT MIRROR: log-publish exports the public face (one file per leaf so git history mirrors log history; the FULL STH history as the witness channel; per-component attestations + receipts; the provider public key; a standalone stdlib-only verify.py and customer README). Live at github.com/saymrwulf/lean-transparency-log (genesis: 8 leaves incl. the honest failed-run entries, dogfood-signed head). - ONLINE SERVICE (pacta_provider serve): read-only, zero-dependency HTTP with CT-style endpoints under a base path for zkdefi.org/lean-transparency-log - /v1/sth, /v1/sth-history, /v1/sth-consistency?first=N, /v1/proof, /v1/attestation, /v1/entries, /v1/metadata, /healthz - plus self-contained customer documentation at /docs (current state, attested components, API, the verify- without-trusting-this-site path, and the means/does-NOT-mean boundary). The process never loads private keys: heads are signed offline; a compromised server can withhold or replay (pinning + freshness detect both) but never forge. STH history now recorded append-only by the provider (with a backfill head signed for the existing log). - AGENT ONLINE CLIENT: pacta log-fetch (download evidence; explicitly UNVERIFIED until receipt-verify runs - transport is not trust) and pacta sth-refresh (fetch head, verify signature, advance the pin via an online consistency proof from the pinned size; fail closed). - WITNESSES: pacta witness-audit over a clone of the published mirror recomputes every prefix root from the public leaves and checks every historical head + signature - no consistency proofs needed when the leaves are public. Tampering one published entry trips both the leaf-hash check and the prefix-root check (tested). verify.py gives customers the same audit with zero installation. - DEPLOY.md: the complete server-session checklist for zkdefi.org - reconstruct the servable log FROM the published mirror (the server stays in witness trust-position), hardened systemd unit, nginx/Caddy path routing, Forgejo mirror setup, the provider->world update cycle, and remote smoke tests. Validated end-to-end on the REAL log: all 10 endpoints, online-fetched proof re-verified locally through the dogfood verifier with pinning, online pin refresh, publish + witness audit green, tamper caught, standalone verify.py green in the published clone. 54/54 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:20 +00:00
<table>
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
<tr><th>#</th><th>Artifact</th><th>What it is</th><th>Where</th></tr>
<tr><td><b>1</b></td><td><code>provider.ed25519.pub</code></td>
<td><strong>The identity anchor.</strong> The provider's public key — the sole cryptographic
identity you pin. It authenticates the operator's statements; their truth rests on each leaf's
stated assumptions. Fetch it from BOTH independent locations and compare; the copies must be
identical.</td>
<td><a href="{base}/log-public-key">this site</a> · <a href="{mirror}/blob/main/provider.ed25519.pub">mirror</a></td></tr>
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
<tr><td><b>2</b></td><td><code>&lt;library&gt;.attestation.json</code></td>
<td><strong>The claim.</strong> Which repo, which exact git commit, which theorems,
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
which observed axiom cones (the exact set of assumptions each proof ultimately rests on), what machine protection signed by the provider.</td>
<td>table below, or <a href="{mirror}">mirror</a> <code>entries/</code></td></tr>
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
<tr><td><b>3</b></td><td><code>&lt;library&gt;.receipt.json</code></td>
<td><strong>The proof of inclusion.</strong> Binds artifact&nbsp;2 into the signed tree:
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
leaf index, sibling hashes, the Signed Tree Head (STH). A one-page Python core verifies it printed as Appendix&nbsp;C of the paper; the shipped <code>verify.py</code> wraps that core with full fail-closed binding checks (stdlib hashing; signature checks shell out to the <code>openssl</code> binary).</td>
<td>table below, or <a href="{mirror}">mirror</a> <code>receipts/</code></td></tr>
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
<tr><td>+</td><td>the full mirror clone</td>
<td><strong>Maximal benefit: become a witness.</strong> Every leaf + every signed head
site: the homepage tells the truth about tree 19 — dual anchors, honest tooling, and a note to the paper's readers The estate doc audit scoped itself to *.md and missed the text a site visitor actually reads: the string constants in webdocs.py. Fixed here, verified by RENDERING the page from the live 19-leaf state and checking each block: - The SVG head label reads "Ed25519 + SLH-DSA" when the live head is dual-signed, "Ed25519" when it is not — computed, not asserted. - The trust-anchor card now carries BOTH keys the same way: full PEM, SHA-256 fingerprint, raw endpoint (/v1/log-slhdsa-public-key), mirror comparison link. The Ed25519 key stays the required anchor; the SLH-DSA key is the additive post-quantum one, and the card says whose proof subject its verify path is (leaf 18). - The registered homepage overclaim (register: homepage-stdlib-claim) is closed: "stdlib-only" wording replaced with the truth — stdlib hashing, signature checks shell out to the openssl binary, fails closed without. - "one signature and ~N hashes" became "one REQUIRED signature (Ed25519; heads from tree 14 add an additive post-quantum SLH-DSA signature)". - The paper card is reframed (frozen under review, describes the 16 July snapshot, "then-thirteen-leaf") and followed by a new reader-guidance card (operator-ordered): the paper-era prefix is unchanged inside the live history — leaves 0-12 byte-identical, the paper's head still head #5 of sth-history — verify.py --all checks both eras at once; the advances are additive (44-cert re-attestations, leaf 18, dual-signed heads, ABSENT on older heads by design); and the 3,867 divergence the paper honestly reports has since been CLOSED (sn==0 fix, 2026-07-23, pinned count now 0) — both the divergence and the fix are part of the retained record. Layout fact the render surfaced: the served log dir must contain the .pub files (that is what /v1/log-public-key reads); the SLH-DSA pub joins the Ed25519 one there. Suite 152/0/0. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-07 16:11:42 +00:00
ever issued + <code>verify.py</code> (Python stdlib + the <code>openssl</code> binary for
signatures; fails closed without them). <code>python3 verify.py --all</code>
recomputes the entire tree and every historical head you then hold a retained view that can
later EXPOSE a conflicting head shown to someone else. (A single clone cannot by itself prove the
log never split its view toward another consumer; that requires comparing heads across
consumers.)</td>
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
<td><code>git clone {mirror}</code></td></tr>
The log goes public: git-published mirror, online service, witnesses Three synchronized faces of one log - transport orthogonal to trust: - PUBLISHED GIT MIRROR: log-publish exports the public face (one file per leaf so git history mirrors log history; the FULL STH history as the witness channel; per-component attestations + receipts; the provider public key; a standalone stdlib-only verify.py and customer README). Live at github.com/saymrwulf/lean-transparency-log (genesis: 8 leaves incl. the honest failed-run entries, dogfood-signed head). - ONLINE SERVICE (pacta_provider serve): read-only, zero-dependency HTTP with CT-style endpoints under a base path for zkdefi.org/lean-transparency-log - /v1/sth, /v1/sth-history, /v1/sth-consistency?first=N, /v1/proof, /v1/attestation, /v1/entries, /v1/metadata, /healthz - plus self-contained customer documentation at /docs (current state, attested components, API, the verify- without-trusting-this-site path, and the means/does-NOT-mean boundary). The process never loads private keys: heads are signed offline; a compromised server can withhold or replay (pinning + freshness detect both) but never forge. STH history now recorded append-only by the provider (with a backfill head signed for the existing log). - AGENT ONLINE CLIENT: pacta log-fetch (download evidence; explicitly UNVERIFIED until receipt-verify runs - transport is not trust) and pacta sth-refresh (fetch head, verify signature, advance the pin via an online consistency proof from the pinned size; fail closed). - WITNESSES: pacta witness-audit over a clone of the published mirror recomputes every prefix root from the public leaves and checks every historical head + signature - no consistency proofs needed when the leaves are public. Tampering one published entry trips both the leaf-hash check and the prefix-root check (tested). verify.py gives customers the same audit with zero installation. - DEPLOY.md: the complete server-session checklist for zkdefi.org - reconstruct the servable log FROM the published mirror (the server stays in witness trust-position), hardened systemd unit, nginx/Caddy path routing, Forgejo mirror setup, the provider->world update cycle, and remote smoke tests. Validated end-to-end on the REAL log: all 10 endpoints, online-fetched proof re-verified locally through the dogfood verifier with pinning, online pin refresh, publish + witness audit green, tamper caught, standalone verify.py green in the published clone. 54/54 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:20 +00:00
</table>
<h2>Attested libraries</h2>
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
<table><tr><th>component</th><th>artifact 2</th><th>artifact 3</th><th>status</th></tr>{rows}</table>
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
<p class="muted">One certificate = one machine-checked theorem together with its exact assumption set (its axiom cone).</p>
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
<h2>Three ways to use it</h2>
<div class="steps">
<div class="card"><strong>Quick check</strong> (any machine, milliseconds): download
artifacts 13, then<br>
<code>pacta receipt-verify --attestation --receipt --log-public-key provider.ed25519.pub</code>
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
<br><span class="muted">No Lean, no Rust, no account. The <code>pacta</code> CLI ships in the <a href="https://github.com/saymrwulf/proof-aware-crypto-tooling-agent">pacta repository</a> (<code>pip install .</code> from a clone). Add <code>--sth-store pins.json</code> to remember every Signed Tree Head (STH) you accept your defense against a split view (the operator showing different histories to different consumers).</span></div>
<div class="card"><strong>Zero-install audit</strong>: <code>git clone {mirror} &amp;&amp; cd lean-transparency-log &amp;&amp; python3 verify.py --all</code>
<br><span class="muted">Standard-library Python plus the system <code>openssl</code> binary (signature checks fail closed without it). You become a witness of the whole history.</span></div>
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
<div class="card"><strong>Autonomous agent</strong>: the <a href="https://github.com/saymrwulf/proof-aware-crypto-tooling-agent">pacta</a>
tool adds STH pinning, freshness policy, online refresh from this service, risk scoring
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
(R0R5, six named residual-risk classes) with policy-gated consequences, and optionally verifies every signature through
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
the proof-attested Ed25519 code path itself (<code>--require-verified-verifier</code>).</div>
</div>
The log goes public: git-published mirror, online service, witnesses Three synchronized faces of one log - transport orthogonal to trust: - PUBLISHED GIT MIRROR: log-publish exports the public face (one file per leaf so git history mirrors log history; the FULL STH history as the witness channel; per-component attestations + receipts; the provider public key; a standalone stdlib-only verify.py and customer README). Live at github.com/saymrwulf/lean-transparency-log (genesis: 8 leaves incl. the honest failed-run entries, dogfood-signed head). - ONLINE SERVICE (pacta_provider serve): read-only, zero-dependency HTTP with CT-style endpoints under a base path for zkdefi.org/lean-transparency-log - /v1/sth, /v1/sth-history, /v1/sth-consistency?first=N, /v1/proof, /v1/attestation, /v1/entries, /v1/metadata, /healthz - plus self-contained customer documentation at /docs (current state, attested components, API, the verify- without-trusting-this-site path, and the means/does-NOT-mean boundary). The process never loads private keys: heads are signed offline; a compromised server can withhold or replay (pinning + freshness detect both) but never forge. STH history now recorded append-only by the provider (with a backfill head signed for the existing log). - AGENT ONLINE CLIENT: pacta log-fetch (download evidence; explicitly UNVERIFIED until receipt-verify runs - transport is not trust) and pacta sth-refresh (fetch head, verify signature, advance the pin via an online consistency proof from the pinned size; fail closed). - WITNESSES: pacta witness-audit over a clone of the published mirror recomputes every prefix root from the public leaves and checks every historical head + signature - no consistency proofs needed when the leaves are public. Tampering one published entry trips both the leaf-hash check and the prefix-root check (tested). verify.py gives customers the same audit with zero installation. - DEPLOY.md: the complete server-session checklist for zkdefi.org - reconstruct the servable log FROM the published mirror (the server stays in witness trust-position), hardened systemd unit, nginx/Caddy path routing, Forgejo mirror setup, the provider->world update cycle, and remote smoke tests. Validated end-to-end on the REAL log: all 10 endpoints, online-fetched proof re-verified locally through the dogfood verifier with pinning, online pin refresh, publish + witness audit green, tamper caught, standalone verify.py green in the published clone. 54/54 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:20 +00:00
<h2>API</h2>
<pre>GET {base}/v1/sth latest Signed Tree Head
audit v3: paper-reality congruence + external-pointer integrity (Fable-5 Socratic pass) Two Fable-5 inventory agents cross-checked every empirical claim in the paper against code/deployed log, and every external pointer against the live internet. Fixes on both sides: CODE (system brought up to the paper's claims): - SECURITY: pin-store mutation (incl. permanent poisoning) was reachable via receipts whose head signature FAILED verification in two of three consumer paths (attestation.py, cli.py) - an unauthenticated forged head at the pinned size could poison a consumer's pin forever and pollute the equivocation-evidence pair with an unverifiable head, contradicting SS5.4's 'validly signed' precondition and Prop 1. Both paths now gate the store on a verified Ed25519 head signature (logclient.py already did). Regression test added. - Prop 2 made literally true: _normalize_certificate now derives the cleanliness verdict purely from (observed cone, local allowed set) in EVERY branch; the operator's axiom_status label is never copied (was passed through for non-proven certs), missing cone => unverifiable always. Labels can deny, never grant. Test added. - webdocs: '/v1/sth-history: every head ever signed' -> 'the published head history'. PAPER (claims brought down to reality): - 'every head ever signed' -> the signed head history since publication began (heads for sizes 1-7 predate the mirror and were not retained). - Run-3 bullet: 'independently checkable by diffing the two commit trees' was no longer reproducible (pre-rewrite objects discarded); now states the log-internal corroboration (identical cert lists and cones across leaves 4-7 vs 8-11) and that tree diffs are not public. - Appendix A leaf block now actually verbatim: scheme openssl-ed25519, verified_backend serial/u64, real Lean version (4.30.0-rc2) instead of 4.x.y placeholder, leaf's actual axiom order (finalize/new/update), machine_protection note quoted, elisions marked; preamble wording matches. - Appendix C upstream boundary reordered to check.sh's verbatim order. - '27 lines - all annotation' -> honest description (axiom-list entries + operation reordering from one fork's black_box barrier). - Prop 2 proof + App A: status label consulted only negatively. - SS7: provenance fields noted as outside the signed payload; consumer chain relies on none of them. - Bibliography: all 20 entries verified against DBLP/RFC-editor - zero errors; added missing page numbers to 6 entries; thebibliography width 19->20. All URLs verified public; no PlanetMacro leakage. 17 pages, 106 tests green, accumulator untouched (tree_size 12). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 19:33:28 +00:00
GET {base}/v1/sth-history the published head history (witness material)
The log goes public: git-published mirror, online service, witnesses Three synchronized faces of one log - transport orthogonal to trust: - PUBLISHED GIT MIRROR: log-publish exports the public face (one file per leaf so git history mirrors log history; the FULL STH history as the witness channel; per-component attestations + receipts; the provider public key; a standalone stdlib-only verify.py and customer README). Live at github.com/saymrwulf/lean-transparency-log (genesis: 8 leaves incl. the honest failed-run entries, dogfood-signed head). - ONLINE SERVICE (pacta_provider serve): read-only, zero-dependency HTTP with CT-style endpoints under a base path for zkdefi.org/lean-transparency-log - /v1/sth, /v1/sth-history, /v1/sth-consistency?first=N, /v1/proof, /v1/attestation, /v1/entries, /v1/metadata, /healthz - plus self-contained customer documentation at /docs (current state, attested components, API, the verify- without-trusting-this-site path, and the means/does-NOT-mean boundary). The process never loads private keys: heads are signed offline; a compromised server can withhold or replay (pinning + freshness detect both) but never forge. STH history now recorded append-only by the provider (with a backfill head signed for the existing log). - AGENT ONLINE CLIENT: pacta log-fetch (download evidence; explicitly UNVERIFIED until receipt-verify runs - transport is not trust) and pacta sth-refresh (fetch head, verify signature, advance the pin via an online consistency proof from the pinned size; fail closed). - WITNESSES: pacta witness-audit over a clone of the published mirror recomputes every prefix root from the public leaves and checks every historical head + signature - no consistency proofs needed when the leaves are public. Tampering one published entry trips both the leaf-hash check and the prefix-root check (tested). verify.py gives customers the same audit with zero installation. - DEPLOY.md: the complete server-session checklist for zkdefi.org - reconstruct the servable log FROM the published mirror (the server stays in witness trust-position), hardened systemd unit, nginx/Caddy path routing, Forgejo mirror setup, the provider->world update cycle, and remote smoke tests. Validated end-to-end on the REAL log: all 10 endpoints, online-fetched proof re-verified locally through the dogfood verifier with pinning, online pin refresh, publish + witness audit green, tamper caught, standalone verify.py green in the published clone. 54/54 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:20 +00:00
GET {base}/v1/sth-consistency?first=N consistency proof from your pinned size
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
GET {base}/v1/proof?component=NAME inclusion proof (artifact 3, freshly issued)
GET {base}/v1/attestation?component=NAME the claim (artifact 2)
GET {base}/v1/entries?start=N&amp;end=M raw leaves
The log goes public: git-published mirror, online service, witnesses Three synchronized faces of one log - transport orthogonal to trust: - PUBLISHED GIT MIRROR: log-publish exports the public face (one file per leaf so git history mirrors log history; the FULL STH history as the witness channel; per-component attestations + receipts; the provider public key; a standalone stdlib-only verify.py and customer README). Live at github.com/saymrwulf/lean-transparency-log (genesis: 8 leaves incl. the honest failed-run entries, dogfood-signed head). - ONLINE SERVICE (pacta_provider serve): read-only, zero-dependency HTTP with CT-style endpoints under a base path for zkdefi.org/lean-transparency-log - /v1/sth, /v1/sth-history, /v1/sth-consistency?first=N, /v1/proof, /v1/attestation, /v1/entries, /v1/metadata, /healthz - plus self-contained customer documentation at /docs (current state, attested components, API, the verify- without-trusting-this-site path, and the means/does-NOT-mean boundary). The process never loads private keys: heads are signed offline; a compromised server can withhold or replay (pinning + freshness detect both) but never forge. STH history now recorded append-only by the provider (with a backfill head signed for the existing log). - AGENT ONLINE CLIENT: pacta log-fetch (download evidence; explicitly UNVERIFIED until receipt-verify runs - transport is not trust) and pacta sth-refresh (fetch head, verify signature, advance the pin via an online consistency proof from the pinned size; fail closed). - WITNESSES: pacta witness-audit over a clone of the published mirror recomputes every prefix root from the public leaves and checks every historical head + signature - no consistency proofs needed when the leaves are public. Tampering one published entry trips both the leaf-hash check and the prefix-root check (tested). verify.py gives customers the same audit with zero installation. - DEPLOY.md: the complete server-session checklist for zkdefi.org - reconstruct the servable log FROM the published mirror (the server stays in witness trust-position), hardened systemd unit, nginx/Caddy path routing, Forgejo mirror setup, the provider->world update cycle, and remote smoke tests. Validated end-to-end on the REAL log: all 10 endpoints, online-fetched proof re-verified locally through the dogfood verifier with pinning, online pin refresh, publish + witness audit green, tamper caught, standalone verify.py green in the published clone. 54/54 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:20 +00:00
GET {base}/v1/metadata log identity
GET {base}/healthz</pre>
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
<h2>What a verified inclusion means and what it does not</h2>
<div class="card"><span class="pill ok">means</span> The provider whose key you hold
attests: the Lean proofs of the named repository at the named git commit re-check with
exactly the documented assumptions and this signed head irrevocably commits that statement to
this view. Consumers who compare heads, or retain the public mirror, can expose any conflicting
view.</div>
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
<div class="card"><span class="pill warn">does not mean</span> A verified binary. The
proofs cover Rust <em>source</em>; clone the attested commit (the commit id identifies the
committed git tree not external dependencies, toolchain downloads, or generated artifacts) and
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
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 <code>attestation.json</code>. Honesty about the boundary is the product.</div>
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
<h2>You hold the ruler</h2>
<div class="card">The list of assumptions a certificate is <em>allowed</em> to rest on
is not something this site hands you at verification time it is a
<strong>requirements card</strong> that lives in <em>your</em> tooling, on
<em>your</em> disk, and that you can read in five minutes or rewrite from first
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
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
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
attestation's <em>observed</em> axiom list (its cone) against <em>your</em> card, name by name.
The operator is trusted to copy down what the proof kernel printed never to
interpret it.</div>
<div class="card">A card you write yourself will match this log's supply
<strong>exactly</strong> and that is engineered, not coincidence: the corpus was
shrunk until every remaining axiom justifies its existence. If your card is
<em>stricter</em> (say: "SHA-512 itself must be proven"), there is nothing here to
negotiate the gap is itemized, never blurred, and you have three honest options:
accept a <em>named</em> line item, walk away, or prove the missing piece and enter it
into this same log. <strong>If your ruler is stricter than our supply, your ruler is
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
our roadmap.</strong> (The full walk-through is lecture&nbsp;11 of the Jupyter course in the
<a href="https://github.com/saymrwulf/proof-aware-crypto-tooling-agent">pacta repo</a>.)</div>
<h2>The paper</h2>
paper v0.3: the reinvention — accountable distribution of machine-checked evidence Executes the approved reinvention outline, using the round-11 GPT-5.6 draft as base material; the operator remains the author of record and this pass is the authorial fact-check + completion of that draft. New title: 'Accountable Distribution of Machine-Checked Correctness Evidence: A Transparency Model and the Lean Transparency Log' (16 pp). Old 19-page system report archived byte-identical as v0.2 (paper/ltl-v0.2.{tex,pdf}, served at /paper/v0.2; v0.1 unchanged). Every factual claim in the draft was verified against the estate before adoption: 222 inventoried constants + 61 reviewed cones (README:36), all four fidelity counts, the gap-14 lied-size witness reproduced empirically (deployed verify_consistency(1,3,R2,R3,P)=True while the recursive model rejects; honest 2->3 True/True), all four apex theorem names greped from the dalek repo, the entry-13 scope block now quoted VERBATIM (was silently trimmed), the new klaus2026 citation confirmed real via the arXiv API (author order corrected to Klaus, Conejero, Tolmach), remaining 20 bibitems byte-identical to the F10-verified set. Author corrections beyond the draft: 'opaque SHA-256 function' -> uninterpreted/boundary AXIOM (matches axiom sha256 : List UInt8 -> Hash); STH field list now matches the deployed head (adds type tag); lied-size mechanism sentence from the gap ledger; six-published-heads (sizes 8-13) mirror honesty; consumers subsection (warden + Swiss Post family-level negative) per outline item 7; optimistic-accountability related-work paragraph per outline item 8; fifteen-gap ledger pointer per outline item 9; verify.py fail-closed tie-ins in artifact availability and appendix C; wired the six uncited bibitems (lean4, pnueli, eddsa, rfc8032, edwards+twisted, easycrypt); certificate listing gains the deployed 'diagnostics' field. Build: 16 pages, 0 overfull, 0 undefined. web.py: /paper/v0.2 route + loader. webdocs: paper card rewritten for v0.3 with both archived versions linked. Suite 115 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 07:39:04 +00:00
<div class="card"><a href="{base}/paper"><strong>Accountable Distribution of Machine-Checked
Correctness Evidence: A Transparency Model and the Lean Transparency Log</strong></a>
(PDF, 25 pages, <strong>v0.12 revised August&nbsp;2026</strong>; the version is printed on the
title page) the trust decomposition (expensive verification produces an
paper v0.5: B6 executed — accountability games + explicit composition theorem (IACR track) New \S5.4 'Scheme-level games and a composition theorem' (operator order: third attempt targets an IACR venue): - Game PB (position binding): two accepting openings of different leaves at one (m,n,r) -> explicit B_pb outputs a SHA-256 collision in <= 2(ceil(log2 n)+1) hash evaluations (two-transcript top-down comparison; 32-byte widths make argument pairs recoverable). - Lemma (prefix transport): an accepted ConsRec transcript plus an accepting opening at m<n0 under the NEW head yields a collision or an assembled accepting opening under the OLD head (frontier comparison + old-root spine assembly; degenerate power-of-two case handled). - Game HIST (local history binding): pin-rule chains + contradictory openings at any two accepted heads -> collision, by transport induction + PB. Supplies the multi-step closure at paper level. - Game FORK: evidence completeness by construction; frame resistance reduces to EUF-CMA. Win condition deliberately over canonical PAYLOADS, not heads — a second signature on an already-signed payload is not an EUF-CMA forgery (SUF/EUF trap caught in the self-audit pass before integration). - Policy separation as a deterministic lemma (per GPT B6's own suggestion), formal Definition 3, and Theorem 7: the construction is an accountable replay-distribution scheme. - Fixed-function SHA-256 handled per Rogaway's human-ignorance treatment (new citation, arXiv-API/DBLP/Springer-verified: VIETCRYPT, LNCS 4341, pp. 211-228, 2006 — note Rogaway's own page carries a 221- typo): every hash statement is an explicit reduction, the scheme-level continuation of the named-extractor discipline. - Games are non-interactive BECAUSE the operator-adversary holds the signing key (no secrets, no oracles) — stated in the section, mirroring the deployment's non-interactive verification. - Honesty anchored: scope remark + new coverage-table row (two- transcript comparisons and prefix transport are paper-level, not mechanized); Definition 2 re-badged informal with pointer; DGHS two-transcript lineage credited in related work. 19 pages, 0 overfull, suite 115 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 11:31:51 +00:00
observation; transparency makes the observation accountable; consumer-local policy decides
acceptance), collision-extracting soundness for inclusion and consistency, scheme-level
paper v0.6: round-13 fix batch — §5.4 rewritten; every verified finding closed Reconciliation first: the two round-13 reviews CONTRADICT on FORK. Opus (flagged mid-review as flipped, per operator): 'frame-resistance unsound as stated' because payloads carry timestamps. GPT: 'the right EUF-CMA form.' Independent re-derivation sides with GPT: a winning head needs a VALID SIGNATURE on its never-queried exact payload bytes — a forgery regardless of timestamp; Opus's no-forgery scenario never produces the valid signature it presupposes, and its own fix paragraph concedes the win condition already means exact-payload freshness. Its real residue (the (n,r)-injectivity parenthetical was a red herring in that proof) is adopted: the parenthetical is gone, injectivity is now its own lemma where it belongs. GPT findings, all verified then fixed: - Theorem 5 formal error (CONFIRMED): the proof applied transport to same-size transitions outside the lemma's n0<n1 hypothesis, and the lemma's last line smuggled that case. Lemma restated for n0<=n1 with the equal case explicit; HIST proof now case-splits (equal: Ext forces equal roots, opening carries over; growth: transport). - Prefix transport (CONFIRMED under-proved; Opus concurs): the frontier narrative is replaced by a FULL induction over the ConsRec recursion, with the verifier recursions displayed, the value-equality invariant (rho = y) threaded exactly as the corpus's extractConsNode analysis identified, explicit P0 assembly per branch, the no-mismatched- stopping-points argument (shapes are integer-determined), and the power-of-two split-stability step credited to the corpus's mechanized kbelow lemma. - FORK cross-log framing flaw (CONFIRMED): evidence predicate now context-scoped — fixed chi = (log id, schema/type, hash-alg, pk) declared once, encoded in every head; one key running two logs can no longer be classified as equivocating. Prose corrected to 'issued-message attribution' (no more 'never equivocated' oracle mismatch). - HEAD-AUTH game added (CONFIRMED gap): outsider forging one ordinary head reduces to EUF-CMA; G1's forgery leg is now discharged by an actual game, closing the network-attacker hole. - Two-level formalization (CONFIRMED): Definition 3 = collision- extractable accountability (unconditional, explicit reductions with stated costs); NEW security corollary = what human-ignorance CR + EUF-CMA + correct key + fixed context then rule out. Extractability no longer masquerades as hardness. - Composition mapping made precise: G1 narrowed to authentic position binding (HEAD + PB opening-uniqueness; full-list membership is a system property of the published mirror, said so); G2 split into syntactic pin rule vs semantic HIST content; monotone-extensions and payload-injectivity as one-line lemmas; HIST game syntax lists C_i and 0<=a<b<=k; Adv defined for the two keyed games; PB cost notes retained intermediates; Rogaway bibitem gains the DOI (211-228 reconfirmed by GPT: Springer/DBLP vs the author's list-page typo). 21 pages, 0 overfull, suite 115 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 13:01:45 +00:00
accountability GAMES with an explicit composition theorem (head authenticity, position
binding, history binding with a fully proved prefix-transport induction, context-scoped
fork evidence all discharged by named reductions), the policy boundary where
operator labels can veto but never grant acceptance, and the measured model/deployment
divergence reported as a result rather than hidden now together with its closure: the
divergence traced to one omitted RFC&nbsp;9162 conjunct (Step&nbsp;7's <code>sn&nbsp;=&nbsp;0</code>),
zero divergences after the one-line restoration, confirmed by a three-way regression.
New in the August 2026 revisions: the deployment evaluated to its current nineteen-leaf, dual-signed state, an
instantiation section for the SLH-DSA (FIPS&nbsp;205) verify path eleven certificates,
five uninterpreted hash oracles, exact cones and a certificate appendix mirroring the
Ed25519 tiers.</div>
<div class="card"><strong>Paper and log, one story.</strong> Since the August 2026 revisions the paper
site: the socratic round — every stale claim fixed, every printed command runs, first-use glosses 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).
2026-08-16 14:49:44 +00:00
describes this deployment as it runs nineteen leaves, dual-signed heads, the
post-quantum verify path as leaf&nbsp;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: <code>python3 verify.py --all</code>
re-verifies all of it, paper-era and after, from a clone of the mirror.</div>
site: the homepage tells the truth about tree 19 — dual anchors, honest tooling, and a note to the paper's readers The estate doc audit scoped itself to *.md and missed the text a site visitor actually reads: the string constants in webdocs.py. Fixed here, verified by RENDERING the page from the live 19-leaf state and checking each block: - The SVG head label reads "Ed25519 + SLH-DSA" when the live head is dual-signed, "Ed25519" when it is not — computed, not asserted. - The trust-anchor card now carries BOTH keys the same way: full PEM, SHA-256 fingerprint, raw endpoint (/v1/log-slhdsa-public-key), mirror comparison link. The Ed25519 key stays the required anchor; the SLH-DSA key is the additive post-quantum one, and the card says whose proof subject its verify path is (leaf 18). - The registered homepage overclaim (register: homepage-stdlib-claim) is closed: "stdlib-only" wording replaced with the truth — stdlib hashing, signature checks shell out to the openssl binary, fails closed without. - "one signature and ~N hashes" became "one REQUIRED signature (Ed25519; heads from tree 14 add an additive post-quantum SLH-DSA signature)". - The paper card is reframed (frozen under review, describes the 16 July snapshot, "then-thirteen-leaf") and followed by a new reader-guidance card (operator-ordered): the paper-era prefix is unchanged inside the live history — leaves 0-12 byte-identical, the paper's head still head #5 of sth-history — verify.py --all checks both eras at once; the advances are additive (44-cert re-attestations, leaf 18, dual-signed heads, ABSENT on older heads by design); and the 3,867 divergence the paper honestly reports has since been CLOSED (sn==0 fix, 2026-07-23, pinned count now 0) — both the divergence and the fix are part of the retained record. Layout fact the render surfaced: the served log dir must contain the .pub files (that is what /v1/log-public-key reads); the SLH-DSA pub joins the Ed25519 one there. Suite 152/0/0. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-07 16:11:42 +00:00
The LTL website: the accumulator drawn live, artifacts named unambiguously The /docs route is now a real landing site (still one self-contained HTML, inline CSS + inline SVG, zero external assets): - One-sentence definition up top: what the LTL is and the cost asymmetry it exists for (one signature + a few hashes in milliseconds vs hours of theorem proving). - THE GRAPHIC: the accumulator itself, rendered server-side from the LIVE log at page load - real leaf hashes, real internal nodes, the real root and signature. Green leaves are boundary-exact verified attestations; grey leaves are the historical audit-failure entries, labeled "kept forever - an append-only ledger does not erase its bad day". The signature box names the dogfood backend and the provider's self-inclusion check (the signature vouches for the code; the tree vouches for the signature's code). - "What do I download?" - exactly three artifacts, numbered, each with what-it-is and where: (1) provider.ed25519.pub, the sole trust anchor, cross-checkable between this site and the GitHub mirror; (2) the attestation = the claim; (3) the receipt = the proof of inclusion. Plus the maximal-benefit path: clone the mirror, run verify.py --all, become a witness. - Three usage lanes (quick check / zero-install audit / autonomous agent), the API, and the means / does-NOT-mean cards. Rendered against the real 8-leaf log and content-asserted in tests' presence. 54/54 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:38:37 +00:00
<p class="muted">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 <a href="https://github.com/saymrwulf/proof-aware-crypto-tooling-agent">pacta repository</a>.</p>
The log goes public: git-published mirror, online service, witnesses Three synchronized faces of one log - transport orthogonal to trust: - PUBLISHED GIT MIRROR: log-publish exports the public face (one file per leaf so git history mirrors log history; the FULL STH history as the witness channel; per-component attestations + receipts; the provider public key; a standalone stdlib-only verify.py and customer README). Live at github.com/saymrwulf/lean-transparency-log (genesis: 8 leaves incl. the honest failed-run entries, dogfood-signed head). - ONLINE SERVICE (pacta_provider serve): read-only, zero-dependency HTTP with CT-style endpoints under a base path for zkdefi.org/lean-transparency-log - /v1/sth, /v1/sth-history, /v1/sth-consistency?first=N, /v1/proof, /v1/attestation, /v1/entries, /v1/metadata, /healthz - plus self-contained customer documentation at /docs (current state, attested components, API, the verify- without-trusting-this-site path, and the means/does-NOT-mean boundary). The process never loads private keys: heads are signed offline; a compromised server can withhold or replay (pinning + freshness detect both) but never forge. STH history now recorded append-only by the provider (with a backfill head signed for the existing log). - AGENT ONLINE CLIENT: pacta log-fetch (download evidence; explicitly UNVERIFIED until receipt-verify runs - transport is not trust) and pacta sth-refresh (fetch head, verify signature, advance the pin via an online consistency proof from the pinned size; fail closed). - WITNESSES: pacta witness-audit over a clone of the published mirror recomputes every prefix root from the public leaves and checks every historical head + signature - no consistency proofs needed when the leaves are public. Tampering one published entry trips both the leaf-hash check and the prefix-root check (tested). verify.py gives customers the same audit with zero installation. - DEPLOY.md: the complete server-session checklist for zkdefi.org - reconstruct the servable log FROM the published mirror (the server stays in witness trust-position), hardened systemd unit, nginx/Caddy path routing, Forgejo mirror setup, the provider->world update cycle, and remote smoke tests. Validated end-to-end on the REAL log: all 10 endpoints, online-fetched proof re-verified locally through the dogfood verifier with pinning, online pin refresh, publish + witness audit green, tamper caught, standalone verify.py green in the published clone. 54/54 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:05:20 +00:00
</body></html>"""