PiProof v0.16.0 — Third Implementation & Normative Conformance
PiProof v0.16.0 — Third Implementation & Normative Conformance
The protocol core now exists as three independent codebases — Node.js,
pure-Python, and from-scratch Go — agreeing byte-for-byte on every interop
vector, and anyone claiming "PiProof compatible" has one command to prove it.
Highlights
Go protocol core (sdk/go/)
- From scratch: Canonical Profile v1.1 (NFC-form sort, UTF-16 ordering),
closed event schema, G1–G9 pipeline with exact error-code parity, RFC 8032
via stdlibcrypto/ed25519. - One pinned auxiliary dependency (
golang.org/x/text) — Go ships no Unicode
normalization tables; it plays the roleunicodedataplays in Python. - Ordered JSON parsing preserves key order (Go maps randomize it).
- CANC/PARSE fuzz driver speaking the same line protocol as Python's.
- Tests: 16 interop vectors byte-exact · fixed-point INV-01 pin · valid
vector ACCEPTS · all 20 attacks reject with exact codes · INV-05/INV-08 pins.
Normative conformance suite (npm run conformance + docs/CONFORMANCE.md)
- Four-row matrix: Node vectors / Python canonicalizer / Go protocol core /
Python Ed25519. - Claim rules: publish raw matrix output + vector commit SHA; say "passes
the PiProof conformance matrix at commit<sha>" — never "certified". - Graceful SKIP for absent toolchains;
--strictturns skips into failures.
TLA+ model of the stateful gate core (formal/)
- Two verifiers racing one shared nonce authority; G8 snapshot eligibility
and atomic G9 test-and-set modeled explicitly. - INV-04 (at-most-one-accept), INV-05 (burn-on-pass-only), TypeOK,
AcceptImpliesBurn as TLC invariants. Hand-checked pending CI tooling —
stated honestly in formal/README.md.
Fuzzing: seventh campaign go-diff
- Node vs Go differential through the driver protocol: canonical bytes AND
parse shapes. Clean SKIP without a Go toolchain.
Corrections to v0.15's Unicode story
v0.15 claimed canon-012 pinned the amended NFC-form sort order. Wrong on
Unicode facts: ligatures have no canonical decomposition, so canon-012's
emission order is identical under both sort rules. The true discriminator is
new vector canon-016 (Ç U+00C7 vs Å-sign U+212B): raw-sort emits Ç
first; v1.1 NFC-form emits Å first. Suite is now 16 vectors, and
cross-canonical.py was moved from raw-sort to NFC-form sort (it silently
disagreed with v1.1 on flip-class pairs while passing the old set).
Verification
132/132 tests · layers clean (23 modules / 64 edges / 0 violations) ·
20/20 attacks · 16/16 canonical vectors ×3 languages · FUZZ OK incl.
go-diff · conformance matrix 4/4 · go vet clean · CI green on
Node 18/20/22 + Python 3.10/3.12 × ubuntu/windows + Go on both OSes.
Maturity movement
- Row #13 (independent implementation): partially held — spec proven
reimplementable in a third language; author-independence remains open. - Row #14 (mechanized verification): drafted — TLC-runnable model shipped.
v1.0 remains gated on external review. Full details:
CHANGELOG ·
docs/CONFORMANCE.md ·
docs/MATURITY.md