{"assessments":[],"deployments":[],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"71d90ba9-a088-41dc-9a98-3eb144d6042a","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"6b7b5c49cfd8fcaabe80d394638b4b7782a9fe43c5f49f647a7e8d679722093e","dependsOn":["audit_imported_code"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","tools":[]},"key":"adapt_contract_project","kind":"code","role":"implement","skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","state":"accepted"},{"acceptedSubmissionHash":"c5bcd112f46fac1d22ef7298789ac6b0efb562449ebef55609eab0ed4c46988f","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"1063af793fb7b2b0601b0154c9677b4db1776fc99c4c3a0c55c8869c04bc14cd","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"659594fdab602612ca6d661dfb4c1b902593ce21146c9e847d8305753e216170","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","tools":[]},"key":"audit_imported_code","kind":"code","role":"review","skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","state":"accepted"},{"acceptedSubmissionHash":"ba8e294a87fbe06ca2fc48c87cbaa8dccce6774f3e264ce45ef6c0406068e7da","dependsOn":["adapt_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"18bf43069e8b1e861a651e85df64a3294cfd485808e95f8d6ddd5ae14380f7da","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"869afcf4685c617c1cbdc7f2b8138583100ab6f3fde0f67decd50af8fc165518","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"9946223babecc870369279e939f80b84f646fc586be1df80197335bfa1a200d2","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"b4b500aabae31ba9a53f9cb94f71507b3b364300f392e88451a5936df5ed512c","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Launch PLEA test run 8.5 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 rehearsed once more (run 8's contracts and code hashes, with a lighter default build: the test suite moved to test/full/): run 7's code (branch testnet7 @ e1755aa, live as your launch #1843) plus (1) your run-7 adapt step's CabalGate size refactor, as delivered (no behaviour change); (2) the two Lows of run 7's launch audit, fixed: the Letterbox's 95% delivery floor is taken after the hook's 2% sale fees (HOOK_SALE_FEE_BPS 200), and Tribunal.standing checks the seller's exclusion before a pending objection; (3) the run-8 numbers: letters plead 20% (LETTER_SHARE_BPS 2000) 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 (exact band edges); PLEA that no buy record covers (claims, prizes) counts as held since trading opened, at profit 10; 24h trend up: 9, flat: 5, down: 0; need = 71 - fact (CannotPass above 45); (4) the fixes of your audit template's rounds 5 to 8 (audit/FINDINGS.md R5-* to R8-*; audit/rounds/5 to 8): two objections from different wallets may be pending at once (Tribunal Case.pending[2]); PleaLaunch's constructor refuses an oracle-fee setup the Letterbox would refuse and a zero or swapped Letterbox hash; seed waits for the hook, the Letterbox and the committed Tribunal; Tribunal.status counts the 1.2 seat multiplier; a plea larger than the seller's buy record takes the PLEA-weighted mean of the record's and the received-PLEA hold and profit points, to the nearest point; the gate's and the Tribunal's text checks refuse every Unicode format, variation-selector and default-ignorable character; PLEA the PoolManager cannot pay before a seller settles (a trim, the sale fee) is kept as ERC-6909 claims that rebalance burns; a partial fill's fee refund comes after the payouts; a Stacker without code falls back to plain-IMD cashback; the seed's dust burn is counted in totalBurned. Objection! (src/Tribunal.sol, spec OBJECTIONS.md; ownerless; deployed after the launch through PleaLaunch.deployTribunal(creationCode) against the keccak256 committed as PleaLaunch's 13th argument): for 20 minutes after an approval anyone except the seller and the wallets Seasons excludes may object (0.5 IMD oracle fee minted on Sepolia like the Letterbox's, a 0.35 IMD stake in pool IMD); a fresh panel re-scores the plea; 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 sale is never touched and rulings never reset the dead-man. Unchanged from run 7: fees 2.0% (0.5% cashback, 0.75% owner, 0.25% prize pot, 0.25% wall, 0.25% of the PLEA burned), 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 (823 tests in 89 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); 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,494,931 as charged, 16,463,815 with headroom, 313,401 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 1792335600, credit gas 1300000, 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,038, 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.","parentJobId":null,"planHash":"8f0b175b7ac9e7127aceb01aa7e16691df6cf462454ecccafcf5aee75b4e6e9d","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"71d90ba9-a088-41dc-9a98-3eb144d6042a","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1981-src-cabalgate-sol-src-tribunal-sol-src-p"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51510","feedbackHash":"d37820cfdb24f3ea93165d291d534715e51e436c50813933ea543a7e67c652b8","nodeKey":"adapt_contract_project","submissionHash":"6b7b5c49cfd8fcaabe80d394638b4b7782a9fe43c5f49f647a7e8d679722093e","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51878","feedbackHash":"92f03d38ee26a02a9593d6f2c4042bb573cbc534745580cbaaa80be0c7bad551","nodeKey":"audit_economics","submissionHash":"c5bcd112f46fac1d22ef7298789ac6b0efb562449ebef55609eab0ed4c46988f","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52419","feedbackHash":"0c91e4e801c0cd3eaf870adb82a6763070393f85c5c618c32fd6d9bed1d1f68d","nodeKey":"audit_flow","submissionHash":"1063af793fb7b2b0601b0154c9677b4db1776fc99c4c3a0c55c8869c04bc14cd","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51427","feedbackHash":"db1ec671fe14a5c73a74a074524cea48c6ac4cd5a752d35c8b3bb41ebac0a682","nodeKey":"audit_imported_code","submissionHash":"659594fdab602612ca6d661dfb4c1b902593ce21146c9e847d8305753e216170","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51558","feedbackHash":"5a0077428e32771340b760a567f6e6d2955c14b33461f852252e6236ee5db865","nodeKey":"audit_judge","submissionHash":"ba8e294a87fbe06ca2fc48c87cbaa8dccce6774f3e264ce45ef6c0406068e7da","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52267","feedbackHash":"3ce060997eee65e1396c8a98fe540ec9337a731341b3553ff536fd2acdddd879","nodeKey":"audit_math","submissionHash":"18bf43069e8b1e861a651e85df64a3294cfd485808e95f8d6ddd5ae14380f7da","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51331","feedbackHash":"6a3714c555734e1eb617a3756815410e4905ecd09e69ec3c79046c974ee1f4b6","nodeKey":"audit_permissions","submissionHash":"869afcf4685c617c1cbdc7f2b8138583100ab6f3fde0f67decd50af8fc165518","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52480","feedbackHash":"bcef4223b8428b1b004e110ad7b6df4b7d11d64828cc41004a4a9e75430bd4e1","nodeKey":"manifest","submissionHash":"9946223babecc870369279e939f80b84f646fc586be1df80197335bfa1a200d2","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51143","feedbackHash":"a5d266aa7f8d77248da123d2f75a19b73ab11b82b1b4755d58f2b3e0d0348616","nodeKey":"write_foundry_tests","submissionHash":"b4b500aabae31ba9a53f9cb94f71507b3b364300f392e88451a5936df5ed512c","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"a625e65238997527445c8c4884d4361cb179dfdfa4e987299a00d5f70f9c043e","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7e50667f872c7f5e","findings":[{"citation":"resolved","description":"The fourth constructor argument of Seasons (the IMD seat NFT (test) the brief gives as 0xa0443799c320e16c80801c9c1911f3571260287f) is written in launch.json as the mixed-case string 0xA0443799C320e16C80801c9c1911f3571260287F. Its casing is not the EIP-55 checksum of that address: the correct checksummed form is 0xa0443799c320E16C80801c9C1911F3571260287F, which is exactly what test/LaunchManifest.t.sol:45 (address constant SEAT) and test/fork/ForkTestnet.t.sol:63 compile (solc refuses a mixed-case literal with a wrong checksum, so those constants are known-good). Every other address word in the manifest (Intake, oracle asset, pool IMD, signer, PoolManager, Stacker) checksums correctly; only this one is wrong. The manifest step and the deployer parse constructor address words off chain; the usual parsers (viem isAddress/getAddress in default strict mode, ethers getAddress) reject a mixed-case address whose checksum does not match, so the whole launch.json is refused and the run parks after the build was accepted. If the service's parser is case-insensitive instead, nothing breaks, so the impact is conditional, but the string is objectively malformed under EIP-55 and the fix is a one-word edit. The gap is not caught locally because AtomicManifestTest.test_factoryDeploysExactManifestOnAnEmptySepoliaChain builds Seasons' arguments from its own SEAT constant and only reads notes, the mint flag and the two code hashes from launch.json; no test parses .contracts[2].constructorArgs[3] and compares it to SEAT.","line":28,"path":"launch.json","reproduction":"Run: cast to-check-sum-address 0xA0443799C320e16C80801c9c1911f3571260287F -> prints 0xa0443799c320E16C80801c9C1911F3571260287F, which differs from the manifest string in letter case (A0443799C320 vs a0443799c320), i.e. the manifest word fails EIP-55 validation. Equivalent check in JS: ethers.getAddress('0xA0443799C320e16C80801c9c1911f3571260287F') throws 'bad address checksum'; viem isAddress('0xA0443799C320e16C80801c9c1911f3571260287F') returns false. Expected: the manifest's static address words are valid EIP-55 strings (or all-lowercase, as the brief writes this one) so the Seasons constructor receives the seat NFT; actual: a strict parser refuses launch.json. Fix: write the word as 0xa0443799c320E16C80801c9C1911F3571260287F (or all lowercase), and optionally have LaunchManifest.t.sol assert vm.parseJsonAddress(json, '.contracts[2].constructorArgs[3]') == SEAT and that the string equals vm.toString(SEAT) (checksummed).","severity":"medium","snippet":"        \"0xA0443799C320e16C80801c9c1911f3571260287F\"","title":"launch.json: Seasons' seat NFT argument is a mixed-case address with an invalid EIP-55 checksum; the tree's manifest test never checks the string"}],"hash":"1063af793fb7b2b0601b0154c9677b4db1776fc99c4c3a0c55c8869c04bc14cd","nodeId":"ae4326cc-3a3d-405a-9f89-6852ecd0684b","outcome":"completed","summary":"The snippet matches the file byte for byte, the JSON is valid, and the only file in the tree I wrote is `.imd-findings.json` (the task's output; nothing else changed).\n\n**Outcome:** one substantiated finding, written to `.imd-findings.json` with a 59-row coverage record (all 56 listed entry points plus three invariant/manifest rows). No critical or high defects were found, so no proof test was written.\n\n**The finding (medium, launch.json line 28).** The fourth constructor argument of Seasons, the IMD seat NFT, is written as a mixed-case address whose casing is not its EIP-55 checksum. `cast to-check-sum-address` returns a different casing, and the correct form is the one `test/LaunchManifest.t.sol:45` already compiles as its `SEAT` constant. Every other address word in the manifest checksums correctly. A strict parser (viem's default `isAddress`, ethers' `getAddress`) refuses such a string, which would park the whole launch after the build is accepted. The impact is conditional on the service's parser, which is stated in the description. It passes locally only because the manifest test builds Seasons' arguments from its own constant and never reads that word from launch.json. The fix is a one-word edit to the checksummed or all-lowercase form.\n\n**Coverage of the assigned area.** I traced, from the Execution Trace, Periphery and First Principles checklists, the whole control flow across the five launch contracts plus the Letterbox, Tribunal and hook:\n\n- Launch wiring and the post-launch deployments: committed code hashes, the transient/deployment-block registration window, seed's preconditions and ordering.\n- The plea lifecycle: submit, fee swap, verdict callbacks, execute, lapse, expire, appeal retry, and the Letterbox escrow in every ending.\n- Objection!: both pending slots, stale voiding, same-wallet rule, rulings, settle into Seasons, and the hold on points. I checked that a hold can never outlast the season's one-hour close grace.\n- Fee accounting in afterSwap, including the refund-after-payouts order, ERC-6909 claim fallbacks, the PLEA transfer rule for every sender the system uses, and the Seasons pot-accounting invariant.\n- Periphery helpers: the assembly decimal/hex/escape writers, the UTF-8 validators and marker checks in both copies, the share table (sums to 10,000), the letter word parser, name rules.\n\nThe default-profile suites (21 tests) pass. I did not run the full-profile suite in test/full or any fork, and I did not independently re-verify the hook's tick and liquidity arithmetic beyond its control flow, since those sit outside the assigned guides.","treeHash":null,"usage":{"cachedInputTokens":1376102,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":42764,"runtime":"claude","turns":22,"wallClockMs":640611}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3baa2091028c32c1","findings":[{"citation":"resolved","description":"Boundary x precision seam (Pashov Numerical Gap). `_factScore` feeds `_factScoreAt` with `amount * 10_000 / bal` (src/CabalGate.sol:257), an integer division that floors the share to whole basis points, and the band test `shareBps <= 2_000` then reads any share in [20%, 20.01%) as \"at most 20%\" (likewise [35%, 35.01%) as \"at most 35%\"). The run-8 table defines the bands as \"share of the balance sold at most 20%: 16, at most 35%: 9, more: 3\", and round 5 (R5-A1-2) moved the profit bands to exact edges for the same reason (\"a 50.9% gain is over 50%\"), so a plea of 20.0099% of the balance now scores 16 share points instead of 9: 7 fact points, so a need 7 lower, for selling more than the band allows. The same code path serves submitSell, submitFor, appeal and appealFor (appeals via the lesser of the two bps-floored shares). The Letterbox cannot reach it (a letter pleads floor(20%)), but the site's `plead(amount, text)` and a direct `submitSell` can. Impact is small (at most 1/10,000 of the balance per band, 7 points), hence Low; the fix is an exact comparison such as `amount * 5 <= bal ? 16 : amount * 20 <= bal * 7 ? 9 : 3` (or `amount * 10_000 <= bal * 2_000`), which keeps every number as agreed. Note: test/full/AppealRounding.t.sol `test_shareBandsAndFiftyPercentClampKeepTheirExistingRounding` asserts the current rounding on the appeal path, so the author may have chosen it; if so this is an Info-level inconsistency with R5-A1-2 and the table's wording rather than a defect.","line":264,"path":"src/CabalGate.sol","reproduction":"State: Cabal begun, seller balance 1,000e18 PLEA, no buy record (basisOf = 0,0,0), latestPrice = 2^96, price24hAgo = 0, 30 days after begin. Call `gate.factScore(seller, 200e18)` -> 38 (16 share + 7 held since start + 10 profit + 5 flat). Call `gate.factScore(seller, 200e18 + 1)` (20.0000000000000000001% of the balance, i.e. more than 20%) -> 38 as well: expected 31 (9 share points), because (200e18 + 1) * 10_000 / 1_000e18 == 2_000. The window is every amount below bal * 2_001 / 10_000: e.g. amount = 200_099_999_999_999_999_999 (20.0099999...% of 1,000e18) still yields shareBps 2_000 and 16 points, while 200_100_000_000_000_000_000 yields 2_001 and 9. The 35% edge behaves the same (amounts below bal * 3_501 / 10_000 score 9 instead of 3). Observed with a scratch Foundry test (CabalGate deployed against a mock PLEA/hook; trace shows factScore(…, 2e20+1) returning 38). Through `submitSell(200e18 + 1, text)` the plea opens with factScore 38 and need 33 where the table gives factScore 31 and need 40.","severity":"low","snippet":"        score = shareBps <= 2_000 ? 16 : shareBps <= 3_500 ? 9 : 3;","title":"Share band edges are truncated to whole basis points: a plea up to 0.0099% over 20% (or 35%) of the balance still scores the better band"}],"hash":"18bf43069e8b1e861a651e85df64a3294cfd485808e95f8d6ddd5ae14380f7da","nodeId":"630e781b-16c1-44ba-af6e-3a9ae87a936f","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds one finding plus a coverage row for all 58 entry points and three checked invariants. The scratch test is removed, so no tracked file changed.\n\n**Result: one Low finding, no funds-at-risk defect in the math.**\n\n- **Share band edges are truncated to basis points** (`src/CabalGate.sol:264`). The share fed to the band test is `amount * 10_000 / bal`, so any plea in the range [20%, 20.01%) of the balance reads as \"at most 20%\" and earns 16 share points instead of 9. The 35% edge behaves the same. I confirmed it with a scratch Foundry test: balance 1,000e18, no buy record, 30 days after begin gives 38 for a 200e18 plea and also 38 for 200e18 + 1 wei, where the table gives 31. Round 5 made the profit bands exact for the same reason, so this is the one band left on rounded percentages. The author's own appeal-rounding test asserts the current share rounding, so it may be a deliberate choice. Impact is at most 7 fact points for selling one ten-thousandth of the balance more, hence Low.\n\n**What I verified and found sound in my area**\n\n- The full run-8 fact table against the gate with a mock hook: hold bands at exactly 1, 3 and 7 days, profit edges at exactly 0%, 50%, 200%, 500% and 1,000%, the trend bands, the CannotPass line, and the PLEA-weighted mean of a plea larger than the buy record rounding to the nearest point with ties up.\n- The hook's fee arithmetic: the exact-input and exact-output formulas match v4's `amountToSwap` so the fee is the agreed share of the fill, the fill-based fee never exceeds the reserved fee, and the cashback, owner and prize floors never exceed the fee taken. I checked that exhaustively for every amount from 1 to 200,000 wei at the 175, 3,675 and 7,175 bps rates.\n- The Letterbox's 95% floor after the 2% sale fees is conservative: the hook's real net on a sale is 98.005%. The auto-sell fee is capped at the sale and cannot underflow. The appeal clamps, the 1% floor on the lesser balance and the 0.70 IMD raise line up with the gate's own checks.\n- Seasons: the 25 prize shares sum to exactly 10,000 bps, the 1.2 seat multiplier fits uint8, best-three sums fit uint16, and the pot accounting cannot underflow. Cap decay in the hook uses consistent PLEA-second units and never advances its clock past now.\n- Tribunal: sustained exactly when the new score plus 2 is below the need, the lowest score tracks correctly from the first ruling, and the two-objection limit counts rulings plus live pending slots.\n\n**Not reached**\n\n- I did not run the full-profile suite or any fork test, since a full build was outside the time budget. PLEA's transfer rule and the distributor are outside my area and have no arithmetic I needed to trace, so their rows are marked as holding on that basis.","treeHash":null,"usage":{"cachedInputTokens":2183332,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":50126,"runtime":"claude","turns":26,"wallClockMs":699954}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5b9c505a673e1a8a","findings":[{"citation":"resolved","description":"CabalGate.onOracleResult (src/CabalGate.sol:530-560) and Tribunal.onOracleResult (src/Tribunal.sol:308-340) look the plea or objection up by the Intake's `intakeId`, verify the attestation's signature in their own EIP-712 domain, consume `a.requestId` once, and then apply `a.answer` to that plea. Nothing compares `a.requestId` with `intakeId`, and `a.questionHash` is never read, so the contract itself does not bind the signed score to the question it paid for; the only binding is whatever the Intake enforces when it completes a request. THREAT-MODEL.md section 1 says the contracts 'must bind each answer to one exact request', and the suite's OracleReplayTest only shows that one answer cannot settle two pleas (first delivery wins), not that it settles the right one. The repository's mock Intake (test/utils/Mocks.sol `complete`) is permissionless; the live Sepolia Intake v2 at 0xa43e6F75ee006411F79Ac1C84120606C2330DE82 could not be read in this review, so whether a third party can complete request B with the attestation issued for request A is unverified. If it can, the first party to deliver chooses which pending plea receives a signed score; if only the Intake's writer can complete, the exposure reduces to the Intake writer's honesty, which the threat model already assumes.","line":537,"path":"src/CabalGate.sol","reproduction":"State: Alice pleads (plea A, need 26) and Bob pleads (plea B, need 45, a CannotPass-adjacent plea), both Pending with intake ids idA and idB. The oracle signs attestation X for request A: requestId = idA, answer = 45, panelSize 30, quorum 17, agreed 20, chainId 1, signed for the gate's domain. Call Intake.complete(idB, 0, abi.encode(idB, X, sig)) before the honest delivery of idA. Actual: gate.onOracleResult(idB, X, sig) passes every check (the signature verifies, requestId idA is not yet consumed, panel fields pass), marks plea B Approved with score 45 and consumes idA; the honest delivery of idA then fails AlreadyConsumed and plea A expires without a verdict. Expected: the gate refuses an attestation whose requestId (or questionHash) is not the one recorded for intakeId. The repository's own OracleReplayTest.testFuzz_oneSignedRequestCannotSettleTwoPleas drives exactly this delivery order with `deliver(intakeIdOf(second), a)` and shows the wrong plea is the one settled. Whether a third party can call the live Intake's completion is the unreached precondition.","severity":"low","snippet":"        _verifyAttestation(a, signature);\n        _consume(a.requestId);","title":"Oracle callbacks bind a signed answer to a request only by consuming a.requestId: neither the gate nor the Tribunal checks a.requestId == intakeId or a.questionHash, so an answer signed for one plea c"},{"citation":"resolved","description":"Read in full against the Pashov checklist (state-changing externals, callers, value moved, trust): src/PLEA.sol, src/CabalGate.sol, src/Seasons.sol, src/PleaDistributor.sol, src/PleaLaunch.sol, src/PleaHook.sol, src/Letterbox.sol, src/Tribunal.sol, src/OracleAttestation.sol and src/interfaces/*. launch.json was checked against the constructors (13 PleaLaunch words in declaration order, 7 CabalGate, 4 Seasons, 2 PleaDistributor, 1 PLEA; only kind/contracts/notes; $owner only where PLEA and PleaDistributor take an owner; the bool mint flag as the static word 1; the Letterbox and Tribunal hashes verified by test/LaunchManifest.t.sol). The default profile built and its 21 tests passed (Launch, LaunchManifest, ManifestInput). Not reached: the live Sepolia Intake v2 (0xa43e...), PoolManager (0xE03A...), Stacker (0x0457...), TestIMD (0x2B69...), the mintable oracle fee asset (0x44a1...) and the seat NFT (0xA044...), so every property that depends on them (Intake completion access, callback gas, the seat NFT's balanceOf cost under the 100k gas lent) rests on the repository's mocks; the 823-test full suite in test/full/ and the forks were not run in this review's budget. No DELEGATECALL, CALLCODE or SELFDESTRUCT appears in src (grep), no proxy or initializer, no post-deployment configuration other than the committed-code deployments and the one-time distributor root the brief describes. Against the launch's forbidden list: PLEA's transfer restriction while the Cabal watches (src/PLEA.sol _update) is the agreed product mechanic with the 33-hour dead-man as its exit, and the owner's `allow` list only widens it (add-only), so it is noted rather than reported as a freeze.","line":34,"path":"src/PleaLaunch.sol","reproduction":"Not a defect: deploy the five manifest contracts on an empty chain (test/LaunchManifest.t.sol test_factoryDeploysExactManifestOnAnEmptySepoliaChain passes) and observe that nothing in the review changed any file; the findings above are the only ones substantiated.","severity":"info","snippet":"contract PleaLaunch {","title":"Coverage: all nine src contracts read; the live Sepolia dependencies and the full suite were not reached"}],"hash":"659594fdab602612ca6d661dfb4c1b902593ce21146c9e847d8305753e216170","nodeId":"236215ef-ea2a-4da2-957e-3be370cec2d0","outcome":"completed","summary":"Review complete. The findings file is written and validated.\n\n**What I did**\n- Read all nine contracts in `src/` plus the interfaces, launch.json, the eight prior audit rounds' ledger and the threat model, and worked through every state-changing external function (callers, value moved, trust) against the Pashov checklist.\n- Built the default profile and ran its 21 manifest tests. All pass, including the Letterbox and Tribunal code-hash commitments in launch.json and the atomic five-contract deployment on an empty chain.\n- Checked launch.json by hand: only the schema's keys, one word per constructor parameter in declaration order, `$owner` only where PLEA and PleaDistributor take an owner, the mint flag as the static word 1, 13 PleaLaunch arguments.\n- Grepped `src/` for DELEGATECALL, CALLCODE and SELFDESTRUCT. None, and no proxy or initializer.\n\n**Findings** (in `.imd-findings.json`)\n- **Low:** the gate's and the Tribunal's oracle callbacks bind a signed score to a request only by consuming `a.requestId`. Neither compares it with the `intakeId` being answered nor reads `a.questionHash`. The repository's own replay test shows that delivering plea A's attestation under plea B's intake id settles B. Whether a third party can complete a request on the live Sepolia Intake is the unverified precondition, which is why this is low rather than high.\n- **Info:** coverage. Every source contract was read. The live Sepolia dependencies (Intake, PoolManager, Stacker, TestIMD, the mintable fee asset, the seat NFT) could not be reached, and the 823-test full suite was not run within the budget. PLEA's transfer restriction is noted as the agreed mechanic with the dead-man exit, not reported as a freeze.\n\nNo critical, high or medium defect was substantiated, so no proof test was written. No file in the tree was changed.","treeHash":null,"usage":{"cachedInputTokens":992607,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":30765,"runtime":"claude","turns":26,"wallClockMs":528812}},{"artifacts":[],"attempt":1,"bundleHash":"c3b5e78284697f8dbd4873a1cd52cc685683cfb5b836df6eaad3b387588f429a","device":"8d428b115b0ebd64","findings":[],"hash":"6b7b5c49cfd8fcaabe80d394638b4b7782a9fe43c5f49f647a7e8d679722093e","nodeId":"2ad0b42b-4a42-446b-b83a-5678de3043d4","outcome":"completed","summary":"Work is complete. Summary:\n\n**Outcome.** Run 8.5 deploys run 8's code unchanged. No contract, test, script, manifest or build setting was modified, so the Letterbox and Tribunal hashes in launch.json stay as they are. The deliverables are a rewritten ADAPTATION.md and two audit ledger updates.\n\n**The audit's Low does not reproduce on the live Intake.** The finding says the gate's and the Tribunal's oracle callbacks never compare the attestation's `requestId` with the callback's intake id. That observation is correct, and the repo's own replay test shows the mechanism on the permissionless mock. The exploit needs a third party to complete a request on the live Sepolia Intake v2. I pulled that contract's verified source from Sourcify, a full match of creation and runtime code. Its `complete` reverts for every caller except its writer, and the live writer is the oracle plane's own key. So only the party that already signs the answers could re-address one, which the threat model already trusts.\n\n**The suggested fix would brick live verdicts.** The oracle plane's attestation `requestId` is its own request UUID, visible in the live attestation kept in the conformance test, not the Intake's keccak id. Comparing the two would refuse every live answer and trip the 33-hour dead-man. The question-hash alternative needs the plane's unpublished canonicalisation. The finding is therefore recorded as accepted with that reasoning rather than fixed.\n\n**Files changed:**\n- `ADAPTATION.md`: rewritten for run 8.5 with the reproduction, the live evidence, the decision, the launch-rule checks and the verification results.\n- `audit/FINDINGS.md`: a round entry for this launch job and rows R85-I-1 (Low, accepted) and R85-I-2 (coverage Info).\n- `audit/THREAT-MODEL.md`: invariant 4 and the Intake row now say the answer-to-request binding lives with the Intake's writer, not an on-chain check.\n\n**Verification with the verifier's fuzz seed:**\n\n| Check | Result |\n|---|---|\n| forge build, default profile | passed |\n| forge test, default profile | 21 passed |\n| full profile: OracleReplay, OracleConformance, TribunalOracleBoundary | 17 passed |\n| full profile: Gate, GateAdversarial, Tribunal, TribunalAdversarial | 113 passed |\n\nRuntime sizes match the brief exactly (PleaHook 24,402, CabalGate 24,038, Letterbox 23,255, Tribunal 21,654, Seasons 12,473). Fork suites were skipped for lack of RPC variables. Changes are left uncommitted in the working tree for the pipeline's upload.","treeHash":"135b31b6ef75b059e60dcbb37689442a8c77ea46","usage":{"cachedInputTokens":1346572,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":24886,"runtime":"claude","turns":34,"wallClockMs":587567}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d2d5a117dd72f6b4","findings":[],"hash":"869afcf4685c617c1cbdc7f2b8138583100ab6f3fde0f67decd50af8fc165518","nodeId":"6fa574f8-78f0-433a-91c5-3b30dcf91d3d","outcome":"completed","summary":"The review is complete and the findings file is written.\n\n**Result:** no reproducible defect in the permission model. `.imd-findings.json` holds an empty findings list and a coverage record with a `holds` row for every one of the 56 listed entry points plus two invariant rows, each with a one-line reason.\n\n**What I covered**, in the Access Control, Trust Gap and Asymmetry guides' terms:\n\n- **Role map.** Every inline guard across the nine contracts: launcher-only (`PLEA.init`, `setLetterbox`, `CabalGate.begin`, `PleaHook.seed`), Letterbox-only (`courtTake`, `submitFor`, `appealFor`, `executeSellFor`), Intake-only callbacks (gate and Tribunal, each under its own EIP-712 domain), PoolManager-only unlock callbacks with their expected flags, Tribunal-only `checkpointObjection`, and the two Ownable2Step owners. The deployment-block registration in `PLEA.setLauncher` is taken inside the atomic launch transaction.\n- **Weakest-guard check per storage variable.** The transfer restriction in `PLEA._update` is the one guard many paths share. Every restricted-time route into the PoolManager, the gate and the Letterbox was traced; the owner's allowlist cannot reach the pool.\n- **Trust seams.** The permissionless `record`, `deliver`, `closeSeason`, `rebalance`, `expire` and `settle` paths pay nothing to the caller or only what the design states. The \"read, never trust\" staticcalls to the Tribunal were checked against gas starvation.\n- **Asymmetry pairs.** `appeal` versus `appealFor`, `executeSell` versus `executeSellFor`, `record` versus `_tryRecord`, `settle` versus `deliver`, the two `onOracleResult` and failure callbacks, and the two text validators.\n\n**Verified with a scratch Foundry test** (removed afterwards, nothing kept): a gas-starved `Seasons.record` never bypasses the Tribunal hold across a sweep of 60k to 3M gas, an ordinary holder's `burn` reverts while the Cabal watches, and a buy whose hookData names the gate reverts rather than landing PLEA in the gate.\n\n**Not reached.** The live Sepolia dependencies (Intake v2, TestIMD, Stacker, the seat NFT) were not called. The full suite in test/full was not rerun, only the default build and my scratch file. Previously accepted items such as R85-I-1, R4-A2-4, R6-P-1 and R1-A1-1 were re-read and not re-reported.","treeHash":null,"usage":{"cachedInputTokens":2358403,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":35039,"runtime":"claude","turns":24,"wallClockMs":611716}},{"artifacts":[],"attempt":1,"bundleHash":"2add6b5d0aaa8fb0e3082478b5e0f2b638da351b1ed79740788a52bc1ef3f630","device":"b0b4e7bbc84f9d80","findings":[],"hash":"9946223babecc870369279e939f80b84f646fc586be1df80197335bfa1a200d2","nodeId":"155c7745-53b5-43dc-adf7-f1403f379b5c","outcome":"completed","summary":"All checks pass and the working tree is unchanged, so the manifest is complete as committed.\n\n**Outcome:** launch.json already describes the accepted run 8.5 tree exactly, and I verified it rather than rewriting it. No file was changed.\n\n**What I verified**\n\n- **Schema:** the file has exactly the keys kind, contracts and notes. Five unique contracts are listed in dependency order with every argument a string. Notes are 3,793 characters, under the 4,000 cap.\n- **Constructors:** argument counts match each constructor in src, in declaration order. PLEA takes one arg, CabalGate seven, Seasons four, PleaDistributor two, PleaLaunch thirteen. PLEA and PleaDistributor receive $owner, and PleaLaunch reads its owner from PLEA, so neither the factory nor IMD gains control.\n- **Brief numbers:** 18000-second seasons, 118800-second dead-man, credit gas 1300000, START 1792335600, the mint flag as the static word 1, and the seat NFT 0xa0443799c320e16c80801c9c1911f3571260287f as Seasons' fourth argument.\n- **Code hashes:** the 12th and 13th PleaLaunch arguments equal keccak256 of this build's Letterbox and Tribunal creation code. The Tribunal hash matches the one the round-8 commit names.\n- **Protected checks:** the deployment probe deploys all five in one call on an empty chain, every runtime stays under the EIP-170 limit with no forbidden opcodes, and no contract is owned by the factory or IMD.\n\n**Test results** with the verifier's fuzz seed on the default profile:\n\n| Suite | Result |\n|---|---|\n| LaunchManifest (Atomic, Rehearsal, PostLaunch) | 11 passed |\n| ManifestInput | 2 passed |\n| Launch | 8 passed |\n\nThe default forge build finished in about 84 seconds. The manifest test confirms the launch fits the 16,777,216-gas cap with the factory's headroom. Nothing needs input from the requester, so no .imd-blocked.json was written.","treeHash":"135b31b6ef75b059e60dcbb37689442a8c77ea46","usage":{"cachedInputTokens":213620,"inputTokens":162,"model":"claude-fable-5-1","outputTokens":3511,"runtime":"claude","turns":10,"wallClockMs":141349}},{"artifacts":[],"attempt":1,"bundleHash":"7b1dac15f2654809bb268fddecea80bde78b8f11dcd98e253d9cf4936c0b9e8a","device":"a4c81f495eb81dd0","findings":[],"hash":"b4b500aabae31ba9a53f9cb94f71507b3b364300f392e88451a5936df5ed512c","nodeId":"f56962da-30a2-4fa6-bfe5-f1672888c8df","outcome":"completed","summary":"Done. The default-profile `forge test` passes with the new file included, and the working tree holds only the one new test file under `test/`.\n\n**What I added**: `test/Run85Objection.t.sol`, which joins the light default build (a bare `forge build` / `forge test`, the profile the verifier runs). It rehearses Objection! against the real gate, Seasons, Tribunal, PLEA and pool under the Sepolia timings, with only the Intake, fee tokens and Stacker mocked.\n\n- **Failure paths, 19 unit tests**: every refused text class (empty, 281 bytes, control bytes, overlong and surrogate UTF-8, soft hyphen, zero-width, bidi override, BOM, variation selectors U+FE0E/FE0F and U+E0100, tag characters, CGJ, Hangul fillers, U+2028, C1 controls, musical and Egyptian format controls, the `[PLEA` and `[OBJECTION` markers); the seller and the excluded owner refused; unapproved, pending and denied pleas refused; the window's last second accepted and the next second refused; a recorded plea out of reach; a stake one wei short refused; two pending objections only from different wallets, then the case full; a ruled objector barred from the second slot; a void freeing its slot; the margin edges (need-2 overruled, need-3 sustained); a higher re-score never raising the plea; late, forged, wrong-panel and out-of-range rulings refused without burning a nonce; settle refused before a ruling and twice; rulings never resetting the dead-man or stopping the approved sale.\n- **Invariants over random call sequences**: a handler files, rules, refuses, silences, expires, settles, sells and advances time with bounded inputs and three objectors, with `fail-on-revert` on. Ghost variables check that the Tribunal holds exactly the unsettled stakes, nobody is refunded more than they staked, every settled stake went to its objector or the season pot, at most two rulings per plea from different wallets, the recorded score is the lowest any panel gave, sustained exactly when newScore + 2 < need, and the sale's verdict is never rewritten. An `afterInvariant` pass shows every history unwinds to a zero balance without the oracle, and a scripted witness test proves the handler reaches every ending.\n\n**Results** with the verifier's fuzz seed:\n\n| Scope | Result |\n|---|---|\n| New file | 21 passed, invariant 48 runs, 3072 calls, 0 reverts |\n| Whole default profile | 42 passed, 0 failed |\n\n**Defects**: none found, so no `.imd-findings.json` was written. The file is left uncommitted in `test/`, and nothing outside the allowed paths was created.","treeHash":"0495af99f7c0260c0834ad319961c4e4cb46b073","usage":{"cachedInputTokens":1841557,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":34895,"runtime":"claude","turns":27,"wallClockMs":799783}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"323aec17bfc8d652","findings":[{"citation":"resolved","description":"Merged from audit_math (the only specialist to report it); reproduced. `_factScore` (src/CabalGate.sol:257, `return _factScoreAt(seller, amount, amount * 10_000 / bal);`) floors the share of the balance to whole basis points before the band test at line 264, so every amount in [20%, 20.01%) of the balance reads as 'at most 20%' and scores 16 share points instead of 9, and every amount in [35%, 35.01%) scores 9 instead of 3. The run-8 table says 'share of the balance sold at most 20%: 16, at most 35%: 9, more: 3', and round 5 (R5-A1-2) moved the profit bands to exact edges for exactly this reason, so the share bands are the one table row still on a rounded percentage. The same path serves submitSell, submitFor, appeal and appealFor (an appeal uses the lesser of two bps-floored shares in `_open`, line 422-425). The Letterbox cannot reach the window (a letter pleads floor(20%)), but `Letterbox.plead(amount, text)` and a direct `submitSell` can. Impact: at most 1/10,000 of the balance per band for a 7-point (or 6-point) lower need, so Low. Minimal fix keeping every agreed number: pass `amount` and `bal` to the band test and compare exactly, e.g. `amount * 5 <= bal ? 16 : amount * 20 <= bal * 7 ? 9 : 3` (an appeal keeps the lesser-share rule by comparing `amount * oBal` against `oAmount * bal`). test/full/AppealRounding.t.sol `test_shareBandsAndFiftyPercentClampKeepTheirExistingRounding` only checks that an appeal keeps its original's band; it does not assert that 20% + 1 wei scores the 20% band, so the fix does not conflict with it. CabalGate is 24,038 bytes (538 under EIP-170), so the two extra multiplications fit.","line":264,"path":"src/CabalGate.sol","reproduction":"Fixture state (test/utils/Fixture.sol: trading seeded, 91 minutes past seed), then: deal(address(plea), alice, 1_000e18); skip(30 days). alice has no buy record (basisOf = 0,0,0), latestPrice != 0, price24hAgo == 0. gate.factScore(alice, 200e18) -> 38 (16 share + 7 held since start + 10 profit + 5 flat). gate.factScore(alice, 200e18 + 1) -> 38: expected 31 (9 share points), because (200e18 + 1) * 10_000 / 1_000e18 == 2_000. gate.factScore(alice, 200_100_000_000_000_000_000) (20.01%) -> 31. Same at 35%: factScore(alice, 350e18 + 1) == factScore(alice, 350e18) == 31 while factScore(alice, 350_100_000_000_000_000_000) == 25. Run with the scratch test below (it passes on this code because it asserts the defect): forge test --match-path test/scratch/ShareBand.t.sol -vv prints 'factScore at exactly 20%: 38', 'factScore at 20% + 1 wei: 38', 'factScore at 20.01%: 31'. Through submitSell(200e18 + 1, text) the plea opens with factScore 38 and need 33 where the table gives 31 and 40.\n\nScratch test (test/scratch/ShareBand.t.sol):\n// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\nimport {Fixture} from \"../utils/Fixture.sol\";\ncontract ShareBandScratch is Fixture {\n    function test_oneWeiOver20PercentStillScoresTheBestBand() public {\n        deal(address(plea), alice, 1_000e18);\n        skip(30 days);\n        uint8 at20 = gate.factScore(alice, 200e18);\n        uint8 over20 = gate.factScore(alice, 200e18 + 1);\n        uint8 at2001 = gate.factScore(alice, 200_100_000_000_000_000_000);\n        assertEq(over20, at20);      // defect: should differ by 7\n        assertEq(at20 - at2001, 7);\n        assertEq(gate.factScore(alice, 350e18 + 1), gate.factScore(alice, 350e18));\n        assertEq(gate.factScore(alice, 350e18) - gate.factScore(alice, 350_100_000_000_000_000_000), 6);\n    }\n}","severity":"low","snippet":"        score = shareBps <= 2_000 ? 16 : shareBps <= 3_500 ? 9 : 3;","title":"Share band edges are floored to whole basis points: a plea up to 0.01% over 20% (or 35%) of the balance still scores the better band"},{"citation":"resolved","description":"From audit_flow (reported as Medium). The fact reproduces: the fourth constructor argument of Seasons is written as 0xA0443799C320e16C80801c9c1911f3571260287F, and the EIP-55 form of that address is 0xa0443799c320E16C80801c9C1911F3571260287F (the constant test/LaunchManifest.t.sol:45 compiles, which solc only accepts with a correct checksum). A strict parser (ethers getAddress, viem isAddress in strict mode) rejects the manifest word. The claimed impact does not reproduce: git history shows the identical string has been in launch.json since commit ca8c914 ('Run 7'), and the notes record run 7 as live launch #1843, so the service's manifest parser accepted this word once already and the Seasons constructor received the seat NFT. The brief itself writes the address all-lowercase, and every other address word in the manifest checksums correctly, so this is a one-word hygiene edit (write it as 0xa0443799c320E16C80801c9C1911F3571260287F or all-lowercase), plus optionally a LaunchManifest.t.sol assertion that vm.parseJsonAddress(json, '.contracts[2].constructorArgs[3]') == SEAT, which no test in the tree checks today (AtomicManifestTest builds Seasons' arguments from its own SEAT constant). Downgraded to Info: no code, custody or constructor-value defect, and the deployment evidence contradicts a refusal.","line":28,"path":"launch.json","reproduction":"cast to-check-sum-address 0xA0443799C320e16C80801c9c1911f3571260287F -> 0xa0443799c320E16C80801c9C1911F3571260287F, which differs from the manifest word in letter case; ethers.getAddress('0xA0443799C320e16C80801c9c1911f3571260287F') throws 'bad address checksum'. Expected: a static address word that validates under EIP-55 or is all-lowercase. Evidence that it is not blocking: git log -S'0xA0443799C320e16C80801c9c1911f3571260287F' -- launch.json shows the word introduced in ca8c914 (run 7), which the notes say deployed as launch #1843.","severity":"info","snippet":"        \"0xA0443799C320e16C80801c9c1911f3571260287F\"","title":"launch.json: Seasons' seat NFT argument is a mixed-case address whose casing is not its EIP-55 checksum (not a deployment blocker: run 7 launched with the same word)"}],"hash":"ba8e294a87fbe06ca2fc48c87cbaa8dccce6774f3e264ce45ef6c0406068e7da","nodeId":"64f212da-b272-4bd0-b79e-12365f025fc7","outcome":"completed","summary":"Review complete. The findings file is written and validated: it parses, every one of the 56 entry points has a coverage row, and both snippets match the tree at the cited lines.\n\n**What I found**\n\n- **Kept, Low (from audit_math):** the share bands in `src/CabalGate.sol:264` test a share floored to whole basis points. A plea of 20% plus one wei still scores the \"at most 20%\" band. I reproduced it against the real gate with a scratch test under test/scratch/: factScore is 38 at exactly 20% and at 20% plus one wei, and 31 at 20.01%. The same holds at the 35% edge. Impact is at most one ten-thousandth of the balance for 7 points, so Low. The fix is an exact comparison that keeps every agreed number and fits CabalGate's size.\n- **Downgraded to Info (from audit_flow, reported as Medium):** the Seasons seat NFT word in launch.json is mixed-case with a wrong EIP-55 checksum. The fact reproduces with cast, but the claimed refusal does not: git history shows the identical string has been in launch.json since the run 7 commit, and the notes record run 7 as live launch #1843, so the manifest parser accepted it. It is a one-word hygiene edit.\n\n**What I checked beyond the specialists**\n\n- The default profile test run passes, 42 tests in 7 suites, including the manifest suite that ties both committed hashes to the compiled Letterbox and Tribunal and asserts the gas cap with headroom, and the run 8.5 objection invariants.\n- I read all nine contracts and traced each entry point. The Tribunal's two-slot pending case, same-objector rules, stale voiding, margin rule and stake settlement hold. Seasons' one-hour close grace exceeds the 40 minutes a plea can be held. The Letterbox's delivery floor is taken after the hook's 2%. PLEA's transfer rule admits only the gate's pull, the court escrow and exempt senders. No new defect surfaced.\n\n**Not run:** the full suite in test/full/ and the fork tests, per the build guidance. The scratch test is the only file I created, in the directory the task reserves for that.","treeHash":null,"usage":{"cachedInputTokens":1142240,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":30046,"runtime":"claude","turns":27,"wallClockMs":552990}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2a6239e0c1b8c774","findings":[],"hash":"c5bcd112f46fac1d22ef7298789ac6b0efb562449ebef55609eab0ed4c46988f","nodeId":"354a89af-a0af-4488-b2d5-2da8c070f140","outcome":"completed","summary":"The review is complete and the findings file is written and validated.\n\n**Outcome: no defect substantiated.** `.imd-findings.json` holds an empty findings list and 60 coverage rows: all 56 listed entry points marked `holds` plus four economic invariants I traced (hook fee split, Letterbox accounting, need/fact scoring, season pot conservation).\n\n**What I covered, against the Economic Security, Invariant and Flow Gap guides**\n\n- **Value flows and conservation.** Hook fee arithmetic on the realised fill (reserved fee capped, refund after payouts, claims when the PoolManager cannot pay, launch extra to the pool), the 82/6/12 mint, the prize-pot ledger (open season fees plus rollover equals the accounted pot, never above holdings, so a Tribunal settle can never be locked by `UnfundedStake`), prize and bonus share tables (sum 10,000 bps), stake conservation in the Tribunal, and the Letterbox's escrow-plus-tip accounting through letter, appeal, deliver and settle.\n- **Dependencies and token behaviour.** Intake callbacks (signer, domain, panel, consumed once, 20-minute expiry, failure path moves no value), the Stacker credit with the plain-IMD fallback, the gas-capped seat read, the fail-open Tribunal read, and PLEA's transfer rule that keeps PLEA out of any hookless pool while the Cabal watches.\n- **Flow seams.** Letter scoring before the fee sale, escrow closed before the sale, appeals at the gate while a denied escrow is still open, the objection window versus record and close grace (40 minutes inside the 1-hour grace), late overruled stakes after a flush, and the executeSellFor path where the pending plea cannot diverge from the escrow.\n- **Confirmed baseline.** The default build compiles clean, and the SeasonFunds, TribunalSeasons and LetterboxInvariant suites pass on this tree (33 tests).\n\n**Not reached.** The live Sepolia dependencies (real Intake, TestIMD, Stacker, seat NFT) and the fork suites were not exercised. Every behaviour I judged economically questionable (min-of-panels objections, the seller shield, gift buys moving hold time, the lossy unanswered-letter exit, the opening-buy claims path) is already listed as deliberate in the threat model and findings ledger, so I did not report it again.","treeHash":null,"usage":{"cachedInputTokens":1625105,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":42540,"runtime":"claude","turns":27,"wallClockMs":660722}}],"verification":[{"checks":[{"durationMs":28968,"exitCode":0,"name":"build","output":"Compiling 122 files with Solc 0.8.26\nSolc 0.8.26 finished in 28.81s\nCompiler run successful with warnings:\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Tribunal.sol:345:9:\n    |\n345 |         uint8 status,\n    |         ^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Tribunal.sol:208:5:\n    |\n208 |     function status(uint256 pleaId) external view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Tribunal.sol:383:53:\n    |\n383 |     function _void(uint256 id, Objection storage o, uint8 status, bytes32 reason) internal {\n    |                                                     ^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Tribunal.sol:208:5:\n    |\n208 |     function status(uint256 pleaId) external view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/Seasons.sol:422:58:\n    |\n422 |     function _owners() internal view returns (address a, address b, address c) {\n    |                                                          ^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/CabalGate.sol:749:5:\n    |\n749 |     function _text(string storage t, bool json) internal view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":288,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/LaunchManifest.t.sol:RehearsalManifestTest\n[PASS] test_laterBlockCannotRegisterLauncher() (gas: 14065763)\n[PASS] test_separateConstructorCallsInDeploymentBlockStillWork() (gas: 15289919)\n[PASS] test_separateTransactionsLeaveTheAcceptedDeploymentBlockWindow() (gas: 14200150)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 9.72ms (9.85ms CPU time)\n\nRan 2 tests for test/ManifestInput.t.sol:ManifestInputTest\n[PASS] test_everyManifestWordDeploysAtomicallyAndCommitsTheTribunal() (gas: 22559509)\n[PASS] test_failedLastConstructorRollsBackAllEarlierDeploymentsAndCanRetry() (gas: 27169362)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.59ms (14.60ms CPU time)\n\nRan 3 tests for test/LaunchManifest.t.sol:PostLaunchTest\n[PASS] test_committedHookDeploysLaterAndMintsOnlyTheFixedSplit() (gas: 7988962)\n[PASS] test_committedLetterboxDeploysLater() (gas: 10792141)\nLogs:\n  deployLetterbox transaction gas: 5580999\n\n[PASS] test_committedTribunalDeploysLater() (gas: 10383958)\nLogs:\n  deployTribunal transaction gas: 5271240\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 12.94ms (18.24ms CPU time)\n\nRan 5 tests for test/LaunchManifest.t.sol:AtomicManifestTest\n[PASS] test_factoryDeploysExactManifestOnAnEmptySepoliaChain() (gas: 54251908)\nLogs:\n  five-contract launch transaction gas through IMD's factory: 13494931\n  gas limit with IMD's headroom: 16463815\n  margin to the 16,777,216 cap: 313401\n\n[PASS] test_launchJsonCommitsToThisLetterbox() (gas: 34569)\n[PASS] test_launchJsonCommitsToThisTribunal() (gas: 31273)\n[PASS] test_launchJsonEncodesOracleMintFlagAsStaticWord() (gas: 11366)\n[PASS] test_launchJsonNotesFitTheManifestCap() (gas: 9569)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 57.78ms (56.56ms CPU time)\n\nRan 8 tests for test/Launch.t.sol:LaunchTest\n[PASS] test_aMintedFeeOnChainOneNeverOpensTrading() (gas: 287274592)\n[PASS] test_deployHookChecksTheInitCodeAndFlags() (gas: 259227306)\n[PASS] test_eachStepFitsAMainnetTransaction() (gas: 263978225)\nLogs:\n  launch (5 contracts + intake mock): 12787202\n  deployLetterbox: 5210191\n  deployHook: 5800334\n  seed: 643071\n\n[PASS] test_launchWiresEverythingWithoutCallingOutside() (gas: 12909340)\n[PASS] test_ownerMaySeedEarly() (gas: 263944320)\n[PASS] test_seedByOwnerAnyTimeByAnyoneAfterStart() (gas: 264082869)\n[PASS] test_theLaunchRefusesAZeroOrSwappedLetterboxHash() (gas: 52962294)\n[PASS] test_theLaunchRefusesAnOracleSetupTheLetterboxWouldRefuse() (gas: 53619602)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 160.74ms (709.18ms CPU time)\n\nRan 5 test suites in 161.64ms (251.77ms CPU time): 21 tests passed, 0 failed, 0 skipped (21 total tests)\n","passed":true},{"durationMs":104,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"CabalGate.appeal(uint256,uint256,string)\",\"CabalGate.appealFor(address,uint256,uint256,uint256,string,uint8,uint256,uint256)\",\"CabalGate.begin()\",\"CabalGate.executeSell(uint256)\",\"CabalGate.executeSellFor(uint256,uint256)\",\"CabalGate.expire(uint256)\",\"CabalGate.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"CabalGate.onPleaFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"CabalGate.submitFor(address,uint256,uint256,string,uint8,uint256,uint256)\",\"CabalGate.submitSell(uint256,string)\",\"CabalGate.unlockCallback(bytes)\",\"Letterbox.appealAuto(uint256,string)\",\"Letterbox.deliver(uint256)\",\"Letterbox.fallback()\",\"Letterbox.letter(string)\",\"Letterbox.plead(uint256,string)\",\"Letterbox.setName(string)\",\"Letterbox.settle(uint256)\",\"PLEA.acceptOwnership()\",\"PLEA.allow(address)\",\"PLEA.approve(address,uint256)\",\"PLEA.burn(uint256)\",\"PLEA.courtTake(address,uint256)\",\"PLEA.init(address,address)\",\"PLEA.renounceOwnership()\",\"PLEA.setLauncher(address,address,address)\",\"PLEA.setLetterbox(address)\",\"PLEA.transfer(address,uint256)\",\"PLEA.transferFrom(address,address,uint256)\",\"PLEA.transferOwnership(address)\",\"PleaDistributor.acceptOwnership()\",\"PleaDistributor.claim(uint256,address,uint256,bytes32[])\",\"PleaDistributor.renounceOwnership()\",\"PleaDistributor.setMerkleRoot(bytes32)\",\"PleaDistributor.transferOwnership(address)\",\"PleaHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"PleaHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"PleaHook.fundWall(uint256)\",\"PleaHook.rebalance()\",\"PleaHook.seed()\",\"PleaHook.unlockCallback(bytes)\",\"PleaLaunch.deployHook(bytes32,bytes)\",\"PleaLaunch.deployLetterbox(bytes)\",\"PleaLaunch.deployTribunal(bytes)\",\"PleaLaunch.seed()\",\"Seasons.checkpoint()\",\"Seasons.checkpointObjection(uint256,uint256)\",\"Seasons.closeSeason(uint256[])\",\"Seasons.flushToWall()\",\"Seasons.record(uint256)\",\"Seasons.unlockCallback(bytes)\",\"Tribunal.expire(uint256)\",\"Tribunal.object(uint256,string)\",\"Tribunal.onObjectionFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"Tribunal.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Tribunal.settle(uint256)\"],\"files\":{\".gitignore\":5,\"ADAPTATION.md\":43,\"OBJECTIONS.md\":339,\"README.md\":303,\"audit/FINDINGS.md\":161,\"audit/README.md\":35,\"audit/THREAT-MODEL.md\":112,\"audit/jobs/A1.md\":18,\"audit/jobs/A2.md\":23,\"audit/jobs/A3.md\":16,\"audit/jobs/common.md\":14,\"audit/make_jobs.py\":143,\"audit/rounds/1/A1.objective.txt\":26,\"audit/rounds/1/A1.report.md\":130,\"audit/rounds/1/A1.request.json\":9,\"audit/rounds/1/A2.objective.txt\":31,\"audit/rounds/1/A2.report.md\":323,\"audit/rounds/1/A2.request.json\":9,\"audit/rounds/1/A3.objective.txt\":24,\"audit/rounds/1/A3.report.md\":114,\"audit/rounds/1/A3.request.json\":9,\"audit/rounds/1/manifest.json\":87,\"audit/rounds/2/A1.objective.txt\":26,\"audit/rounds/2/A1.report.md\":133,\"audit/rounds/2/A1.request.json\":9,\"audit/rounds/2/A2.objective.txt\":31,\"audit/rounds/2/A2.report.md\":93,\"audit/rounds/2/A2.request.json\":9,\"audit/rounds/2/A3.objective.txt\":24,\"audit/rounds/2/A3.report.md\":142,\"audit/rounds/2/A3.request.json\":9,\"audit/rounds/2/manifest.json\":87,\"audit/rounds/3/A1.objective.txt\":26,\"audit/rounds/3/A1.report.md\":127,\"audit/rounds/3/A1.request.json\":9,\"audit/rounds/3/A2.objective.txt\":31,\"audit/rounds/3/A2.report.md\":192,\"audit/rounds/3/A2.request.json\":9,\"audit/rounds/3/A3.objective.txt\":24,\"audit/rounds/3/A3.report.md\":119,\"audit/rounds/3/A3.request.json\":9,\"audit/rounds/3/manifest.json\":87,\"audit/rounds/4/A1.objective.txt\":26,\"audit/rounds/4/A1.report.md\":88,\"audit/rounds/4/A1.request.json\":9,\"audit/rounds/4/A2.objective.txt\":31,\"audit/rounds/4/A2.report.md\":207,\"audit/rounds/4/A2.request.json\":9,\"audit/rounds/4/A3.objective.txt\":24,\"audit/rounds/4/A3.report.md\":133,\"audit/rounds/4/A3.request.json\":9,\"audit/rounds/4/manifest.json\":87,\"audit/rounds/5/A1.objective.txt\":26,\"audit/rounds/5/A1.report.md\":135,\"audit/rounds/5/A1.request.json\":9,\"audit/rounds/5/A2.objective.txt\":31,\"audit/rounds/5/A2.report.md\":93,\"audit/rounds/5/A2.request.json\":9,\"audit/rounds/5/A3.objective.txt\":24,\"audit/rounds/5/A3.report.md\":73,\"audit/rounds/5/A3.request.json\":9,\"audit/rounds/5/manifest.json\":87,\"audit/rounds/6/A1.objective.txt\":26,\"audit/rounds/6/A1.report.md\":60,\"audit/rounds/6/A1.request.json\":9,\"audit/rounds/6/A2.objective.txt\":31,\"audit/rounds/6/A2.report.md\":161,\"audit/rounds/6/A2.request.json\":9,\"audit/rounds/6/A3.objective.txt\":24,\"audit/rounds/6/A3.request.json\":9,\"audit/rounds/6/manifest.json\":87,\"audit/rounds/7/A1.objective.txt\":26,\"audit/rounds/7/A1.report.md\":132,\"audit/rounds/7/A1.request.json\":9,\"audit/rounds/7/A2.objective.txt\":31,\"audit/rounds/7/A2.report.md\":95,\"audit/rounds/7/A2.request.json\":9,\"audit/rounds/7/A3.objective.txt\":24,\"audit/rounds/7/A3.report.md\":72,\"audit/rounds/7/A3.request.json\":9,\"audit/rounds/7/manifest.json\":87,\"audit/rounds/8/A1.objective.txt\":26,\"audit/rounds/8/A1.report.md\":121,\"audit/rounds/8/A1.request.json\":9,\"audit/rounds/8/A2.objective.txt\":31,\"audit/rounds/8/A2.request.json\":9,\"audit/rounds/8/A3.objective.txt\":24,\"audit/rounds/8/A3.report.md\":114,\"audit/rounds/8/A3.request.json\":9,\"audit/rounds/8/manifest.json\":87,\"foundry.toml\":34,\"launch.json\":58,\"remappings.txt\":4,\"script/Deploy.s.sol\":80,\"script/DeployLetterbox.s.sol\":22,\"script/DeployTribunal.s.sol\":22,\"script/MineSalt.s.sol\":44,\"src/CabalGate.sol\":903,\"src/Letterbox.sol\":757,\"src/OracleAttestation.sol\":227,\"src/PLEA.sol\":151,\"src/PleaDistributor.sol\":60,\"src/PleaHook.sol\":1116,\"src/PleaLaunch.sol\":220,\"src/Seasons.sol\":467,\"src/Tribunal.sol\":561,\"src/interfaces/IPleaParts.sol\":78,\"src/interfaces/IStacker.sol\":12,\"test/Launch.t.sol\":249,\"test/LaunchManifest.t.sol\":370,\"test/ManifestInput.t.sol\":84,\"test/fork/ForkMainnet.t.sol\":406,\"test/fork/ForkTestnet.t.sol\":884,\"test/full/AppealRounding.t.sol\":146,\"test/full/ArtifactDeployment.t.sol\":59,\"test/full/AuditImported.t.sol\":142,\"test/full/AuditRevision.t.sol\":336,\"test/full/AuditRound1.t.sol\":651,\"test/full/AuditRun3.t.sol\":394,\"test/full/AuditRun5.t.sol\":186,\"test/full/BonusInvariant.t.sol\":541,\"test/full/DistributorAdversarial.t.sol\":342,\"test/full/DistributorOwnership.t.sol\":71,\"test/full/GasPass.t.sol\":403,\"test/full/Gate.t.sol\":472,\"test/full/GateAdversarial.t.sol\":400,\"test/full/GateFailureInvariant.t.sol\":330,\"test/full/Hook.t.sol\":359,\"test/full/HookAdversarial.t.sol\":257,\"test/full/HookRevision.t.sol\":553,\"test/full/JudgeFindings.t.sol\":222,\"test/full/Letterbox.t.sol\":915,\"test/full/LetterboxInvariant.t.sol\":447,\"test/full/MainnetGuard.t.sol\":87,\"test/full/OracleConformance.t.sol\":116,\"test/full/OracleReplay.t.sol\":60,\"test/full/Orientation.t.sol\":126,\"test/full/OwnershipTransitionInvariant.t.sol\":238,\"test/full/Run7Coverage.md\":54,\"test/full/Run7DistributorLifecycle.t.sol\":276,\"test/full/Run7ObjectionPoints.t.sol\":204,\"test/full/Run7SeatAccounting.t.sol\":308,\"test/full/SeasonAdversarial.t.sol\":211,\"test/full/SeasonFunds.t.sol\":351,\"test/full/SeasonInvariant.t.sol\":348,\"test/full/SeasonRanking.t.sol\":176,\"test/full/Seasons.t.sol\":290,\"test/full/SeatMultiplier.t.sol\":167,\"test/full/Token.t.sol\":80,\"test/full/TraderAttributionInvariant.t.sol\":287,\"test/full/TraderFallbackAdversarial.t.sol\":315,\"test/full/TraderResolution.t.sol\":225,\"test/full/TraderResolverBoundary.t.sol\":126,\"test/full/TradingInvariant.t.sol\":496,\"test/full/Tribunal.t.sol\":615,\"test/full/TribunalAdversarial.t.sol\":225,\"test/full/TribunalInvariant.t.sol\":603,\"test/full/TribunalOracleBoundary.t.sol\":334,\"test/full/TribunalSeasons.t.sol\":309,\"test/full/TribunalStanding.t.sol\":217,\"test/full/TribunalTextProperties.t.sol\":276,\"test/utils/AdversarialTraderRouter.sol\":38,\"test/utils/ArtifactDeployment.sol\":23,\"test/utils/ClaimTree.sol\":41,\"test/utils/Fixture.sol\":350,\"test/utils/Mocks.sol\":371,\"test/utils/SeasonModel.sol\":117,\"test/utils/SepoliaFixture.sol\":36},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"6b7b5c49cfd8fcaabe80d394638b4b7782a9fe43c5f49f647a7e8d679722093e","verifiedTreeHash":"135b31b6ef75b059e60dcbb37689442a8c77ea46","verifierVersion":"0.1.0+d952fceb"},{"checks":[{"durationMs":47083,"exitCode":0,"name":"build","output":"Compiling 122 files with Solc 0.8.26\nSolc 0.8.26 finished in 46.90s\nCompiler run successful with warnings:\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Tribunal.sol:345:9:\n    |\n345 |         uint8 status,\n    |         ^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Tribunal.sol:208:5:\n    |\n208 |     function status(uint256 pleaId) external view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Tribunal.sol:383:53:\n    |\n383 |     function _void(uint256 id, Objection storage o, uint8 status, bytes32 reason) internal {\n    |                                                     ^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Tribunal.sol:208:5:\n    |\n208 |     function status(uint256 pleaId) external view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/Seasons.sol:422:58:\n    |\n422 |     function _owners() internal view returns (address a, address b, address c) {\n    |                                                          ^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/CabalGate.sol:749:5:\n    |\n749 |     function _text(string storage t, bool json) internal view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":499,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/LaunchManifest.t.sol:RehearsalManifestTest\n[PASS] test_laterBlockCannotRegisterLauncher() (gas: 14065763)\n[PASS] test_separateConstructorCallsInDeploymentBlockStillWork() (gas: 15289919)\n[PASS] test_separateTransactionsLeaveTheAcceptedDeploymentBlockWindow() (gas: 14200150)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 12.64ms (13.45ms CPU time)\n\nRan 2 tests for test/ManifestInput.t.sol:ManifestInputTest\n[PASS] test_everyManifestWordDeploysAtomicallyAndCommitsTheTribunal() (gas: 22559509)\n[PASS] test_failedLastConstructorRollsBackAllEarlierDeploymentsAndCanRetry() (gas: 27169362)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 17.34ms (21.44ms CPU time)\n\nRan 3 tests for test/LaunchManifest.t.sol:PostLaunchTest\n[PASS] test_committedHookDeploysLaterAndMintsOnlyTheFixedSplit() (gas: 7988962)\n[PASS] test_committedLetterboxDeploysLater() (gas: 10792141)\nLogs:\n  deployLetterbox transaction gas: 5580999\n\n[PASS] test_committedTribunalDeploysLater() (gas: 10383958)\nLogs:\n  deployTribunal transaction gas: 5271240\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 24.91ms (33.52ms CPU time)\n\nRan 5 tests for test/LaunchManifest.t.sol:AtomicManifestTest\n[PASS] test_factoryDeploysExactManifestOnAnEmptySepoliaChain() (gas: 54251908)\nLogs:\n  five-contract launch transaction gas through IMD's factory: 13494931\n  gas limit with IMD's headroom: 16463815\n  margin to the 16,777,216 cap: 313401\n\n[PASS] test_launchJsonCommitsToThisLetterbox() (gas: 34569)\n[PASS] test_launchJsonCommitsToThisTribunal() (gas: 31273)\n[PASS] test_launchJsonEncodesOracleMintFlagAsStaticWord() (gas: 11366)\n[PASS] test_launchJsonNotesFitTheManifestCap() (gas: 9569)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 78.27ms (86.52ms CPU time)\n\nRan 8 tests for test/Launch.t.sol:LaunchTest\n[PASS] test_aMintedFeeOnChainOneNeverOpensTrading() (gas: 287274592)\n[PASS] test_deployHookChecksTheInitCodeAndFlags() (gas: 259227306)\n[PASS] test_eachStepFitsAMainnetTransaction() (gas: 263978225)\nLogs:\n  launch (5 contracts + intake mock): 12787202\n  deployLetterbox: 5210191\n  deployHook: 5800334\n  seed: 643071\n\n[PASS] test_launchWiresEverythingWithoutCallingOutside() (gas: 12909340)\n[PASS] test_ownerMaySeedEarly() (gas: 263944320)\n[PASS] test_seedByOwnerAnyTimeByAnyoneAfterStart() (gas: 264082869)\n[PASS] test_theLaunchRefusesAZeroOrSwappedLetterboxHash() (gas: 52962294)\n[PASS] test_theLaunchRefusesAnOracleSetupTheLetterboxWouldRefuse() (gas: 53619602)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 289.44ms (1.20s CPU time)\n\nRan 5 test suites in 290.54ms (422.61ms CPU time): 21 tests passed, 0 failed, 0 skipped (21 total tests)\n","passed":true},{"durationMs":149,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"CabalGate.appeal(uint256,uint256,string)\",\"CabalGate.appealFor(address,uint256,uint256,uint256,string,uint8,uint256,uint256)\",\"CabalGate.begin()\",\"CabalGate.executeSell(uint256)\",\"CabalGate.executeSellFor(uint256,uint256)\",\"CabalGate.expire(uint256)\",\"CabalGate.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"CabalGate.onPleaFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"CabalGate.submitFor(address,uint256,uint256,string,uint8,uint256,uint256)\",\"CabalGate.submitSell(uint256,string)\",\"CabalGate.unlockCallback(bytes)\",\"Letterbox.appealAuto(uint256,string)\",\"Letterbox.deliver(uint256)\",\"Letterbox.fallback()\",\"Letterbox.letter(string)\",\"Letterbox.plead(uint256,string)\",\"Letterbox.setName(string)\",\"Letterbox.settle(uint256)\",\"PLEA.acceptOwnership()\",\"PLEA.allow(address)\",\"PLEA.approve(address,uint256)\",\"PLEA.burn(uint256)\",\"PLEA.courtTake(address,uint256)\",\"PLEA.init(address,address)\",\"PLEA.renounceOwnership()\",\"PLEA.setLauncher(address,address,address)\",\"PLEA.setLetterbox(address)\",\"PLEA.transfer(address,uint256)\",\"PLEA.transferFrom(address,address,uint256)\",\"PLEA.transferOwnership(address)\",\"PleaDistributor.acceptOwnership()\",\"PleaDistributor.claim(uint256,address,uint256,bytes32[])\",\"PleaDistributor.renounceOwnership()\",\"PleaDistributor.setMerkleRoot(bytes32)\",\"PleaDistributor.transferOwnership(address)\",\"PleaHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"PleaHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"PleaHook.fundWall(uint256)\",\"PleaHook.rebalance()\",\"PleaHook.seed()\",\"PleaHook.unlockCallback(bytes)\",\"PleaLaunch.deployHook(bytes32,bytes)\",\"PleaLaunch.deployLetterbox(bytes)\",\"PleaLaunch.deployTribunal(bytes)\",\"PleaLaunch.seed()\",\"Seasons.checkpoint()\",\"Seasons.checkpointObjection(uint256,uint256)\",\"Seasons.closeSeason(uint256[])\",\"Seasons.flushToWall()\",\"Seasons.record(uint256)\",\"Seasons.unlockCallback(bytes)\",\"Tribunal.expire(uint256)\",\"Tribunal.object(uint256,string)\",\"Tribunal.onObjectionFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"Tribunal.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Tribunal.settle(uint256)\"],\"files\":{\".gitignore\":5,\"ADAPTATION.md\":43,\"OBJECTIONS.md\":339,\"README.md\":303,\"audit/FINDINGS.md\":161,\"audit/README.md\":35,\"audit/THREAT-MODEL.md\":112,\"audit/jobs/A1.md\":18,\"audit/jobs/A2.md\":23,\"audit/jobs/A3.md\":16,\"audit/jobs/common.md\":14,\"audit/make_jobs.py\":143,\"audit/rounds/1/A1.objective.txt\":26,\"audit/rounds/1/A1.report.md\":130,\"audit/rounds/1/A1.request.json\":9,\"audit/rounds/1/A2.objective.txt\":31,\"audit/rounds/1/A2.report.md\":323,\"audit/rounds/1/A2.request.json\":9,\"audit/rounds/1/A3.objective.txt\":24,\"audit/rounds/1/A3.report.md\":114,\"audit/rounds/1/A3.request.json\":9,\"audit/rounds/1/manifest.json\":87,\"audit/rounds/2/A1.objective.txt\":26,\"audit/rounds/2/A1.report.md\":133,\"audit/rounds/2/A1.request.json\":9,\"audit/rounds/2/A2.objective.txt\":31,\"audit/rounds/2/A2.report.md\":93,\"audit/rounds/2/A2.request.json\":9,\"audit/rounds/2/A3.objective.txt\":24,\"audit/rounds/2/A3.report.md\":142,\"audit/rounds/2/A3.request.json\":9,\"audit/rounds/2/manifest.json\":87,\"audit/rounds/3/A1.objective.txt\":26,\"audit/rounds/3/A1.report.md\":127,\"audit/rounds/3/A1.request.json\":9,\"audit/rounds/3/A2.objective.txt\":31,\"audit/rounds/3/A2.report.md\":192,\"audit/rounds/3/A2.request.json\":9,\"audit/rounds/3/A3.objective.txt\":24,\"audit/rounds/3/A3.report.md\":119,\"audit/rounds/3/A3.request.json\":9,\"audit/rounds/3/manifest.json\":87,\"audit/rounds/4/A1.objective.txt\":26,\"audit/rounds/4/A1.report.md\":88,\"audit/rounds/4/A1.request.json\":9,\"audit/rounds/4/A2.objective.txt\":31,\"audit/rounds/4/A2.report.md\":207,\"audit/rounds/4/A2.request.json\":9,\"audit/rounds/4/A3.objective.txt\":24,\"audit/rounds/4/A3.report.md\":133,\"audit/rounds/4/A3.request.json\":9,\"audit/rounds/4/manifest.json\":87,\"audit/rounds/5/A1.objective.txt\":26,\"audit/rounds/5/A1.report.md\":135,\"audit/rounds/5/A1.request.json\":9,\"audit/rounds/5/A2.objective.txt\":31,\"audit/rounds/5/A2.report.md\":93,\"audit/rounds/5/A2.request.json\":9,\"audit/rounds/5/A3.objective.txt\":24,\"audit/rounds/5/A3.report.md\":73,\"audit/rounds/5/A3.request.json\":9,\"audit/rounds/5/manifest.json\":87,\"audit/rounds/6/A1.objective.txt\":26,\"audit/rounds/6/A1.report.md\":60,\"audit/rounds/6/A1.request.json\":9,\"audit/rounds/6/A2.objective.txt\":31,\"audit/rounds/6/A2.report.md\":161,\"audit/rounds/6/A2.request.json\":9,\"audit/rounds/6/A3.objective.txt\":24,\"audit/rounds/6/A3.request.json\":9,\"audit/rounds/6/manifest.json\":87,\"audit/rounds/7/A1.objective.txt\":26,\"audit/rounds/7/A1.report.md\":132,\"audit/rounds/7/A1.request.json\":9,\"audit/rounds/7/A2.objective.txt\":31,\"audit/rounds/7/A2.report.md\":95,\"audit/rounds/7/A2.request.json\":9,\"audit/rounds/7/A3.objective.txt\":24,\"audit/rounds/7/A3.report.md\":72,\"audit/rounds/7/A3.request.json\":9,\"audit/rounds/7/manifest.json\":87,\"audit/rounds/8/A1.objective.txt\":26,\"audit/rounds/8/A1.report.md\":121,\"audit/rounds/8/A1.request.json\":9,\"audit/rounds/8/A2.objective.txt\":31,\"audit/rounds/8/A2.request.json\":9,\"audit/rounds/8/A3.objective.txt\":24,\"audit/rounds/8/A3.report.md\":114,\"audit/rounds/8/A3.request.json\":9,\"audit/rounds/8/manifest.json\":87,\"foundry.toml\":34,\"launch.json\":58,\"remappings.txt\":4,\"script/Deploy.s.sol\":80,\"script/DeployLetterbox.s.sol\":22,\"script/DeployTribunal.s.sol\":22,\"script/MineSalt.s.sol\":44,\"src/CabalGate.sol\":903,\"src/Letterbox.sol\":757,\"src/OracleAttestation.sol\":227,\"src/PLEA.sol\":151,\"src/PleaDistributor.sol\":60,\"src/PleaHook.sol\":1116,\"src/PleaLaunch.sol\":220,\"src/Seasons.sol\":467,\"src/Tribunal.sol\":561,\"src/interfaces/IPleaParts.sol\":78,\"src/interfaces/IStacker.sol\":12,\"test/Launch.t.sol\":249,\"test/LaunchManifest.t.sol\":370,\"test/ManifestInput.t.sol\":84,\"test/fork/ForkMainnet.t.sol\":406,\"test/fork/ForkTestnet.t.sol\":884,\"test/full/AppealRounding.t.sol\":146,\"test/full/ArtifactDeployment.t.sol\":59,\"test/full/AuditImported.t.sol\":142,\"test/full/AuditRevision.t.sol\":336,\"test/full/AuditRound1.t.sol\":651,\"test/full/AuditRun3.t.sol\":394,\"test/full/AuditRun5.t.sol\":186,\"test/full/BonusInvariant.t.sol\":541,\"test/full/DistributorAdversarial.t.sol\":342,\"test/full/DistributorOwnership.t.sol\":71,\"test/full/GasPass.t.sol\":403,\"test/full/Gate.t.sol\":472,\"test/full/GateAdversarial.t.sol\":400,\"test/full/GateFailureInvariant.t.sol\":330,\"test/full/Hook.t.sol\":359,\"test/full/HookAdversarial.t.sol\":257,\"test/full/HookRevision.t.sol\":553,\"test/full/JudgeFindings.t.sol\":222,\"test/full/Letterbox.t.sol\":915,\"test/full/LetterboxInvariant.t.sol\":447,\"test/full/MainnetGuard.t.sol\":87,\"test/full/OracleConformance.t.sol\":116,\"test/full/OracleReplay.t.sol\":60,\"test/full/Orientation.t.sol\":126,\"test/full/OwnershipTransitionInvariant.t.sol\":238,\"test/full/Run7Coverage.md\":54,\"test/full/Run7DistributorLifecycle.t.sol\":276,\"test/full/Run7ObjectionPoints.t.sol\":204,\"test/full/Run7SeatAccounting.t.sol\":308,\"test/full/SeasonAdversarial.t.sol\":211,\"test/full/SeasonFunds.t.sol\":351,\"test/full/SeasonInvariant.t.sol\":348,\"test/full/SeasonRanking.t.sol\":176,\"test/full/Seasons.t.sol\":290,\"test/full/SeatMultiplier.t.sol\":167,\"test/full/Token.t.sol\":80,\"test/full/TraderAttributionInvariant.t.sol\":287,\"test/full/TraderFallbackAdversarial.t.sol\":315,\"test/full/TraderResolution.t.sol\":225,\"test/full/TraderResolverBoundary.t.sol\":126,\"test/full/TradingInvariant.t.sol\":496,\"test/full/Tribunal.t.sol\":615,\"test/full/TribunalAdversarial.t.sol\":225,\"test/full/TribunalInvariant.t.sol\":603,\"test/full/TribunalOracleBoundary.t.sol\":334,\"test/full/TribunalSeasons.t.sol\":309,\"test/full/TribunalStanding.t.sol\":217,\"test/full/TribunalTextProperties.t.sol\":276,\"test/utils/AdversarialTraderRouter.sol\":38,\"test/utils/ArtifactDeployment.sol\":23,\"test/utils/ClaimTree.sol\":41,\"test/utils/Fixture.sol\":350,\"test/utils/Mocks.sol\":371,\"test/utils/SeasonModel.sol\":117,\"test/utils/SepoliaFixture.sol\":36},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"9946223babecc870369279e939f80b84f646fc586be1df80197335bfa1a200d2","verifiedTreeHash":"135b31b6ef75b059e60dcbb37689442a8c77ea46","verifierVersion":"0.1.0+d952fceb"},{"checks":[{"durationMs":44765,"exitCode":0,"name":"build","output":"Compiling 123 files with Solc 0.8.26\nSolc 0.8.26 finished in 44.64s\nCompiler run successful with warnings:\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Tribunal.sol:345:9:\n    |\n345 |         uint8 status,\n    |         ^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Tribunal.sol:208:5:\n    |\n208 |     function status(uint256 pleaId) external view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Tribunal.sol:383:53:\n    |\n383 |     function _void(uint256 id, Objection storage o, uint8 status, bytes32 reason) internal {\n    |                                                     ^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Tribunal.sol:208:5:\n    |\n208 |     function status(uint256 pleaId) external view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/Seasons.sol:422:58:\n    |\n422 |     function _owners() internal view returns (address a, address b, address c) {\n    |                                                          ^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/CabalGate.sol:749:5:\n    |\n749 |     function _text(string storage t, bool json) internal view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":1316,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/LaunchManifest.t.sol:RehearsalManifestTest\n[PASS] test_laterBlockCannotRegisterLauncher() (gas: 14065763)\n[PASS] test_separateConstructorCallsInDeploymentBlockStillWork() (gas: 15289919)\n[PASS] test_separateTransactionsLeaveTheAcceptedDeploymentBlockWindow() (gas: 14200150)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 6.21ms (6.23ms CPU time)\n\nRan 2 tests for test/ManifestInput.t.sol:ManifestInputTest\n[PASS] test_everyManifestWordDeploysAtomicallyAndCommitsTheTribunal() (gas: 22559509)\n[PASS] test_failedLastConstructorRollsBackAllEarlierDeploymentsAndCanRetry() (gas: 27169362)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.46ms (8.18ms CPU time)\n\nRan 3 tests for test/LaunchManifest.t.sol:PostLaunchTest\n[PASS] test_committedHookDeploysLaterAndMintsOnlyTheFixedSplit() (gas: 7988962)\n[PASS] test_committedLetterboxDeploysLater() (gas: 10792141)\nLogs:\n  deployLetterbox transaction gas: 5580999\n\n[PASS] test_committedTribunalDeploysLater() (gas: 10383958)\nLogs:\n  deployTribunal transaction gas: 5271240\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 14.88ms (18.94ms CPU time)\n\nRan 5 tests for test/LaunchManifest.t.sol:AtomicManifestTest\n[PASS] test_factoryDeploysExactManifestOnAnEmptySepoliaChain() (gas: 54251908)\nLogs:\n  five-contract launch transaction gas through IMD's factory: 13494931\n  gas limit with IMD's headroom: 16463815\n  margin to the 16,777,216 cap: 313401\n\n[PASS] test_launchJsonCommitsToThisLetterbox() (gas: 34569)\n[PASS] test_launchJsonCommitsToThisTribunal() (gas: 31273)\n[PASS] test_launchJsonEncodesOracleMintFlagAsStaticWord() (gas: 11366)\n[PASS] test_launchJsonNotesFitTheManifestCap() (gas: 9569)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 61.40ms (61.64ms CPU time)\n\nRan 19 tests for test/Run85Objection.t.sol:Run85ObjectionTest\n[PASS] test_aHigherReScoreNeverRaisesThePlea() (gas: 9668857)\n[PASS] test_aLateOrRepeatedRulingIsRefusedAndBurnsNoNonce() (gas: 9397544)\n[PASS] test_aRecordedPleaIsOutOfReach() (gas: 5332642)\n[PASS] test_aRuledObjectorCannotFileTheSecondOne() (gas: 12991740)\n[PASS] test_aVoidObjectionFreesItsSlotForTheSameWallet() (gas: 12795217)\n[PASS] test_marginEdgesSustainOnlyBelowNeedMinusMargin() (gas: 13153349)\n[PASS] test_objectingNeedsTheStakeInPoolImd() (gas: 9168356)\n[PASS] test_onlyAnApprovalInItsWindowCanBeObjectedTo() (gas: 12688031)\n[PASS] test_onlyTheIntakeMayRuleOrFail() (gas: 9303445)\n[PASS] test_rulingsNeverResetTheDeadManNorTouchTheSale() (gas: 10110539)\n[PASS] test_settleNeedsARulingAndPaysEachSideOnce() (gas: 9678341)\n[PASS] test_textAcceptsOrdinaryUnicodeUpToTheLimit() (gas: 13415375)\n[PASS] test_textRefusesEmptyOverlongControlAndMalformedBytes() (gas: 637715)\n[PASS] test_textRefusesFormatVariationSelectorAndDefaultIgnorableCharacters() (gas: 1363341)\n[PASS] test_theAgreedObjectionNumbersAreCompiledIn() (gas: 93287)\n[PASS] test_theSellerAndExcludedWalletsCannotObject() (gas: 5183163)\n[PASS] test_theTribunalDeploysOnceFromTheCommittedCodeOnly() (gas: 834121)\n[PASS] test_twoPendingFromDifferentWalletsThenTheCaseIsFull() (gas: 13711979)\n[PASS] test_wrongPanelsAndOutOfRangeScoresAreRefused() (gas: 12930660)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 88.23ms (86.13ms CPU time)\n\nRan 8 tests for test/Launch.t.sol:LaunchTest\n[PASS] test_aMintedFeeOnChainOneNeverOpensTrading() (gas: 287274592)\n[PASS] test_deployHookChecksTheInitCodeAndFlags() (gas: 259227306)\n[PASS] test_eachStepFitsAMainnetTransaction() (gas: 263978225)\nLogs:\n  launch (5 contracts + intake mock): 12787202\n  deployLetterbox: 5210191\n  deployHook: 5800334\n  seed: 643071\n\n[PASS] test_launchWiresEverythingWithoutCallingOutside() (gas: 12909340)\n[PASS] test_ownerMaySeedEarly() (gas: 263944320)\n[PASS] test_seedByOwnerAnyTimeByAnyoneAfterStart() (gas: 264082869)\n[PASS] test_theLaunchRefusesAZeroOrSwappedLetterboxHash() (gas: 52962294)\n[PASS] test_theLaunchRefusesAnOracleSetupTheLetterboxWouldRefuse() (gas: 53619602)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 150.14ms (670.68ms CPU time)\n\nRan 2 tests for test/Run85Objection.t.sol:Run85ObjectionInvariantTest\n[PASS]\nRun85ObjectionInvariantTest invariants:\n[PASS] invariant_casesRulingsAndSalesKeepTheAgreedRules\n[PASS] invariant_theTribunalHoldsExactlyTheUnsettledStakes\n Run85ObjectionInvariantTest invariants (runs: 48, calls: 3072, reverts: 0)\n\n╭------------------+----------+-------+---------+----------╮\n| Contract         | Selector | Calls | Reverts | Discards |\n+==========================================================+\n| ObjectionHandler | advance  | 438   | 0       | 0        |\n|------------------+----------+-------+---------+----------|\n| ObjectionHandler | expire   | 450   | 0       | 0        |\n|------------------+----------+-------+---------+----------|\n| ObjectionHandler | fail     | 429   | 0       | 0        |\n|------------------+----------+-------+---------+----------|\n| ObjectionHandler | file     | 443   | 0       | 0        |\n|------------------+----------+-------+---------+----------|\n| ObjectionHandler | rule     | 429   | 0       | 0        |\n|------------------+----------+-------+---------+----------|\n| ObjectionHandler | sell     | 490   | 0       | 0        |\n|------------------+----------+-------+---------+----------|\n| ObjectionHandler | settle   | 393   | 0       | 0        |\n╰------------------+----------+-------+---------+----------╯\n\n[PASS] test_handlerReachesEveryEnding() (gas: 21140621)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.19s (1.11s CPU time)\n\nRan 7 test suites in 1.20s (1.52s CPU time): 42 tests passed, 0 failed, 0 skipped (42 total tests)\n","passed":true},{"durationMs":83,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"CabalGate.appeal(uint256,uint256,string)\",\"CabalGate.appealFor(address,uint256,uint256,uint256,string,uint8,uint256,uint256)\",\"CabalGate.begin()\",\"CabalGate.executeSell(uint256)\",\"CabalGate.executeSellFor(uint256,uint256)\",\"CabalGate.expire(uint256)\",\"CabalGate.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"CabalGate.onPleaFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"CabalGate.submitFor(address,uint256,uint256,string,uint8,uint256,uint256)\",\"CabalGate.submitSell(uint256,string)\",\"CabalGate.unlockCallback(bytes)\",\"Letterbox.appealAuto(uint256,string)\",\"Letterbox.deliver(uint256)\",\"Letterbox.fallback()\",\"Letterbox.letter(string)\",\"Letterbox.plead(uint256,string)\",\"Letterbox.setName(string)\",\"Letterbox.settle(uint256)\",\"PLEA.acceptOwnership()\",\"PLEA.allow(address)\",\"PLEA.approve(address,uint256)\",\"PLEA.burn(uint256)\",\"PLEA.courtTake(address,uint256)\",\"PLEA.init(address,address)\",\"PLEA.renounceOwnership()\",\"PLEA.setLauncher(address,address,address)\",\"PLEA.setLetterbox(address)\",\"PLEA.transfer(address,uint256)\",\"PLEA.transferFrom(address,address,uint256)\",\"PLEA.transferOwnership(address)\",\"PleaDistributor.acceptOwnership()\",\"PleaDistributor.claim(uint256,address,uint256,bytes32[])\",\"PleaDistributor.renounceOwnership()\",\"PleaDistributor.setMerkleRoot(bytes32)\",\"PleaDistributor.transferOwnership(address)\",\"PleaHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"PleaHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"PleaHook.fundWall(uint256)\",\"PleaHook.rebalance()\",\"PleaHook.seed()\",\"PleaHook.unlockCallback(bytes)\",\"PleaLaunch.deployHook(bytes32,bytes)\",\"PleaLaunch.deployLetterbox(bytes)\",\"PleaLaunch.deployTribunal(bytes)\",\"PleaLaunch.seed()\",\"Seasons.checkpoint()\",\"Seasons.checkpointObjection(uint256,uint256)\",\"Seasons.closeSeason(uint256[])\",\"Seasons.flushToWall()\",\"Seasons.record(uint256)\",\"Seasons.unlockCallback(bytes)\",\"Tribunal.expire(uint256)\",\"Tribunal.object(uint256,string)\",\"Tribunal.onObjectionFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"Tribunal.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Tribunal.settle(uint256)\"],\"files\":{\".gitignore\":5,\"ADAPTATION.md\":43,\"OBJECTIONS.md\":339,\"README.md\":303,\"audit/FINDINGS.md\":161,\"audit/README.md\":35,\"audit/THREAT-MODEL.md\":112,\"audit/jobs/A1.md\":18,\"audit/jobs/A2.md\":23,\"audit/jobs/A3.md\":16,\"audit/jobs/common.md\":14,\"audit/make_jobs.py\":143,\"audit/rounds/1/A1.objective.txt\":26,\"audit/rounds/1/A1.report.md\":130,\"audit/rounds/1/A1.request.json\":9,\"audit/rounds/1/A2.objective.txt\":31,\"audit/rounds/1/A2.report.md\":323,\"audit/rounds/1/A2.request.json\":9,\"audit/rounds/1/A3.objective.txt\":24,\"audit/rounds/1/A3.report.md\":114,\"audit/rounds/1/A3.request.json\":9,\"audit/rounds/1/manifest.json\":87,\"audit/rounds/2/A1.objective.txt\":26,\"audit/rounds/2/A1.report.md\":133,\"audit/rounds/2/A1.request.json\":9,\"audit/rounds/2/A2.objective.txt\":31,\"audit/rounds/2/A2.report.md\":93,\"audit/rounds/2/A2.request.json\":9,\"audit/rounds/2/A3.objective.txt\":24,\"audit/rounds/2/A3.report.md\":142,\"audit/rounds/2/A3.request.json\":9,\"audit/rounds/2/manifest.json\":87,\"audit/rounds/3/A1.objective.txt\":26,\"audit/rounds/3/A1.report.md\":127,\"audit/rounds/3/A1.request.json\":9,\"audit/rounds/3/A2.objective.txt\":31,\"audit/rounds/3/A2.report.md\":192,\"audit/rounds/3/A2.request.json\":9,\"audit/rounds/3/A3.objective.txt\":24,\"audit/rounds/3/A3.report.md\":119,\"audit/rounds/3/A3.request.json\":9,\"audit/rounds/3/manifest.json\":87,\"audit/rounds/4/A1.objective.txt\":26,\"audit/rounds/4/A1.report.md\":88,\"audit/rounds/4/A1.request.json\":9,\"audit/rounds/4/A2.objective.txt\":31,\"audit/rounds/4/A2.report.md\":207,\"audit/rounds/4/A2.request.json\":9,\"audit/rounds/4/A3.objective.txt\":24,\"audit/rounds/4/A3.report.md\":133,\"audit/rounds/4/A3.request.json\":9,\"audit/rounds/4/manifest.json\":87,\"audit/rounds/5/A1.objective.txt\":26,\"audit/rounds/5/A1.report.md\":135,\"audit/rounds/5/A1.request.json\":9,\"audit/rounds/5/A2.objective.txt\":31,\"audit/rounds/5/A2.report.md\":93,\"audit/rounds/5/A2.request.json\":9,\"audit/rounds/5/A3.objective.txt\":24,\"audit/rounds/5/A3.report.md\":73,\"audit/rounds/5/A3.request.json\":9,\"audit/rounds/5/manifest.json\":87,\"audit/rounds/6/A1.objective.txt\":26,\"audit/rounds/6/A1.report.md\":60,\"audit/rounds/6/A1.request.json\":9,\"audit/rounds/6/A2.objective.txt\":31,\"audit/rounds/6/A2.report.md\":161,\"audit/rounds/6/A2.request.json\":9,\"audit/rounds/6/A3.objective.txt\":24,\"audit/rounds/6/A3.request.json\":9,\"audit/rounds/6/manifest.json\":87,\"audit/rounds/7/A1.objective.txt\":26,\"audit/rounds/7/A1.report.md\":132,\"audit/rounds/7/A1.request.json\":9,\"audit/rounds/7/A2.objective.txt\":31,\"audit/rounds/7/A2.report.md\":95,\"audit/rounds/7/A2.request.json\":9,\"audit/rounds/7/A3.objective.txt\":24,\"audit/rounds/7/A3.report.md\":72,\"audit/rounds/7/A3.request.json\":9,\"audit/rounds/7/manifest.json\":87,\"audit/rounds/8/A1.objective.txt\":26,\"audit/rounds/8/A1.report.md\":121,\"audit/rounds/8/A1.request.json\":9,\"audit/rounds/8/A2.objective.txt\":31,\"audit/rounds/8/A2.request.json\":9,\"audit/rounds/8/A3.objective.txt\":24,\"audit/rounds/8/A3.report.md\":114,\"audit/rounds/8/A3.request.json\":9,\"audit/rounds/8/manifest.json\":87,\"foundry.toml\":34,\"launch.json\":58,\"remappings.txt\":4,\"script/Deploy.s.sol\":80,\"script/DeployLetterbox.s.sol\":22,\"script/DeployTribunal.s.sol\":22,\"script/MineSalt.s.sol\":44,\"src/CabalGate.sol\":903,\"src/Letterbox.sol\":757,\"src/OracleAttestation.sol\":227,\"src/PLEA.sol\":151,\"src/PleaDistributor.sol\":60,\"src/PleaHook.sol\":1116,\"src/PleaLaunch.sol\":220,\"src/Seasons.sol\":467,\"src/Tribunal.sol\":561,\"src/interfaces/IPleaParts.sol\":78,\"src/interfaces/IStacker.sol\":12,\"test/Launch.t.sol\":249,\"test/LaunchManifest.t.sol\":370,\"test/ManifestInput.t.sol\":84,\"test/Run85Objection.t.sol\":820,\"test/fork/ForkMainnet.t.sol\":406,\"test/fork/ForkTestnet.t.sol\":884,\"test/full/AppealRounding.t.sol\":146,\"test/full/ArtifactDeployment.t.sol\":59,\"test/full/AuditImported.t.sol\":142,\"test/full/AuditRevision.t.sol\":336,\"test/full/AuditRound1.t.sol\":651,\"test/full/AuditRun3.t.sol\":394,\"test/full/AuditRun5.t.sol\":186,\"test/full/BonusInvariant.t.sol\":541,\"test/full/DistributorAdversarial.t.sol\":342,\"test/full/DistributorOwnership.t.sol\":71,\"test/full/GasPass.t.sol\":403,\"test/full/Gate.t.sol\":472,\"test/full/GateAdversarial.t.sol\":400,\"test/full/GateFailureInvariant.t.sol\":330,\"test/full/Hook.t.sol\":359,\"test/full/HookAdversarial.t.sol\":257,\"test/full/HookRevision.t.sol\":553,\"test/full/JudgeFindings.t.sol\":222,\"test/full/Letterbox.t.sol\":915,\"test/full/LetterboxInvariant.t.sol\":447,\"test/full/MainnetGuard.t.sol\":87,\"test/full/OracleConformance.t.sol\":116,\"test/full/OracleReplay.t.sol\":60,\"test/full/Orientation.t.sol\":126,\"test/full/OwnershipTransitionInvariant.t.sol\":238,\"test/full/Run7Coverage.md\":54,\"test/full/Run7DistributorLifecycle.t.sol\":276,\"test/full/Run7ObjectionPoints.t.sol\":204,\"test/full/Run7SeatAccounting.t.sol\":308,\"test/full/SeasonAdversarial.t.sol\":211,\"test/full/SeasonFunds.t.sol\":351,\"test/full/SeasonInvariant.t.sol\":348,\"test/full/SeasonRanking.t.sol\":176,\"test/full/Seasons.t.sol\":290,\"test/full/SeatMultiplier.t.sol\":167,\"test/full/Token.t.sol\":80,\"test/full/TraderAttributionInvariant.t.sol\":287,\"test/full/TraderFallbackAdversarial.t.sol\":315,\"test/full/TraderResolution.t.sol\":225,\"test/full/TraderResolverBoundary.t.sol\":126,\"test/full/TradingInvariant.t.sol\":496,\"test/full/Tribunal.t.sol\":615,\"test/full/TribunalAdversarial.t.sol\":225,\"test/full/TribunalInvariant.t.sol\":603,\"test/full/TribunalOracleBoundary.t.sol\":334,\"test/full/TribunalSeasons.t.sol\":309,\"test/full/TribunalStanding.t.sol\":217,\"test/full/TribunalTextProperties.t.sol\":276,\"test/utils/AdversarialTraderRouter.sol\":38,\"test/utils/ArtifactDeployment.sol\":23,\"test/utils/ClaimTree.sol\":41,\"test/utils/Fixture.sol\":350,\"test/utils/Mocks.sol\":371,\"test/utils/SeasonModel.sol\":117,\"test/utils/SepoliaFixture.sol\":36},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b4b500aabae31ba9a53f9cb94f71507b3b364300f392e88451a5936df5ed512c","verifiedTreeHash":"0495af99f7c0260c0834ad319961c4e4cb46b073","verifierVersion":"0.1.0+d952fceb"}]}