The log

Daily entries, weekly arcs

Every day gets a short entry: what happened, what was learned about working with agents. Each week the entries become an arc. Over seasons, the arcs become the record of the experiment.

Thirty-eight refusals, fifteen plans through them

A second Jito Foundation program, tip-payment, now runs on the same anchor-lang 1.0.1 / Crucible v0.2.0 rails as cf-invariants-jito. The AI invariant-suggester is live (claude-sonnet-4-6) and converged on every hand-authored class on tip-distribution plus surfaced a novel access-control gate.

Can a stranger's Uniswap v4 hook actually be put through an invariant harness?

A census of ten hooks drawn by pre-declared rule from the live v4 hook population, run cold, twice. On the first cold pass, ten of ten failed at the same step, and the step was ours. After two repairs the number held at 0 / 10, and every failure is now a measured property of the live population: its compiler pragmas, its dependency tails, its import-prefix conventions, its constructor shapes. The sampling rule is published in place of the table, the walls are named W1 through W7, and the honest recommendation is a different container, not a longer configuration file.

Nine gates, zero facts

A document built specifically to be verified by hostile strangers passed nine consecutive quality gates while committing, cryptographically, to two model identifiers that do not exist. Two of three were fabricated; nine gates read them and none probed them. The finding, the tally, and the standing rule that came out of it: every externally-resolvable identifier in a publishable artifact is probed against its live source before publish, documentation is not evidence, and an unprobeable string stays pending while the artifact does not ship. The seat that now owns that question, and the gate it runs.

The reachability certification: sixteen seeds, hard alarm

An external reviewer named a real gap in the standing planted-twin CI claim: a single-seed green does not exclude a lucky-seed miss on classes with long triggers. Same-day fix: a merge gate that requires the planted twin to fail on all 16 canonical fuzzer seeds. Two cases certified today, Euler Earn M-01 (Foundry) and Blend V2 H-01 (Rust/Soroban), both green at head. The reachability job is now the standing receipt behind the docs claim.

The gate that caught the secret-scan gap

CaliperForge is a small AI-augmented contribution agency: one operator, thirty-nine specialized roles, each in its own single-context lane, each gated by a distinct reviewer role. Two weeks ago, one of those rails caught a gap in our own commit rail: the reconciler ran a secret scan, logged tainted paths, and committed anyway. Fix T-wave-c-close-f1-secretscan-2026-07-12 added the partitioning branch that refuses to land tainted paths, and a regression test pins the floor. Why the shape matters: same shape as the planted-twin CI receipts we ship for protocol audit tooling. The org caught its own gap because it had a rail that could refuse.

The audit already had it, in Rust this time: Blend V2 H-01 as a Soroban twin

Code4rena wardens named H-01 in their published Blend V2 review: a flash-loan round-trip that leaves a reserve’s d_supply out of step with the sum of every user’s liability. The Blend team fixed it in the commit the audit’s mitigation review confirms. This post walks the invariant that names the class and the clean/planted twin in caliperforge/soroban-invariant-atlas that fires on it: a stateful proptest-style campaign against a minimal original soroban-sdk pool that isolates the identity, a deterministic regression, and both required legs green on CI.

The audit already had it: Euler Earn share-accounting solvency as a runnable twin

Pashov Audit Group surfaced M-01 in their public Euler Earn security review (2025-07-25): a share-accounting drift in PublicAllocator when a strategy’s share delta reaches the vault outside EulerEarn.deposit. Euler Labs shipped the fix at commit f07f6b1c5e1e (2025-08-11), merged in PR #22. This post walks the invariants that name the class and the clean/planted twin in caliperforge/euler-earn-invariants that fires on it: 256 × 50 fuzz against the real Euler Earn contracts through IntegrationTest, deterministic regression mirroring the auditor’s 4-call sequence, and a short shrunk counterexample on the planted twin.

The audited base had it too: Uniswap v4 fee-direction integrity as a runnable twin

OpenZeppelin’s v1.1.0 RC-2 audit surfaced M-01 on their own BaseDynamicAfterFee: direction-blind fee arithmetic that computed against the wrong leg on exactOutput swaps. Commit 2678eb9 shipped the fix in tag v1.1.0; Zealynx’s Pattern 4 names the taxonomy. This post walks the direction-integrity invariant that names the class and the clean/planted twin in caliperforge/uniswap-v4-invariants that fires on it: 256 × 50 fuzz against the real PoolManager, deterministic regression, and a 1-call shrunk counterexample.

The review layer caught the build layer: a confident, wrong attribution

Written on activity day 41 and published later. A builder agent produced a clean twin and a planted twin that behaved exactly as they should: the property stayed silent on the clean twin and fired on the planted one. Then it wrote one sentence crediting the wrong line to an audit firm’s published fix. A reviewer agent with no shared context went to the primary source, found the commit, and did not match. Everything mechanical was right and the credit line was wrong, which is the shape of mistake that reads correct on the page. What the catch proves, and the three things it does not.

The reference hook had it too: Uniswap v4 liquidity-penalty conservation as a runnable twin

The Uniswap Foundation ships a reference LiquidityPenaltyHook through OpenZeppelin. Zealynx surfaced the donation-griefing class (their Pattern 3); OpenZeppelin’s v1.1.0 audit surfaced it independently; v1.2.0 already ships the add-time fee-state guard. This post walks the conservation invariant that names the class and the clean/planted twin in caliperforge/uniswap-v4-invariants that fires on it: 256 × 50 fuzz against the real PoolManager, deterministic regression, and a 3-call shrunk counterexample.

Right denom, wrong channel: Secret Network, IBC source validation, and the conservation invariant

Around June 10, 2026, roughly $4.67M was drained from a wrapped-token contract on Secret Network. A modified CW20-ICS20 implementation validated the incoming denomination but not the source channel, because the channel check was commented out. This is not a postmortem. It names the invariant class the mechanism belongs to, states the two-counter property a stateful test would assert, and says plainly where our CI-verified coverage stops.

32 days, one operator, an AI-agentic company

One operator, 12 to 15 hours a day, running the venture through a roster of AI agents with role cards, outboxes and review gates. The cockpit that makes the org observable, the gate catch-and-miss numbers as they stood on day 32, the places the agents miss and the operator cleans up, the bad days, and the zero on the revenue line.

The clean=0 gate: why a planted bug is the minimum bar for invariant CI

An invariant test that fires on a planted bug tells you the property runs. It does not tell you the property catches anything. Only the second leg, the same property holding on the clean reference, makes the claim checkable. Written on day 31 and published from the backlog later. What it takes to wire both legs as a CI gate, what the gate refuses to let through, and the three things a green pair still does not prove.

5 billion SYS, one missing burn: Syscoin, SPV proofs, and the conservation invariant

On June 7, 2026, the Syscoin bridge lost a reported $8.56M to a malformed SPV proof accepted as valid: approximately 5 billion SYS minted on the destination side with no corresponding burn on the source side. The conservation invariant a bridge must enforce, how a stateful test that tracks both counters finds the violating call, and how this maps to CI-verified conservation reference pairs on Anchor/Solana (cf-invariants-anchor, cf-invariants-jito) and Cairo/Starknet (cf-invariants).

The txs the proof validated but settlement skipped: Aztec’s cross-layer conservation class

On June 14, 2026, approximately $2.19M was extracted from Aztec’s deprecated RollupProcessor contract. Proof scope and settlement scope diverged: the ZK proof validated all 32 batch slots; the L1 settlement loop processed only numRealTxs of them. The cross-layer conservation class, what CI-verified reference pairs cover today, and where the Aztec surface sits outside that set.

Authentication is not authorization: the TrustedVolumes access_control class

TrustedVolumes lost a reported $5.87M because the settlement contract keyed its signature lookup on the caller (msg.sender) instead of the order’s maker. The invariant property that catches the class, mapped to CI-verified access_control reference pairs on Anchor/Solana and Cairo. No Solidity-rail pair yet, said plainly.

The planted-twin methodology: what it is and what it is not

A clean reference where the property holds, a planted twin where it fires, both on the same CI run: why a checkable pair beats a claim. hyperevm-safety v0.1 to M2 in the same week as the worked example, and the Verus bridge-conservation reference as the one-line case. Not an audit; not a runtime monitor.

Exploit→Invariant Atlas, six cross-VM defender-side CI cases

Six real-world hacks across Cairo, Move, Solana, and EVM, each with a runnable invariant that would have caught the bug class on the pre-exploit code under CI. First cross-VM defender-side benchmark of this shape: pre-deploy CI gate, not a runtime guard, non-EVM-led.