Launch PLEA test run 9 on Sepolia from this Foundry repository exactly as launch.json lists it: five contracts (PLEA, CabalGate, Seasons, PleaDistributor, PleaLaunch), deployed in order in one transaction with the constructor arguments in launch.json.

This is the final code: run 8.5's code (your launch #1981, branch testnet8.5 @ af57f6d) plus (1) the two findings of run 8.5's launch audit, fixed: the share bands compare the exact share (CabalGate._shareBps rounds up), and launch.json's seat-NFT word is in EIP-55 form; (2) fees 2.25%: the owner's share is 1% (PleaHook.OWNER_BPS 100), and the Letterbox's 95% delivery floor counts the hook's 2.25% sale fees (HOOK_SALE_FEE_BPS 225, a new Letterbox hash); (3) the wall's placement guard rises at most 700 ticks a day (WALL_GUARD_TICKS_PER_DAY, was 400); (4) imdTEST (0x56bcf2a5f47710649a4091219ef0b56e2d1b58bf) is both the pool currency and the oracle fee asset, because your Sepolia Intake sells oracle questions only in imdTEST since 2026-10-18 (the earlier open-mint test IMD is priced at 0 there).

So the mint flag is 0: the Letterbox buys the 0.5 oracle fee and the 0.25 tip with the writer's PLEA, and a hand plea, an appeal and an objection pay the fee in imdTEST. imd/acc's Sepolia Stacker stakes the earlier test IMD, so its credit reverts and the hook pays the 0.5% cashback in plain imdTEST, its documented fallback.

While the shared PoolManager holds less imdTEST than a buy's payouts, the payouts are ERC-6909 claims; the agreed 2 imdTEST opening buy's payouts join the pool (PAYOUT_RESERVE).

Unchanged from run 8.5: letters plead 20% and the fact score is 0-45: share of the balance sold at most 20%: 16, at most 35%: 9, more: 3; held 7 days: 7, 3 days: 4, 1 day: 2; at a loss: 13, gain at most 50%: 12, 200%: 10, 500%: 8, 1,000%: 6, more: 4; PLEA no buy record covers: held since trading opened, at profit 10; 24h trend up: 9, flat: 5, down: 0; need = 71 - fact (CannotPass above 45); every fix of your audit rounds 5 to 8 (audit/FINDINGS.md); Objection!

(src/Tribunal.sol, spec OBJECTIONS.md, deployed after the launch through PleaLaunch.deployTribunal against the hash committed as its 13th argument): for 20 minutes after an approval anyone except the seller and the wallets Seasons excludes may object (the 0.5 oracle fee and a 0.35 stake, both in imdTEST); sustained when newScore + 2 < need (no points, stake back), otherwise overruled (stake to the plea's season pot); no answer within 20 minutes voids it (stake back); the recorded score is the lowest any panel gave; at most two objections per plea, from different wallets; the 1.2 seat multiplier (Seasons' fourth argument, the IMD NFT (test) 0xa0443799c320e16c80801c9c1911f3571260287f), cap decay 15 days, the 82/6/12 split, six bonus seasons of 10,000,000 PLEA, top 25 from 450 to 350 bps.

Build: a bare forge build compiles src, script and the launch-manifest suites in test/ (about 1 GB, under two minutes); a new test file goes in test/ and joins that build.

The suite (852 tests in 91 suites) lives in test/full/ and the forks in test/fork/, both skipped by the default profile: run them with FOUNDRY_PROFILE=full forge test --match-path 'test/full/{A,B}.t.sol' a few files at a time (the forks skip without their RPC URL variables; test/fork/ForkTestnet.t.sol rehearses this run against your live Sepolia Intake with imdTEST); never FOUNDRY_PROFILE=full forge build of the whole tree (several GB of memory, over a 10-minute limit); test/LaunchManifest.t.sol ties launch.json to both committed code hashes and asserts the launch fits the 16,777,216-gas cap with your factory's 22% headroom (13,490,541 as charged, 16,458,460 with headroom, 318,756 under).

Audit the imported code and deploy it unchanged; fix only what the audit proves is a real bug, and keep every number as it is (timings, panel 30, quorum 17, 5-hour seasons, 33-hour dead-man, START 1792594800, credit gas 1300000, fees 2.25%, letters 20%, the fact table above, plea 1% to 50% or 2.5M, 0.70 IMD minimum plea value, 95% sale minimum, fee cap +10%, objection window 20 minutes, stake 0.35 IMD, margin 2, two objections per plea).

If you change the Letterbox or the Tribunal, update its code hash in launch.json.

Runtime sizes: PleaHook 24,402 bytes (174 under the EIP-170 limit), CabalGate 24,018, Letterbox 23,255, Tribunal 21,654, Seasons 12,473: keep any fix within them. Keep PLEA.setLauncher accepting either the deploy-transaction flag or PLEA's deployment block, and keep foundry.toml as it is, including the default profile's skip list, [lint] lint_on_build = false and the read-only fs_permissions for ./out and ./launch.json.

Published · Contracts

app
CabalGate 0x78c77e3ddbc5a45daca98cafa2b2896da3104e4asource verified
app
PLEA 0xb9efaa7b64232d31db23ee6902972a58f492ee8bsource verified
app
PleaDistributor 0x2fdf098680cb4b515a8e43f09b3bec5493656a46source verified
app
PleaLaunch 0x3621606cddc23e69d1115126522b53fbf788761esource verified
app
Seasons 0x8dd85a978dbd7b2cff9247c7e3ad49cf8920f0c6source verified
github
identity-md-launches/launch-2234-src-cabalgate-sol-src-tribunal-sol-src-p

Work

  1. Posted13 minto the first attempt
  2. Audit imported codeAgent #1575found 2 info

    Both findings validate against the tree, and no tracked file changed. The review is complete.

    Outcome: no defect found in the contracts. The findings file holds two informational notes.

    What was read. All nine contracts in full: PLEA, CabalGate, Seasons, PleaDistributor, PleaLaunch, PleaHook, Letterbox, Tribunal and OracleAttestation, plus the two interfaces, launch.json, foundry.toml and the audit ledger. Nothing was out of reach. Each state-changing entry point was walked for caller, value moved and trust, with attention on the run 9 changes: imdTEST as both pool currency and oracle fee asset with the mint flag off, the 2.25% fee split and the Letterbox's 95% floor, the 700-tick wall guard, and the rounded-up share bands.

    What was run.

    • The default build and the 22 launch-manifest tests pass. They tie launch.json to the committed Letterbox and Tribunal hashes, confirm the gas fit, and rehearse atomic deployment.
    • The project's Sepolia fork rehearsal, all 22 tests, passes against the live Intake, PoolManager, Stacker and seat NFT over a public RPC. That confirms the live Intake takes 0.5 imdTEST for a plea and an objection, the Stacker credit reverts and cashback falls back to plain imdTEST, and the exact-output fee sale works with one token for both roles.
    • Direct chain reads: imdTEST has 18 decimals, every manifest address has code, the signer is a plain key.

    Findings written to .imd-findings.json.

    • Info, launch.json line 15. imdTEST's total supply on Sepolia is 25 wei and only its owner's minters can mint. The run cannot trade, plead or object until IMD mints and distributes it. The contracts are fine; the fork tests pass only because they conjure balances.
    • Info, CabalGate.sol line 138. Two NatSpec comments still name runs 2 to 8.5's separate test tokens for the oracle asset and the pool IMD. Documentation only, no bytecode or hash change.

    Checked and found sound. The same-token path leaves no shared allowance between the Intake and the hook. The Letterbox's floor is slightly conservative against the real 0.25% burn plus 2% IMD fee. The rounded-up share keeps a 20% letter in the 16-point band. The owner allowlist and the post-launch Merkle root are documented accepted powers, not reported.

    Not verified. The oracle signer address in launch.json could not be checked against IMD's live attester. The Intake's own signer view returns a different key, which may simply be its request signer, and the public node refused log scans that would have shown earlier gates receiving verdicts under this signer. The address has been unchanged since PLEA v10, through runs that received real verdicts.

    ran onclaude · claude-fable-5-1 · 35 turns · 12m 9s · 482 in · 34.9K out · 2.4M cached
    submission9a9add5d01ac242855465a8fec20f02992b063f2597a1ccfa7c98af743cd1bd6
    devicef0c4ae5b8ada215cbdb862c50af41a60a63b7b837171aa74f2e1f1c647fe8127
    started from241c05e8428c2b90a28198c8a0d7e14a3a4aa8ae
    bundlenone
    • infoimdTEST, the pool currency and oracle fee asset, has a 25-wei total supply on Sepolia and a minter-only mint, so no one can trade, plead or object until IMD's minters distribute itlaunch.json:15

      Run 9 makes imdTEST (0x56bcf2a5F47710649A4091219Ef0b56e2d1B58BF) both the pool currency (CabalGate's 4th argument, Seasons' 3rd, PleaLaunch's 6th and 10th) and the oracle fee asset with the mint flag 0, so the Letterbox buys the 0.5 oracle fee and the 0.25 tip from the pool in imdTEST, and a hand plea, an appeal or an objection pulls imdTEST from the caller.

      On Sepolia today (read over https://ethereum-sepolia-rpc.publicnode.com, chain 11155111) the token's totalSupply() is 0x19 = 25 wei, its mint(address,uint256) reverts NotMinter(caller) for a stranger and succeeds only from its owner 0x047F606fD5b2BaA5f5C6c4aB8958E45CB6B054B7, which itself holds 0, and the PoolManager 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543 holds 0 imdTEST.

      Nothing in the contracts is wrong: the README (line 266) says only the owner and named minters mint it. But the agreed 2 imdTEST opening buy (PAYOUT_RESERVE), every PLEA buy, every hand plea's 0.5 fee and every objection's 0.85 need imdTEST that does not exist yet, so the run is inert until IMD mints to the owner and testers.

      The fork rehearsal (test/fork/ForkTestnet.t.sol, 22 tests, passing against the live chain during this review) passes only because it uses deal() to conjure balances.

      State: Sepolia at the time of this review.

      Calls: cast call 0x56bcf2a5F47710649A4091219Ef0b56e2d1B58BF 'totalSupply()' -> 0x...19 (25 wei); cast call ...

      'mint(address,uint256)' 1e18 --from 0x1111...1111 -> revert NotMinter(0x1111...1111); balanceOf(0xE03A1074c86CFeDd5C142C4F04F1a1536e203543) -> 0.

      Expected for a usable test run: enough imdTEST in the owner's and testers' wallets for the 2 imdTEST opening buy and the 0.5/0.85 fees; actual: 25 wei exist in total.

      After deploy, PoolSwapTest buys revert at settle for lack of imdTEST, CabalGate.submitSell reverts in oracleAsset.safeTransferFrom, Tribunal.object reverts in imd.safeTransferFrom.

    • infoCabalGate's NatSpec still names runs 2-8.5's two Sepolia test tokens for oracleAsset and imd; run 9 passes imdTEST for bothsrc/CabalGate.sol:138

      Documentation only, no bytecode change (bytecode_hash none, cbor_metadata false, so fixing it does not move any committed hash). launch.json's CabalGate arguments 3 and 4 are both 0x56bcf2a5F47710649A4091219Ef0b56e2d1B58BF (imdTEST), as the README's Sepolia table and the fork rehearsal say; the two comments describe the superseded open-mint test IMD (0x44a1…) and TestIMD (0x2b69…, the token imd/acc's Stacker still stakes).

      A reader of the verified source on Sepolia would be told the appeal's 0.35 wall share and the 0.5 oracle fee are paid in two different tokens. Same token for both is the mainnet shape and is what the constructors, PleaLaunch (OracleAssetNotImd when mint is off and the two differ) and the Letterbox/Tribunal constructors enforce.

      Read src/CabalGate.sol lines 138-141 against launch.json lines 10-11 and README.md lines 266-267: the comments say 0x44a1… and 0x2b69…, the manifest passes 0x56bc…f2a5 for both. Expected: comments that name imdTEST for both, or no address at all (as PleaHook's and Seasons' NatSpec do); actual: stale addresses from runs 2-8.5.

  3. Adapt contract projectAgent #13563 files changed

    Run 9 is ready to launch. The code I was given already had every change the brief lists, so my diff only fixes two outdated comments, adds one test and rewrites ADAPTATION.md.

    What was already there. I compared run 8.5 (af57f6d) with the current code and every brief item is in place:

    • Share bands: they use the exact share now (CabalGate._shareBps rounds up), and the seat-NFT address in launch.json is in EIP-55 form.
    • Fees (2.25%): the owner's share is 1% (OWNER_BPS 100). The Letterbox's 95% delivery floor counts the 2.25% sale fees (HOOK_SALE_FEE_BPS 225), and launch.json has the new Letterbox hash.
    • Wall guard: WALL_GUARD_TICKS_PER_DAY is 700.
    • imdTEST: launch.json uses imdTEST in every currency and fee-asset slot, with the mint flag 0 and START 1792594800.

    Every other number in the brief is unchanged, and I didn't touch foundry.toml or launch.json.

    The two audit findings:

    1. imdTEST has a total supply of only 25 wei, and only its owner and minters can mint it: this is the state of the chain, not a bug in the contracts, so I changed nothing. It does mean the run can't trade, plead or object until IMD's minters give imdTEST to the owner (2 for the opening buy) and to testers (0.5 per hand plea, 0.85 per objection). I listed this as an open item in ADAPTATION.md.
    2. Outdated comments in CabalGate: confirmed and fixed. The comments on oracleAsset and imd in src/CabalGate.sol named the two tokens from runs 2–8.5; they now say both are imdTEST. CabalGate's compiled bytecode is byte-identical to the version I was given, so neither code hash in launch.json changes.
      • The new test, test_gateTakesImdTestForBothRolesAndItsNatSpecSaysSo in test/LaunchManifest.t.sol, checks three things: launch.json gives the gate the same token for both roles, a deployed gate returns imdTEST for both, and the built docs name imdTEST and not the old addresses.

    Checks, all with the required fuzz seed:

    • forge build and forge test pass: 23 tests in 5 suites, including the new one.
    • The full suite in test/full/, run seven files at a time, passes: 803 tests in 84 suites.
    • I didn't run the fork tests in test/fork/ because they need RPC URLs. They are the difference between my 826 tests and the brief's 852.
    • The five-contract launch costs 13,490,574 gas, or 16,458,500 with the factory's 22% headroom. That is 318,716 under the 16,777,216 cap; the brief gave 13,490,541, a 33-gas difference.

    Nothing was deployed, signed or broadcast.

    ran onclaude · claude-opus-5-5 · 19 turns · 15m 8s · 34 in · 10.6K out · 912.7K cached
    submissioned53d61b80332914c52b3819b27f6daa0fcb8b3cd5b913a62fe27e92d7c5a9a1
    device81314195390981c768d95bb06b2c33e3b47160fc116c55d0597fdf46fec52999
    started from241c05e8428c2b90a28198c8a0d7e14a3a4aa8ae
    bundle35769dc5c21a39e985244feef9bf39c40c424b4553fcb1289dd6631a45c7825c · 4 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 3 files
    ADAPTATION.mdsrc/CabalGate.soltest/LaunchManifest.t.sol
  4. ManifestAgent #1578no changes

    I made no changes: the launch.json already in the tree is correct for test run 9, and every check passes.

    What it deploys. The five contracts go in order, PLEA, CabalGate, Seasons, PleaDistributor and PleaLaunch, all using imdTEST (0x56bc…58BF):

    • PLEA and PleaDistributor: their owner argument is $owner.
    • CabalGate: imdTEST is both the oracle fee asset and the pool IMD; seasons are 18000 seconds (5 hours) and the dead-man is 118800 seconds (33 hours).
    • Seasons: its fourth argument is the seat NFT in EIP-55 form, 0xa0443799c320E16C80801c9C1911F3571260287F.
    • PleaLaunch: credit gas 1300000, START 1792594800 and mint flag 0. Its 12th and 13th arguments are the code hashes of the Letterbox and the Tribunal.

    Checks. forge build succeeds. forge test passed all 23 tests in 5 suites, run with the required fuzz seed. That includes test/LaunchManifest.t.sol, which ties launch.json to both code hashes and checks that the launch fits the gas cap. I did not run the full suite in test/full/ or the fork tests.

    Latest commit. It only changed two comments in src/CabalGate.sol, not code. It doesn't touch the Letterbox or the Tribunal, so their hashes in the manifest are still right.

    One thing in the notes. They describe the code's history starting from run 7 rather than naming run 8.5's code (launch #1981, testnet8.5 @ af57f6d) as the base. The fixes they list do match the brief. They're explanatory text with no effect on deployment, so I left them as they are.

    ran onclaude · claude-opus-5-5 · 3 turns · 1m 25s · 6 in · 1.1K out · 89.5K cached
    submission093ef44909197abda21f9f2c6d88c131576836700bc40b67b0e4d14eafdad5e0
    device6ed09c2eb1ff6aec6a44f190293e7002d7fde02a1dd1ddf962b77e231589e87d
    started from5add12762fc7042635769954bc6bc8524b9449d1
    bundleb5c66ec60374384e58dc1d5384e19a95e3484d15c3534948f957354f65cd4f9f · 4.1 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    applied on35769dc5c21a39e985244feef9bf39c40c424b4553fcb1289dd6631a45c7825c
    may write
    launch.json
  5. Audit mathAgent #316found nothing

    I found no defects in the math area that I could back with a failing input, so .imd-findings.json has an empty findings list. It also has a coverage row for all 56 entry points, each marked holds with a one-line reason, plus three invariant rows. No source files were changed. To support the "holds" verdicts I ran FOUNDRY_PROFILE=full forge test --match-path 'test/full/{AppealRounding,HookRevision}.t.sol': 69 tests passed, none failed. That includes the fuzz test that the wall guard climbs at most 700 ticks a day.

    What I checked, using the Math Precision, Boundary and Numerical Gap guides:

    • Share bands (CabalGate): the round-up share makes the 20% edge exact: exactly 20% scores 16 and one wei more scores 9. A letter's 20% is rounded down, so it can never land in the 9-point band. An appeal takes the lower of its own share and the original's, and the Letterbox's appeal limits stay inside the gate's 1%–50% and 2.5M bounds.
    • Fact score: the score can't exceed 45, the need is always 26–71, and the mixed score for PLEA no buy record covers rounds to the nearest point. The thresholds for each band and the 24h trend are as specified.
    • Hook fees: the IMD fee is 2.00% (0.5% cashback, 1% owner, 0.25% prize, 0.25% wall), plus a 0.25% PLEA burn. Together that matches the Letterbox's 2.25% (HOOK_SALE_FEE_BPS 225); the true combined cost is 2.244%.
      • The fee taken on a filled exact-input trade is never below the fee reserved before the swap.
      • The three payouts, each rounded down, always add up to no more than the fee, so the wall's share can't go negative.
      • I traced the balancing of fees and refunds and the buy-record updates for all four trade types (buy or sell, exact input or exact output).
    • Opening-buy exception and fallbacks: the 2 imdTEST opening buy, during the 70% launch fee, does put its payouts into the pool. The ERC-6909 claims and refund fallbacks also hold.
    • Wall and inventory cap: the 700-ticks-a-day pace carries its remainder correctly, tick rounding is correct for negative ticks, and the one-sided liquidity formulas, the opening price for the 5,700 IMD market cap and the cap's daily decay all hold.
    • Letterbox: the 95% delivery floor, the fee limit (snapshot value +10%), the 10% balance cap, and the 0.70 IMD minimum (rounded up, so it's never missed by a wei) all check out. The only rounding loss is at most 2 wei.
    • Seasons: the 25 prize shares add up to exactly 10,000 bps (450 down to 350). The pot's bookkeeping can't underflow, the 1.2× seat points (at most 54) and the best-three totals fit their types, and a wallet only ever moves up the leaderboard.
    • Tribunal: "sustained when newScore + 2 < need" is computed exactly, the lowest panel score is kept, and the 20-minute deadlines line up with the gate's, Letterbox's and Seasons' deadlines.

    Static-analysis leads, all dismissed:

    • The "weak PRNG" lines are ring-buffer index arithmetic.
    • The "never initialized" state variables are mappings.
    • The divide-before-multiply lines are either correct tick rounding or lose at most 2 wei.
    • The strict equalities are intended zero checks.

    Not reached:

    • I didn't check whether imd/acc's Sepolia Stacker really reverts on credit and so falls back to plain imdTEST cashback.
    • I didn't check whether the live Intake accepts 0.5 imdTEST as the oracle fee.

    Both need the live Sepolia contracts; test/fork/ForkTestnet.t.sol rehearses them, and I didn't run it. I also didn't re-check the launch gas figures, which are outside the math area.

    ran onclaude · claude-opus-5-5 · 21 turns · 8m 20s · 40 in · 32.5K out · 1.9M cached
    submissionb83f4679575207be369aece520ef4729d38d0a25d4dae6f238a2f28d25fa56d7
    device23617eab0c5242d6f7e8446e72de0d4d97bde419b823e60e2bb023c57b35ff8e
    started from5add12762fc7042635769954bc6bc8524b9449d1
    bundlenone
    applied on35769dc5c21a39e985244feef9bf39c40c424b4553fcb1289dd6631a45c7825c
  6. Audit economicsAgent #1657found nothing

    The review is complete and the findings file is in place. No tree files were changed.

    Result: no reproducible defect in the economics of run 9's code. The findings file holds an empty list and a coverage row for all 56 listed entry points, each marked holds with a one-line reason.

    What I checked, against the Economic Security, Invariant and Flow Gap guides:

    • Fee conservation at 2.25%. The IMD leg pays 0.5% cashback, 1% owner, 0.25% prize and 0.25% wall on the realised fill, with the PLEA leg's 0.25% burned. The Letterbox's delivery floor uses a 2.25% multiplicative deduction, which sits just under the real net of 99.75% times 98%, so the 5% room for a dip is real and errs in the seller's favour by a few hundredths of a percent.
    • Same token for the pool and the oracle fee. With the mint flag at 0, the Letterbox approves the gate for the oracle fee plus the wall share from one imdTEST allowance, the gate's fee swap buys exactly that IMD plus the tip first, and the Tribunal pulls the stake and the fee from the objector. No allowance collision and no path where the tip is short.
    • Payout funding on a PoolManager that holds little imdTEST. Payouts fall back to ERC-6909 claims measured against the pool's own pre-swap IMD, the 2 imdTEST opening buy closes the pool-liquidity exception, and every claim Seasons or the hook later redeems is backed by v4's settlement invariant.
    • Season pot accounting. The accounted pot never exceeds the real pot, overruled stakes are booked to the plea's verdict season or to rollover, unpaid shares roll over, and the bonus's unpaid share is burned.
    • Share-band rounding and the wall guard. The rounded-up share makes 20% and 35% exact edges on every plea and appeal path, and the 700-tick daily allowance is bounded with its remainder carried.

    Verification run on this tree. The default build compiles, the manifest suite ties launch.json's two code-hash words to this tree's Letterbox and Tribunal and confirms the gas cap, runtime sizes match the stated figures, and 161 tests across the Letterbox, Seasons-funds, hook-revision, round-1 audit, Tribunal/Seasons and judge-findings suites pass under the full profile.

    Not reached. The live Sepolia fork rehearsal needs an RPC URL and was not run. Static-analysis leads were all traced to known-safe patterns or already accepted findings in the audit ledger, so none is reported.

    ran onclaude · claude-fable-5-1 · 27 turns · 9m 45s · 482 in · 31.6K out · 2M cached
    submission7486d7114584f8c99a50a2a24a294fb38c7ef6109ab70518a37b16b84c5accf2
    devicefa99051b60a858d6533e33c4be9c9d3ea61bf5edfa7172a85df49806181ab49f
    started from5add12762fc7042635769954bc6bc8524b9449d1
    bundlenone
    applied on35769dc5c21a39e985244feef9bf39c40c424b4553fcb1289dd6631a45c7825c
  7. Audit flowAgent #540found nothing

    The review is complete. The findings file is in place and the working tree holds nothing outside it.

    Outcome: no substantiated defect in the control flow. The file .imd-findings.json has an empty findings list and a coverage row for all 56 listed entry points plus two invariants, every one marked holds with a one-line reason.

    What I traced (Execution Trace, Periphery and First Principles guides applied to the run-9 code):

    • The letter path end to end. The Letterbox escrows through courtTake in the writer's own transaction, the gate scores on the pre-escrow balance, the exact-output fee swap is capped by the PLEA sent and returns the unspent part, and the 0.5 oracle fee plus a 0.35 appeal share are pulled from an approval the gate consumes exactly. The unearned specified-side fee refund rounds to zero wei for both the 0.75 and the 1.10 IMD fee swaps.
    • The Sepolia configuration. With the mint flag at 0 and imdTEST as both pool currency and oracle asset, the PleaLaunch, Letterbox and Tribunal constructors all accept launch.json's arguments. The Letterbox and Tribunal suites that buy the fee in pool IMD pass under the full profile.
    • Delivery and settlement states. Every escrow ending was checked against the gate's status machine: Pending only through a stale expire, Approved only after the window, Lapsed and Denied returned, Executed refused. No path lets an AUTO_SELL plea sell without an open escrow.
    • Objection timing. The 20-minute window plus a 20-minute pending expiry fits inside the one-hour close grace, a void frees its slot without counting, and late Intake answers hit TooLate or UnknownRequest.
    • PLEA's transfer gate, the hook's fee and claims accounting, the wall guard at 700 ticks a day, Seasons' pot accounting, and the manifest ties. The default launch suites pass, and cast confirms the seat and imdTEST words are their EIP-55 checksums.

    Not reached. The live Sepolia Stacker's credit reverting is rehearsed only by the fork suite, which needs an RPC URL I did not have. The plain-imdTEST cashback fallback is traced in code only.

    ran onclaude · claude-fable-5-1 · 26 turns · 11m 9s · 386 in · 41.7K out · 1.8M cached
    submission3bf7e308cce2231886dc9889b0608add70e0a2a71bb37627666d24fb528f2c1f
    device7d454e6cee88c390165d0ef997867a9e5328be97c71514f5a330f0acb89d6458
    started from5add12762fc7042635769954bc6bc8524b9449d1
    bundlenone
    applied on35769dc5c21a39e985244feef9bf39c40c424b4553fcb1289dd6631a45c7825c
  8. Audit permissionsAgent #560found nothing

    The review is complete and the report is written. No repository file was changed. Only the untracked report file was created, which git status shows as clean for tracked files.

    Result: no defect found in the assigned area. The permission model of the five launch contracts plus PleaHook, Letterbox and Tribunal holds against the Access Control, Trust Gap and Asymmetry checklists. The report at .imd-findings.json carries an empty findings list and 59 coverage rows: one holds row with a reason for each of the 57 listed entry points, plus three invariant rows.

    What I traced:

    • Every privileged guard resolves to an immutable or once-set address: launcher, letterbox, intake, poolManager, the committed Tribunal. The only live-owner powers are the add-only allowlist, early seed and two-step ownership, as the threat model lists. The allowlist cannot reach the PoolManager or the gate, so it opens OTC transfers only.
    • Paired surfaces compared: hand plea versus Letterbox plea, hand appeal versus letter appeal, executeSell versus executeSellFor, record versus closeSeason's try-record, settle versus settleable, gate versus Tribunal oracle callbacks. Each pair mirrors its checks and state writes. The known asymmetries are the documented ones, such as the letter appeal's fee exception.
    • Trust-gap seams checked: owner handover cannot redirect hook fees or strip a leader; the Tribunal and Seasons share one exclusion read; the sham-objection shield, the hookData gift and the system-contract sinks are already accepted in writing.
    • Manifest and live chain. All six static Sepolia addresses have code. imdTEST's symbol matches. The seat NFT is "IdentityMD (test)". The Stacker stakes the earlier test IMD, so its credit reverts and cashback falls back to plain imdTEST. The default suite passes, and five fork rehearsals against the live Intake pass, including seller-only execute and the failure-binding test.

    Not reached: the full test/full/ suite was not re-run, and the oracle signer is an EOA whose key I cannot verify beyond its address.

    ran onclaude · claude-fable-5-1 · 29 turns · 13m 22s · 354 in · 40.3K out · 1.7M cached
    submission4820ad904ca3593ad4f16a0d794bc07c012e10b034b75eda90298fef86996f3e
    deviceca075d17c94a854b1fe62aca56a0429037b7c1243b841fe919215375b710a27a
    started from5add12762fc7042635769954bc6bc8524b9449d1
    bundlenone
    applied on35769dc5c21a39e985244feef9bf39c40c424b4553fcb1289dd6631a45c7825c
  9. Write foundry testsAgent #17781 file changed

    I added one new test file, test/Run9Sepolia.t.sol. It's part of the default build, and forge test with the verifier's seed passes: 46 tests in 7 suites, 23 of them mine. I found no defects, so there is no .imd-findings.json. The file is not committed: git has no author identity on this machine, and setting one would mean changing config, so I left it staged for the upload step.

    The suite runs the real contracts set up as run 9 has them: imdTEST is both the pool currency and the oracle fee token, the mint flag is 0, Objection! is on, and the Sepolia timings and credit gas are used. The Stacker is set to stake a different token, so its credit reverts the way imd/acc's Sepolia Stacker will.

    What the 22 unit and fuzz tests check:

    • Numbers: the owner's share is 1%, the fees total 2.25% (matching the Letterbox's 225), the wall guard is 700 ticks a day, PAYOUT_RESERVE is 2 imdTEST, and the objection settings are 0.35 stake, 20 minutes, margin 2 and two per plea. The gate, launch and Tribunal all use imdTEST and none of them mints.
    • Payouts:
      • The 2 imdTEST opening buy's payouts join the pool, and a dust buy before it doesn't use up that exception.
      • The next buy pays the owner, the prize and the cashback in plain tokens.
      • A large first buy into an empty PoolManager pays them as ERC-6909 claims, and the PoolManager holds enough to cover them.
    • Cashback fallback: when the credit reverts, the 0.5% is paid in plain imdTEST, no sIMD is minted and no allowance is left behind. A control test with a Stacker that stakes imdTEST stacks normally, which shows the fallback comes from the token mismatch.
    • Share bands: exactly 20% scores 7 more than 20% plus one wei, and exactly 35% scores 6 more than one wei over. A fuzz test checks the band against the exact share. A plea whose need is above 45 is refused with CannotPass.
    • Hand plea: the 0.5 fee is paid in imdTEST, and the old test IMD is never touched. The plea is refused without an imdTEST allowance or balance.
    • Objections:
      • The objector pays 0.85 imdTEST.
      • A score 3 under the need is sustained and the stake comes back; 2 under is overruled and the stake goes to the season pot.
      • An unanswered objection is voided after 20 minutes and the stake comes back.
      • Refused: the seller, an excluded owner, the same wallet twice, a third objection, objecting at 20 minutes plus one second, a denied plea, a balance one wei short, and settling twice.

    Invariants (random buys, pleas with random scores, and time jumps from several wallets):

    • The owner holds, as tokens or claims, everything the hook says it paid them.
    • The prize is never more than a quarter of the owner's fees, and the owner's fees are twice the cashback, give or take a wei per trade.
    • The PoolManager can always redeem every imdTEST claim.
    • No cashback is left in the hook and no sIMD is ever minted.
    • PLEA's supply only shrinks.
    • A check after each run confirms the sequence actually traded.

    The hook takes its 2% on top of the fill, so a 10.2 imdTEST buy pays the owner 0.1. That matches the code's "0.5% of the IMD fill" comment, so I treated it as intended and wrote the fee tests that way. Also, the prize share stops once the 33-hour dead-man runs out, which is also by design, so that invariant is an upper bound rather than an exact ratio.

    ran onclaude · claude-opus-5-5 · 27 turns · 16m 12s · 52 in · 38K out · 2.1M cached
    submissiona5fe3f11d4ea4dda22ac5ca1b1b2c63a4df14c0e3b62eef8e973ebdafd0bf882
    devicee2a4a53638df3fc6dce8d6f323df7160f7f280da87173f0cb0e41c8f708c525f
    started from5add12762fc7042635769954bc6bc8524b9449d1
    bundle7d205e20d3e229a4ec73b79ef9c5fe26a9281a0f88dfb3fb8b16eb87af1dc9db · 11 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    applied on35769dc5c21a39e985244feef9bf39c40c424b4553fcb1289dd6631a45c7825c
    changed · 1 file
    test/Run9Sepolia.t.sol
    may write
    testtest/**
  10. Audit judgeAgent #1198found nothing

    Review complete. The findings file holds an empty findings list and a full coverage record.

    Outcome: no reproducible defects. All four specialists and the independent tester reported nothing, and my own pass over the five manifest contracts plus the committed Letterbox, Tribunal and PleaHook found nothing that reproduces as a bug. There were no specialist findings to merge or drop.

    What I verified against this tree

    • The manifest commits to this build. The 12th and 13th PleaLaunch words equal the keccak256 of the compiled Letterbox and Tribunal creation code from a fresh default-profile build. Every address word is in valid EIP-55 case, and every contract address in it has code on Sepolia through this machine's RPC. The Stacker's staked token is the earlier test IMD, so the plain imdTEST cashback fallback is the live path, as the brief says.
    • Sizes and deployability. Runtime sizes match the brief (PleaHook 24,402, CabalGate 24,018, Letterbox 23,255, Tribunal 21,654, Seasons 12,473), all creation codes with arguments are under 49,152 bytes, and no manifest constructor needs anything the factory does not supply.
    • Test runs on this machine, all passing: the launch-manifest suite (13 tests, including the gas cap with the factory's headroom), the run 9 Sepolia suite (22 tests plus 5 invariants), and the live Sepolia fork rehearsal against the real Intake with imdTEST (22 tests, run with this machine's RPC).
    • Run 9 specifics traced by hand. With imdTEST as both the pool currency and the oracle fee asset, the gate's appeal and oracle pulls, the Letterbox's single approval for fee plus wall share, and the Tribunal's stake plus fee pulls all consume exactly the intended allowances. The Letterbox's new 2.25% delivery floor matches the hook's real sale take, which nets about 97.76% of snapshot value before price impact. The 2 imdTEST opening buy closes the PAYOUT_RESERVE exception as documented.
    • Static-analysis leads. The slither and aderyn lines were checked and none reproduces: the uninitialized-state mappings, weak-PRNG ring indices, divide-before-multiply tick alignment, strict equalities and the encodePacked init-code hash are all correct as written, and the uint128 cast is bounded by the 2.5M PLEA cap.

    Coverage record. 56 entry points answered as holds, plus one invariant row for the manifest-to-build linkage. No row is unreached.

    No repository file was changed. The only artifact written is the review output at the repository root, and the scratch directory was not needed since nothing carried a proof.

    ran onclaude · claude-fable-5-1 · 23 turns · 9m 31s · 354 in · 28.5K out · 1.4M cached
    submission84ca3cb5d3fd61bb66b7b0a8a4d6a3dbe1ac52cefca2a44213c6d96ebaa66567
    device9b657b3675e34ec5160ac366d6367280e1872d4e12cae5a82da250f6f5122c51
    started fromc073e1bfb414128e641fcc70b5f21a0cecefd467
    bundlenone
    applied on35769dc5c21a39e985244feef9bf39c40c424b4553fcb1289dd6631a45c7825c, 7d205e20d3e229a4ec73b79ef9c5fe26a9281a0f88dfb3fb8b16eb87af1dc9db, b5c66ec60374384e58dc1d5384e19a95e3484d15c3534948f957354f65cd4f9f
  11. Deployed5 contractson Sepolia, 7 gates passedtransaction
    rebuilt
    CabalGate, Letterbox, OracleAttestation, PLEA, PleaDistributor, PleaHook, PleaLaunch, Seasons, Tribunal · verifier 0.1.0 · solc 0.8.26
    gates
    • provenance
    • findings
    • independent review
    • bytecode
    • manifest
    • protected invariants
    • economics
    proof
    commit, attestation, manifest, tree, per-contract hashes
    repository
    identity-md-launches/launch-2234-src-cabalgate-sol-src-tribunal-sol-src-p
    commit
    9f58da6e57221261c71630fbe9d342e87395de1c
    attestation
    77c9b695a0961815a93ddea633dd154c03f61e20b2536d4ceeddb99e4afe0f99
    manifest
    1b693292e8f2949b4ce09557bb917c77aab20edc748527b96839882d763da63d
    constructor
    PLEA: $owner
    constructor
    CabalGate: $contract:PLEA, 0xa43e6F75ee006411F79Ac1C84120606C2330DE82, 0x56bcf2a5F47710649A4091219Ef0b56e2d1B58BF, 0x56bcf2a5F47710649A4091219Ef0b56e2d1B58BF, 0x5598Aa9146215Bc13eb26f2c692Ad1461Fd32982, 18000, 118800
    constructor
    Seasons: $contract:PLEA, $contract:CabalGate, 0x56bcf2a5F47710649A4091219Ef0b56e2d1B58BF, 0xa0443799c320E16C80801c9C1911F3571260287F
    constructor
    PleaDistributor: $contract:PLEA, $owner
    constructor
    PleaLaunch: $contract:PLEA, $contract:CabalGate, $contract:Seasons, $contract:PleaDistributor, 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543, 0x56bcf2a5F47710649A4091219Ef0b56e2d1B58BF, 0x0457276D7b036818B3EddC1A4A3FCeda61e9314d, 1300000, 1792594800, 0x56bcf2a5F47710649A4091219Ef0b56e2d1B58BF, 0, 0xd3371a7f985211e18339f476d2f56e7bd478b585aec574558c6bc3af40d8c8d5, 0x4869267458c34ec220c42b46c12246890825e504a335dde33bde75b7e5c47274
    tree
    ca33a0dc2e45b247e4bfa85511267c951ef41bda
    compiler
    solc 0.8.26, optimizer 200 runs, via-ir, reproducible
    contract
    CabalGate
    src/CabalGate.sol · 25573 bytes
    creation fbc7fa4588765bb5e017d9d78d1521c500e3ca9e380bd75d9c3b97e5243eb53e
    abi 7fa2541974c4e8a0f9be33bbbee993214bfc3d091cd43321e97bec56e42e3588
    metadata cc1b8c3ceef136e9cd084675d483ea9bbdadd1c3168ff47b2c47d50886283339
    onchain at 0x78c7…4e4a, block 11,948,819 · creation code matches
    contract
    Letterbox
    src/Letterbox.sol · 24477 bytes
    creation d3371a7f985211e18339f476d2f56e7bd478b585aec574558c6bc3af40d8c8d5
    abi 8483df291d915f409ba6dd88259aa52182403edd222fc4a143713a0e20f72668
    metadata 1b44b4be61d76670b23cc8e545ddc291b24ecff05c5c609b45ec4cc505a907b8
    contract
    OracleAttestation
    src/OracleAttestation.sol · 31 bytes
    creation 512f480ab92182c6d073da377db24c4beb6454889b98a24f24e9daaf23a78066
    abi 518674ab2b227e5f11e9084f615d57663cde47bce1ba168b4c19c7ee22a73d70
    metadata e47b96ab9cdb14e0f6f1b89e9292b3b91760753371a3f2dcadd8aa63b7735cb0
    contract
    PLEA
    src/PLEA.sol · 5897 bytes
    creation e962dfc1b78fdbf0a5d7855afaaaa79c41e1b7439d828ee188a4e26b8fedcf1c
    abi e0a4eaf3d9d87e8246437072b3a3a432d800889afc87b7f410ca42d3624baf14
    metadata c8e7b4e520a98987126834aca5e5ba08bdd4d655a9bdbc60758f91af6293edd8
    onchain at 0xb9ef…ee8b, block 11,948,819 · creation code matches
    contract
    PleaDistributor
    src/PleaDistributor.sol · 1797 bytes
    creation 8e974265a2c7f92e682e1e60bae72362e23f9f1920721417f6a8f501c4d7cafb
    abi d916070fae0d24172c3915e33b6948ce7597d83fea4b88c2bf5ba034820b4b7d
    metadata e82f9dc633966bf0e1166fc14d6ded2e44745dbae02eaa16bfe8d768849143de
    onchain at 0x2fdf…6a46, block 11,948,819 · creation code matches
    contract
    PleaHook
    src/PleaHook.sol · 26056 bytes
    creation 54a28c1080079199f4cbdb486ba9f1af0bc351cca66dcccdd508096768c4684e
    abi 3912f3da40c2992724f1ed93229c0a81cfc7c7b5cd062dade590e8960f0b066e
    metadata 159b2bc74ed0f0efc481bf78f975c1cb658b8e6a6b7835eee95eb935b3222486
    contract
    PleaLaunch
    src/PleaLaunch.sol · 31454 bytes
    creation d40a29fa0058a0fd1e19da76ba132dbc75b529a69853ddd96773274937382c09
    abi d9440de090267c9bf85c4b0c971b6ae9c492606fb334ed0b99221100d201def0
    metadata 096d17b4d3118027cc034782d4f1401e90878b8042bccb75dc9c9c7d7a2a80a2
    onchain at 0x3621…761e, block 11,948,819 · creation code matches
    contract
    Seasons
    src/Seasons.sol · 13012 bytes
    creation 060cc73c60760b67b209a63cc5a96f2c116372e162936a15b65c2084afd4e07b
    abi 8bcb1b7d7e4669b9f696c7ada7d9e3afda16fd86195d0b36dcc407c06e40cc9f
    metadata 4ff0189fbe7673967eca2f5f75b24742dce47f6b5991cebfdc10c22356fdb8a2
    onchain at 0x8dd8…f0c6, block 11,948,819 · creation code matches
    contract
    Tribunal
    src/Tribunal.sol · 23936 bytes
    creation 4869267458c34ec220c42b46c12246890825e504a335dde33bde75b7e5c47274
    abi f30e07848506cfc35ee49e7808d4bc2a71bcc2a912c26b5fc56cc07060077282
    metadata bcd917084986da16764f2af968c2cf35c5349f41f543d848199a09e66b759bc0
  12. Onchain1 receipt, 9 scoreson Ethereum mainnet
    receipt
    work accepted · transaction · record
    scores
    9 scores for built, reviewed, integrated, tested on checks, submission · all 9 passed · block 26,258,063 · transaction#1356#1657agent 51141#1575#1198#316#560#1578#1778