Internal Review · AI-Driven · Published in Full

ZK Engine Security Review & Remediation

An internal, AI-driven adversarial review of the MIZAN zero-knowledge quant-verification engine — proof soundness, in-circuit correctness, confidentiality, and claims integrity — with a same-day remediation ledger and reproducible verification evidence. This is not a third-party audit; its authority rests on reproducibility, not on the reviewer.

Latest · 2026-07-22: same-day double ship. Guest v9 closed the D7/D8 PBO/CPCV soundness holes; guest v10 then rebuilt PBO as composed proofs: every trial its own STARK, verified in-circuit by an aggregator via recursion — at S=16, all 12,870 partitions, added the n_eff autocorrelation correction to the Deflated Sharpe, and made sealed-model sizing provable. Red-teaming v10 before its mint found D9: clone-padding: a ledger stuffed with copies of the winner games PBO to zero. Refused in-circuit, disclosed, minted only after. You can re-verify the fix from production in one command, and it still reads not significant, on purpose.

ENGAGEMENT · mizan-proof (Rust + RISC Zero zkVM) SCOPE · ~18,000 LOC · 5 audits · 6 AI auditor agents DATE · 2026-07-0207-03 → guest v5 07-18 → five-front 07-21 → v9+v10 ship 07-22 AUDITED ERA · guest v10 · id dafad185… · composed PBO (S=16 · 12,870 partitions) · n_eff DSR · fractional sizing (D7–D9 closed) CURRENT ERA · guest v11 · id 3ac3b10b… · both schools in-circuit (adds PSR · Hansen SPA) · v10 credentials verify forever
3
Critical findings
(all found & fixed)
24
Remediations
(across four audits)
50/50
Core tests green
(was 0 compiling)
16/16
Zero-trust checks
on a real STARK
The audits · published in full

Two reviews. Both open to read.

MIZAN audits itself in public along two axes, the cryptography that makes a credential unforgeable, and the quant honesty of the numbers a credential attests. Each is an internal, AI-driven adversarial review whose authority rests on reproducibility, not on the reviewer. Open either.

01 · Executive Summary

The cryptographic spine is sound. One in-circuit hole let a prover forge a passing credential — it is now closed.

The independent verifier is genuinely zero-trust in real mode: the STARK seal is checked against a compiled-in image ID, the journal is bound to the receipt, the dataset Merkle root is re-derived by the verifier, and the risk-gate policy is pinned. No-lookahead holds across every engine path, and the codebase's honesty discipline is unusually strong, the hard line against "audited / secure / production-ready" claims is held everywhere, and the real STARK path is implemented (not stubbed).

ZK
REVIEWED
2026

Verdict — structurally sound, pre-production, one critical closed.

The engine is credential-grade after remediation, but not capital-grade: an external paid ZK audit remains the standing must-fix before any live capital. Data provenance (U5) is now pinned by a fail-closed canonical-root allowlist (2026-07-03); the fully trustless version — roots signed by an independent data authority — stays on the roadmap. This document is an internal, AI-driven engineering review, not a third-party audit or certification.

C1
Critical — annualization
inflation · CLOSED
5/5
High findings
code-fixed (U5 interim)
100%
Build green
host · verifier · core
219KB
Real STARK re-minted
on the patched engine
01b · Second Review — Guest v5 Ship (2026-07-18)

We adversarially audited our own just-shipped in-circuit ML engine. It caught a live overclaim on this very site — we corrected it the same day.

On 2026-07-18, hours after shipping guest v5, the in-circuit black-box gate and zkML proven-inference credential families, plus a re-minted flagship, the engine was put through a second internal adversarial review: five AI auditor agents in parallel (ZK circuit soundness, cryptographic binding, quant honesty of the flagship, deployed-claims integrity, and a dedicated forge-a-credential red-team), each finding independently re-verified before action. The single most important result is the one an honesty-branded company most wants to find in its own work before anyone else does.

v5
REVIEWED
07·18

Verdict — cryptographic binding sound, flagship honest; one live copy overclaim caught & corrected same-day.

Five independent lenses converged on one finding: the black-box credential's public wording said "backdating refused by construction." The circuit genuinely refuses tampering, curation and re-tuning, but it does not prove positions were committed before each outcome was known; the red-team minted a green perfect-hindsight track to prove it. The claim was corrected across the live site within the day, and the real engineering fix — external timestamp-anchoring of the track head (U10) — is queued as the top item of the next engine re-anchor. No credential was mis-issued: the finding was in the marketing wording, not the proof.

3
Copy overclaims
fixed · deployed same day
U10
Anti-hindsight anchor
queued · next re-anchor
133/133
Core tests green
guest v5
0
Forge/tamper paths
on the desktop verifier

Corrected on this site, same day

V5·1
Black-box "backdating refused by construction" overclaimCircuit proves forward-ordering + tamper/curation resistance; forward-timing (positions fixed before outcomes) rests on an anchored track head, not the circuit. Copy now states this precisely on the verify page, studio coverage map, and homepage. Real fix U10 queued.
Fixed · deployed
V5·2
Verifier condition count was under-statedThe source-available verifier prints 16 checks on a disclosing credential (12 minimal) — the enumerated list had silently dropped the cost-floor check. Corrected site-wide. Settled by running the verifier, not by reading docs.
Fixed · deployed
V5·3
Homepage / coverage-map contradictionHomepage listed point-in-time equities + option chains as "built" while the coverage map said "in build." Reconciled: ML / black-box proven live; PIT equities + per-strike option chains — engines built, our data feeds in build.
Fixed · deployed

Open — tracked for the next engine re-anchor

U10
Anti-hindsight anchor on black-box track headsBind each track head to an external OpenTimestamps / RFC-3161 anchor predating its periods, enforced fail-closed in the verifier — makes the strong "forward-committed" claim provable, not asserted. Top item of the next re-anchor.
Queued
V5·4
Browser seal-verify hardeningThe in-browser convenience verifier checks the STARK seal + journal match, but not the gate verdict, gate policy, cost floor, or data-root allowlist, so a failing or fabricated-data credential can show green in the browser. The authoritative desktop verifier has no such gap. The browser path will decode and assert the full check set.
Queued
V5·5
Six lower-severity code items--aux/--track binding made fail-closed; leverage bound into the black-box identity; vol-target rebalance turnover costed; integer-cast hardening; engine-id validity-window enforcement; interior-bar causality test. All bundled into one image change. See docs/AUDIT_2026_07_18_v5_findings.md.
Queued
Verified sound — bankable. The cryptographic binding held against every forge attempt: no tamper (the track head is re-derived in-circuit), no zkML decision forgery (decisions are recomputed from committed weights), no cost understatement (the floor is refused at mint), no dev-mode fake accepted as real, and no engine downgrade on the desktop verifier. The re-minted flagship was independently confirmed honest — no lookahead, no phantom fills, drawdown marked on intrabar wicks, annualization bound to the data, and it runs below buy-and-hold exposure (0.20× average), winning on risk-adjusted terms (Sharpe 1.63 vs buy-and-hold 0.78) at roughly a quarter of the drawdown, not on leverage. Same standing posture as the 2026-07-02 review: credential-grade, not capital-grade: an external paid ZK audit (U1) remains the must-fix before live capital.
01c · Component Review — Deflated Sharpe Ratio (reviewed pre-ship AND post-ship · now live)

We reviewed a statistic before it shipped, and again after — catching a way to game it, then a way to overstate it.

The Deflated Sharpe Ratio (Bailey & López de Prado, 2014) corrects a Sharpe for how many strategies you tried before picking the winner, but only if the trial count N is honest, and nobody reports it honestly. MIZAN built an in-circuit DSR that commits N in a Merkle trial ledger. It was audited twice: on 2026-07-18 before it was wired into any credential (D1–D3 below), and again on 2026-07-20 after it shipped as a public credential (D4). Both audits found a real issue; both are fixed. The credential is now live and independently verifiable: anyone can re-check N=10 committed trials, every trial's Sharpe re-derived in-circuit, and the deflated Sharpe of 0.6779 at mizan.market/verify#dsr.

DSR
PRE + POST
07·18–20

Verdict — two audits, two real issues, both fixed; the credential is now live and independently verifiable.

Pre-ship (07-18): a way to neutralize the whole correction — commit many trials but score only a hand-picked few, collapsing the trial-variance term to flip a failing DSR (0.00) to a passing one (0.96) at an unchanged N of 300. Fixed: fails closed unless every registered trial is scored. The per-trial binding that D3 held open then shipped: every trial's Sharpe is now re-derived and bound in-circuit, so the variance term is proof-grade, not declared. Post-ship (07-20): a claims-vs-code gap, the verifier's DSR path ignored the data file the published command passed, so a reviewer's wrong data still verified green. Not a forgery (the data root is sealed in the receipt) but a real honesty gap for a "recompute from your copy" company. Fixed: the DSR verifier now re-derives the winner's data root from your CSV and pins it to the canonical allowlist, the same independence the flagship gives.

D1
Gaming the trial-variance term (critical) — found & fixedScoring only a chosen subset of registered trials collapsed the deflation while the honest count stayed high (DSR 0.00 → 0.96 at N=300). Fixed: the statistic fails closed unless every registered trial is scored, so the variance reflects all N, not a curated few. Regression-tested.
Fixed
D2
Large-N tail approximation (numerical) — found & fixedThe inverse-normal quantile saturated for very large trial counts, overstating the benchmark. Recomputed from log-N directly so it stays accurate at any N. (The fix's own sign error was caught immediately by regression tests — the reason to audit before wiring.)
Fixed
D3
Per-trial score binding (honesty gate) — now shippedHeld open at pre-ship: the per-trial scores were committed but declared, so we did not claim that half unfakeable. It shipped 07-19 — each trial's Sharpe is re-derived from that trial's own committed spec inside the circuit and bound, so V[SR] is now proof-grade. The live credential's verifier reports it: "EVERY trial's Sharpe re-derived + bound in-circuit."
Shipped
D4
Verifier ignored the passed data file (post-ship, medium) — found & fixedThe published DSR command passed btc_4h.csv, but the verifier's DSR branch exited before loading it — a wrong or nonexistent CSV still printed VERIFIED. Sealed in the receipt (no forgery), but the command implied a re-check that never ran. Fixed: the DSR verifier now recomputes the winner's data root from your CSV, matches the committed root, and pins it to the canonical allowlist; wrong/missing data now refuses. Verifier-only fix — same guest image, the live credential still verifies. Re-tested with live-downloaded artifacts.
Fixed
D5
Significance verdict set at a coin flip (post-ship, medium) — found & fixedThe verdict printed "distinguishable ✓" at DSR ≥ 0.5: not a significance bar at all. DSR is a probability (confidence the true Sharpe beats the best-of-N benchmark), so the bar is Bailey–López de Prado's 0.95, the usual 1−α. Our own flagship (DSR 0.6779) was being stamped as clearing a bar it doesn't. Fixed: threshold raised to 0.95; the credential now honestly reports "NOT significant at 95% — this edge does not survive multiple testing across N=10 trials." The bar is applied by the source-available verifier at check time (auditable), not baked into the prover. Our own flagship failing its own bar is the point — the tool doesn't flatter its maker.
Fixed
D6
Winner not bound to the trial ledger (critical, 2026-07-21 audit) — found & fixed in-circuitThe deflation benchmark SR₀ is computed from the committed trials' variance, but the circuit never asserted the winner is one of those trials, nor that its Sharpe is their maximum. A decoy ledger of tightly-clustered specs could drive V[SR]→0 → SR₀→0, collapsing the deflation to the un-deflated Sharpe while every other check stayed green — the exact best-of-N attack the credential exists to stop. Fixed: evaluate_dsr now requires winner∈ledger AND winner==max(proven trials), fail-closed otherwise, and the host submits the provable argmax as the winner. Two regression tests added — a non-max winner and an absent winner both fail closed. Shipped and live: guest rebuilt to v7 (IMAGE_ID 69ee0666…), the flagship re-minted on it, re-anchored (RFC-3161 + Bitcoin OpenTimestamps), and verified end-to-end by downloading the production verifier + credential and running the command yourself — all checks green, still honestly "NOT significant" (DSR 0.68). No false-significant credential ever existed.
Fixed · shipped v7
01b · Studio surface — 2026-07-21 five-front audit

A parallel five-auditor sweep of the self-serve studio — claims, methodology, application/ZK security, UX, and cross-property consistency. The self-serve DSR / registry surface, shipped fast, went out under-secured; the live-money and honesty items were fixed the same day and are documented here.

S1
Unauthenticated mint endpoint → GPU cost-DoS (critical) — fixedThe self-serve mint took a client-supplied email as its only rate key; rotating it allowed unlimited real GPU-proving spend on the public box. Fixed: an authenticated session is required, identity is taken from the session (never the body), and global concurrency + daily caps were added. Unauthenticated requests now refuse with 401.
Fixed · deployed
S2
Non-canonical dev dataset was mintable (high) — fixedA 1,000-bar dev prefix flagged non-public could still mint a wall-grade credential on a short window. Fixed: the validator refuses any non-public dataset before proving — only the full canonical sets mint.
Fixed · deployed
S3
Credential listing keyed on an unauthenticated email (medium) — fixedThe "your credentials" listing filtered on a client-supplied email, leaking existence and metrics of others' work. Fixed: the listing is scoped to the authenticated account; the query parameter is ignored.
Fixed · deployed
S4
Homepage card vs the verifiable artifact (high) — fixedThe hero credential card advertised a research config (Sharpe 1.77 / MaxDD 14.9% / CAGR 27.2%) while the downloadable credential verifies to 1.63 / 20.76% / 26.6%. On a "recompute it yourself" site that gap is the worst kind of mismatch. Fixed: the card now shows exactly what the credential verifies, with the buy-and-hold benchmark beside it.
Fixed · deployed
D7
PBO decoy-ledger gaming (critical, self-found same day as ship) — found & fixed in-circuitWe shipped PBO + CPCV (guest v8) then immediately red-teamed them, and found the exact class of bug the DSR fix (D6) closed, not carried into the new code. PBO was computed over the whole committed trial set and the winner was only checked for ledger membership, not that it was the maximum, so padding the ledger with deliberately-weak decoys drove PBO→0 for an overfit winner. Same decoy-ledger attack, reproduced. Fixed (guest v9): evaluate_pbo now (1) requires every committed trial to clear the institutional gate: a churning-cost decoy can no longer be a "trial" — (2) binds winner==max(trials) like DSR, and (3) pins a canonical S=8 split with a pooled-OOS CSCV Sharpe (the paper's method, replacing a 0-floored sum). The flagship's honest PBO moved from the gamed 0.00 to 0.04 across all 70 partitions — genuinely not overfit, and no longer paddable. Shipped, re-minted, re-anchored, verifiable on /verify. Superseded upward in guest v10: PBO is now COMPOSED (per-trial STARKs verified in-circuit by an aggregator) at S=16 — all 12,870 partitions — flagship reads 0.0759.
Fixed · shipped v9
D8
CPCV purge/embargo not actually enforced + parameter-shoppable — found & fixed in-circuitThe CPCV docstring claimed a prover who under-purges commits a count the verifier catches — that check was never implemented (verifier only checked purged_total > 0). With label_span=1/embargo=0 the leak stayed in and "leak-free" still minted. And S (PBO) plus N/k/label_span/embargo (CPCV) were prover-chosen after seeing the data — shoppable for the best number. Fixed (guest v9): the CV schema is now a canonical constant pinned in-circuit (N=6, k=2, label_span=1, embargo=3 — no shopping, no embargo=0), a per-path purge floor is enforced (a path set that purged nothing fails closed), and the verifier independently re-asserts the schema + floor. Self-found and closed the same day, published before any allocator saw it.
Fixed · shipped v9
D9
PBO clone-padding — found by red-team BEFORE the v10 mint, refused in-circuitThe v10 composed-PBO rebuild was red-teamed the same morning it was written — before any mint. Finding: register the winning strategy under N different salts and every "trial" is gate-passing with identical out-of-sample Sharpes, so no partition can rank the winner below median — raw CSCV reads PBO = 0.00 with zero independent trials (the attack is proven by a test, not asserted). Fix, in-circuit: the aggregator refuses any two trials with bit-identical per-sub-period moment vectors — fail-closed to PBO = 1.0. Honest residual, disclosed: ε-perturbed near-clones remain possible; the forward-only ledger is the mitigation and correlation-clustered effective-N is the queued statistical fix. This is the first attack class caught before shipping rather than after — the D7 lesson applied.
Closed in-circuit · pre-mint · v10
S5
Self-serve "N cannot be understated" overclaim + consent — fixedSelf-serve N is the caller's own trial count, not proof of their full search. Fixed: the claim is reframed to "certifies the search you commit" (site §04 + studio), the self-serve path now discloses that the strategy is sent to a third-party GPU for the hosted mint (the "trustless / never seen" guarantee holds for the local SDK path), and the registry honors an explicit opt-out. The PSR significance assumption (serially-independent returns; an upper bound on autocorrelated high-frequency bars) is now disclosed on the standard page. Remaining roadmap item: default-private opt-in (currently opt-out).
Fixed · deployed
Why audit it twice, and publish both? Because the DSR exists to answer the one question its own author would ask first — "where's your multiple-testing correction?", and the honest answer includes what we got wrong at each stage and fixed before anyone relied on it. Pre-ship we caught a gaming path; post-ship we caught a claim the verifier didn't back with a check, and closed it the same day. A verify command that passes an argument must check that argument, or the argument comes out. That is the standard this whole page exists to hold.
02 · Methodology & Reviewer

Six AI auditor agents, each a distinct adversarial lens.

The engine was reviewed by six AI auditor agents (Claude models) working in parallel, each scoped to one failure class and instructed to read the current code and cite file:line, not to trust prior documentation. Findings were triaged by severity and reproduced against the running binaries before remediation.

Who performed this review — in full. This is an internal, AI-driven review: the auditors were Claude models orchestrated by the engineer, independent of each other and of the code's author, but not a third-party firm and not a human security auditor. It does not substitute for the external paid ZK audit (tracked as U1), which remains outstanding and is required before any live capital. Two other, distinct assurance layers exist and should never be conflated with this one: an in-person advisor sanity-check by Dr. Anish Mohammed (cryptographer) on 2026-06-21, and the pending external audit. The credibility of this document rests entirely on reproducibility — every finding carries a file:line, a test, and a build output you can re-run, not on the standing of the reviewer.
AuditorQuestion it tried to answerVerdict
Verifier soundnessCan a malicious prover get a forged PASS blessed as real?spine sound
In-circuit correctnessDoes the proven metric equal the true metric? Lookahead, overflow, gate logic.1 critical
Zero-knowledgeIs the strategy actually hidden, or recoverable from disclosed metrics?disclosure
Build integrityDoes it compile? Do the tests actually run and pass?0/48 → fixed
Claims integrityDo docs/UI claim more than the code delivers? Hard-line violations.honest
Host & provenanceData binding, dev-mode leakage, secrets, custody, versioning.allowlist pinned
03 · Findings Register

What the review surfaced.

24 findings across five severity tiers. The single critical is a genuine forge-a-credential vector inside the circuit; the highs are correctness, confidentiality, and build defects. Every finding below carries its status after same-day remediation.

IDFindingSeverityStatus
C1Prover-chosen annualization basisperiods_per_year was unbound from the bar interval → declaring 2190 on daily bars multiplies Sharpe by √6 and lifts CAGR over the gate.CriticalFixed
C1rCarry annualization residual — found in the 2026-07-03 re-verificationFunding series carry no timestamps in-circuit, so the carry path's basis is trust-on-declaration (declaring hourly on 8-hour prints inflates carry Sharpe ×√8). CLOSED 2026-07-05 (format v2): funding prints are timestamped, bound in the carry root, and spacing + annualization consistency are enforced in-circuit.HighClosed · format v2
H1Carry booked churn for freeThe delta-neutral carry backtest charged no per-trade cost; the anti-fill-fantasy guard was defeated by overloading the slippage field.HighFixed
H2Data-source substitution (U5)The verifier re-derives the root from the same CSV the prover supplies → fabricated history reconciles. A doc line falsely claimed it "prevented." 2026-07-03: verifier now enforces a fail-closed canonical-root allowlist; substituted history fails by default, bring-your-own-data requires an explicit flag and is loudly labeled unpinned.HighInterim fixed
H3Studio blessed dev receiptschecks_pass folded the dev/fake exit-3 into "pass," and the default web verify ran in dev mode.HighFixed
H4Test suite would not compileA months parameter was added to two core functions; five test call sites went stale → 0 of 48 tests ran.HighFixed
H5Disclosure on by default · wrong space reportThe recovery-space report sized the ignored rule DSL, not the active Tier-2 engine; no SDK minimize path.HighFixed
M3Env-based fake detectionThe verifier judged "fake" from its own env, not the receipt structure.MediumFixed
M4·M5Warm-up leverage · soft CAGR floorVol-target warmed at cap; CAGR fixed-point drift left the 20% floor two-sided.MediumFixed
M7·M8Salt in-repo · banned "Capital" termPre-registration salt stored beside the bundle; a legacy "Capital" suffix rendered on credentials/UI (brand is MIZAN).MediumFixed
M9·M10·M11Metric labeling · compute DoS · advisor wordingCorpus metrics shown as "ZK-proven"; unauth compute + CORS*; "reviewed and verified" overstated advisor review.MediumFixed
M1·M2·M6Dev-flag in bundle · prereg default · intrabar MDDSuperseded by M3 / policy note / needs OHLC data-model change.MediumDeferred
L·1–7Low: digest PKI, date parser, pipefail, PII at rest, no gitHardening items; date-parser fail-safe and git versioning fixed, remainder documented.LowPart-fixed
04 · Critical Finding — C1

The prover picked the annualization factor. That forged the gate.

Sharpe scales with √(periods per year); CAGR scales with its exponent. Both are monotonic in periods_per_year. The bar interval was bound to the data — lying about it fails validation, but the annualization basis was never tied to that interval. A prover could take honest daily bars and simply declare six times as many periods per year.

◆ The attack

A 0.6-Sharpe strategy reports 1.47 and clears the 1.20 gate — with honest data.

honest daily bars · interval 86,400s declare periods_per_year = 2190 Sharpe × √6 ≈ 2.45 gate PASS · credential minted

The attested passed bit is gameable with one free integer, the exact thing the product exists to prevent. The receipt is real, the data is real; only the basis is inflated.

✓ The fix — bind the basis to wall-clock

You may not claim more periods per year than the calendar allows.

// mizan-core/src/lib.rs — folded into data_valid on every price path
pub fn ppy_consistent(interval_secs: i64, periods_per_year: u32) -> bool {
    if interval_secs <= 0 { return true; } // irregular data → declared basis
    (periods_per_year as i64).saturating_mul(interval_secs) <= SECONDS_PER_YEAR
}
// over-count → DataInvalid → gate FAIL. Honest under-count (equity 252) allowed.

Under-counting only depresses the prover's own metrics, so it stays legal; over-counting, the attack — now invalidates the dataset. Verified end-to-end: daily bars declared at ppy=2190 now fail with fails:[DataInvalid] instead of minting an inflated-Sharpe pass, and the behavior is locked with a regression test.

Follow-up re-verification (2026-07-03): the fix was independently re-checked against the committed code. Both zkVM guest paths were confirmed bound; the one remaining unbound public API (evaluate, reachable only from tests) was hardened to the same rule and pinned in the regression test. The re-check also surfaced a genuine residual the original pass missed: the carry path cannot bind its basis in-circuit because funding data carries no timestamps (finding C1r above) — disclosed and tracked rather than silently absorbed.

05 · Remediation Ledger

Every finding, accounted for.

Sixteen remediations shipped the same day, each verified by the rebuilt test suite and an end-to-end dev-mode prove/verify smoke test. A follow-up pass on 2026-07-03 closed the data-provenance gap (interim), re-minted the real proof, and re-verified the critical fix. Open items carry an explicit, honest rationale rather than a silent close.

C1
Bind annualization basis to bar intervalppy_consistent guard on single + portfolio paths · regression test ppy_inflation_is_rejected_c1
Fixed · tested
H1
Carry charges a 30bp round-trip cost per entry (×leverage), recorded in fee_bpsAnti-fill-fantasy guard now meaningful for carry · test carry_charges_round_trip_cost_h1
Fixed · tested
H3
Studio checks_pass requires a real STARK (exit 0)Dev/fake exit-3 surfaced separately as plumbing_ok, never as a pass
Fixed
H4
Restored the test suite — 50/50 pass (was 0 compiling)Threaded the months slice through five stale call sites
Fixed
H5
Engine-aware recovery-space verdict, printed before minting · real --minimal PASS/FAIL pathSizes the active trend/xs/book params, not the ignored rule DSL
Fixed
M3
Verifier rejects InnerReceipt::Fake structurallyRobust to a stray RISC0_DEV_MODE — fakeness read from the receipt, not the env
Fixed
M4·M5
Vol-target warms at 1× · conservative CAGR gate margin (40bp)No early over-leverage; no false pass at the 20% floor
Fixed
M7
Pre-registration salt written outside the repo tree~/.mizan/salt / MIZAN_SALT_DIR · .gitignore hardened for salts, PII, bundles
Fixed
M8·M9·M11
Dropped the legacy "Capital" suffix — brand is MIZAN · metrics labeled historical · advisor-review wordingCorrects the banned regulated-firm term, the ZK-proven metric conflation, and the audit-vs-review overstatement
Fixed
M10
CORS restricted + per-IP rate limit in public modeCaps unauthenticated compute on /api/prove
Fixed
H2·D4·L2
Threat-model corrected to the open U5 gap · fail-safe date parser · git initializedHonest documentation of the data-provenance limitation; verifier no longer panics on malformed CSV; the moat is now versioned
Doc + fix
U5
Canonical-root allowlist — data provenance pinned (2026-07-03)Verifier enforces data/canonical_roots.txt (10 pinned dataset roots), fail-closed on a missing list or unlisted root · bring-your-own-data requires an explicit --any-data flag, loudly labeled PROVENANCE NOT PINNED · residual: the list is MIZAN-curated — independent data-authority signing remains the trustless roadmap item
Interim fixed
C1+
C1 follow-up re-verification (2026-07-03)Remaining unbound public API (evaluate) hardened + regression-tested · carry-path residual (C1r, no in-circuit timestamps) surfaced, documented at evaluate_min_carry, out-of-circuit cadence check specified
Fixed · tested
Real STARK re-minted on the patched engine (2026-07-03)219 KB succinct proof · all 16 zero-trust verifier checks pass, exit 0 · live /api/verify-real returns real_verified:true in 51 ms
Done
C1r
Carry annualization basis — in-circuit bindingNeeds timestamps in the carry data model (same class as M6) · until then the basis is trust-on-declaration with an out-of-circuit cadence check
Deferred
M6
Intrabar (OHLC) drawdownBar is close-only; adding OHLC touches every loader + the Merkle root — a data-model change, not a patch
Deferred
06 · Verification Evidence

Reproducible, not asserted.

Every claim above is backed by a rebuilt binary and a run. The build is green across all crates, the full test suite passes, and the critical fix was confirmed end-to-end against the live host and verifier.

mizan-proof · verification run · 2026-07-02
$ cargo test -p mizan-core
test result: ok. 50 passed; 0 failed; 0 ignored     # was 0 compiling

$ cargo build --release -p host -p verifier
    Finished `release` profile [optimized] target(s)

$ RISC0_DEV_MODE=1 host --prove c1_cheat.json   # daily bars, ppy=2190
  GATE VERDICT : FAIL ✗
  DIAG: net 553.2% · CAGR 584.8% · … → fails: [DataInvalid]   # C1 blocked

$ verifier credential.bundle  (dev receipt)
  ⚠️ CHECKS PASS but the receipt is NOT a real STARK — exit 3   # M3

$ host --prove btc_directional.json --minimal   # H5 minimize path
  🔒 MINIMIZED: only PASS/FAIL committed — strategy unrecoverable
mizan-proof · follow-up · real STARK on the patched engine · 2026-07-03
$ host --credential            # real proving, RISC0_DEV_MODE unset (~12 min)
  Compressed proof: 3547 KB → 219 KB (succinct), verify ✓ 13ms

$ verifier credential_REAL.bundle data/prices.csv
  [] guest image id matches the program we trust
  [] zk receipt verifies (proof is real)
  [] committed journal matches credential (no swap)
  [] data root recomputed from canonical CSV matches
  [] data root pinned to canonical allowlist: prices.csv   # U5 — new
  [] gate policy is the canonical MIZAN policy … (16/16 checks)
  ✅ INDEPENDENTLY VERIFIED — exit 0

$ verifier <bundle> substituted.csv              # fabricated history
  [] data root NOT in canonical allowlist — substituted/unknown dataset

$ curl /api/verify-real
  real_verified: true · elapsed_ms: 51.2 · proof_kb: 219
07 · Assurance Posture

What the engine guarantees: and what it does not.

Trust in a verification product is bought with disclosed limits, not hidden ones. After remediation the cryptographic guarantees hold; the remaining gaps are named, tracked, and gated behind an external audit.

◆ Guaranteed after remediation

  • The verifier is zero-trust in real mode — seal, journal-binding, data-root re-derivation, gate pinning.
  • The annualization basis is bound to the bar interval — Sharpe/CAGR can't be inflated for free.
  • No-lookahead holds across every engine path (perturb-last-bar tested).
  • The strategy witness is provably absent from the credential.
  • Dev/fake receipts are rejected structurally and never blessed as real.
  • Carry is netted of borrow and charged real trading cost, in-circuit.
  • Dataset provenance is pinned to a fail-closed canonical-root allowlist — substituted history fails verification by default; bring-your-own-data is loudly labeled, never silently trusted.

○ Not yet claimed — gated on external audit

  • U5 — trustless provenance: the canonical-root allowlist is MIZAN-curated; roots signed by an independent data authority remain the roadmap item for third-party-trustless verification.
  • C1r — CLOSED (format v2, 2026-07-05): funding prints are timestamped and bound; the carry annualization basis is enforced in-circuit.
  • Seal witness-hiding (U9) is flagged unverified pending the external ZK audit.
  • M6 — CLOSED (format v2, 2026-07-05): bars carry OHLC; drawdown and worst-bar are marked against the adverse intrabar extreme at leverage. The change retired our own v1 flagship (−16.2% intrabar wick, gate refusal) — replaced by the production trend book, which passes honestly.
  • The credential digest is tamper-evident, not issuer-signed (PKI is future work).
  • On-chain (Groth16) verification is wired but blocked on x86/Bonsai infra.
  • This is an internal, AI-driven review by the engineering team — not a third-party audit, human security auditor, or certification.
Standing posture. Credential-grade, not capital-grade. The engine may issue and verify zero-trust credentials today — on provenance-pinned canonical data as of 2026-07-03; live capital remains gated behind an external paid ZK audit (U1) and independent data-authority signing for fully trustless provenance. No custody, orders, or funds are touched anywhere in the system.