diff --git a/ESTATE.md b/ESTATE.md
index 8f3745c..cf9fb49 100644
--- a/ESTATE.md
+++ b/ESTATE.md
@@ -7,9 +7,10 @@ including the two self-referential loops that make the estate hard to
keep in one head. Maintained here in pacta because pacta is the
machinery hub and the only repo that changes freely.
-State snapshot (2026-07-19): log **13 leaves**, root `3488a2d0…`, key
+State snapshot (2026-07-22): log **13 leaves**, root `3488a2d0…`, key
fingerprint `874c8a00…`, paper **v0.9 camera-ready (23 pp)**, five
-attested components, pacta suite 135 green.
+attested components, one campaign open (SLH-DSA — **zero
+certificates**), pacta suite 144 green.
```mermaid
flowchart LR
@@ -19,6 +20,7 @@ flowchart LR
s3["risc0-…-dalek-source"]
s4["betrusted-…-dalek-source"]
s5["pasta_curves-source"]
+ s6["fips205-source"]
end
subgraph V["VERIFIED SUBJECTS"]
d["dalek-ed25519-verified
16 certs · leaf 8 · signer source"]
@@ -26,6 +28,7 @@ flowchart LR
r["risc0-ed25519-verified
16 certs · leaf 10"]
b["betrusted-ed25519-verified
16 certs · leaf 11"]
p["pasta-pallas-verified
field layer only · NOT attested"]
+ f["fips205-slhdsa-verified
campaign in progress · 0 certs · NOT attested"]
c["ltl-accumulator-verified
61 certs · entry-13 subject · frozen 172a1d0"]
end
subgraph M["MACHINERY — pacta + operator-held"]
@@ -57,6 +60,7 @@ flowchart LR
s3 --> r
s4 --> b
s5 --> p
+ s6 --> f
d -->|attest| prov
a -->|attest| prov
r -->|attest| prov
@@ -85,8 +89,8 @@ flowchart LR
classDef held fill:#2b3442,stroke:#2b3442,color:#e8ecf2
classDef pub fill:#efe9f5,stroke:#6d4a8f,color:#1c2430
classDef cons fill:#fdf0da,stroke:#a86a10,color:#1c2430
- class s1,s2,s3,s4,s5 src
- class d,a,r,b,p,c sub
+ class s1,s2,s3,s4,s5,s6 src
+ class d,a,r,b,p,c,f sub
class prov,sig,lib,wal,pap,crs mach
class key,ops,sd held
class mir,site,fj,book pub
@@ -115,8 +119,10 @@ deployed verifier; see the corpus KNOWN-GAPS ledger).
| Repository | Lane | Role | Mutability |
|---|---|---|---|
| `curve25519-dalek-source`, `anza-cryptography-source`, `risc0-…-source`, `betrusted-…-source`, `pasta_curves-source` (+ `xous-core`, `litex-boards` context) | upstream | pinned inputs to extraction | **frozen — never modified** |
+| `fips205-source` | upstream | verbatim snapshot of `integritychain/fips205` (pure-Rust FIPS 205 / SLH-DSA); upstream pin `30bac08`, snapshot head `5dca0db` — single deviation: upstream CI workflows stripped, documented in-commit | pinned; moves only for transparent, individually-justified Aeneas-compat patches (nothing proposed upstream) |
| `dalek-` / `anza-` / `risc0-` / `betrusted-ed25519-verified` | subject | Rust source + Lean proofs; 16 certs each; attested (leaves 8–11, generations at 0–7) | frozen at attested commits; branch moves only for docs |
| `pasta-pallas-verified` | subject | field layer proven; curve layer pending; **not attested** | changes freely |
+| `fips205-slhdsa-verified` | subject | SLH-DSA (FIPS 205) verify-path campaign, parameter set SLH-DSA-SHA2-128s; **campaign in progress — zero certificates, `check.sh` non-green by design**; not attested | changes freely — campaign |
| `ltl-accumulator-verified` | subject | 61-cert corpus about the log's accumulator model; **entry-13 subject**, frozen `172a1d0` | frozen; doc-only commits allowed |
| `proof-aware-crypto-tooling-agent` (this repo) | machinery | provider service, consumer library, warden (+ local read-only cockpit), dogfood signer, paper, course, tests | **changes freely — the hub** |
| `lean-transparency-log` | published | the public mirror: leaves, heads, receipts, fail-closed `verify.py` + selftest | **generated by publish** — canonical files here, templates in pacta, CI-pinned |
@@ -133,7 +139,7 @@ deployed verifier; see the corpus KNOWN-GAPS ledger).
| **Operational log state** | `provider/state/transparency-log-main` — the true accumulator. Appends happen here; the mirror is its projection. |
| **Evidence archive (offline)** | review kits and stamped artifacts (`_timestamp_hash8` convention); never in git. |
-## What is running (operations, verified 2026-07-20)
+## What is running (operations, verified 2026-07-20; campaign rows 2026-07-22)
| Entity | Runtime | Where | Starts / stops |
|---|---|---|---|
@@ -143,6 +149,7 @@ deployed verifier; see the corpus KNOWN-GAPS ledger).
| provider write side (check / append / publish / sign) | **on demand** | operator machine | runs only during an append ceremony, minutes at a time; the signing key is offline otherwise |
| warden (the financial agent) | **not running** | nowhere | implemented prototype: a wallet directory plus CLI/MCP/cockpit processes that exist only while explicitly started; no deployed instance, no funds watched |
| custody cockpit | **on demand** | operator machine, localhost | `pacta wallet cockpit`, stops with Ctrl-C; read-only |
+| SLH-DSA campaign (`fips205-source` + `fips205-slhdsa-verified`) | **no process** | — | static repos, **zero certificates yet**; extraction/proof sessions are episodic operator-machine runs under lean-guard |
| everything else (repos, paper, book, mirror, SD) | **no process** | — | static files; consumers and reviewers are external and episodic |
The human-facing interactive rendering of this whole map, runtime
diff --git a/src/pacta/estateview.py b/src/pacta/estateview.py
index c2ea519..1967d79 100644
--- a/src/pacta/estateview.py
+++ b/src/pacta/estateview.py
@@ -123,8 +123,9 @@ ESTATE_HTML = r'''
LTL estate map — repos, services, loops
key 874c8a00…
paper v0.9 · 23 pp · camera-ready
attested components 5
- pacta suite 135 green
- state as of 2026-07-20
+ pacta suite 144 green
+ SLH-DSA campaign open — 0 certificates
+ state as of 2026-07-22
ALWAYS ON droplet: caddy (TLS, static blog) · LTL web service (read-only container) · Forgejo (+ 03:00 mirror cron)
@@ -155,6 +156,7 @@ ESTATE_HTML = r'''
LTL estate map — repos, services, loops
risc0-…-dalek-source
RISC Zero fork, pinned clone
betrusted-…-dalek-source
Betrusted fork (+ xous-core, litex-boards context)
pasta_curves-source
Pasta curves, pinned clone
+
fips205-source
integritychain FIPS 205 (SLH-DSA), pinned snapshot
@@ -170,6 +172,8 @@ ESTATE_HTML = r'''LTL estate map — repos, services, loops
attested
pasta-pallas-verified
field layer proven · curve layer pending
not attested
+ fips205-slhdsa-verified
SLH-DSA-SHA2-128s verify path · skeleton — 0 certificates
+
campaign in progressnot attested
ltl-accumulator-verified
61 certs · proofs about the log's own accumulator model
attested · entry 13frozen 172a1d0loop 2
@@ -241,9 +245,11 @@ const RUNTIME = {
srcDalek:"frozen clone — nothing runs", srcAnza:"frozen clone — nothing runs",
srcRisc0:"frozen clone — nothing runs", srcBet:"frozen clone — nothing runs",
srcPasta:"frozen clone — nothing runs",
+ srcFips205:"pinned snapshot — nothing runs; moves only for documented Aeneas-compat patches",
dalek:"static repo — proofs replay on demand", anza:"static repo — proofs replay on demand",
risc0:"static repo — proofs replay on demand", bet:"static repo — proofs replay on demand",
pasta:"static repo — open work, run manually", corpus:"frozen repo — replay on demand",
+ fips:"static repo — no process; campaign sessions are episodic operator-machine runs under lean-guard; check.sh exits non-green by design",
provider:"SPLIT: the write side (check/append/publish) runs ON DEMAND on the operator machine, only during a ceremony; the read-only web face runs ALWAYS ON in the droplet container",
signer:"on demand — invoked only while signing during a ceremony; key offline otherwise",
conslib:"library — runs inside whichever consumer invokes it",
@@ -269,11 +275,13 @@ const DOSSIER = {
srcRisc0:{lane:"Upstream inputs",mut:"frozen",facts:["Pinned clone of the RISC Zero dalek fork.","Input to extraction; never modified."]},
srcBet:{lane:"Upstream inputs",mut:"frozen",facts:["Pinned clone of the Betrusted dalek fork.","xous-core and litex-boards sit alongside as platform context.","Input to extraction; never modified."]},
srcPasta:{lane:"Upstream inputs",mut:"frozen",facts:["Pinned clone of the Pasta curves crate.","Feeds pasta-pallas-verified; never modified."]},
+ srcFips205:{lane:"Upstream inputs",mut:"frozen",facts:["Verbatim snapshot of integritychain/fips205 — pure-Rust FIPS 205 / SLH-DSA (zero unsafe, no_std, const-generic).","Pinned at upstream 30bac08 (2025-09-01); snapshot head 5dca0db — the single deviation from verbatim is stripping upstream CI workflows, documented in that commit.","Aeneas-compat patches land HERE as transparent, individually-justified commits; nothing is proposed upstream (no affiliation)."]},
dalek:{lane:"Verified subjects",mut:"frozen",facts:["16 reviewed certificates: field, group law, scalars, signature apex (T1–T4).","Attested in all three log generations; current leaf 8.","LOOP 1 anchor: the dogfood signer binary is built from this source — the log's heads are signed by code whose proofs are inside the log.","Attestation pins a commit; the branch only moves for docs."]},
anza:{lane:"Verified subjects",mut:"frozen",facts:["16 reviewed certificates; current leaf 9.","Same proof pyramid as dalek, rebuilt for the fork's code structure."]},
risc0:{lane:"Verified subjects",mut:"frozen",facts:["16 reviewed certificates; current leaf 10.","Differs from Betrusted's corpus by 27 changed proof lines (the paper's portability datum)."]},
bet:{lane:"Verified subjects",mut:"frozen",facts:["16 reviewed certificates; current leaf 11."]},
- pasta:{lane:"Verified subjects",mut:"free",facts:["Field layer proven from own extraction; curve layer (group law + scalar mul) is the one open verification task in the estate.","NOT attested — the log carries only the four Ed25519 forks + the corpus."]},
+ pasta:{lane:"Verified subjects",mut:"free",facts:["Field layer proven from own extraction; curve layer (group law + scalar mul) remains open work.","NOT attested — the log carries only the four Ed25519 forks + the corpus."]},
+ fips:{lane:"Verified subjects",mut:"free",facts:["CAMPAIGN IN PROGRESS — ZERO certificates: verification/check.sh exits non-green and says so; that script is the only source of the word «proven» for this repo.","Scope: the FIPS 205 verify path only (slh_verify → fors / hypertree → xmss → wots → chain), parameter set SLH-DSA-SHA2-128s; keygen and signing are trusted base, exactly as ed25519 signing was.","The six SHA-2 hash oracles are opaque external models (TRUSTED-BASE.md), kept outside every future certificate's dependency cone.","Gate-0 (2026-07-22): Charon clean; Aeneas translated the whole cone with exactly one obstruction class (the Hashers fn-pointer struct) — campaign phase 1 is the compat patch in fips205-source.","NOT attested — the log carries nothing from this campaign yet."]},
corpus:{lane:"Verified subjects",mut:"frozen",facts:["61 certificates over one boundary axiom (LTLAcc.sha256); 222-constant environment inventory; 15-gap honest ledger.","Mechanizes the archived report's §6: extractors, consistency binding, per-step pin safety.","LOOP 2 anchor: attested INTO the log as entry 13 — the log carries kernel-checked proofs about its own accumulator model.","Frozen at 172a1d0 (the attested commit); doc-only commits may move the branch.","Docs carry numbering notes: paper references are v0.2 numbering."]},
provider:{lane:"pacta · machinery",mut:"free",facts:["pacta_provider: attestation check → log-append → log-publish; webdocs homepage + /v1 API code.","Holds the publish TEMPLATES for the mirror's verify.py / selftest / README — since 2026-07-19 pinned by CI (test_published_assets) after the audit caught a stale fail-open template.","Deploys to the droplet as the ltl container."]},
signer:{lane:"pacta · machinery",mut:"free",facts:["verified-dalek-serial: the Ed25519 binary built from the attested dalek source.","Signs every tree head; before signing, the provider re-checks inclusion of the signer's own leaf.","LOOP 1: signature vouches for the tree; the tree contains the attestation of the signer's source (leaf 8). Execution provenance is reported, not proven — stated in the paper."]},
@@ -299,6 +307,7 @@ const EDGES = [
["srcDalek","dalek","","extract"],["srcAnza","anza","","extract"],
["srcRisc0","risc0","","extract"],["srcBet","bet","","extract"],
["srcPasta","pasta","","extract"],
+ ["srcFips205","fips","","extract"],
["dalek","provider","","attest"],["anza","provider","","attest"],
["risc0","provider","","attest"],["bet","provider","","attest"],
["provider","opstate","append","publish"],
diff --git a/src/pacta/liveness.py b/src/pacta/liveness.py
index dfbccfa..cc28c4f 100644
--- a/src/pacta/liveness.py
+++ b/src/pacta/liveness.py
@@ -36,6 +36,8 @@ SERVICES: list[tuple[str, str, str]] = [
]
# local working copies expected as siblings of this repo checkout
+# (the upstream-source shelf — curve25519-dalek-source, fips205-source, … —
+# lives outside this root and is deliberately not probed here)
LOCAL_REPOS: list[str] = [
"lean-transparency-log",
"ltl-accumulator-verified",
@@ -45,6 +47,7 @@ LOCAL_REPOS: list[str] = [
"risc0-ed25519-verified",
"betrusted-ed25519-verified",
"pasta-pallas-verified",
+ "fips205-slhdsa-verified",
"proof-aware-crypto-tooling-agent",
]
diff --git a/tests/test_walletui.py b/tests/test_walletui.py
index 054385f..b486920 100644
--- a/tests/test_walletui.py
+++ b/tests/test_walletui.py
@@ -232,6 +232,7 @@ def test_estate_view_and_estate_md_do_not_drift():
for name in ("lean-transparency-log", "ltl-accumulator-verified",
"proof-aware-crypto-tooling-agent", "verifying-crypto-with-lean",
"dalek-ed25519-verified", "pasta-pallas-verified",
+ "fips205-source", "fips205-slhdsa-verified",
"ltl.zkdefi.org", "Forgejo"):
assert name in ESTATE_HTML, f"estate view lost: {name}"
assert name in estate_md, f"ESTATE.md lost: {name}"