CaliperForge

Blog · 2026-06-03 · Michael Moffett

Two Jito programs on the same rails — and the AI invariant-suggester goes live.

cf-invariants-jito harnessed Jito Foundation's tip-distribution program against Crucible earlier today. A second Jito program — tip-payment — now runs on the same anchor-lang 1.0.1 / Crucible v0.2.0 rails, with its own CI green on the first push. Alongside the second port, the AI invariant-suggester is live: a real claude-sonnet-4-6 call against tip-distribution converged on every hand-authored invariant class and surfaced a fifth, a novel access-control gate on upload_merkle_root. Assistive, human-reviewed, not autonomous discovery.

From one to two

Rails generalize when the second port is the boring one.

The previous post, First real protocol harnessed, stood up cf-invariants-jito against the Jito Foundation tip-distribution program: four invariant classes, four planted-bug twins, CI clean=0 / planted≥1, commit e683c5a. That established that the Crucible (Asymmetric Research) rails carry a real upstream Apache-2.0 Solana program written by someone else — not a toy vault. The question that immediately followed was whether the second port off the same rails was cheap.

cf-invariants-jito-tippayment answers that. The target is the sibling tip-payment program in the same Jito Foundation workspace — the on-chain piece that holds per-block MEV tips before they are rolled into a TipDistributionAccount. The port reuses the same toolchain pin (anchor-lang 1.0.1, Crucible v0.2.0, platform-tools v1.52, Solana CLI 2.1.21), the same workspace shape, the same clean/planted twin convention, and the same CI assertion (clean=0, planted≥1). Commit 08ed8f9, CI run 26915805927 green on the first push, all three jobs.

What tip-payment tests

One invariant class to start — the right one for the program.

tip-payment's first cut ships a single invariant class: change_tip_receiver_state_update (invariant_change_tip_receiver_updates_config). After every successful change_tip_receiver call, the on-chain Config.tip_receiver field must equal the new_tip_receiver pubkey the caller passed in. The planted twin (jito_tippay_ref_planted_change_tip_receiver_state) drops the ctx.accounts.config.tip_receiver = … commit line; the instruction succeeds, lamports rebalance, but the rotation never commits. The hand-authored invariant catches it.

Why this class first, and not the lamport-conservation shape that does most of the work on tip-distribution: tip-payment's economic moves are rebalances, not deltas against a single program-controlled vault. A clean change_tip_receiver moves lamports from the old receiver to the new one; a clean change_block_builder moves the commission split. A naive "sum of system-account lamports is conserved" property would either be trivially true (yes, the system conserves lamports) or trivially false (no, the program rebalanced them by design). The class that actually has teeth on tip-payment is the state-update commit — does the program persist the rotation it just claimed to do — and that is the one the harness checks. The repo's README calibration paragraph walks through the choice in full.

One class today, with the same harness shape that ran four on tip-distribution. Adding the next class is a single-source-file main.rs + a single planted variant; the CI matrix expands by one cell.

AI invariant-suggester — live

A real model call, a real provenance tag, and a hand-authored set to compare against.

The AI invariant-suggester in cf-invariants-anchor shipped as a typed orchestrator on 2026-06-02 with the transport stubbed. As of today it is live: model claude-sonnet-4-6 (the DEFAULT_MODEL constant in cf-invariants-anchor-ai), prompt version invariant_suggestion_v1, every candidate tagged InvariantSource::AiSuggested { model, prompt_version, timestamp_utc } per the disclosure contract that lives in the crate.

The first portfolio-wide capture ran the suggester against both Jito programs without changing the prompt between them. On tip-distribution the model returned five candidates; cross-mapped to the four hand-authored invariant classes that Phase 2 of cf-invariants-jito ratified:

And one novel candidate not in the hand-authored set: the access-control gate on upload_merkle_root itself. Phase 2 tested the proof check on claim; the AI proposed the authority check on the upload step that establishes the root in the first place. Adding it strictly improves coverage. It is recorded as a follow-up candidate for the hand-authored Phase 3 set, not as a vulnerability claim against the production Jito program.

On tip-payment the same prompt returned two candidates, both access_control. One mapped adjacent to the hand-authored change_tip_receiver_state_update class (state-update vs. access-control on the same instruction); the other proposed a parallel access-control property on the sibling change_block_builder instruction that the hand-authored set has not covered yet. Both are in the captured run README.

One of those candidates was honestly flagged for human review in the run README: the literal text — "change_tip_receiver must reject signers other than the current authority" — is stronger than what the upstream program currently enforces (the #[derive(Accounts)] struct constrains the old tip-receiver key but the Signer itself is not bound to it). The AI proposed a plausible property that may diverge from program reality. That is precisely the work the human- review half of "assistive, human-reviewed" exists for. Whether the gap is a real concern worth surfacing to Jito Foundation via their security.txt channel is a CEO call, not a vulnerability claim from this post.

Full captures — surface JSON, rendered prompt, raw model response with SHA-256, tagged candidates, audit-log entry, transport envelope — live under experiments/cf-invariants-jito/findings/ai_suggester_run_2026-06-03/ and the tip-payment sibling path. Costs ($0.10 on tip-distribution, $0.08 on tip-payment) are disclosed in each run README, not buried; both ran over the $0.05 per-call cap that was calibrated against the smaller vault_ref surface, and a cap re-tune is queued with the CEO.

What the AI suggester is and isn't

Assistive, human-reviewed, harness-verified.

Three framings to keep load-bearing:

Why this artifact — restated

Specialization velocity, as an existence proof.

The differentiator is not new fuzzing engines. snforge on Cairo, Crucible on Solana / Anchor — both belong to other teams, and CaliperForge does not compete with them on coverage. What is being tested here is the throughput of the operator-plus-AI authoring layer that sits on top of those engines: how quickly the same operator can stand up invariant-authoring against a new VM, against a new real protocol, against a second real protocol on the same rails, with the AI suggester live and tagged.

The existence proof, as of 2026-06-03, is four points: cf-invariants (Cairo / Starknet / snforge), cf-invariants-anchor (Solana / Anchor scaffold on Crucible, generic vault target, AI suggester typed and tagged), cf-invariants-jito (first real upstream Jito program harnessed), and cf-invariants-jito-tippayment (second real Jito program, same rails, CI green on the first push) — with the AI invariant-suggester now hitting the live model and running against both Jito surfaces under one prompt. One operator, four CI-green artifacts, two VMs, one live AI suggester pipeline, all inside a handful of days. The dates are checkable on GitHub. The commits are public. The CI badges show today's state.

That is the claim. It is not that this harness covers everything Crucible covers, or that the AI suggester replaces hand-authored invariants — the hand-authored set is still what ships, and the live capture's value is the convergence evidence plus the novel-coverage candidate. The claim is that the authoring layer ports across VMs and across sibling protocols at the speed shown, with the AI suggester producing convergent and incremental candidates on the live model, and the CI green lights are the only evidence that matters.

What this is not

Not a fork. Not an audit. Not autonomous discovery.

Four framings each repo's README is explicit about, mirrored here so this post does not drift:

Repos: github.com/caliperforge/cf-invariants-jito and github.com/caliperforge/cf-invariants-jito-tippayment. AI suggester crate: cf-invariants-anchor-ai. Issues and PRs are open on all three. Operator of record on every commit: Michael Moffett.

— Michael Moffett. Built with AI assistance; the harness scaffolds, the invariant fixtures, and the AI-suggester orchestration were drafted with an AI coding assistant under operator review, with full repo attribution. AI policy at caliperforge.com/ai-disclosure.