CAIN-42 formal models, checked with TLC (the TLA+ model checker), 2026-09-27.

CAINPBFTCommitSafety.tla      PBFT commit and view-change rules: N=4, f<=1, Q=3, one sequence, views 0-1, values X/Y.
  Invariants: Agreement (no two honest replicas execute different values), CommitOnlyWhenPrepared.
  Configurations: Byzantine replica (290,806 distinct states), Byzantine view-0 leader (670,340), none (4,198,642): no violation.
  Mutants that MUST fail: the pre-fix "execute on a prepared certificate" rule, and a new primary that ignores
  reported certificates: both violate Agreement.

CAINMCPGateAuthorization.tla  MCPGate consensus-authorization gate: an attacker presents any body with any call.
  Invariants: NoExecWithoutQuorum, ActionBinding, IdentityBinding, ContextBinding, NotExpired, SingleUse.
  Configurations: Byzantine member (553,996 distinct states), none (1,591,308): no violation.
  Mutants that MUST fail: quorum threshold 2, and each gate check removed in turn: each violates exactly the
  invariant that check protects.

Each *.tlc.json lists every run with the numbers TLC printed, and the spec's SHA-256.

Reproduce (Java 11+, tla2tools.jar from https://github.com/tlaplus/tlaplus/releases). The models are published as
*.tla.txt; save them as *.tla:
  BASE=https://clawx.click/evidence/formal-2026-09-27   # or https://cainstudio.online/proof/bundle/formal-2026-09-27
  for m in CAINPBFTCommitSafety CAINMCPGateAuthorization; do curl -so $m.tla "$BASE/$m.tla.txt"; done
  printf 'CONSTANTS\n  Byz = {"n4"}\n  OldRule = FALSE\n  IgnoreReports = FALSE\nSPECIFICATION Spec\nINVARIANTS\n  TypeOK\n  Agreement\n  CommitOnlyWhenPrepared\n' > CAINPBFTCommitSafety.cfg
  java -cp tla2tools.jar tlc2.TLC -deadlock -config CAINPBFTCommitSafety.cfg CAINPBFTCommitSafety.tla
  (set OldRule = TRUE or IgnoreReports = TRUE to see the counterexample)
  printf 'CONSTANTS\n  Byz = {"n4"}\n  Thresh = 3\n  SkipExpiry = FALSE\n  SkipAction = FALSE\n  SkipIdentity = FALSE\n  SkipContext = FALSE\n  SkipReplay = FALSE\nSPECIFICATION Spec\nINVARIANTS\n  TypeOK\n  NoExecWithoutQuorum\n  ActionBinding\n  IdentityBinding\n  ContextBinding\n  NotExpired\n  SingleUse\n' > CAINMCPGateAuthorization.cfg
  java -cp tla2tools.jar tlc2.TLC -deadlock -config CAINMCPGateAuthorization.cfg CAINMCPGateAuthorization.tla
  -deadlock turns off deadlock detection: the models are bounded, so behaviours end in terminal states; only safety is checked.

Not claimed: a proof about the Python implementation; unbounded parameters (more replicas, sequences, views);
liveness; a machine-checked proof (these are exhaustive model checks within the bounds above).
