{"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":"b4b81b03-93f1-4cc0-89c1-3ba424813023","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":null,"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":"failed"},{"acceptedSubmissionHash":null,"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":"waiting"},{"acceptedSubmissionHash":null,"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":"waiting"},{"acceptedSubmissionHash":"b8111b928ebd407fb102be881951c9f356e5f33e7efa876d39aed2666166f707","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":null,"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":"waiting"},{"acceptedSubmissionHash":null,"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":"waiting"},{"acceptedSubmissionHash":null,"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":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"waiting"}],"objective":"Launch imd/acc's mainnet ProjectRegistry from this repository (the launch-mainnet branch, which is main without .github/workflows; do not add any workflow file): deploy only the ProjectRegistry, exactly as launch.json lists it, on Ethereum mainnet, wired to imd/acc's live mainnet Stacker and to IdentityMD's Intake v2. It decides which projects' cashback earns points, through IdentityMD oracle panels, with no owner. It is the code of Sepolia test run 6 (launch #1463, 0x30a3bb4d75989cb19f83607abc2dffe52a253384), byte for byte: test run 5's registry (launch #1428, tested live: a rejection, a listing and a defended challenge) with one rule text clarified, version 3.1 of the panel rules (the trader rule rejects the router itself and says the address msgSender() reports is a valid trader even when it is a contract; rehearsed with a real panel, 11 of 11 true). imd/acc pays trading cashback to traders as staked IMD (sIMD), 0.25% to 1% of each trade at each project's choice, funded from the project's existing fees; only credits from listed projects earn points.\n\nDEPLOY (Ethereum mainnet, one contract):\n- ProjectRegistry(intake, oracleAsset, stacker, oracleSigner, questionChainId, challengeBond, challengeCooldown) = (0xa43e6f75ee006411f79ac1c84120606c2330de82 Intake v2, 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7 IMD, 0x06909f672301f28a810f78cfe7a754851269f4f0 the live mainnet Stacker of launch #1409, 0x5598aa9146215bc13eb26f2c692ad1461fd32982 oracle signer, 1, 20e18, 604800). launch.json already lists exactly this: a 20 IMD challenge bond and a 7-day cooldown, agreed by the owner.\n- Do not deploy a Stacker: 0x0690...f4f0 is live (src/Stacker.sol, launch #1409) and primed. The registry only names it in its questions and never calls it.\n- src/ProjectRegistry.sol and src/oracle/OracleAttestation.sol stay as they are: no owner; the constructor makes no external call. applyListing(project, name, sourceUrl, rateBps 25-100, beneficiary): when the project reports an owner through owner() (projectOwner: a staticcall capped at 30,000 gas reading at most 32 bytes; a revert, a malformed answer or zero means no owner), only that owner or the project itself may apply (NotProjectOwner, before any fee); a project without an owner can be applied for by anyone. Anyone may challengeForBeneficiary(project, reason, beneficiary) a listed project after its cooldown. Each ask pays the oracle fee read live from the Intake (ORACLE_FEE(), 0.5 IMD), plus the 20 IMD bond for a challenge, and asks Intake v2 one yes-or-no question with requestWithFailure, with the 8 rules of version 3.1 (docs/panel-rules-v2.md), each under 512 characters. onOracleResult (0x510379c7) accepts only the Intake, only its own open request, each answer once, only a signature by the oracle signer for this contract issued after the ask (300-second tolerance), from a panel of 15 with at least 11 agreeing: yes lists from that block, or keeps a challenged project (bond to its beneficiary, cooldown not restarted); no rejects, or delists from that block (bond back). onOracleFailure (0xa7980e31) only clears the open question and returns a bond; expire clears one after a day or once the Intake completed it. A bond the token refuses is recorded in bondOwed and claimed with claimBond(to). setBeneficiary waits while a question is open and changes the wallet at most once per day. Questions are filed under chain 1.\n- test/mocks and test/trial hold test doubles and trial contracts only. Keep foundry.toml as it is (solc 0.8.26, cancun, 10,000 runs, bytecode_hash none).\n\nFACTS (read on chain 2026-10-12, Ethereum block 26,178,270): Intake v2 sells the question for 0.5 IMD (priceOf) and delivers answers with 200,000 callback gas. The registry's runtime is 23,295 bytes; deploying it estimates about 5.16M gas. Mainnet fork with the real Intake and IMD (test/RegistryMainnetFork.t.sol): a stranger is refused for an owned project, the owner's application pays the Intake 0.5 IMD and opens our request, a listing answer uses 100,341 gas and a defended challenge 112,901 gas (the 20 IMD bond paid to the beneficiary), both within 200,000.\n\nTESTS: forge test passes (246 tests: 232 run offline; 12 fork tests run when ETH_RPC_URL and SEPOLIA_RPC_URL are set; 2 Stacker-manifest checks skip because this launch.json lists the registry). test/Deployment.t.sol checks this manifest (mainnet IMD, the live Stacker, 20 IMD, 7 days); test/RegistryApplicantGate.t.sol owner-only applications; test/RegistryPolicyRevision.t.sol the version 3.1 rules; test/RegistryCallbackGas.t.sol and test/RegistryBondOwed.t.sol answers within 200,000 gas. Keep all of them passing.\n\nREADME: once live, add the registry's address to the Ethereum mainnet Deployments table.","parentJobId":null,"planHash":"080b17e3c75cf50751e53ffe53e54066ad4a46483de565d3f34a4b0223f1ad4f","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"b4b81b03-93f1-4cc0-89c1-3ba424813023","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1494-launch-imd-acc-s-mainnet-projectregistry"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52165","feedbackHash":"7945d09372caff1a52db63a96059657d5d6a3a6713c5a36a3821ea69f211ac61","nodeKey":"audit_imported_code","submissionHash":"b8111b928ebd407fb102be881951c9f356e5f33e7efa876d39aed2666166f707","tag1":"review:submission","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"e17ca9abf8723d6966fe70851ebe58f050b6b3e5c23bf5abd068128db7303ea8","state":"blocked","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7a2710990fabf59a","findings":[],"hash":"804a9ae8ef736e4a19b00e5c535105a116ad4ed56e776551ff4cead800f502d4","nodeId":"0082b93c-e513-4ac2-8d66-66f8ac14c57f","outcome":"failed","summary":"needs input: The imported medium self-challenge finding reproduces at the mainnet settings: five defended beneficiary self-challenges cost only 2.5 IMD and each outside attempt reverts AskOpen. Fixing this requires changing ProjectRegistry.sol behavior and bytecode, but the brief explicitly requires that source to stay unchanged and match Sepolia test run 6 byte for byte, while also requiring reproduced audit findings to be fixed. — Should this launch preserve the exact Sepolia test run 6 bytecode and explicitly accept the reproduced self-challenge slot-blocking risk, or may ProjectRegistry.sol change to fix that finding with regression tests?","treeHash":null,"usage":{"cachedInputTokens":672896,"inputTokens":59328,"model":"gpt-6.1-sol","outputTokens":2925,"runtime":"codex","turns":4,"wallClockMs":151114}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e12f98dda6acc55f","findings":[{"citation":"resolved","description":"Each project has one question slot. _challenge refuses a new challenge while any ask is open, and nothing stops the beneficiary (or any wallet it controls) from challenging its own project. A self-challenge costs the beneficiary only the 0.5 IMD oracle fee: on the panel's 'yes' the 20 IMD bond is paid back to p.beneficiary, which is the challenger itself. The slot reopens only inside the writer's complete() transaction, so a beneficiary that watches the mempool can re-file a self-challenge ahead of every outside challenger's transaction, which then reverts AskOpen before paying anything. The contract already treats this exact mempool-watching defense as unacceptable for beneficiary handoffs (HANDOFF_INTERVAL, lines 90-95) but has no equivalent throttle for challenges. The cost to the beneficiary is 0.5 IMD per panel round (minutes), and each round does re-ask the panel the real question, so this only pays for a project whose violation the panel misses without a pointed reason; it is a race rather than a certainty. Minimal fix preserving the design: a per-project minimum interval between challenges whose bond returned to the beneficiary (for example refuse a new challenge by the current beneficiary until HANDOFF_INTERVAL after a defended one), or a short challenge queue keyed by challenger.","line":321,"path":"src/ProjectRegistry.sol","reproduction":"Deploy ProjectRegistry with MockIntake and MintableIMD (test/mocks), list `project` with beneficiary B, warp past the 7-day cooldown. Loop: (1) B calls challengeForBeneficiary(project, 'routine check', B) and pays 0.5 IMD + 20 IMD; (2) challenger C calls challengeForBeneficiary(project, 'it credits outside trades', B) -> reverts AskOpen; (3) the intake delivers a signed yes -> Defended, 20 IMD back to B. After 5 rounds B's balance is down exactly 2.5 IMD, C has never filed, and the project is still listed. Expected: a challenger who retries after a settled self-challenge gets a question filed (as the handoff throttle guarantees for handoffs). Actual: every retry can be front-run for 0.5 IMD. Reproduced in test/scratch/Leads.t.sol test_selfChallengeOccupiesTheSlot.","severity":"medium","snippet":"        if (p.ask != Ask.None) revert AskOpen();","title":"A beneficiary can keep its project's only question slot busy with self-challenges, so third-party challenges never file"},{"citation":"resolved","description":"The brief chooses no owner, so oracleSigner (OracleAttestationConsumer, set once in the constructor, _setOracleSigner never exposed), ACTION (a constant) and intake (immutable) can never change. The oracle-consumer reference says each of these must be owner-settable because the plane may rotate its key or retire oracle-1 (the live Intake retires an action with setPrice(action, asset, 0)). If IdentityMD rotates the signer key, every subsequent application or challenge still pulls and forwards 0.5 IMD to the Intake, the panel answers, and onOracleResult reverts BadSignature, so no listing or delisting can ever settle again; challenge bonds come back only through expire a day later. If oracle-1 is retired, ORACLE_FEE() is 0 and every ask reverts OracleUnavailable: nothing is lost but the registry is dead and must be redeployed. This is the agreed design (no owner), reported so the owner decides it knowingly; the adapter should not add an owner without that decision. Mitigation inside the design: none on chain; off chain, IdentityMD must keep signing with 0x5598...2982 for this contract.","line":81,"path":"src/ProjectRegistry.sol","reproduction":"Deploy with signer S. List a project. Rotate the oracle key to S' (sign the attestation with S' instead of S). A challenger files a challenge paying 0.5 IMD fee + 20 IMD bond; the Intake delivers a signed 'no' from S' under 200,000 gas: onOracleResult reverts BadSignature, delivered=false, the project stays listed although the panel said no. expire(project) returns the 20 IMD; the 0.5 IMD fee is gone. Reproduced in test/scratch/Leads.t.sol test_signerRotationStrandsEveryAsk.","severity":"low","snippet":"    bytes32 public constant ACTION = \"oracle.request@oracle-1\";","title":"Oracle signer, action id and Intake are fixed at deployment with no owner: a signer rotation or action retirement strands the registry and burns 0.5 IMD per ask"},{"citation":"resolved","description":"setBeneficiary lets the current beneficiary hand a listed project's points to any non-zero wallet, and the manifest notes and README promise this. But every challenge body carries the beneficiary rule with the current p.beneficiary filled in: it 'must be the owner of <project>, or a wallet its verified source or its official website names as its team or treasury'. A handoff to a fresh wallet (a cold wallet, a new multisig) therefore gives any challenger a true 'no' at the next challenge: the project is delisted, the challenger gets the bond back, and the team must re-apply (0.5 IMD, a new panel, a new 7-day cooldown). The contract feature and the rule text disagree on what a legitimate beneficiary is; the docs (design.md, listing.md, panel-rules-v2.md) do not say a handoff must go to a named wallet. Fix is a text decision for the owner: either the challenge form of the beneficiary rule accepts 'or a wallet the previous beneficiary handed off to through the registry', or the docs tell beneficiaries that a handoff must go to a wallet the project names.","line":578,"path":"src/ProjectRegistry.sol","reproduction":"List project P with beneficiary = P's owner O. After cooldown, O calls setBeneficiary(P, W) where W is a fresh wallet named nowhere. Challenger C calls challengeForBeneficiary(P, 'beneficiary is not the owner or a named team wallet', W): the body's beneficiary definition reads '0x<W> must be the owner of 0x<P>, or a wallet its verified source or its official website names as its team or treasury', which is false by construction. A faithful panel signs 'no': onOracleResult sets listed=false, Delisted, bond to C. Expected per README/notes: 'a listed project's beneficiary may hand its points to another wallet'. Actual: doing so forfeits the listing at the next challenge.","severity":"low","snippet":"            \" must be the owner of \",","title":"A beneficiary handoff to a wallet the project does not name makes the project delistable under the beneficiary rule the contract itself sends"},{"citation":"resolved","description":"The owner gate decodes the first return word as an address whenever its top 96 bits are zero. A project exposing owner() with a different return type (uint256, bool, an enum) returns a small word that passes the check and becomes an 'owner' nobody controls (0x...01), so NotProjectOwner blocks every human applicant and only a call from the project contract itself can apply. Documented behaviour ('an answer that isn't one address ... means no owner') does not cover this case: the answer is one word and is accepted. Low impact (such projects are rare and the project can still apply through its own code or expose a proper owner()); worth stating in the listing docs or tightening to a selector/ABI check if the owner wants it.","line":247,"path":"src/ProjectRegistry.sol","reproduction":"Deploy a project contract with `function owner() external pure returns (uint256) { return 1; }`. Any wallet calling applyListing(project, 'Venue', 'https://example.org/venue', 50, wallet) reverts NotProjectOwner(0x0000000000000000000000000000000000000001). Expected: treated as no owner (anyone may apply) or rejected as malformed; actual: an uncontrollable owner. Reproduced in test/scratch/Leads.t.sol test_ownerReturningNonAddressBlocksApplications.","severity":"info","snippet":"        if (ok && size == 32 && word >> 160 == 0) owner = address(uint160(word));","title":"projectOwner reads any 32-byte word below 2^160 as an owner, so a project whose owner() returns a small integer or a bool can only be applied for by itself"},{"citation":"resolved","description":"Read from the verified Intake v2 source (Sourcify, 0xa43e...de82, solc 0.8.26): priceOf and callbackGas are Ownable2Step owner-settable; complete() is writer-only and, for status 0, passes the writer's args to the callback without binding args[0:32] to the request it completes (it does bind them for failures). Consequences for this registry: (1) a price raise lands on askers who gave the registry an unlimited IMD approval, since _ask pulls the live price plus bond with no caller-supplied maximum (the NatSpec tells callers to approve exactly the quote); (2) callbackGas below about 113,000 (the measured defended-challenge answer) makes every answer fail and every ask expire; (3) the writer can, by construction of the Intake, deliver an attestation under any open intakeId of the registry, so the 'own open request' check is only as strong as the writer. All three are documented in the contract's Trust note or the reference; none is a defect in this code. Live values read on 2026-10-13 at block 26,180,659: priceOf = 0.5 IMD, callbackGas = 200,000, IMD = 'Identity.md' (a LayerZero OFT with plain ERC-20 transfers, owner 0x047f...54b7 can rename it only).","line":345,"path":"src/ProjectRegistry.sol","reproduction":"Not a failing input; state for the adapter and the panel. Example of (1): asker approves type(uint256).max; Intake owner calls setPrice(ACTION, IMD, 5e18) before the asker's applyListing is mined; _ask pulls 5 IMD instead of 0.5. Example of (2): Intake owner calls setCallbackGas(100000); a defended challenge answer (112,901 gas on the mainnet fork) runs out of gas, delivered=false, expire returns the bond and the fee is lost.","severity":"info","snippet":"        uint256 fee = ORACLE_FEE();","title":"Trust assumptions on the live Intake: its owner sets the price and the 200,000 callback gas, and its writer alone pairs an answer to a request id"},{"citation":"resolved","description":"Read in full: src/ProjectRegistry.sol, src/oracle/OracleAttestation.sol, src/Stacker.sol (not deployed by this launch; its local runtime is 2,614 bytes, the same size as the live 0x0690...f4f0 which reports IMD() = 0xd34a...63b7), test/mocks/MockIntake.sol, launch.json, docs/panel-rules-v2.md, the protected harness, and the live Intake v2 source from Sourcify (requests getter returns (payer, callbackTarget, callbackSelector, completed) exactly as IIntake declares; complete marks completed before calling the callback in the same transaction, so expire has no window). Checks: forge test 232 passed, 14 skipped (fork and Stacker-manifest tests); runtime 23,295 bytes, no DELEGATECALL/CALLCODE/SELFDESTRUCT in the deployed code; selectors 0x510379c7 and 0xa7980e31; ACTION bytes match the reference; all 8 rules at most 512 bytes (trader 505), apply question 1,002 and challenge question 1,099 bytes at maximum inputs; launch.json has exactly kind/contracts/notes, 7 string arguments in constructor order matching the brief, notes 1,538 characters. Checked and found sound: access on every state-changing entry point, CEI and nonReentrant on every path that moves IMD, bond conservation (balance = open bonds + bondOwed), replay (consumed requestId, domain = this contract + chain 1), issuedAt and expiry windows, panel minimums, text filtering of untrusted applicant input, boundary at askedAt + 1 day between onOracleResult and expire, handoff throttle and challenge pin. Not reached: the mainnet and Sepolia fork tests (no ETH_RPC_URL/SEPOLIA_RPC_URL in this environment; the Intake and IMD were read directly over a public RPC instead), the IdentityMD plane's off-chain body validation (the consumer key and allowAmbiguous are accepted on the evidence of Sepolia runs 5 and 6, not re-verified here), and the oracle signer's identity (taken from the brief).","line":53,"path":"src/ProjectRegistry.sol","reproduction":"Not a defect. Commands: forge test; forge test --match-path test/scratch/Opcodes.t.sol -vv; forge test --match-path test/scratch/Lengths.t.sol -vv.","severity":"info","snippet":"contract ProjectRegistry is OracleAttestationConsumer, ReentrancyGuard {","title":"Coverage: contracts read, checks performed, and what could not be reached"}],"hash":"b8111b928ebd407fb102be881951c9f356e5f33e7efa876d39aed2666166f707","nodeId":"519df9ab-f0af-4419-8896-249e0273be9d","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds six entries. No file outside the findings file and `test/scratch/` was changed.\n\n**Verdict:** no critical or high defect in the registry as it arrived. The code is tight on access control, reentrancy, bond conservation, replay and timing. One medium, two lows and three informational notes were substantiated.\n\n**Findings written**\n\n- **Medium, self-challenge slot occupation** at `src/ProjectRegistry.sol:321`. A beneficiary can challenge its own project for 0.5 IMD per round since the bond returns to itself on a \"yes\", and re-file ahead of every outside challenger, who then reverts with AskOpen. The contract throttles the equivalent handoff trick but not this one. Reproduced in the scratch test over five rounds.\n- **Low, fixed signer and action with no owner** at line 81. A signer rotation makes every ask pay 0.5 IMD and never settle. This is the brief's own choice, reported so the owner decides it knowingly.\n- **Low, handoff versus the beneficiary rule** at line 578. A handoff to a wallet the project does not name makes the project delistable at the next challenge under the rule text the contract itself sends.\n- **Info, owner() returning a small non-address word** at line 247 is read as an uncontrollable owner.\n- **Info, trust assumptions on the live Intake** at line 345. Its owner sets price and callback gas, and its writer alone pairs status-0 answers to request ids.\n- **Info, coverage statement** at line 53.\n\n**What was read and checked.** ProjectRegistry, OracleAttestation, Stacker, the mock Intake, launch.json, the panel rules, the protected harness, and the live Intake v2 source from Sourcify, whose `requests` getter and `complete` ordering match what the registry assumes. The suite passes offline with 232 tests and 14 skipped. Deployed runtime is 23,295 bytes with no forbidden opcodes. All eight rules fit 512 bytes, questions fit 2,000. The manifest has the right keys and seven arguments in order. Live reads on mainnet confirmed a 0.5 IMD price, 200,000 callback gas, and the Stacker's runtime size.\n\n**Not reached.** The fork tests, since no RPC environment variables are set here. The plane's off-chain body validation and the oracle signer's identity were taken from the brief and the Sepolia runs rather than re-verified.","treeHash":null,"usage":{"cachedInputTokens":1787171,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":47982,"runtime":"claude","turns":35,"wallClockMs":700598}}],"verification":[]}