# 16 — On-chain Breakthrough Review (2026-06-27c) Review of the milestone: a real client-generated 3,450,403-constraint Groth16 recovery proof verified by a live Cardano Preview node and funds released. Six-agent review (verifier soundness, on-chain evidence, contract integration, prover/commitment, spec reconciliation, formal/Lean) + an adversarial refutation pass on the two high findings. Raw findings: `scratchpad/review2/{R1..R6,RB-A,RB-B}.md`. ## Bottom line **The breakthrough is real and independently verified — and it is a verify-only gate, not bound redemption.** Both halves of that sentence are load-bearing. - **Verified (R2, via Koios):** lock tx `168b4de3…` and spend tx `7f7f41e0…` are real on Preview. The spend consumed the gate UTxO, executed a PlutusV3 script whose hash is exactly the repo's compiled `gate.plutus` (`bb6a2410…`), the redeemer is **byte-for-byte** the repo's `proof_c.hex`, the script **succeeded**, and 3.5 tADA was released. The on-chain commitment-aware verifier accepted a genuine BSB22-committed proof. - **Cryptographically sound on the main path (R1, R4):** the commitment-aware verifier matches gnark's BSB22 verify (PoK pairing, `e_cmt` challenge, fold `vk_x = K0 + pub·K1 + e_cmt·K2 + commitment`, final Groth16). The prover↔verifier wire format and the `e_cmt` challenge are **byte-exact** (14/14 fields; `ecmt_test.go` cross-checks gnark `fr.Hash`). No honest proof is rejected; the main pairing resists forgery. - **But (R3, RB-A CONFIRMED):** the deployed script (`Gate.hs::mkGate`) is **verify-only** — it binds no destination, entitlement, value, or self-pay, so a proof revealed in the mempool can be spent to any address (front-runnable). The full `RedemptionValidator` (which *does* bind D + entitlement + no-self-pay) wires the **vanilla** `groth16Verify` and would therefore **reject** the real committed proof. No single deployable script both verifies the committed proof and binds the payout. The live demo proves the verifier integration; it does **not** exercise bound redemption. ## Findings (severity-ranked, post-refutation) | # | Sev | Finding | Status | |---|---|---|---| | **F1 (R3-01/R6-02)** | **High** | **Verifier/binding split.** `mkValidator` uses vanilla verify (rejects real proofs); deployed `mkGate` uses the committed verifier but binds nothing (front-runnable). Fix: wire `groth16VerifyCommitted` into `mkValidator`, deploy that, retire `Gate` as a redemption path. | open (integration) | | **F2 (R5)** | **High (prod)** | **Throwaway trusted setup.** `test.md`: single-party local `groth16.Setup` (12m, WSL). Retained toxic waste forges any proof; satisfies zero of REQ-TS-01..14. Fine for testnet; hard mainnet blocker — needs a real MPC ceremony. | open (production) | | **F3 (R6-01)** | **High (fidelity)** | **Lean lags the impl.** `Validator.lean` still models the pre-M1 `payAddr == r.destination` CBOR equality that M1 deleted, and lacks `payoutOk` + len-57. `v_cons` now proves a check the contract no longer performs. Fix: add V-PAYOUT (`payoutMatchesDestination`), restate `v_cons`. | open | | **F4 (R1-01/R4-04/RB-B)** | **Low–Med** | **Commitment `Y` not bound to the point.** `e_cmt` hashes the raw prover `Y` bytes; the point uses only X+sign (no `Y