{"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":"09baba31-7451-4891-9562-4c27d9111a09","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"70af53152493e0d7cfcc86ece1b58c9865e823d2098d7070926f6262615cabf4","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":"31a58ce961af9cffeb56531ee53de017ecaca50f9142f89933c024f246b8a329","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":"a98b5ceb4e8ac00708f71b3c25a23a236d17757d3b86611e896492856ec266a5","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":"d1482287c6978c335ae24367d6370dfdcb3478977d31bb419610311d64979b96","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":"49b54b10c524be88d7134a76f1ceb1cd2b4719b535b5faf9b25c4d7a9157fa30","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":"42550de001fd3bf66d92b1b963a7a33f2f2cd23d7b7482a6b438e1febaea4c85","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":"0f74a6e33a9a3fa194031051ecd9365ab20854053e98451077765c0a9a895d51","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":"aa2ac28c9adcd139d68076f8ce66dcbe23064f780f4a811f07455c8dfd059bf2","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"b41a2b504d792e78f562f5f80ab3ee1221f5c771f3ba8c9796731261500ec226","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":"Deploy the locally repaired and independently accepted STEPS (Stepstoke) contracts from the EXACT public repository and commit specified below. Contracts-only Ethereum mainnet release. The previous development-only prohibition is superseded solely for this deployment order after the local release gate has passed. Do not publish, host, rebuild or connect the website in this order; website integration follows a separate independent deployment acceptance gate. Do not open any paid child job, product round, additional repair or replacement order.\n\nPreserve the repaired contracts, six operations, exact explicit payment, Branch-as-payer, one active request, authenticated success/failure callbacks, full original-result Keccak binding, file SHA-256 verification, accepted checkpoints and historical forks. Three named launch contracts in this order: RelayEncoder(), RelayVerifier(), RelayFactory($contract:RelayEncoder,$contract:RelayVerifier). Static constructor arguments only; no ETH value, post-deployment initialization or external constructor calls. Runtime createProject/fork continues to create complete independent Branch contracts. No template Branch deployment, proxies, DELEGATECALL, CALLCODE, SELFDESTRUCT, linked external libraries, owner/admin/upgrade/pause/forced unlock, token, pool, hook or treasury. The service deploys through its official launch path; workers must not obtain keys or broadcast independently.\n\nThis source contains local repairs after the earlier IMD candidate. Preserve that authorship and provenance honestly. Use the mandatory imported-source audit/adaptation/review stages; make only strictly necessary deployment packaging changes. Never revert local repairs, lower compatibility limits, replace raw result bytes with a projection, raise the Ethereum transaction gas limit or waive a test for a deadline. If substantive contract changes are required, report the blocker rather than silently deploy a materially different product. Deliver the exact final source commit, complete diff from the imported commit, build settings, deployment manifest, ABIs, ABI hashes, runtime hashes and immutable bindings for independent post-deployment checking.\n\nReproduce the accepted 32768-byte C-GAS-01 regression (SHA-256 8768318db71105397ac89eef44af007752b94e966eb8adebd237a2b97c9de805) with the original 16-asset witness as a complete Branch.bind transaction below 16777216 gas. Preserve Unicode/escaped/raw JSON semantics and current budgets. Run final-source contract/fuzz/invariant/SDK/security/gas/size/constructor-policy checks, including launch deployment rehearsal. Local chain transactions are allowed; funded public product tests are not.\n\nEthereum chainId 1 only. Preserve compiler/dependency settings, source reproducibility, all reviewed safety properties and release evidence. Unresolved material security, gas, size, launch-policy or reproducibility findings must block deployment. Local test acceptance permits this launch; it does not prove public transport, actual deployment, live paid profiles or production readiness. Keep productionReady=false and unperformed live profile checks NOT_RUN. A successful launch label alone does not authorize website publication or paid UI activation.\n\nProvide the official launch ID, actual deployment transaction hash, canonical receipt/block, deployed addresses, actual transaction sender and contract-creation caller, exact constructor arguments, verified source links and the official deployment handoff if available. Do not invent missing handoff fields. A final source/result file is not proof of deployment. Keep all task outputs and documents in English. Existing identity is STEPS / Stepstoke and https://x.com/stepstoke; no branding work or social posting.","parentJobId":null,"planHash":"0ad7b57afa81564fbeaa41e5f03b962c138c2bd6aa7e3de2979bd65922d8381a","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"09baba31-7451-4891-9562-4c27d9111a09","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2455-relayencoder-relayverifier-relayfactory"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51487","feedbackHash":"37425d48ef5b3c806a2fb9ccfb8948bc25a6a4c6ece8ca541ba4c52d36016592","nodeKey":"adapt_contract_project","submissionHash":"70af53152493e0d7cfcc86ece1b58c9865e823d2098d7070926f6262615cabf4","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50907","feedbackHash":"cef944a9c20fe24e5629cc755444fa9fbc0527d9e93be2993ad3d4dc7096e9e9","nodeKey":"adapt_contract_project","submissionHash":"b34fcc87d6604a30b899e86713dae18a241773857626b757f92b3280af738817","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52708","feedbackHash":"de6fc65059b2c41f5b05e05a1de4adfea5fee26b2b983db47fa0de9646a8852f","nodeKey":"audit_economics","submissionHash":"31a58ce961af9cffeb56531ee53de017ecaca50f9142f89933c024f246b8a329","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52161","feedbackHash":"39c866fb577270e27f5e467eb132e567fc083347cc80e32b41a9258aa0f93036","nodeKey":"audit_flow","submissionHash":"a98b5ceb4e8ac00708f71b3c25a23a236d17757d3b86611e896492856ec266a5","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50907","feedbackHash":"ae6104ffae5353d43d35157864ea0457fc09454b4ff0ee5090f4c6f69f3483fd","nodeKey":"audit_imported_code","submissionHash":"d1482287c6978c335ae24367d6370dfdcb3478977d31bb419610311d64979b96","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52251","feedbackHash":"20cd4086fce9df8d75fcceec566eb4263162700e17dfae89e3c6425b6f768c9d","nodeKey":"audit_judge","submissionHash":"49b54b10c524be88d7134a76f1ceb1cd2b4719b535b5faf9b25c4d7a9157fa30","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51445","feedbackHash":"49a326eeb037022c0d35393b41babfa9d999ee4f965499822344b6386ef3726b","nodeKey":"audit_judge","submissionHash":"af886c2474d6a60b755d6e9626bd1ca72e22f4356fc501775f09051f714edbda","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52157","feedbackHash":"0d4b97b0b92eaf6b9322b5d4a742be221ed4b457d3f71fe4720115687a838b70","nodeKey":"audit_math","submissionHash":"42550de001fd3bf66d92b1b963a7a33f2f2cd23d7b7482a6b438e1febaea4c85","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51515","feedbackHash":"a476b41333a7a8a3684f817d6ad92642b1a9d587bd397c5e579ab3bb8bdf141b","nodeKey":"audit_permissions","submissionHash":"0f74a6e33a9a3fa194031051ecd9365ab20854053e98451077765c0a9a895d51","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52701","feedbackHash":"0efcad79dcf4a38f4829f05cb900b714bf20aa52a38489d8e47a7653ddd64d08","nodeKey":"manifest","submissionHash":"aa2ac28c9adcd139d68076f8ce66dcbe23064f780f4a811f07455c8dfd059bf2","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52255","feedbackHash":"c4e8cfbab5f5bc0d1b0ea7015edd73b417e4b9f6f865ace96a74dd2e7c617ca5","nodeKey":"manifest","submissionHash":"0fe7beffef249cbc040a45773ad8ed764935a821e53359a4db66367adeced235","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51433","feedbackHash":"84b8004fab998c1303981bd2d8e0bf338c7569750b7e7515dd0ada7664dc9502","nodeKey":"write_foundry_tests","submissionHash":"44d8b208090a886a99ffdd4a7c5e618ced761e16804aec2eb666cba40b84f16a","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51450","feedbackHash":"75938b5f8040657d997237b896810d0bccc7f67125c8d689d1ff0f07bbd7f57d","nodeKey":"write_foundry_tests","submissionHash":"b41a2b504d792e78f562f5f80ab3ee1221f5c771f3ba8c9796731261500ec226","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"7464357eb307eb1db135a253f6cd8b0dfcd8cbeea20ab7c7b20cb7e5dd00f047","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ea89e16822824c6f","findings":[{"citation":"resolved","description":"Area: Access Control / Trust Gap / Asymmetry. sponsor() is permissionless and is the only writer of activeProposal (line 167). Once the Intake answers the active attempt with onIntakeFailure(status=1) the phase becomes Refused (line 237) and the only state-changing entry left is retry() (line 173: `if (phase != T.Phase.Refused) revert Busy();`), which re-purchases exactly the same body for activeProposal and records whoever pays as sponsor. sponsor() of any other proposal reverts Busy forever, bind() reverts Busy, and no other path writes phase. The asymmetry: the sponsor role is unprivileged and costs one job price, but its effect (which proposal the branch is bound to) is branch-wide and irreversible; every other user is reduced to paying for the locking sponsor's body or forking to a new address that loses the IMD project/job continuation head (fork children start with latestJobId empty, i.e. job.open). docs/OPERATIONS.md states 'no alternate proposal after a refused attempt' as a design decision, so this is reported as a documented trust assumption with an unprivileged amplifier rather than a permission bypass: a hostile sponsor only needs a proposal the Intake will refuse with status 1 (deterministically refused text, unpriced/withdrawn action at retry time) to end the branch's public continuation at the price of one job. The frozen path (status != 1, line 237) has the same shape with no retry at all. No fix is proposed that changes the agreed 'one active request / no unlock' design; if the author wants to keep the branch usable, the minimal change is to let a Refused attempt be abandoned by a *different* paid proposal (sponsor allowed in Refused, recording the abandoned attempt), which keeps exact payment, Branch-as-payer and callback authentication intact.","line":165,"path":"src/RelayBranch.sol","reproduction":"Local mocks (test/RelaySetup.sol): Mallory calls branch.propose(P1, []) then branch.sponsor(idP1, 10e18, []) -> phase Pending. Intake writer calls intake.fail(request, 1, 'refused') -> phase Refused. Alice calls branch.propose(P2, []) (succeeds, id 2) then branch.sponsor(2, 10e18, []) -> reverts RelayBranch.Busy. branch.bind('', []) -> reverts Busy. Alice's only option is branch.retry(10e18, []) which charges Alice PRICE for Mallory's P1 body; a second status-1 refusal returns to the identical locked state with activeProposal still == idP1 and Alice's balance reduced by PRICE. Expected per the public-continuation guarantee ('Anyone can create, propose, sponsor', README): Alice can fund her own proposal. Actual: the branch accepts only the refused body for its entire remaining life. Scratch reproduction: test/scratch/RefusedLock.t.sol.","severity":"low","snippet":"        if (phase != T.Phase.Ready) revert Busy();","title":"Any sponsor whose attempt is refused with status 1 permanently locks the public branch to that one proposal (access x asymmetry seam)"},{"citation":"resolved","description":"Asymmetry between the paired callbacks: onIntakeResult bounds the uri and reverts above 1024 bytes, whereas onIntakeFailure (line 230) ignores and never bounds its trailing bytes argument. The uri is only emitted (line 227), never stored or used for binding, so the bound protects only event gas under the Intake's 200,000-gas single callback attempt. Reverting rather than recording the result hash and omitting/hashing the uri converts a cosmetic limit into a permanent outcome: the Intake has already been paid, the attempt stays undelivered, phase stays Pending, and no entry point (sponsor/retry/bind all require another phase, callbacks require !delivered on the same request) can ever move the branch again. docs/OPERATIONS.md documents this as a candidate limit and the deployment order protects current budgets, so this is recorded for the author's awareness and not as a blocker. Only the fixed Intake can trigger it (trusted actor, no unprivileged amplifier).","line":223,"path":"src/RelayBranch.sol","reproduction":"Branch in phase Pending with active request R. From Policy.INTAKE call onIntakeResult(R, keccak256(rawManifest), uri) with bytes(uri).length == 1025 (for example 'https://api.imd.fun/intake-results/' followed by 990 'a' characters). Actual: revert Policy.Limit(); attempts[activeAttempt].delivered stays false, phase stays Pending; a second identical call with a 70-byte uri would succeed only if the Intake retries, which the pinned v2 behaviour (one callback attempt) does not. Expected by the sponsor: the result hash is recorded and bind(rawManifest, witness) becomes possible regardless of URI length, since the URI is not part of the binding.","severity":"info","snippet":"        if (bytes(uri).length > 1024) revert Policy.Limit();","title":"Success callback reverts on a URI over 1024 bytes while the failure callback accepts any payload, so one over-long honest URI leaves a paid attempt Pending forever"}],"hash":"0f74a6e33a9a3fa194031051ecd9365ab20854053e98451077765c0a9a895d51","nodeId":"1f6637da-9c1f-4451-ba07-afcc3eb2836e","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. Nothing in the tree was modified outside the findings file and the scratch test directory.\n\n**Outcome: no permission bypass found.** The permission model is small and holds up under the Access Control, Trust Gap and Asymmetry checklists. Both factory entry points and five of the six branch entry points are permissionless by design. The two Intake callbacks are the only restricted functions, and their guard binds caller, phase, active request id and single delivery, so a cross-branch or attacker-registered Intake request cannot settle a victim branch. The Branch pulls tokens only from the caller, resets its Intake allowance to zero and asserts balances, so there is no confused-deputy path through approvals. Reentrancy through token hooks or a synchronous Intake callback is blocked by the guard and the phase checks. Checkpoints, asset hashes and job identity have single writers. Runtime sizes are all under the limit, no owner, proxy or linked library exists, and the constructor policy for the three launch contracts is satisfied.\n\n**Two findings were recorded, neither blocking:**\n\n- **Low:** any sponsor whose attempt is refused with status 1 locks the whole public branch to that one proposal. Other users can propose but never sponsor anything else; their only options are to pay for the refused body again or fork to a new address that loses the job-continuation head. This is documented in the operations runbook as intentional, so it is reported as a trust assumption with an unprivileged amplifier, with a scratch test in `test/scratch/RefusedLock.t.sol` demonstrating the locked state.\n- **Info:** the success callback reverts on a URI over 1024 bytes while the failure callback bounds nothing, so one over-long URI from the Intake leaves a paid attempt pending forever. Also documented, and the deployment order protects current budgets.\n\n**Verification:** the adversarial, payment, history and profile suites were run on this tree, 73 tests passed including the state-machine invariant, and the author's own test confirms the refusal lock is intended behaviour.\n\n**Coverage:** all eight listed entry points have rows, plus five invariant rows. The JSON parser libraries behind the verifier are marked unreached since they are outside the assigned area and were only skimmed.","treeHash":null,"usage":{"cachedInputTokens":1551226,"inputTokens":422,"model":"claude-fable-5-1","outputTokens":36206,"runtime":"claude","turns":38,"wallClockMs":914121}},{"artifacts":[],"attempt":1,"bundleHash":"5d5b24534869e4bffca4125ded0f349fa1c875ebd62e84d6f14949fe103ba502","device":"e06554fd2816f9d7","findings":[],"hash":"0fe7beffef249cbc040a45773ad8ed764935a821e53359a4db66367adeced235","nodeId":"d77c5544-1c6f-485a-8e12-950f18d7f46c","outcome":"completed","summary":"Done. `launch.json` is written, validated against the manifest schema, and the full suite passes with the verifier's fuzz seed.\n\n**What the manifest declares** (matching the accepted source and the brief's proposal in `docs/CONTRACTS.md`):\n\n- `RelayEncoder` with no constructor arguments. The contract has no constructor, so its default nonpayable zero-argument constructor applies.\n- `RelayVerifier` with no constructor arguments, same situation.\n- `RelayFactory` with `$contract:RelayEncoder` and `$contract:RelayVerifier`. Its constructor at `src/RelayFactory.sol:31` stores the two addresses as immutables and checks only nonzero and distinct. It makes no external call and reads no code, so it survives the empty-chain probe in the protected test. Dependency code and policy identity are checked at first product use.\n\n**Why there is no `$owner` entry.** No contract in the accepted source has an owner, admin, upgrade, pause, treasury or token role, so no constructor takes an owner address. The owner-checks protected test therefore has nothing to flag. The notes say this explicitly.\n\n**Checks run**\n\n| Check | Result |\n|---|---|\n| Manifest schema (keys, kind, unique names, backward references, string args, notes length) | ok, notes 2141 chars |\n| `forge build` | ok |\n| `forge test` with the verifier's fuzz seed | 169 passed, 0 failed |\n\nThe existing `LaunchCompatibility` suite already rehearses the three-name CREATE2 batch and the empty-dependency factory constructor, and it passed in that run.\n\n**Scope.** Only `launch.json` was added. No source, configuration, library or documentation file was touched, and no key, broadcast or public RPC was used. The official launch ID, transaction hash, receipt, deployed addresses, sender and verified source links are not in this deliverable because they only exist after the service's own deployment step, and the notes say they must come from the official handoff rather than be invented.","treeHash":"cd7aa2abb569ba387baa273b1af28b9fbc96d6a3","usage":{"cachedInputTokens":250644,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":3582,"runtime":"claude","turns":7,"wallClockMs":198520}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d021901979a78997","findings":[{"citation":"resolved","description":"Economic Security / Flow Gap (execution x periphery x first principles). The verified mainnet Intake (0xa43e6F75ee006411F79Ac1C84120606C2330DE82, src/Intake.sol) exposes `uint64 public callbackGas = 200_000` and `setCallbackGas(uint64) onlyOwner`; `complete` calls the Branch with exactly `call(stipend, ...)` inside a try, records `delivered=false` on failure and never redelivers. Live read at block 26,245,260: callbackGas = 0x30d40 (200,000). The Branch's `onIntakeResult` needs about 62,000 gas (measured: fails at 61,000, succeeds at 62,000 with a short URI; more with a 1,024-byte URI) and `onIntakeFailure` about 61,300 (docs/LIMITS.md). `_purchase` forwards the full price to Intake (which forwards it whole to payTo) without reading `callbackGas()` or otherwise bounding the stipend risk, so a stipend below the Branch's need is only discovered after payment, when the callback runs out of gas. Because `_pending` is the only way out of Pending and there is no timeout, refund or forced unlock, every Branch that purchased under a lowered stipend is stranded with its fee spent, and the public getter that would have allowed `_purchase` to refuse the purchase up front is unused. The repository nowhere mentions that the stipend is operator-settable (no hit for callbackGas/setCallbackGas in src or docs); it is treated as a fixed 'official stipend'. This is a trust assumption on the Intake operator, so severity is low, but it is a concrete, cheaply checkable dependency failure that strands sponsor funds. Minimal fix preserving the design: add `function callbackGas() external view returns (uint64)` to IIntake and in `_purchase`, before the first transfer, `if (intake_.callbackGas() < MIN_CALLBACK_GAS) revert FeeExceeded();` with a compiled constant above the measured maximum (for example 100_000), and document the dependency.","line":196,"path":"src/RelayBranch.sol","reproduction":"State: fresh root Branch, sponsor approved. 1) Intake owner calls `setCallbackGas(60_000)` (any value below ~62,000; mainnet value today is 200,000). 2) `propose(MarkdownCreate ...)` then `sponsor(id, 0.5e18, [])`: Branch pulls 0.5 IMD from the sponsor, Intake forwards 0.5 IMD to payTo, phase = Pending. 3) Writer calls `complete(requestId, 0, resultHash, uri, args)`: Intake does `call(60_000, branch, onIntakeResult...)`, the callback runs out of gas, Intake emits Completed(delivered=false) and marks the request completed. Expected: result recorded so `bind` can proceed. Actual: Branch stays Pending forever; `sponsor`, `retry` and `bind` all revert Busy; the 0.5 IMD is spent; no other proposal on this Branch can ever be funded. Reproduced locally in test/scratch/StipendProbe.t.sol: with `vm.prank(Policy.INTAKE); address(branch).call{gas: 61_000}(abi.encodeCall(branch.onIntakeResult,(req, keccak256(raw), \"ipfs://x/result.json\")))` the call fails, phase stays Pending, treasury holds PRICE, `bind` reverts; the same call with 62,000 gas succeeds.","severity":"low","snippet":"        requestId = intake_.requestWithFailure(","title":"Branch purchases do not check the Intake callback stipend, which the Intake owner can lower below the ~62k gas the result/failure callbacks need; a completed job then leaves the paid Branch Pending fo"},{"citation":"resolved","description":"Economic Security (incentives) / First principles. The verified mainnet Intake documents `complete` as: status 1 when the plane refused the ask, 2 when the work ended without a result (a panel that disagreed, a job that failed). A status-1 refusal is an admission decision about the body; the Branch's only exit from Refused is `retry`, which by design resubmits the byte-identical body and pays the full price again (docs/REVIEW.md acknowledges a deterministic refusal 'can refuse every retry and charge again'). A status-2 failure is an execution outcome that is often transient (worker crash, panel disagreement), yet it permanently freezes the Branch: no proposal can ever be funded again and the project can only continue through a fork, which must open a new Intake project (IdentityMismatch forbids reusing the inherited project). Economic consequence: one 0.5 IMD purchase whose job happens to fail at execution destroys the Branch's forward liveness with no attacker needed, while the path that is retryable is the one least likely to succeed on retry. The requester documents both behaviours as required (ADAPTATION.md, docs/REVIEW.md, docs/OPERATIONS.md), so this is recorded as a design-level observation with the dependency's own status semantics as evidence, not as a permission bypass; any change (for example, permitting a paid identical retry on status 2 as well) is a scope decision for the author.","line":237,"path":"src/RelayBranch.sol","reproduction":"State: root Branch, proposal id 1 funded (`sponsor(1, 0.5e18, [])`, 0.5 IMD forwarded to Intake payTo). Writer calls `complete(requestId, 2, 0, \"\", abi.encode(requestId, uint8(2), bytes32(\"job_failed\"), uint16(0), uint16(0), bytes(\"\")))`. Branch: `onIntakeFailure` sets phase = Frozen. Then `retry(0.5e18, [])` reverts Busy, `sponsor(2, 0.5e18, [])` reverts Busy, `bind(...)` reverts Busy, for every later block (test/RelayPayments.t.sol testFuzz_nonRefusalFailureAlwaysFreezes shows the same). Conversely with status 1 the same Branch accepts `retry` repeatedly, each pulling the full price for the identical body.","severity":"info","snippet":"        phase = status == 1 ? T.Phase.Refused : T.Phase.Frozen;","title":"Failure status mapping is inverted relative to the Intake's documented semantics: transient status 2 (job failed) freezes the Branch permanently, deterministic status 1 (plane refused the ask) invites"},{"citation":"resolved","description":"Economic Security (cheapest griefing vector). `sponsor` is callable by anyone for any live proposal id and there is one active request per Branch (phase must be Ready). A competing payer who sees Alice's `sponsor(5, ...)` in the mempool can front-run it with `sponsor(7, ...)` for a proposal of their own: Alice's transaction reverts Busy (gas only), the competitor pays the current price (0.5 IMD on mainnet today), and when their result binds the anchor changes so proposal 5 (and every other open proposal) reverts Stale and must be re-proposed. Repeating this costs the competitor one price per round and produces a worker job each time, so it is bounded by cost and not free, and 'No FIFO' is the documented design (test/RelayPayments.t.sol). Recorded as an economic trust/design note for the judge, not a defect: no funds of the pre-empted party are lost and the author has explicitly chosen permissionless sponsorship with no queue.","line":165,"path":"src/RelayBranch.sol","reproduction":"State: root Branch Ready; Alice has proposal 5, Bob has proposal 7, both anchored at the current digest. Same block: Bob's `sponsor(7, 0.5e18, [])` is ordered first and succeeds (phase Pending, 0.5 IMD to payTo); Alice's `sponsor(5, 0.5e18, [])` reverts Busy. After Bob's result is recorded and `bind` succeeds, Alice's `sponsor(5, ...)` reverts Stale because proposal 5's anchor is the old digest. Expected by Alice: her funded proposal runs; actual: she must re-propose and race again, at Bob's cost of one price per round.","severity":"info","snippet":"        if (phase != T.Phase.Ready) revert Busy();","title":"Permissionless single-slot sponsorship lets any payer pre-empt another sponsor's proposal for one price per round; a successful round also stales every other open proposal"}],"hash":"31a58ce961af9cffeb56531ee53de017ecaca50f9142f89933c024f246b8a329","nodeId":"f3a28a46-fd39-4f8d-8374-b6b30d6881ca","outcome":"completed","summary":"The review is complete. The findings file is written at the repository root with three findings and thirteen coverage rows, and all three cited snippets match the tree exactly.\n\n**Outcome: the economics hold.** I traced every value flow in `RelayBranch` against the verified mainnet Intake and IMD token sources, and found no loss-of-funds or conservation defect in the Economic Security, Invariant and Flow Gap areas.\n\nWhat I verified:\n- **Real Intake dependency.** The verified source of the mainnet Intake pulls exactly the paid amount and forwards it whole to its treasury, never refunds, and only calls back from the writer's `complete` with a fixed stipend. The Branch's pre/post balance and allowance checks match this behavior exactly.\n- **Real IMD token.** It is a LayerZero OFT built on the OpenZeppelin ERC20 with no transfer fees, hooks, pause or blacklist. The owner can only rename it.\n- **Live state.** Both job actions are priced at 0.5 IMD and the callback stipend is 200,000 gas at block 26,245,260.\n- **Tests.** All 168 tests plus the two invariant suites pass locally. Capacity rules in the encoder and verifier agree, so an admitted proposal cannot become unbindable for capacity reasons.\n\nFindings reported:\n1. **Low.** The Intake's callback stipend is owner-settable and the Branch never reads it before paying. A stipend below about 62,000 gas leaves every completed job stranded in Pending with the fee spent. The repository nowhere mentions this setter. Reproduced in a scratch test.\n2. **Info.** The failure mapping is inverted against the Intake's own documented semantics. Transient status 2 freezes a Branch forever while deterministic status 1 invites repeated paid identical retries. This is documented as required design, so it is recorded as an observation.\n3. **Info.** Permissionless single-slot sponsorship allows pre-empting another sponsor for one price per round. Documented as the \"No FIFO\" design, no funds lost.\n\nCoverage: all eight entry points have rows, plus five invariant and dependency rows. Documented design limits such as stuck Pending on a missing callback, stuck ResultRecorded on an unverifiable result, and the no-refund model were traced and confirmed as disclosed, not reported as defects. No tracked files were changed; the only writes were the findings file and a scratch test.","treeHash":null,"usage":{"cachedInputTokens":1711812,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":38910,"runtime":"claude","turns":40,"wallClockMs":751291}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"37eed9f56188ea8b","findings":[{"citation":"resolved","description":"Seam: boundary x invariant. The verifier's documented envelope bound is 32,768 raw bytes plus the work/value budgets, and the invariant the Branch relies on is that a completed, authenticated result whose declared output is unique can always be bound (bind is the only exit from ResultRecorded; ADAPTATION.md 7e8de817). But ManifestJSON._childMode(3, key) (lines 175-181) marks name/path/hash/mediaType/bytes/submissionHash as retained for EVERY entry of the files array, not only the declared one, and _object/_value allocate one retained token per key and per value (line 127: `if (p.count == MAX_RETAINED_TOKENS) revert Policy.Limit();`). A standard six-field file entry therefore costs 13 retained tokens; the root costs 9. 9 + 19*13 = 256 is accepted, 20 files = 269 > 256 reverts Policy.Limit even though the manifest is 4,696 bytes, every entry is well formed, and the declared output is unique. RelayVerifier._declaredFile only reads name and path of non-declared entries, so the other four retained fields per extra file are never used. The cap is not disclosed anywhere in README/REVIEW/LIMITS/PROTOCOL-OVERVIEW (grep for MAX_RETAINED_TOKENS/file count finds only the SDK constant), while the repository's own evidence records real public 17-file envelopes, so a 20-file result is a realistic plane output. Impact: the sponsor's exact fee is spent, the result is authenticated and recorded, bind reverts forever, retry/sponsor revert Busy, and the Branch is permanently stranded in ResultRecorded (no admin, timeout or refund exists by design). Minimal fix options that preserve the design: raise MAX_RETAINED_TOKENS so the already-enforced MAX_VALUES=512 / MAX_WORK budgets bind first (retained tokens <= 2*values, so 1024 covers every admissible document; mirror in sdk/strict-json.mjs MANIFEST_LIMITS.retainedTokens and re-run the 16,777,216-gas C-GAS-01 and 16-asset bind measurements), or retain the four non-identity fields only for entries whose name/path match the proposal (requires passing the declared identity into the parser). At minimum the 19-file ceiling must be documented and pre-checked in the SDK before payment.","line":26,"path":"src/libraries/ManifestJSON.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\n// Self-contained: only project sources. No forge-std is vendored in this repository, so the\n// test is a plain contract; a revert inside verify() fails the test, a clean return passes it.\nimport {RelayVerifier} from \"src/RelayVerifier.sol\";\nimport {RelayTypes as T} from \"src/RelayTypes.sol\";\nimport {Text} from \"src/libraries/Text.sol\";\n\ncontract RetainedTokenCapProofTest {\n    RelayVerifier internal verifier;\n\n    function setUp() public {\n        verifier = new RelayVerifier();\n    }\n\n    // A completed result listing `extras` ordinary produced files (each with the six standard\n    // descriptor keys) plus the proposal's declared Markdown output as the last entry.\n    function _result(uint256 extras) internal pure returns (bytes memory raw) {\n        raw = '{\"jobId\":\"job-many-files\",\"projectId\":\"project-a\",\"state\":\"completed\",\"files\":[';\n        for (uint256 i; i < extras; ++i) {\n            raw = bytes.concat(\n                raw,\n                '{\"name\":\"f',\n                bytes(Text.decimal(i)),\n                '\",\"path\":\"src/f',\n                bytes(Text.decimal(i)),\n                '.txt\",\"hash\":\"',\n                bytes(Text.hex32(sha256(abi.encode(i)))),\n                '\",\"mediaType\":\"text/plain\",\"bytes\":12,\"submissionHash\":\"',\n                bytes(Text.hex32(sha256(abi.encode(i + 1000)))),\n                '\"},'\n            );\n        }\n        raw = bytes.concat(\n            raw,\n            '{\"name\":\"main\",\"path\":\"artifacts/main.md\",\"hash\":\"',\n            bytes(Text.hex32(sha256(\"content\"))),\n            '\",\"mediaType\":\"text/markdown\",\"bytes\":64,\"submissionHash\":\"',\n            bytes(Text.hex32(sha256(\"submission\"))),\n            '\"}]}'\n        );\n    }\n\n    function _proposal() internal pure returns (T.Proposal memory p) {\n        p.profile = T.Profile.MarkdownCreate;\n        p.target = bytes32(uint256(1));\n        p.inputs = new bytes32[](0);\n        p.outputName = \"main\";\n        p.outputPath = \"artifacts/main.md\";\n        p.text = \"Perform the declared change.\";\n    }\n\n    /// 19 files (18 extras + declared) is accepted today: 9 root tokens + 19 * 13 = 256 retained tokens.\n    function test_nineteenFileResultBinds() public view {\n        bytes memory raw = _result(18);\n        require(raw.length < 32_768, \"below byte cap\");\n        (,, T.Asset[] memory next) = verifier.verify(raw, keccak256(raw), _proposal(), new T.Asset[](0), address(0xB), 1);\n        require(next.length == 1, \"one accepted asset\");\n    }\n\n    /// 20 files is 4,696 raw bytes, every entry well formed, the declared output unique, yet\n    /// verify() reverts Policy.Limit because ManifestJSON retains 13 tokens per file entry\n    /// and MAX_RETAINED_TOKENS is 256. A sponsor who paid for this recorded result can never bind it.\n    function test_twentyFileResultUnderFiveKilobytesBinds() public view {\n        bytes memory raw = _result(19);\n        require(raw.length < 5_000, \"below five kilobytes\");\n        (,, T.Asset[] memory next) = verifier.verify(raw, keccak256(raw), _proposal(), new T.Asset[](0), address(0xB), 1);\n        require(next.length == 1, \"one accepted asset\");\n        require(keccak256(bytes(next[0].name)) == keccak256(\"main\"), \"declared output accepted\");\n    }\n}","reproduction":"Fresh Branch from RelayFactory.createProject; propose MarkdownCreate target=0x01, outputName=\"main\", outputPath=\"artifacts/main.md\"; sponsor pays the exact price; Intake delivers onIntakeResult(requestId, keccak256(raw), uri) where raw is {\"jobId\":\"job-many-files\",\"projectId\":\"project-a\",\"state\":\"completed\",\"files\":[ 19 entries {\"name\":\"fN\",\"path\":\"src/fN.txt\",\"hash\":\"<64 hex>\",\"mediaType\":\"text/plain\",\"bytes\":12,\"submissionHash\":\"<64 hex>\"} , then the declared {\"name\":\"main\",\"path\":\"artifacts/main.md\",\"hash\":\"<64 hex>\",\"mediaType\":\"text/markdown\",\"bytes\":64,\"submissionHash\":\"<64 hex>\"} ]} (4,696 bytes). Expected: bind(raw, []) succeeds, revision 1, one accepted asset. Actual: RelayVerifier.verify reverts Policy.Limit() from ManifestJSON line 127 after 256 tokens; phase stays ResultRecorded; retry() and sponsor() revert Busy(). The same document with 18 extras (19 files, 4,466 bytes) binds. Measured with test/scratch/WorkBudgetSeam.t.sol (binary search: largest accepted extras = 18) and the attached proof (19 files PASS, 20 files FAIL: Limit()).","severity":"medium","snippet":"    uint256 internal constant MAX_RETAINED_TOKENS = 256;","title":"Retained-token cap strands a paid, conforming result once it lists 20 produced files (4.7 KB, far below the 32,768-byte envelope)"},{"citation":"resolved","description":"Boundary: the success callback from the compiled-in Intake. Assumption: the Intake's result URI is at most 1,024 bytes. Actual: a longer URI makes onIntakeResult revert inside the Intake's single delivery call; the Intake marks the request completed, the Branch never leaves Pending, and no function can move it (sponsor/retry/bind all revert Busy, onIntakeResult is single-shot). The resultHash that would have been recorded is lost with the fee. The repository test test_callbackUriAtLimitWithinOfficialStipendAndAboveStaysPending asserts this as intended, so it is reported as a documented liveness dependency on an external field whose production length is unverified (liveCompatibility NOT_RUN), not as a code defect. If the official Intake can emit URIs above 1,024 bytes, truncating the emitted event payload (or raising the bound within the 200,000-gas stipend) is the minimal change.","line":223,"path":"src/RelayBranch.sol","reproduction":"After sponsor() returns requestId R, call from Policy.INTAKE with 200,000 gas: onIntakeResult(R, keccak256(\"raw\"), uri) with uri = 1,025 bytes of 'u'. Expected (from the sponsor's view): result recorded. Actual: revert Policy.Limit(), phase remains Pending (2); a second delivery with 1,024 bytes succeeds only because the mock allows redelivery; the real Intake delivers once. See test/LaunchCompatibility.t.sol lines 123-143.","severity":"info","snippet":"        if (bytes(uri).length > 1024) revert Policy.Limit();","title":"Callback URI longer than 1,024 bytes makes the paid result undeliverable and leaves the Branch Pending forever"}],"hash":"42550de001fd3bf66d92b1b963a7a33f2f2cd23d7b7482a6b438e1febaea4c85","nodeId":"42d88394-feac-4290-ac45-0daebbcf8fd7","outcome":"completed","summary":"Findings file written and validated. The review is complete.\n\n**Result: one medium finding, one informational note, all 8 entry points covered (13 coverage rows), in `.imd-findings.json`.**\n\n**Medium: a conforming paid result with 20 produced files can never bind.** `ManifestJSON` retains the six standard descriptor keys for every entry of the `files` array, not just the declared output, so each file costs 13 retained tokens against `MAX_RETAINED_TOKENS = 256` at `src/libraries/ManifestJSON.sol:26`. The root costs 9, so 19 files hit exactly 256 and bind, while 20 files revert with `Policy.Limit` at only 4,696 raw bytes, far below the documented 32,768-byte envelope. The sponsor's fee is spent, the result is authenticated, and the Branch is stranded in ResultRecorded forever since `retry` and `sponsor` revert Busy. The repository's own evidence records real 17-file public envelopes, and no document discloses a file-count ceiling. The attached self-contained proof `test/scratch/RetainedTokenCapProof.t.sol` passes at 19 files and fails with `Limit()` at 20 on current code. Suggested minimal fix: raise the retained-token cap so the existing value and work budgets bind first, mirror it in the SDK, and re-measure the 16,777,216-gas regressions.\n\n**Info: callback URI over 1,024 bytes leaves the Branch Pending forever.** `src/RelayBranch.sol:223` reverts the single-shot success callback, which the suite asserts as intended. Reported as an external-input liveness dependency, not a defect.\n\n**What held in the math area.** Base64 overhead formula is a bounded ceiling division with no overflow. Size parsing caps at 10 digits before the uint32 cast. Hex, UTF-8 and escape decoders agree across `Text`, `_stringInto` and `_skipString`. Slot-reservation arithmetic in the encoder matches `Assets.validate` after replacement. Payment deltas are exact. Every static-analysis lead was traced and dismissed with a reason in the coverage rows. The baseline suite passed 169 of 169.\n\n**Not reached.** No live Intake behaviour was checked, so the real production URI length and file counts remain unverified, and the fix was not rehearsed against the gas ceiling since the review writes no source changes.","treeHash":null,"usage":{"cachedInputTokens":1798706,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":43382,"runtime":"claude","turns":37,"wallClockMs":1086325}},{"artifacts":[],"attempt":1,"bundleHash":"210824a1eb1dc23afc68848403693f795f0186f7e46fc7fb0c8bc5b9ee55f51e","device":"9fd410b500e3af05","findings":[],"hash":"44d8b208090a886a99ffdd4a7c5e618ced761e16804aec2eb666cba40b84f16a","nodeId":"63507761-1c51-42f6-bfec-38cfa4a01839","outcome":"completed","summary":"Added failure-path, fuzz, and stateful invariant tests under `test/release/`.\n\n- `forge build` passed.\n- All 175 Foundry tests passed with the required seed.\n- All 85 SDK tests passed.\n- Exact C-GAS-01 calldata replay used **13,427,365 gas**, below **16,777,216**.\n- Local launch rehearsal passed.\n\nNo contract or configuration changes. No public deployment performed; `productionReady=false` and live checks remain `NOT_RUN`.","treeHash":"38fa861960202eb26f3dcd3d080f44cdd9cb6ae7","usage":{"cachedInputTokens":4774528,"inputTokens":153442,"model":"gpt-6-astra","outputTokens":29245,"runtime":"codex","turns":7,"wallClockMs":970597}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1731fbfe0c4574fb","findings":[{"citation":"resolved","description":"config/release.json frozenBuild (sources at line 263, sourceIdToPath at line 316) freezes a 48-file clean compilation, but the combined tree now compiles 50 files: the independently accepted test/release/ExactGasRegression.t.sol and test/release/PurchaseAtomicityInvariant.t.sol (commit a1ef1d8, combined after the author's revision-1 re-freeze) are not in the frozen list. tools/compilation-context.mjs hashes every file in cache/solidity-files-cache.json and tools/check-release.mjs asserts deep equality with frozenBuild.sources and frozenBuild.compilation before it validates any artifact, so the repository's own release gate aborts with 'Complete clean compilation source drift' and never reaches the ABI/runtime/creation-hash and validateReleaseState checks. docs/validation/launch-packaging-v1/README.md (revision 1 table) records this check as PASS and launch.json notes say the compiler inputs 'are frozen in config/release.json'; on the tree as it stands neither statement holds. I verified separately that the deployable artifacts are unaffected: for RelayFactory/RelayBranch/RelayEncoder/RelayVerifier the clean-build runtime keccak, runtime size (21,195 / 12,876 / 11,498 / 14,138 bytes), creation-code hash, initcode size, ABI and compiler version all equal config/release.json, and every source in each contract's metadata is in the frozen list. So this is a reproducibility-evidence inconsistency, not a bytecode change, hence low. Minimal fix: re-run tools/sync-release.mjs (the project's re-freeze) on the final combined tree so frozenBuild.sources and sourceIdToPath include the two test/release files, confirm tools/check-release.mjs passes, and record it; the contract fingerprints need no change. Not a code defect in src/.","line":263,"path":"config/release.json","reproduction":"On this tree with no test/scratch files: `forge build --force` (one build-info), then `node tools/check-release.mjs`. Expected (per docs/validation/launch-packaging-v1/README.md revision 1 row 'tools/check-release.mjs: PASS'): exit 0. Actual: AssertionError 'Complete clean compilation source drift', diff shows actual sources 'test/release/ExactGasRegression.t.sol' 0x84379c34... and 'test/release/PurchaseAtomicityInvariant.t.sol' 0x532c5b62... absent from frozenBuild.sources (actual 50 files, frozen 48); frozenBuild.compilation.sourceIdToPath likewise differs. Independent artifact comparison (same build) shows all four contracts' runtime/creation/ABI fingerprints equal config/release.json.","severity":"low","snippet":"    \"sources\": {","title":"Release fingerprint gate (tools/check-release.mjs) fails on the combined tree: frozenBuild.sources omits the two accepted test/release sources"},{"citation":"resolved","description":"Re-checked this round: the state still reproduces (test/scratch/AdvisoryRecheck.t.sol test_zeroResultHashStrands passes on this tree). The author disputed a contract change as outside the strictly necessary packaging changes of this deployment order and disclosed the condition in docs/LIMITS.md ('Delivery conditions that leave a paid Branch without an exit') and ADAPTATION.md. Settled: reachable only from the trusted Intake writer delivering a status-0 completion with no result; same terminal outcome as the accepted design limit 7e8de817 (no refund, timeout, owner or forced unlock). Recorded as a trust assumption on the Intake, not a blocker.","line":225,"path":"src/RelayBranch.sol","reproduction":"Root Branch; propose(MarkdownCreate, target 1); sponsor(1, 10e18, []) -> Pending with request R; vm.prank(Policy.INTAKE); branch.onIntakeResult(R, bytes32(0), 'ipfs://x'). Actual: phase ResultRecorded; bind(F.documentResult(), []) reverts Policy.Invalid; retry reverts Busy; sponsor(1, ...) reverts Busy. Expected by the operations guide: a recorded result is bindable. Documented in LIMITS.md as terminal.","severity":"info","snippet":"        a.outcome = resultHash;","title":"Settled, disclosed design limit: onIntakeResult accepts resultHash == 0, producing a ResultRecorded phase that can never bind (prior id 4d120638)"},{"citation":"resolved","description":"Re-checked this round: still reproduces (test_longUriRevertsAndStaysPending: 1,025-byte URI under 200,000 gas -> revert, phase Pending; 4,096-byte failure payload under the same gas succeeds). The 1,024-byte callback URI is one of the candidate's reviewed budgets that this order says to preserve, and test/LaunchCompatibility.t.sol asserts the Pending outcome as intended; the author disclosed it in LIMITS.md/OPERATIONS.md/REVIEW.md. Settled as a documented liveness dependency on the trusted Intake's URI length; not a blocker.","line":223,"path":"src/RelayBranch.sol","reproduction":"After sponsor() returns R: vm.prank(Policy.INTAKE); address(branch).call{gas: 200_000}(abi.encodeCall(branch.onIntakeResult, (R, keccak256('raw'), <1,025 bytes 'u'>))) -> ok == false (Policy.Limit), phase() == Pending. Same gas, onIntakeFailure(R, 2, 'x', 0, 0, <4,096 bytes>) -> ok == true.","severity":"info","snippet":"        if (bytes(uri).length > 1024) revert Policy.Limit();","title":"Settled, disclosed design limit: success callback reverts above a 1,024-byte URI while the failure callback is unbounded; the single-delivery Intake then leaves the attempt Pending (prior id 8043b46c)"},{"citation":"resolved","description":"Re-checked this round: still reproduces (test_lowStipendLeavesPending: result callback fails under 55,000 gas and succeeds under 70,000; phase stays Pending after the failed delivery). The author declined to add a callbackGas() pre-check (new external dependency and revert path in the payment flow, outside this order's packaging scope) and disclosed the dependency in LIMITS.md with the instruction to read callbackGas() off chain before sponsoring. Settled as a trust assumption on the Intake operator, who can equally withhold completion; not a blocker. Merged earlier with audit_economics d6c8024d.","line":196,"path":"src/RelayBranch.sol","reproduction":"Root Branch Pending with request R and PRICE forwarded to the Intake treasury. vm.prank(Policy.INTAKE); address(branch).call{gas: 55_000}(abi.encodeCall(branch.onIntakeResult, (R, keccak256('raw'), 'ipfs://x/result.json'))) -> ok == false, phase Pending; identical call with 70,000 gas -> ok == true. Against the verified Intake, owner setCallbackGas(60_000) before a purchase gives the same single failed delivery.","severity":"info","snippet":"        requestId = intake_.requestWithFailure(","title":"Settled, disclosed trust assumption: Branch pays before the Intake callback stipend is known; an owner-lowered callbackGas below about 62k strands purchases (prior id b500a9e0)"},{"citation":"resolved","description":"Re-checked this round: still reproduces (test_refusedLocksBranchToRefusedProposal: after a status-1 refusal sponsor(other) reverts Busy, retry re-purchases the identical body with activeProposal unchanged, and a status-2 failure freezes the Branch so retry and sponsor revert Busy). This is the behaviour the deployment order mandates ('one active request', 'no forced unlock', no new authority) and OPERATIONS.md/REVIEW.md/LIMITS.md now state the permissionless-sponsor amplifier explicitly. Settled as a documented design limit for the owner's future scope decision; not a blocker. Merged earlier with audit_permissions 555e1bd8 and audit_economics 96c7b12c / 39301618.","line":165,"path":"src/RelayBranch.sol","reproduction":"Mallory propose(P1 target 1) -> 1; Alice propose(P2 HTMLCreate target 2) -> 2; sponsor(1, 10e18, []) -> Pending; writer intake.fail(R, 1, 'refused') -> Refused. sponsor(2, ...) reverts Busy; retry(10e18, []) succeeds charging the payer for P1 (activeProposal == 1); writer intake.fail(R2, 2, 'job_failed') -> Frozen; retry and sponsor(2, ...) revert Busy thereafter.","severity":"info","snippet":"        if (phase != T.Phase.Ready) revert Busy();","title":"Settled, mandated design limit: one permissionless sponsor's refused (status 1) or failed (status != 1) attempt locks or freezes the Branch for every other proposal (prior id 7ccd11b0)"}],"hash":"49b54b10c524be88d7134a76f1ceb1cd2b4719b535b5faf9b25c4d7a9157fa30","nodeId":"535722a9-9b89-479e-bf23-45d3c23b4159","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written with 5 findings and 12 coverage rows.\n\n**Prior medium finding (retained-token cap) is fixed.** `MAX_RETAINED_TOKENS` is now `2 * MAX_VALUES` and that is the only source change this round. Both attached proofs pass on the revised tree, including the 20-file bind. The cap is structural: a token is allocated only for a retained value or the key that introduces one, so the count cannot exceed twice the value budget. The full suite passes with 184 of 184 tests, the SDK suite passes with 86 of 86, and the exact C-GAS-01 bytes bind as a complete transaction below the 16,777,216 cap.\n\n**One new low finding: the release fingerprint gate fails on the combined tree.** The frozen source list in `config/release.json` has 48 files, but the tree now compiles 50 because the independent tester's two test files under test/release were combined in after the author's re-freeze. The project's own check aborts with \"Complete clean compilation source drift\" before validating artifacts, while the validation README reports it as PASS. I verified separately that every runtime hash, creation hash, size, ABI and compiler version of the four contracts matches the frozen values, so this is an evidence inconsistency rather than a bytecode change. The fix is to re-run the project's re-freeze tool on the final tree.\n\n**The four advisory items stay settled as disclosed limits.** I re-ran all four reproductions and each still reproduces, as the author also confirmed. Their dispute holds under this deployment order, which forbids substantive contract changes and mandates one active request with no forced unlock. Each is now disclosed in LIMITS.md. I recorded them at info severity as trust assumptions on the Intake and mandated design, not blockers.\n\n**Launch rehearsal holds.** A scratch probe deployed the three manifest contracts by CREATE2 on an empty chain with the manifest's static arguments, confirmed runtimes under 24,576 bytes with no reachable forbidden opcodes, and created a runtime Branch through the factory. The manifest has only the schema's keys, unique names and backward references.","treeHash":null,"usage":{"cachedInputTokens":2499674,"inputTokens":770,"model":"claude-fable-5-1","outputTokens":30466,"runtime":"claude","turns":36,"wallClockMs":764248}},{"artifacts":[],"attempt":1,"bundleHash":"2909d713fc28e990f557de5eee7e1ff2bc65196ae84539c905bc0406e55e9737","device":"9e51ef2afd7c2af8","findings":[],"hash":"70af53152493e0d7cfcc86ece1b58c9865e823d2098d7070926f6262615cabf4","nodeId":"be45b9b4-ba6f-4f8b-9635-0f50f964d592","outcome":"completed","summary":"The revision is complete. The reopened finding reproduced and is fixed; the four advisory findings are answered without contract changes.\n\n**What reproduced and what changed**\n\n- **Finding 16331cb9 (medium), fixed.** The reviewer's proof failed on the starting tree: a completed result listing 20 standard file entries reverted with the retained-token limit. In `src/libraries/ManifestJSON.sol` the cap is now twice the value budget, so it is structural and can no longer be the first limit a well-formed result reaches. The SDK constant, the release config and LIMITS.md mirror it. The proof passes on the result.\n- **Tests added.** The new file `test/ManifestRetainedTokens.t.sol` covers the twenty-file result as a complete Branch transaction and shows the work budget and value budget are now the binding limits. One SDK parity test was added. Standard six-key entries bind up to 50 files; the 51st is refused by the unchanged work budget.\n- **Advisory findings 4d120638, 8043b46c, b500a9e0, 7ccd11b0: reproduced, answered \"disputed\".** Each is a real but documented terminal condition that only the trusted Intake or the mandated single-active-request design can produce. Changing them would alter reviewed callback or payment semantics beyond this order's packaging scope. They are now disclosed together in LIMITS.md under a new \"Delivery conditions that leave a paid Branch without an exit\" section.\n\n**Verification on the final source**\n\n| Check | Result |\n| --- | --- |\n| forge test with the pinned fuzz seed | 174/174 pass |\n| SDK tests | 86/86 pass |\n| check-release after forced clean build and re-freeze | pass |\n| Bytecode policy and ABI check | pass, ABI unchanged |\n| Anvil bind transactions, 16-asset witness | 14/14 below 16,777,216 |\n| Exact C-GAS-01 input | 13,687,379 gas |\n\nThe larger token array adds about 260,000 gas per bind. The largest Foundry estimate is the budget-maximal mix at 14,779,323 gas.\n\n**One item deferred.** The deployment rehearsal passed every on-chain step, but its handoff importer authenticates the committed HEAD against frozen source hashes and this revision is uncommitted here. It stopped with \"Handoff sourceCommit differs from frozen source\" and must be re-run on the service's final commit. This is stated in ADAPTATION.md and the evidence README. No launch.json, no key, no broadcast, and no website step were produced.","treeHash":"89202f5233e53cc2e06e8afee95945eb72f5b398","usage":{"cachedInputTokens":5167804,"inputTokens":1198,"model":"claude-fable-5-1","outputTokens":47971,"runtime":"claude","turns":66,"wallClockMs":1639326}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ca075d17c94a854b","findings":[{"citation":"resolved","description":"Execution-trace / wrong-state finding. onIntakeResult records any digest from the Intake, including bytes32(0), and moves the branch to ResultRecorded. bind then requires keccak256(rawManifest) == a.outcome (src/RelayVerifier.sol:25), and no byte string has a zero keccak, so every bind reverts Invalid forever. Meanwhile sponsor and retry are gated on Ready / Refused and revert Busy, so the branch is permanently stuck exactly like Frozen, but it reports the phase that the operations guide (docs/OPERATIONS.md 'Authenticated result recorded: retrieve the original bytes ... and bind') and the UI treat as 'awaiting a gas-only bind'. Compare onIntakeFailure, which routes an unrecoverable delivery to Frozen explicitly. The attempt record also looks like a successful delivery (status 0, delivered true, outcome 0). Impact is limited to a mislabelled permanent state (no funds move, forks of accepted checkpoints still work), which is why this is low; the fixed-Intake trust assumption means only a misbehaving or buggy Intake delivery triggers it. Minimal fix that preserves the stipend-safe callback: in onIntakeResult, treat resultHash == 0 as an unrecoverable delivery (set phase = T.Phase.Frozen and emit FailureRecorded, or revert NotPending so the Intake delivery fails and the request stays Pending), so the ResultRecorded phase keeps its documented meaning that the recorded bytes are bindable.","line":225,"path":"src/RelayBranch.sol","reproduction":"State: fresh root Branch from RelayFactory.createProject, one proposal (MarkdownCreate, target 0x01, outputName 'main', outputPath 'artifacts/main.md'), sponsor(1, 10e18, []) -> Pending with requestId R. Input: the Intake address calls branch.onIntakeResult(R, bytes32(0), 'ipfs://x'). Actual: call succeeds, phase() == ResultRecorded (3), attempt(1).delivered == true, outcome == 0. Then branch.bind('{\"jobId\":\"j\",\"projectId\":\"p\",\"state\":\"completed\",\"files\":[]}', []) reverts Policy.Invalid (hash mismatch), bind('', []) reverts Policy.Invalid, sponsor(1, 10e18, []) reverts Busy, retry(10e18, []) reverts Busy: no transition out of ResultRecorded exists. Expected: a recorded result is bindable with its original bytes, or an unbindable delivery is classified as Frozen like onIntakeFailure does for status != 1. Verified with test/scratch/ZeroResultHash.t.sol (passes on current code, i.e. the stuck state is reproduced).","severity":"low","snippet":"        a.delivered = true;\n        a.outcome = resultHash;\n        phase = T.Phase.ResultRecorded;","title":"onIntakeResult accepts resultHash == 0, producing a ResultRecorded phase that can never bind and never exits"}],"hash":"a98b5ceb4e8ac00708f71b3c25a23a236d17757d3b86611e896492856ec266a5","nodeId":"40f6a464-3ad9-43fc-b52b-f5fe3ca88a62","outcome":"completed","summary":"Every real envelope in the fixtures carries name and path on each file entry, so that lead is closed. The review is complete and the findings file is in place.\n\n**Result: one low-severity finding, no blocking defects in the control-flow area.**\n\nThe findings record is at `.imd-findings.json` with one finding and twelve coverage rows, one per listed entry point plus the launch constructor policy, the periphery libraries, a read-only mainnet dependency check, and an honest \"unreached\" row.\n\n**The finding (low).** The Intake result callback records any digest it is handed, including zero, and moves the branch to ResultRecorded. No byte string hashes to zero, so bind reverts forever, and sponsor and retry are gated on other phases, so the branch is permanently stuck. That is the same outcome as Frozen, but under the phase the operations guide and UI treat as \"awaiting a gas-only bind\". The failure callback classifies unrecoverable deliveries as Frozen explicitly, so the fix is a one-line classification in `src/RelayBranch.sol` at the result callback. It is reproduced by `test/scratch/ZeroResultHash.t.sol`, which passes on current code because it asserts the stuck state. Only a misbehaving Intake delivery triggers it and no funds move, which is why it is low rather than medium.\n\n**What holds, and why.**\n- **Purchase path**: all admission checks precede the token pull, balance deltas are verified on both sides, Intake allowance is set then cleared and asserted zero, and the guard plus the callbacks' entered check stop synchronous callbacks and token reentrancy. The slither and aderyn reentrancy lines are on a pure encoder call and are not reachable.\n- **State machine**: one active request at a time. Refused only exits through an identical-body paid retry, and Frozen never exits. Both are documented design, not defects.\n- **Bind**: the witness, callback hash, declared-file uniqueness, job reuse, project identity and inherited-parent-project rules all trace correctly, and every effect lands in one transaction.\n- **Factory**: static two-address constructor with no external calls, dependencies checked at use, forks only from accepted revisions with an exact witness.\n- **Periphery**: the quoting, hex, path, conflict, sorted-replace and both JSON parsers were traced against the Pashov periphery checklist, including escape decoding, surrogates, overlong UTF-8 and per-depth duplicate keys. The static-analysis uninitialized-local and divide-before-multiply lines are intentional.\n- **Evidence**: the full suite passes with 169 tests, the C-GAS-01 32 KiB 16-asset bind shape is measured below the 16,777,216 cap, and read-only mainnet calls show code at both hardcoded dependencies, a 0.5 IMD price for both actions, and the request selector in the Intake runtime. Live profile checks remain NOT_RUN.\n\n**Not reached**: the SDK, CLI and frontend JavaScript, the Node deployment-rehearsal tooling, and the byte-level SHA-256 of the C-GAS-01 fixture. Note that forge-std is not vendored in this tree, so proof tests must use the project's `test/TestBase.sol` rather than the forge-std import the assignment template names.","treeHash":null,"usage":{"cachedInputTokens":1669540,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":44890,"runtime":"claude","turns":40,"wallClockMs":1014570}},{"artifacts":[],"attempt":1,"bundleHash":"80451410c6ef4d7f871d08ef22e07e8e5434b776435522c630b46c5df7765dd8","device":"aac006f7fc669006","findings":[],"hash":"aa2ac28c9adcd139d68076f8ce66dcbe23064f780f4a811f07455c8dfd059bf2","nodeId":"d77c5544-1c6f-485a-8e12-950f18d7f46c","outcome":"completed","summary":"I updated the notes in `launch.json`; the contract list and constructor arguments are the same as before. `launch.json` is the only file changed.\n\n**Why the notes changed:** they said the source was at commit `e1f964c`, but a later accepted revision (`f71783b`) changed `src/libraries/ManifestJSON.sol`. It raised the limit on stored JSON tokens from 256 to 1,024 (`MAX_RETAINED_TOKENS = 2 * MAX_VALUES`), which raised the gas cost of every `bind`. The notes now say:\n- **Source:** the final source commit is whatever commit the service makes of this tree, and the compiler inputs it must match are in `config/release.json`.\n- **Gas:** the C-GAS-01 regression is recorded at the re-measured 13,687,379 gas, still below 16,777,216.\n\n**Manifest (unchanged):**\n1. `RelayEncoder()`: no arguments.\n2. `RelayVerifier()`: no arguments.\n3. `RelayFactory(\"$contract:RelayEncoder\", \"$contract:RelayVerifier\")`: its constructor only stores the two addresses and checks they are nonzero and different. It makes no external call and needs no code at those addresses, so it deploys on an empty chain.\n\nNone of the contracts has an owner, admin or other privileged role, so there is no `$owner` argument.\n\n**Checks:**\n- **Manifest shape:** passes. It has only `kind`, `contracts` and `notes`; three unique names; every argument is a string; each `$contract:` reference points to an earlier contract; the notes are 2,424 characters (limit 4,000).\n- **Build and tests:** `forge build` succeeds, and `forge test` with the required fuzz seed passed 174 of 174.\n- **Deployment rehearsal:** passes. I ran the logic of `Contracts.protected.t.sol` with the real creation code on an empty chain 1: all three contracts deployed at their predicted addresses, `RelayFactory` received those addresses, every runtime is under the 24,576-byte limit, and none has a reachable DELEGATECALL, CALLCODE or SELFDESTRUCT. The repo has no forge-std, so I ran it against a minimal stand-in for the test helpers, not the original file. I could not run `Owners.protected.t.sol` because a file it imports (`floor/OwnerChecks.sol`) is not in this tree.\n\nThe official launch ID, transaction hash, receipt, deployed addresses, sender and verified source links don't exist yet; they will come only from the service's deployment handoff, so I left them out. Readiness stays `productionReady=false` and live checks stay `NOT_RUN`.","treeHash":"9a59526d5f4f6635c2296b37d04739d481670306","usage":{"cachedInputTokens":610100,"inputTokens":26,"model":"claude-opus-5-5","outputTokens":7955,"runtime":"claude","turns":13,"wallClockMs":558581}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fa8fc4653a9e883d","findings":[{"citation":"resolved","description":"ManifestJSON._childMode(3, key) retains name/path/hash/mediaType/bytes/submissionHash for EVERY entry of the files array, not only the declared output, and _object/_value allocate one retained token per retained key and per value (`if (p.count == MAX_RETAINED_TOKENS) revert Policy.Limit();` at lines 67 and 127). A standard file entry therefore costs 13 retained tokens and the root 9, so 9 + 19*13 = 256 is the last accepted shape: a result listing 20 files reverts Policy.Limit even though it is ~4.7 KB (envelope bound 32,768), every entry is well formed and the declared output is unique. The real plane lists every produced file (test/fixtures/MultiFileResult.sol shows nine keys per entry, of which six are retained) and the repository records real 17-file public envelopes binding locally, so a 20-file result is a realistic output. Because bind is the only exit from ResultRecorded and there is no refund, timeout or unlock, the sponsor's exact fee is spent, the Intake has recorded the result, and the Branch is permanently stranded; sponsor/retry revert Busy. The 19-file ceiling is not disclosed in README/LIMITS/REVIEW/OPERATIONS (LIMITS.md line 3 says only that extra files 'consume the same raw/complexity budgets'); only sdk/strict-json.mjs carries the constant. Merged: audit_math finding 8a7309b6. Minimal fix that preserves the design: raise MAX_RETAINED_TOKENS (retained tokens <= 2*values, so 1024 lets the existing MAX_VALUES=512 / MAX_WORK budgets bind first), mirror it in sdk/strict-json.mjs MANIFEST_LIMITS.retainedTokens, and re-run the C-GAS-01 and 16-asset bind measurements; alternatively retain the four non-identity fields only for the declared entry. At minimum the ceiling must be documented and pre-checked before payment.","line":26,"path":"src/libraries/ManifestJSON.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\n// Self-contained: only project sources. No forge-std is vendored in this repository, so the\n// test is a plain contract; a revert inside verify() fails the test, a clean return passes it.\nimport {RelayVerifier} from \"src/RelayVerifier.sol\";\nimport {RelayTypes as T} from \"src/RelayTypes.sol\";\nimport {Text} from \"src/libraries/Text.sol\";\n\ncontract RetainedTokenCapProofTest {\n    RelayVerifier internal verifier;\n\n    function setUp() public {\n        verifier = new RelayVerifier();\n    }\n\n    // A completed result listing `extras` ordinary produced files (each with the six standard\n    // descriptor keys) plus the proposal's declared Markdown output as the last entry.\n    function _result(uint256 extras) internal pure returns (bytes memory raw) {\n        raw = '{\"jobId\":\"job-many-files\",\"projectId\":\"project-a\",\"state\":\"completed\",\"files\":[';\n        for (uint256 i; i < extras; ++i) {\n            raw = bytes.concat(\n                raw,\n                '{\"name\":\"f',\n                bytes(Text.decimal(i)),\n                '\",\"path\":\"src/f',\n                bytes(Text.decimal(i)),\n                '.txt\",\"hash\":\"',\n                bytes(Text.hex32(sha256(abi.encode(i)))),\n                '\",\"mediaType\":\"text/plain\",\"bytes\":12,\"submissionHash\":\"',\n                bytes(Text.hex32(sha256(abi.encode(i + 1000)))),\n                '\"},'\n            );\n        }\n        raw = bytes.concat(\n            raw,\n            '{\"name\":\"main\",\"path\":\"artifacts/main.md\",\"hash\":\"',\n            bytes(Text.hex32(sha256(\"content\"))),\n            '\",\"mediaType\":\"text/markdown\",\"bytes\":64,\"submissionHash\":\"',\n            bytes(Text.hex32(sha256(\"submission\"))),\n            '\"}]}'\n        );\n    }\n\n    function _proposal() internal pure returns (T.Proposal memory p) {\n        p.profile = T.Profile.MarkdownCreate;\n        p.target = bytes32(uint256(1));\n        p.inputs = new bytes32[](0);\n        p.outputName = \"main\";\n        p.outputPath = \"artifacts/main.md\";\n        p.text = \"Perform the declared change.\";\n    }\n\n    /// 19 files (18 extras + declared) is accepted today: 9 root tokens + 19 * 13 = 256 retained tokens.\n    function test_nineteenFileResultBinds() public view {\n        bytes memory raw = _result(18);\n        require(raw.length < 32_768, \"below byte cap\");\n        (,, T.Asset[] memory next) = verifier.verify(raw, keccak256(raw), _proposal(), new T.Asset[](0), address(0xB), 1);\n        require(next.length == 1, \"one accepted asset\");\n    }\n\n    /// 20 files is 4,696 raw bytes, every entry well formed, the declared output unique, yet\n    /// verify() reverts Policy.Limit because ManifestJSON retains 13 tokens per file entry\n    /// and MAX_RETAINED_TOKENS is 256. A sponsor who paid for this recorded result can never bind it.\n    function test_twentyFileResultUnderFiveKilobytesBinds() public view {\n        bytes memory raw = _result(19);\n        require(raw.length < 5_000, \"below five kilobytes\");\n        (,, T.Asset[] memory next) = verifier.verify(raw, keccak256(raw), _proposal(), new T.Asset[](0), address(0xB), 1);\n        require(next.length == 1, \"one accepted asset\");\n        require(keccak256(bytes(next[0].name)) == keccak256(\"main\"), \"declared output accepted\");\n    }\n}","reproduction":"Fresh root Branch from RelayFactory.createProject; propose MarkdownCreate target=0x01, outputName=\"main\", outputPath=\"artifacts/main.md\"; sponsor pays the exact price; Intake delivers onIntakeResult(requestId, keccak256(raw), uri) where raw = {\"jobId\":\"job-many-files\",\"projectId\":\"project-a\",\"state\":\"completed\",\"files\":[19 entries {\"name\":\"fN\",\"path\":\"src/fN.txt\",\"hash\":\"<64 hex>\",\"mediaType\":\"text/plain\",\"bytes\":12,\"submissionHash\":\"<64 hex>\"}, then the declared {\"name\":\"main\",\"path\":\"artifacts/main.md\",\"hash\":\"<64 hex>\",\"mediaType\":\"text/markdown\",\"bytes\":64,\"submissionHash\":\"<64 hex>\"}]} (4,696 bytes). Expected: bind(raw, []) succeeds with one accepted asset. Actual: RelayVerifier.verify -> ManifestJSON.parse reverts Policy.Limit() at the 257th retained token; phase stays ResultRecorded; retry()/sponsor() revert Busy(). The same document with 18 extras (19 files) binds. Ran the attached proof on this tree: test_nineteenFileResultBinds PASS, test_twentyFileResultUnderFiveKilobytesBinds FAIL: Limit().","severity":"medium","snippet":"    uint256 internal constant MAX_RETAINED_TOKENS = 256;","title":"Retained-token cap (256) strands a paid, well-formed result once the plane lists 20 produced files"},{"citation":"resolved","description":"The success callback records any digest the Intake delivers, including bytes32(0), and moves the Branch to ResultRecorded. bind then requires keccak256(rawManifest) == a.outcome (src/RelayVerifier.sol line 25) and no byte string hashes to zero, so every bind reverts Policy.Invalid forever, while sponsor and retry revert Busy. The Branch is as dead as Frozen but reports the phase that docs/OPERATIONS.md and the UI treat as 'retrieve the bytes and bind', and the attempt record (status 0, delivered true, outcome 0) looks like a successful delivery. The verified Intake (complete(): `resultHash ... zero when there is none`) explicitly allows a zero resultHash on a status-0 completion, so the state is reachable from the trusted writer without any Branch-side classification. Same class, lower weight: onIntakeFailure accepts status 0 and records a Frozen attempt whose status field reads as 'result'. Only the fixed Intake/writer can trigger it, hence low. Merged: audit_flow 7e9b1921. Minimal fix: in onIntakeResult treat resultHash == 0 as an unrecoverable delivery (phase = Frozen and emit FailureRecorded) or revert NotPending so the delivery is marked undelivered.","line":225,"path":"src/RelayBranch.sol","reproduction":"test/scratch/ReviewRepro.t.sol test_zeroResultHashStrandsResultRecorded (passes on this tree, i.e. the stuck state reproduces): root Branch, propose(MarkdownCreate, target 1), sponsor(1, 10e18, []) -> Pending with request R; vm.prank(Policy.INTAKE); branch.onIntakeResult(R, bytes32(0), \"ipfs://x\"). Actual: call succeeds, phase() == ResultRecorded; bind(F.documentResult(), []) reverts Policy.Invalid; bind(\"\", []) reverts Policy.Invalid; sponsor(1, ...) reverts Busy; retry(10e18, []) reverts Busy. Expected: a recorded result is bindable with its original bytes, or an unbindable delivery is classified Frozen like onIntakeFailure does.","severity":"low","snippet":"        a.outcome = resultHash;","title":"onIntakeResult accepts resultHash == 0, producing a ResultRecorded phase that can never bind and never exits"},{"citation":"resolved","description":"onIntakeResult bounds the uri and reverts above 1,024 bytes; onIntakeFailure (line 230) never bounds its trailing bytes argument. The uri is only emitted (line 227), never stored or bound, so the bound protects only event gas under the 200,000-gas stipend. The verified mainnet Intake.complete sets `stored.completed = true` and then makes exactly one `call(stipend, target, ...)`, recording delivered=false on revert and never redelivering. A revert therefore converts a cosmetic limit into a permanent outcome: the fee is spent, the request is completed at the Intake, phase stays Pending, and no entry point can move the Branch (sponsor/retry/bind need another phase; callbacks need the undelivered active request, which is now unreachable). docs/OPERATIONS.md line 29 admits 'official documentation gives no universal maximum URI length'. Merged: audit_permissions ef5acff7 and audit_math 7322db65 (same root cause). Recorded as low: only the trusted Intake triggers it, but with an honest input. Minimal fix: record the hash and emit a truncated/hashed uri instead of reverting, or raise the bound within the measured stipend headroom.","line":223,"path":"src/RelayBranch.sol","reproduction":"test/scratch/ReviewRepro.t.sol test_longUriRevertsSuccessCallbackAndStaysPending (passes on this tree): after sponsor() returns request R, vm.prank(Policy.INTAKE); address(branch).call{gas: 200_000}(abi.encodeCall(branch.onIntakeResult, (R, keccak256(\"raw\"), <1,025 bytes of 'u'>))). Actual: ok == false (revert Policy.Limit()), phase() == Pending. The failure callback with a 4,096-byte trailing bytes argument under the same 200,000 gas succeeds. Expected from the sponsor's view: result hash recorded regardless of URI length, since the URI is not part of the binding. Repository test test/LaunchCompatibility.t.sol lines 123-143 asserts the same Pending outcome.","severity":"low","snippet":"        if (bytes(uri).length > 1024) revert Policy.Limit();","title":"Success callback reverts on a URI over 1,024 bytes while the failure callback accepts any payload; the real Intake delivers once, so one long honest URI leaves a paid attempt Pending forever"},{"citation":"resolved","description":"The verified mainnet Intake (0xa43e6F75ee006411F79Ac1C84120606C2330DE82) exposes `uint64 public callbackGas = 200_000` and `setCallbackGas(uint64) onlyOwner`, and complete() calls the Branch with exactly `call(stipend, ...)` once. Live read during this review: callbackGas() = 200000; owner() = 0x047F606fD5b2BaA5f5C6c4aB8958E45CB6B054B7; selectors 0x8fceb798 (setCallbackGas), 0xa10132ad (callbackGas) and 0x9a78c321 (requestWithFailure) are present in the deployed code. The Branch's onIntakeResult needs about 62,000 gas and onIntakeFailure about 61,300 (docs/LIMITS.md line 30), but _purchase forwards the full price (which the Intake forwards whole to payTo) without reading callbackGas() or otherwise bounding the stipend risk, so a stipend below the Branch's need is discovered only after payment, when the single callback runs out of gas and the Branch stays Pending forever. The repository nowhere mentions that the stipend is operator-settable. This is a trust assumption on the Intake operator (low), but it is a cheaply checkable dependency failure that strands sponsor funds. Merged: audit_economics d6c8024d. Minimal fix preserving the design: add `callbackGas()` to IIntake and in _purchase, before the first transfer, revert FeeExceeded if it is below a compiled constant above the measured maximum (e.g. 100_000); document the dependency.","line":196,"path":"src/RelayBranch.sol","reproduction":"test/scratch/ReviewRepro.t.sol test_lowStipendLeavesPending (passes on this tree): root Branch, propose MarkdownCreate, sponsor(1, 10e18, []) -> Pending, PRICE forwarded to the Intake treasury. vm.prank(Policy.INTAKE); address(branch).call{gas: 55_000}(abi.encodeCall(branch.onIntakeResult, (R, keccak256(\"raw\"), \"ipfs://x/result.json\"))) -> ok == false, phase() == Pending; the identical call with 70,000 gas succeeds. Against the real Intake: owner calls setCallbackGas(60_000); a sponsor buys; the writer's complete(R, 0, hash, uri, args) delivers with 60,000 gas, the callback runs out of gas, Completed(delivered=false) is emitted and the request is marked completed; the Branch stays Pending, bind/sponsor/retry revert Busy, the fee is spent.","severity":"low","snippet":"        requestId = intake_.requestWithFailure(","title":"Branch pays before checking the Intake callback stipend, which the Intake owner can lower below the ~62k gas the callbacks need, stranding every purchase made under it"},{"citation":"resolved","description":"sponsor() is permissionless and the only writer of activeProposal. Once the Intake answers the active attempt with onIntakeFailure(status=1) the phase becomes Refused (line 237) and the only state-changing exit is retry() (line 173 `if (phase != T.Phase.Refused) revert Busy();`), which re-purchases the identical body for activeProposal at the full price. sponsor() of any other proposal and bind() revert Busy for the rest of the Branch's life; a status != 1 failure (line 237) goes straight to Frozen with no exit at all. The asymmetry: the sponsor role is unprivileged and costs one job price (0.5 IMD per the repository's live price evidence), but its effect is Branch-wide and irreversible. A hostile sponsor only needs a proposal the plane will refuse or that fails at execution (the 1,024-byte request text is attacker-chosen) to end a Branch's public continuation; honest users are left paying for the attacker's body or forking, which loses the job-continuation head (a fork starts at job.open and must open a new Intake project, since IdentityMismatch forbids reusing the inherited project) and is impossible for a root Branch that has no accepted revision yet (fork requires at != 0 and resultHash != 0). The Intake's own documentation makes status 2 the transient outcome ('a panel that disagreed, a job that failed') yet it is the one with no retry, while the deterministic status-1 refusal is the one that may be paid for again. Related, not a defect: the same single slot lets a competing payer pre-empt another sponsor's proposal each round at one price per round (audit_economics 39301618). The deployment order mandates one active request and no forced unlock, and docs/OPERATIONS.md line 27 documents 'no alternate proposal after a refused attempt', so this is recorded as a documented design limit with an unprivileged amplifier, not a permission bypass. Merged: audit_permissions 555e1bd8, audit_economics 96c7b12c and 39301618. If the author wants the Branch to stay usable without changing payment, authentication or the single active request, the minimal scope decision is to let a Refused (and possibly Frozen) attempt be abandoned by a different explicitly paid proposal, recording the abandoned attempt.","line":165,"path":"src/RelayBranch.sol","reproduction":"test/scratch/ReviewRepro.t.sol test_refusedLocksBranchToRefusedProposal (passes on this tree, i.e. the lock reproduces): Mallory propose(P1 target 1) -> id 1, Alice propose(P2 target 2) -> id 2; sponsor(1, 10e18, []) -> Pending; writer intake.fail(R, 1, \"refused\") -> phase Refused. Alice sponsor(2, 10e18, []) reverts RelayBranch.Busy; bind(\"\", []) reverts Busy. Alice's only option retry(10e18, []) charges her PRICE for Mallory's body and keeps activeProposal == 1; writer intake.fail(R2, 2, \"job_failed\") -> phase Frozen; retry and sponsor(2, ...) revert Busy forever. Expected per README ('Anyone can create, propose, sponsor'): Alice can fund her own proposal after another sponsor's attempt is refused or fails. Actual: the Branch accepts only the refused body, then nothing.","severity":"low","snippet":"        if (phase != T.Phase.Ready) revert Busy();","title":"Any sponsor can permanently lock or freeze a public Branch for the price of one job: a status-1 refusal binds the Branch to the refused body, a status-2 failure freezes it, and no other proposal can e"}],"hash":"af886c2474d6a60b755d6e9626bd1ca72e22f4356fc501775f09051f714edbda","nodeId":"535722a9-9b89-479e-bf23-45d3c23b4159","outcome":"completed","summary":"The findings file is written and validated. Final state:\n\n**Outcome:** 5 findings kept, all reproduced on this tree, written to `.imd-findings.json` with an 11-row coverage record covering all 8 entry points plus three invariants. The full repository suite passes (175 tests), and the three launch contracts are within size limits with a schema-clean manifest.\n\n**Findings kept (merged from 8 specialist reports):**\n- **Medium.** The retained-token cap of 256 in the manifest parser strands a paid, well-formed result once the plane lists 20 files, even at 4.7 KB. The specialist's proof fails on this tree for exactly that reason and is attached. The ceiling is undocumented, and the repository's own evidence shows real 17-file envelopes.\n- **Low.** The success callback accepts a zero result hash and lands in a ResultRecorded phase that can never bind or exit. The verified Intake source explicitly allows a zero hash on a status-0 completion.\n- **Low.** A URI over 1,024 bytes reverts the success callback while the failure callback is unbounded. I confirmed from the verified Intake source that it marks the request completed and delivers exactly once, so the Branch stays Pending forever. Two specialist reports merged.\n- **Low.** The Branch pays before checking the Intake's stipend. I confirmed on mainnet that the stipend is owner-settable and currently 200,000, and that callbacks fail below roughly 62,000 gas.\n- **Low.** Any sponsor can lock a Branch to a refused body or freeze it for one job price. Three specialist reports merged into one documented-design finding with an unprivileged amplifier.\n\n**Dropped or folded:** the sponsor pre-emption race is noted inside the lock finding rather than kept as a defect, since no funds of the pre-empted party are lost and permissionless single-slot sponsorship is the mandated design.\n\n**Own pass:** I traced propose, fork, createProject, the purchase reconciliation, the reentrancy leads from static analysis, the parser's string and escape handling, and the launch manifest. Nothing additional reproduced as a defect. Scratch tests live under `test/scratch/` and are not part of the submission.","treeHash":null,"usage":{"cachedInputTokens":1254222,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":35222,"runtime":"claude","turns":32,"wallClockMs":625650}},{"artifacts":[],"attempt":1,"bundleHash":"c3b24bf0754eaef9dd8f5d087fef9cf18d360fdab6d5597e4456adfbbd975aca","device":"d5e40d018a0986f3","findings":[],"hash":"b34fcc87d6604a30b899e86713dae18a241773857626b757f92b3280af738817","nodeId":"be45b9b4-ba6f-4f8b-9635-0f50f964d592","outcome":"completed","summary":"The work is complete and committed. Final state, for a reader who only sees this message:\n\n**Outcome.** The imported STEPS source at commit c511aab was packaged for the contracts-only Ethereum launch with no constructor, ABI, policy, limit or authority change. The high audit finding reproduced and is fixed in the parser with tests. Everything builds and passes with the pinned configuration. Two commits sit on top of the import: the source commit 33426e6 and an evidence commit 843dab0 with identical sources.\n\n**What reproduced.** The audit's 32,768-byte alternating-escape result needed about 16.8M gas as a complete Branch.bind, above the 16,777,216 cap. Measurement also found a worse shape the audit did not name: retained strings of 999 plain ASCII bytes followed by one raw \"é\" reached about 17.3M gas with zero escapes, because the ASCII pre-scan walked the prefix and the general loop walked it again. The low finding reproduced as the documented design limit and was left unchanged, since the brief forbids recovery or timeout authority.\n\n**What changed, all driven by that finding.**\n- `src/libraries/ManifestJSON.sol`: the general loop now starts where the pre-scan stopped, so no byte is walked twice, and each simple escape that ends a raw segment is charged eight units of the existing work budget. Budget values and every other limit are unchanged.\n- `sdk/strict-json.mjs` mirrors the charge so the SDK refuses exactly what the verifier refuses.\n- `test/ManifestSegmentBudget.t.sol` adds 13 tests, including exact budget boundaries and full sixteen-asset bind transactions measured against the cap. One SDK parity test was added.\n- `config/release.json` fingerprints were re-frozen after a forced clean build. ADAPTATION.md has a new top section listing each change and why.\n\n**Checks on the final source.** Clean forced build and release check pass. Full contract suite with the verifier's fuzz seed: 169 of 169. SDK suite: 85 of 85. Bytecode policy and ABI checks pass. Real local transactions on Prague Anvil all stay below the cap, including the exact C-GAS-01 input with the recorded SHA-256, which now binds at 13,427,365 gas. The three-name deployment rehearsal passed on an empty local chain 1 at 10,266,963 gas. Evidence is in `docs/validation/launch-packaging-v1/`.\n\n**What is not in the tree, by design.** No launch.json, no key, broadcast, addresses, launch ID or handoff fields. Readiness stays productionReady false and live profiles NOT_RUN. The frontend export was not rebuilt, since no website step is in this order. The gas ceiling gate remains open for the service's own simulation, because finite measurements do not prove a universal bound.","treeHash":"af4d765cc3e758e5284d8950d4ced75ec79f6710","usage":{"cachedInputTokens":5538681,"inputTokens":1154,"model":"claude-fable-5-1","outputTokens":90661,"runtime":"claude","turns":74,"wallClockMs":1861299}},{"artifacts":[],"attempt":1,"bundleHash":"4a396b7c4e061cf456eabaebb90c2d84ecf129947185512407903536124f12a3","device":"f2101c240e0b52a9","findings":[],"hash":"b41a2b504d792e78f562f5f80ab3ee1221f5c771f3ba8c9796731261500ec226","nodeId":"63507761-1c51-42f6-bfec-38cfa4a01839","outcome":"completed","summary":"My earlier tests still pass against the latest source. The only things that had gone stale were the recorded measurements from the previous round, and I've refreshed those. No new contract defect turned up, so there is no `.imd-findings.json`. I changed only two files, both under `test/release/`, and committed nothing.\n\n**What changed in the source since my last round:** another contributor's commit `f71783b` raised `ManifestJSON.MAX_RETAINED_TOKENS` from 256 to `2 * MAX_VALUES` (1024). That changed the compiled RelayVerifier and RelayFactory, so my archived local replay evidence (code hashes, addresses, gas figures) no longer matched.\n\n**Checks run on the current source (Foundry 1.8.3, solc 0.8.26, using the verifier's fuzz seed):**\n- `forge build` passed.\n- `forge test`: 180 tests passed across 23 suites, with no failures or skips. This includes my C-GAS-01 exact-gas regression and my payment invariant over random call sequences.\n- SDK tests: 86 of 86 passed.\n- The local Anvil replay (chain ID 1, 16,777,216 gas limit) passed. The bind calldata is still byte-for-byte identical to the archived original, and the 32,768-byte result still matches SHA-256 `8768318d…de805`.\n\n**What the replay measured now:**\n\n| Measurement | Before | Now |\n| --- | --- | --- |\n| Complete `Branch.bind` transaction | 13,427,365 gas | 13,687,379 gas (still under 16,777,216) |\n| Three-contract deployment batch | 10,266,939 gas | 10,269,931 gas |\n| RelayVerifier code size | 14,124 bytes | 14,138 bytes |\n\nRelayFactory's code hash changed too, and so did the local addresses for both contracts.\n\n**Files updated:**\n- `test/release/local-replay-evidence.json` now holds the new measurements. Only the fields that changed differ.\n- `test/release/README.md` notes the source revision it was checked against and updates the gas figures and test counts.\n\nAll of this is local-only evidence. There is still no official launch ID, mainnet deployment transaction, verified source link or deployment handoff. `productionReady` stays `false`, and live profile checks stay `NOT_RUN`.","treeHash":"72d190720c13e32a63edf26887abafdf151623e5","usage":{"cachedInputTokens":588331,"inputTokens":28,"model":"claude-opus-5-5","outputTokens":5496,"runtime":"claude","turns":14,"wallClockMs":362433}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d5e40d018a0986f3","findings":[{"citation":"resolved","description":"The retained-string parser (ManifestJSON._stringInto) bounds work by raw bytes, value count, key bytes and decoded string size, but not by the number of escape-induced segment flushes. A string that alternates one plain byte with one simple escape (\"a\\n\" repeated) leaves the fast consecutive-escape loop after every escape, flushes a one-byte segment with MCOPY and re-enters the outer dispatch for every 3 raw bytes. For a 32,768-byte state:\"completed\" manifest with 11 extra produced files whose name/path strings are (\"a\\n\" x 500 + index) (each decoded 1,001 bytes <= MAX_RETAINED_STRING, 12 files, well under MAX_VALUES/MAX_WORK/MAX_TOTAL_KEY_BYTES), RelayVerifier.verify alone costs 10,901,894 gas versus 7,975,005 for the accepted C-GAS-01 shape (same 16-asset witness). Replayed as a real transaction on a local Prague anvil with the project's own tooling flow (tools/measure-retained-binding.mjs adapted), the complete Branch.bind transaction with gasLimit 16,777,216 REVERTS (out of gas); with a 50,000,000 limit it completes using 16,751,470 gas, i.e. the execution cannot fit once the intrinsic calldata cost (674,544 for the 46,116-byte calldata) is paid. The accepted C-GAS-01 case (SHA-256 8768318d...) was reproduced at 13,361,083 gas, and the README itself notes the finite cases do not prove a universal maximum; this is the counterexample. Consequence: the Intake has authenticated and recorded the result (phase ResultRecorded), the sponsor's fee is spent, bind is the only exit from ResultRecorded (RelayBranch.sol:243) and no bind transaction can be mined on Ethereum mainnet under EIP-7825. The Branch is dead for continuation; if this is the first result (revision 0) it cannot even be forked (RelayFactory.fork requires cp.resultHash != 0). The shape is controlled by whoever produces the result manifest (worker-chosen file names/paths), not by the sponsor. Quote escapes (\"a\\\"\") reach 16,421,134 gas, only 356,082 below the cap, so the margin is not specific to one escape byte. Fix direction for the adapter: charge the work budget per escape / per segment flush (or per outer-loop iteration) in _stringInto so that MAX_WORK actually bounds verifier gas below the ceiling, and re-measure the worst shape as a complete transaction; do not raise the transaction gas limit or project the raw bytes.","line":32,"path":"src/libraries/ManifestJSON.sol","reproduction":"State: RelayFactory/Encoder/Verifier deployed; one Branch with the 16-asset witness used by tools/measure-retained-binding.mjs (512-byte goal, 64-char names, 115-char .md paths, 64-char job ids). Proposal: MarkdownUpdate of asset key 1 with inputs [1], outputName/outputPath = current[0]. Manifest: {\"jobId\":\"metadata-limits-job\",\"projectId\":\"metadata-project\",\"state\":\"completed\",\"source\":[],\"files\":[<declared file>, then 10 files {\"name\":\"a\\na\\n...(500x)0\",\"path\":same}, then greedy shorter fills of the same pattern, then spaces to exactly 32,768 bytes]}. Sequence: propose -> sponsor (fee paid) -> Intake callback onIntakeResult(requestId, keccak256(raw), uri) -> phase == ResultRecorded -> eth_sendTransaction bind(raw, current) with gasLimit 16,777,216. Expected: bind succeeds (every declared budget is respected; C-GAS-01 acceptance claims 32,768-byte retained inputs bind below 16,777,216). Actual: transaction reverts out of gas; diagnostic with gasLimit 50,000,000 shows gasUsed 16,751,470; Branch stays in phase 3 (ResultRecorded) forever. Run the attached proof: forge test --match-path test/scratch/ProofBindGasCap.t.sol (fails with \"bind cannot execute within the 16,777,216 transaction gas cap\"). In-forge verifier-only comparison (same witness, 32,768-byte manifests): C-GAS-01 e-acute shape 7,975,005; a\\n alternating 10,901,894; \\\" + e-acute 10,283,085; a\\n\\n 9,105,835; \\u00e9 only 7,450,700.","severity":"high","snippet":"    uint256 internal constant MAX_WORK = 65_536;","title":"Well-formed completed result within every parser budget cannot be bound under the 16,777,216 transaction gas cap; Branch is permanently stuck in ResultRecorded"},{"citation":"resolved","description":"bind is the only transition out of ResultRecorded, and the Phase machine has no timeout, retry or fork escape for ResultRecorded, Pending (callback never arrives or reverts, e.g. uri > 1024 bytes at RelayBranch.sol:223) or Frozen. README.md and docs/PROTOCOL-OVERVIEW.md acknowledge this (no refund, no timeout, a malformed or oversized authenticated result can leave it unbindable), so it is a design limit rather than an undocumented defect; it is recorded here because it turns any verifier rejection (state != \"completed\", declared file missing or duplicated by name/path in the files array, jobId/projectId not a <=64-char identifier, bytes > profile maximum, a file entry without a \"name\" or \"path\" key, result > 32,768 bytes, or the gas case above) into permanent loss of the Branch, and RelayFactory.fork refuses checkpoints with resultHash == 0, so a project whose first paid result is rejected cannot be continued or forked at all. The adapter should keep this in the launch evidence and the website risk text; no contract change is required by the brief.","line":243,"path":"src/RelayBranch.sol","reproduction":"createProject(\"goal\"); propose(MarkdownCreate key 1, name \"main\", path \"artifacts/main.md\"); sponsor (fee paid); Intake delivers onIntakeResult with keccak256 of {\"jobId\":\"j\",\"projectId\":\"p\",\"state\":\"completed\",\"files\":[]} (a completed job that produced no files, as in test/fixtures/public/completed-0.json). Expected: some path to retry, refund or fork. Actual: bind reverts Policy.Invalid (no declared file), phase stays ResultRecorded; sponsor/retry/propose+sponsor revert Busy; factory.fork(branch, 0, ...) reverts InvalidCheckpoint because checkpoint(0).resultHash == 0; the fee is spent (test/PublicResults.t.sol demonstrates the never-settles behaviour).","severity":"low","snippet":"        if (phase != T.Phase.ResultRecorded) revert Busy();","title":"Authenticated but unbindable or undelivered results leave a paid Branch permanently stuck with no exit (documented, but blocks the revision-0 fork path)"}],"hash":"d1482287c6978c335ae24367d6370dfdcb3478977d31bb419610311d64979b96","nodeId":"c97136a8-1e21-4166-a4a7-9b95c0b2d0b4","outcome":"completed","summary":"The audit of the imported commit (c511aab) is complete, and the findings file is written. No tracked files were changed; only the ignored `.imd-findings.json` and `test/scratch/` were added.\n\n**Verdict: one blocking gas finding.** A well-formed, fully budget-compliant result manifest cannot be bound within the 16,777,216 transaction cap, so the C-GAS-01 repair is not a universal bound.\n\n**What I read.** All eleven source files in full: RelayBranch, RelayFactory, RelayEncoder, RelayVerifier, RelayTypes, IIntake, and the Policy, Assets, Text, StrictJSON and ManifestJSON libraries. I also read the mocks, test base, the retained-binding measurement tool, the local-repair README and measurements, and the pinned protected tests. Not reached: the SDK and frontend code, the `evidence.tar.xz` archive (no `xz` on this machine), and the real Intake contract semantics, which only exist on mainnet.\n\n**What I reproduced.**\n- Full suite: 156 of 156 tests pass under the pinned toolchain.\n- C-GAS-01: the project's own anvil tool binds the original 32,768-byte input, SHA-256 asserted by the tool, at 13,361,083 gas with the 16-asset witness.\n- Sizes: Factory runtime 21,195 bytes, Encoder 11,498, Verifier 13,999, Branch child 12,876; fork child initcode 30,875. All within EIP-170 and EIP-3860.\n- Reproducibility: runtime bytecode is byte-identical whether or not tests are in the compilation context, contrary to the README's remark about the Encoder fingerprint.\n- Opcode and owner policy: the repository's scan replicates the protected scanner exactly and passes; no contract has an owner, proxy, initializer, DELEGATECALL, CALLCODE or SELFDESTRUCT.\n\n**Finding 1, high.** `ManifestJSON._stringInto` bounds raw bytes, values, key bytes and decoded size, but not escape-induced segment flushes. Extra produced files named with alternating `a` and `\\n` make the verifier cost 10,901,894 gas against 7,975,005 for the accepted shape. As a real anvil transaction with the same witness, the bind reverts at the cap and only completes at 16,751,470 gas with a 50M limit. The Branch is then stuck in ResultRecorded with the fee spent, and a revision-0 project cannot be forked. The attached proof under `test/scratch/ProofBindGasCap.t.sol` fails on this code. It uses an inline Vm interface and inline mocks because forge-std is not present in this repository.\n\n**Finding 2, low.** The stuck-state design, where any verifier rejection or missing callback permanently kills a paid Branch, is documented in the README. I recorded it with a reproduction because it is what turns finding 1 into permanent loss.\n\n**Payer, payment, ordering, callback, file, checkpoint and fork invariants** held under inspection and the existing adversarial suites. I found no reentrancy, access-control, accounting or identity defect.\n\n**Next for the adapter.** Charge the parser's work budget per escape or per outer-loop iteration so `MAX_WORK` actually bounds verifier gas, then re-measure the worst shape as a complete transaction. Do not raise the gas limit or project the raw bytes.","treeHash":null,"usage":{"cachedInputTokens":2727296,"inputTokens":642,"model":"claude-fable-5-1","outputTokens":67068,"runtime":"claude","turns":59,"wallClockMs":1258695}}],"verification":[{"checks":[{"durationMs":129107,"exitCode":0,"name":"build","output":"Compiling 47 files with Solc 0.8.26\nSolc 0.8.26 finished in 129.01s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> test/RelayProfiles.t.sol:331:13:\n    |\n331 |             bytes memory raw = _manifest(Text.hex32(keccak256(abi.encode(i))), Policy.kind(profile), 32);\n    |             ^^^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n   --> test/RelayProfiles.t.sol:339:9:\n    |\n339 |         bytes memory raw = _manifest(Text.hex32(keccak256(\"new job\")), T.Kind.Markdown, 42);\n    |         ^^^^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":18737,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/IntakeCompatibility.t.sol:IntakeCompatibilityTest\n[PASS] test_currentCatalogShapeAndOutputNamespaceAreEncoded() (gas: 6964887)\n[PASS] test_legacyDescriptorRemainsExactAndMigrationRequiresExplicitCanonicalUpdate() (gas: 4425603)\n[PASS] test_legacyHTMLCannotCreateSecondHTMLSlotAndExplicitUpdateMigrates() (gas: 4759435)\n[PASS] test_namesRequireInitialLetterButHistoricalNamesRemainReadable() (gas: 3302403)\n[PASS] test_oldOutputNamespaceRejectedBeforePayment() (gas: 273419)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 27.88ms (26.38ms CPU time)\n\nRan 1 test for test/PublicResults.t.sol:PublicResultsTest\n[PASS] test_exactAuthenticatedPublicZeroFileResultsNeverSettleOrRebuy() (gas: 19886146)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 28.41ms (25.40ms CPU time)\n\nRan 2 tests for test/CrossLanguage.t.sol:CrossLanguageTest\n[PASS] test_sdkCalldataActuallyCreatesBranchWithoutPayment() (gas: 2871398)\n[PASS] test_sdkCanonicalWitnessMatchesSolidity() (gas: 504415)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 45.95ms (1.64ms CPU time)\n\nRan 5 tests for test/MultiFileResults.t.sol:MultiFileResultsTest\n[PASS] test_changingEvenIgnoredFileBytesCannotBindOrBuyAgain() (gas: 5733032)\n[PASS] test_declaredOutputAtBeginningOrEndOfFourAndSeventeenFiles() (gas: 8716113)\n[PASS] test_duplicateOutputNamePathOrExactMatchIsAmbiguous() (gas: 5697513)\n[PASS] test_exactObservedTwoFileResultBindsDeclaredOutputAndForks() (gas: 6443198)\n[PASS] test_invalidExtraJSONAndRetainedBoundsStillReject() (gas: 2560217)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 68.26ms (66.37ms CPU time)\n\nRan 9 tests for test/RelayHistory.t.sol:RelayHistoryTest\n[PASS] test_badBindingPreservesResultThenCorrectWitnessWorksWithoutPurchase() (gas: 6743542)\n[PASS] test_childCannotBindParentsProjectAsOwn() (gas: 9374123)\n[PASS] test_forkCannotAuthenticateFakeParentLatestWitnessOrForgedProvenance() (gas: 6774606)\n[PASS] test_forkChosenHistoricalCheckpointStartsOwnProjectAndPayer() (gas: 18252558)\n[PASS] test_forkIsAllowedWhileParentPendingOrFrozen() (gas: 11736004)\n[PASS] test_htmlImageHtmlLatestJobAndOlderSelectedInputs() (gas: 27069914)\n[PASS] test_projectMismatchCannotOverwriteCheckpoint() (gas: 7223796)\n[PASS] test_removedInitializerCannotChangeAuthorityEvenForFactory() (gas: 139171)\n[PASS] test_reusedJobCannotCreateNewRevision() (gas: 6303754)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 90.09ms (88.68ms CPU time)\n\nRan 5 tests for test/adversarial/ContinuationSpec.t.sol:ContinuationSpecTest\n[PASS] test_checkpointPreimageBindsChainFactoryBranchPolicyRevisionAndSource() (gas: 9316712)\n[PASS] test_currentProposalsSelectableInEitherOrderAndLosingSponsorPaysNothing() (gas: 9133908)\n[PASS] test_everyWitnessFieldAuthenticatedForSponsorBindAndHistoricalFork() (gas: 9955163)\n[PASS] test_fiveRootRoundsTwoSponsorsHistoricalForkAndTwoChildRounds() (gas: 44590786)\n[PASS] test_foreignFactoryAndUnregisteredLookalikeCannotForgeHistoricalFork() (gas: 6260449)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 98.23ms (95.83ms CPU time)\n\nRan 13 tests for test/RelayMappingRegression.t.sol:RelayMappingRegressionTest\n[PASS] test_createRejectsExistingNameEvenWhenPathAndSlotDifferBeforePayment() (gas: 3186564)\n[PASS] test_createRejectsExistingPathEvenWhenNameAndSlotDifferBeforePayment() (gas: 3191092)\n[PASS] test_distLikeNamesAndNestedNonWebsiteDistDirectoryRemainAllowed() (gas: 1676948)\n[PASS] test_historicalForkKeepsSourceProvenanceAndCanUpdateInheritedSlot() (gas: 8127282)\n[PASS] test_legacyIndependentDescriptorsStayReadableButCollidingUpdateIsRejected() (gas: 3542557)\n[PASS] test_markdownAndImageCannotWriteAnyTopLevelDistDescendant() (gas: 746559)\n[PASS] test_namesCannotCollideAcrossDifferentAssetKinds() (gas: 3190052)\n[PASS] test_pathAncestorCannotReplaceAnExistingDirectoryWithFileBeforePayment() (gas: 5684530)\n[PASS] test_pathAncestorCollisionWithOtherSlotAlsoRejectsUpdates() (gas: 3322581)\n[PASS] test_pathCommonDirectoriesAndNonBoundaryPrefixesAreAllowed() (gas: 4232571)\n[PASS] test_pathDescendantCannotTreatAnExistingFileAsDirectoryBeforePayment() (gas: 3194702)\n[PASS] test_secondHtmlSlotRejectsFixedPathCollision() (gas: 6180713)\n[PASS] test_uniqueCreateAndUpdatePreserveOtherAssetProvenance() (gas: 13675407)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 102.06ms (100.40ms CPU time)\n\nRan 15 tests for test/StrictManifest.t.sol:StrictManifestTest\n[PASS] testFuzz_asciiJSONQuoteDecodeRoundTrip(bytes32,uint8) (runs: 1000, μ: 275046, ~: 138192)\n[PASS] testFuzz_decodedDuplicateKeyAlwaysRejected(uint8) (runs: 1000, μ: 77950, ~: 77933)\n[PASS] test_actualFileHashesAndManifestKeccakAreDistinct() (gas: 447728)\n[PASS] test_boundedLargeManifestMeasurement() (gas: 5049071)\n[PASS] test_onlyDeclaredFilesNotSourceOrGitMetadataSupplyAcceptedFile() (gas: 4148207)\n[PASS] test_parserBoundsManifestStringDepthMembersAndTokens() (gas: 2643565)\n[PASS] test_rejectDuplicateKeysIncludingDecodedEscapesAtEveryDepth() (gas: 5852323)\n[PASS] test_rejectEmptyOrMalformedExtraFileEntries() (gas: 3905093)\n[PASS] test_rejectIncompleteWrongIdentityTypesAndWrongFileTypes() (gas: 13253919)\n[PASS] test_rejectInvalidUTF8UnicodeSurrogatesAndNoncharacters() (gas: 871715)\n[PASS] test_rejectPathsTraversalHiddenURLAbsoluteAndDecodedControl() (gas: 20537073)\n[PASS] test_rejectTrailingAndMalformedJSON() (gas: 1235180)\n[PASS] test_rejectZeroOversizedNonIntegerAndStringFileBytes() (gas: 15406077)\n[PASS] test_validUTF8EscapesAndSurrogatePairsDecodeExactly() (gas: 1594868)\n[PASS] test_whitespaceIsLegalButDigestIsOverExactRawBytes() (gas: 463327)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 1.01s (1.09s CPU time)\n\nRan 14 tests for test/RelayProfiles.t.sol:RelayProfilesTest\n[PASS] test_capacityEndToEndSixteenAssetsThenUpdate() (gas: 91718152)\n[PASS] test_htmlImagesPerFileAggregateAndBase64OverheadBounds() (gas: 1375271)\n[PASS] test_imageReferencesAndMarkdownImageInputsDisabled() (gas: 3390159)\n[PASS] test_invalidTextAndCanonicalWitnessRejectBeforePayment() (gas: 346980)\n[PASS] test_jsonEscapingCannotInjectRuntimeFields() (gas: 1027576)\n[PASS] test_maximumCompleteBindingASCIIFitsGasBudget() (gas: 227195804)\n[PASS] test_maximumCompleteBindingEscapedUnicodeFitsGasBudget() (gas: 251560161)\n[PASS] test_maximumCompleteBindingWideObjectsFitsGasBudget() (gas: 256251480)\n[PASS] test_measureMaximumWitnessAndLargeManifestTogether() (gas: 14174902)\n[PASS] test_publishDisabledAndOutputMappingFixedBeforePayment() (gas: 360429)\n[PASS] test_requestBodyUTF8ByteLimitCheckedBeforePayment() (gas: 6269331)\n[PASS] test_reserveEachEnabledTypeAndExistingSlotsUpdatableAtCapacity() (gas: 4280279)\n[PASS] test_selectedInputsMustBeCurrentSortedUniqueAndWithinEight() (gas: 10490710)\n[PASS] test_updateTargetMandatoryCreateCannotOverwriteAndRenameDisabled() (gas: 3865826)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 1.04s (1.71s CPU time)\n\nRan 13 tests for test/ManifestSegmentBudget.t.sol:ManifestSegmentBudgetTest\n[PASS] test_asciiPrefixBeforeEscapeOrScalarDecodesExactly() (gas: 2318812)\n[PASS] test_asciiPrefixKeysStillDetectDuplicates() (gas: 489087)\n[PASS] test_asciiPrefixStillCountsTowardRetainedLimit() (gas: 1848363)\n[PASS] test_auditAlternatingEscapeShapeIsRejectedByBudgetNotGas() (gas: 200501187)\n[PASS] test_bindAsciiPrefixThenRawScalarWithFullWitness() (gas: 201477242)\n[PASS] test_bindAsciiPrefixThenSimpleEscapeWithFullWitness() (gas: 201488101)\n[PASS] test_bindAsciiPrefixThenUnicodeEscapeWithFullWitness() (gas: 201486297)\n[PASS] test_bindBudgetedAlternatingEscapesWithFullWitness() (gas: 185072031)\n[PASS] test_bindMaximumBudgetedSegmentFlushesWithFullWitness() (gas: 200590728)\n[PASS] test_bindOriginalCGas01ShapeWithFullWitnessBelowCap() (gas: 202899651)\n[PASS] test_consecutiveSimpleEscapesAreChargedOnlyOnce() (gas: 31602324)\n[PASS] test_segmentFlushBudgetAcceptsBoundaryRejectsOneMore() (gas: 17584038)\n[PASS] test_unicodeEscapesAndIgnoredStringsAreNotCharged() (gas: 157917183)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 1.07s (2.74s CPU time)\n\nRan 5 tests for test/adversarial/ProfileBoundarySpec.t.sol:ProfileBoundarySpecTest\n[PASS] testFuzz_htmlBase64RoundingAndOneByteOverTheKnownInputBudget(uint32) (runs: 1000, μ: 992660, ~: 992685)\n[PASS] test_realEightAssetWitnessExact16384ByteRequestAndOneByteOverRejectedBeforePayment() (gas: 138060866)\n[PASS] test_slotReservationInputCountAndFullCapacityUpdateBoundaries() (gas: 9075210)\n[PASS] test_unsafePathComponentsInvalidUtf8AndDisabledModesRejectWithoutSpending() (gas: 2664969)\n[PASS] test_utf8TextLimitsCountBytesAndOutputMappingLengthsAreBounded() (gas: 32437589)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.07s (1.33s CPU time)\n\nRan 7 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] test_badPolicyAndBadInputsFailBeforeCreateAndRegistration() (gas: 179829)\n[PASS] test_callbackUriAtLimitWithinOfficialStipendAndAboveStaysPending() (gas: 2261838)\n[PASS] test_constructorRejectsZeroAndDuplicateDependencies() (gas: 12577)\n[PASS] test_directChildrenAreCompleteIndependentPayers() (gas: 6867385)\n[PASS] test_launchAndRuntimeChildPassProtectedOpcodeRule() (gas: 21033043)\n[PASS] test_namedBatchBackwardReferencesThenRuntimeChild() (gas: 13443717)\n[PASS] test_staticFactoryConstructorAcceptsEmptyDependenciesWithoutCallsOrChildren() (gas: 53669)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.07s (47.33ms CPU time)\n\nRan 14 tests for test/adversarial/PaymentSpec.t.sol:PaymentSpecTest\n[PASS] testFuzz_priceChangeCapAndDonationsConserveEveryWei(uint96,uint64) (runs: 1000, μ: 3011897, ~: 3012380)\n[PASS] testFuzz_unknownFailureFrozenDespiteNewProposalsAndTime(uint8) (runs: 1000, μ: 3334928, ~: 3334930)\n[PASS] test_continuationRetryRetainsParentAndFullSelectedSnapshot() (gas: 8236262)\n[PASS] test_exactWholeBalanceAndMaxFeeDoesNotOvercharge() (gas: 2250898)\n[PASS] test_insufficientApprovalAndBalanceRollbackBeforeAnyReceipt() (gas: 3490587)\n[PASS] test_intakeRevertPartialPullZeroIdAndClearFailureRollbackAllEffects() (gas: 7692767)\n[PASS] test_malformedResultIsRecordedWithoutParsingThenBadBindingPreservesIt() (gas: 2697688)\n[PASS] test_maximumCallbackURIWithinStipendAndOversizeFailureStaysPending() (gas: 6467337)\n[PASS] test_missingCallbackHasNoTimeoutButAuthenticLateCallbackStillWorks() (gas: 3227207)\n[PASS] test_reentrancyAtTransferApprovalAndIntakeCannotProposeOrBuyAgain() (gas: 13300793)\n[PASS] test_refusalCannotSubstituteProposalAndRetryRacesCostOnlyWinner() (gas: 6139693)\n[PASS] test_reusedIntakeRequestIdOnRetryCannotOverwriteAttemptOrDoubleCharge() (gas: 4586111)\n[PASS] test_spoofForeignCrossBranchAndReplayCallbacksCannotSettleOwnRequest() (gas: 8657651)\n[PASS] test_synchronousIntakeResultAndFailureCannotSettlePurchasingState() (gas: 4024590)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 1.07s (1.84s CPU time)\n\nRan 6 tests for test/MetadataScannerDifferential.t.sol:MetadataScannerDifferentialTest\n[PASS] testFuzz_ArbitraryRawString(bytes32,bytes32) (runs: 256, μ: 393649, ~: 391620)\n[PASS] testFuzz_RawUnicode(uint32) (runs: 256, μ: 396026, ~: 399168)\n[PASS] testFuzz_UnicodeEscape(uint16,uint16) (runs: 256, μ: 413515, ~: 414221)\n[PASS] test_ControlsInvalidHexAndSurrogates() (gas: 6713765)\n[PASS] test_MixedRawAndEscapedUnicode() (gas: 2435015)\n[PASS] test_RetainedASCIICopyAtWordBoundaries() (gas: 10834619)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.07s (474.97ms CPU time)\n\nRan 13 tests for test/RelayPayments.t.sol:RelayPaymentsTest\n[PASS] testFuzz_exactDynamicFeeConservesBalances(uint96) (runs: 1000, μ: 2013455, ~: 2013424)\n[PASS] testFuzz_nonRefusalFailureAlwaysFreezes(uint8) (runs: 1000, μ: 2191654, ~: 2191655)\n[PASS] test_callbacksAuthenticateSenderOwnRequestAndSingleDelivery() (gas: 2258915)\n[PASS] test_creationAndProposalsDoNotPurchaseOrMoveAnchor() (gas: 3609551)\n[PASS] test_dynamicFeeBranchPayerExactBodyAndSelectors() (gas: 2485141)\n[PASS] test_feeOnTransferSenderTaxFalseAndPartialPullRevertAtomically() (gas: 3683362)\n[PASS] test_foreignIntakeRequestCannotSettleBranch() (gas: 2291558)\n[PASS] test_missingCallbackStaysPendingIndefinitely() (gas: 2122727)\n[PASS] test_noReturnTokenAndStickyAllowanceCleared() (gas: 2016329)\n[PASS] test_refusedOnlyExplicitIdenticalRetryWithNewReceipt() (gas: 5281228)\n[PASS] test_stipendCallbackOnlyRecordsAndBindingIsPermissionless() (gas: 3028585)\n[PASS] test_tokenReentrancyAndSynchronousCallbackAreRejected() (gas: 3197393)\n[PASS] test_zeroUnknownProposalFeeCapAndUnpricedRejectBeforeTransfer() (gas: 1663610)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 1.07s (1.99s CPU time)\n\nRan 11 tests for test/adversarial/ManifestSpec.t.sol:ManifestSpecTest\n[PASS] testFuzz_nonWhitespaceTrailingByteAlwaysRejected(uint8) (runs: 1000, μ: 72226, ~: 72227)\n[PASS] testFuzz_unicodeScalarEscapesDecodeAndDuplicateKeysReject(uint32) (runs: 1000, μ: 243756, ~: 242596)\n[PASS] test_callbackDigestBindsWhitespaceAndKeyOrderOfOriginalBytes() (gas: 3568304)\n[PASS] test_exactDepthMemberKeyAndTokenBoundaries() (gas: 4652769)\n[PASS] test_exactManifestAndStringByteLimitsAcceptBoundaryRejectOneMore() (gas: 15285661)\n[PASS] test_fileSizeIntegerGrammarAndAllProfileDeclaredCaps() (gas: 23964974)\n[PASS] test_hashEncodingTypeWidthNonhexAndZeroAreCheckedForBothDigests() (gas: 99413604)\n[PASS] test_identityLengthDecodedFieldsAndEmptyAcceptedFiles() (gas: 8505003)\n[PASS] test_manifestRejectionsKeepRecordedDigestAndOldHistory() (gas: 110336568)\n[PASS] test_projectSwitchAndHistoricalJobReplayPreservePreviousCheckpoint() (gas: 19277773)\n[PASS] test_sourceAndLaterGitMetadataNeverReplaceAcceptedFilesDescriptor() (gas: 3647342)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 1.07s (1.53s CPU time)\n\nRan 21 tests for test/ManifestEnvelopeRegression.t.sol:ManifestEnvelopeRegressionTest\n[PASS] test_bind33ActualSourceDescriptorsWithoutAnotherPurchase() (gas: 9869743)\n[PASS] test_bind33StructuredSourceEntriesWithoutAnotherPurchase() (gas: 5637779)\n[PASS] test_bindLongMetadataOnTheAcceptedFileWithoutAnotherPurchase() (gas: 4950120)\n[PASS] test_bindMaximumEscapedKeyBytesWithFullWitness() (gas: 247742772)\n[PASS] test_bindMaximumIgnoredNumberWithFullWitness() (gas: 184642766)\n[PASS] test_bindMaximumMetadataComplexityWithFullWitness() (gas: 197167419)\n[PASS] test_bindMaximumMetadataValuesAndUnicodeWithFullWitness() (gas: 201969624)\n[PASS] test_bindMaximumRetainedEscapedSurrogatesWithFullWitness() (gas: 185404023)\n[PASS] test_bindMaximumRetainedEscapedUtf8WithFullWitness() (gas: 187986071)\n[PASS] test_bindMaximumRetainedRawUtf8FourByteWithFullWitness() (gas: 183804732)\n[PASS] test_bindMaximumRetainedRawUtf8ThreeByteWithFullWitness() (gas: 184806019)\n[PASS] test_bindMaximumRetainedRawUtf8TwoByteWithFullWitness() (gas: 185822673)\n[PASS] test_bindMaximumRetainedSimpleEscapesWithFullWitness() (gas: 189126914)\n[PASS] test_bindMaximumWhitespaceWithFullWitness() (gas: 174492294)\n[PASS] test_bindMetadataBeyond8192BytesWithoutAnotherPurchase() (gas: 9051801)\n[PASS] test_exactPreviouslyObservedIMDResultBindsWithoutReserialization() (gas: 3494451)\n[PASS] test_invalidIgnoredMetadataCannotHideBehindProjection() (gas: 4480194)\n[PASS] test_longIgnoredStringStillRejectsLateInvalidUtf8AndDuplicateKeys() (gas: 20271255)\n[PASS] test_manifestAggregateKeyBudgetAccepts2048Rejects2049() (gas: 3594717)\n[PASS] test_manifestValueBudgetAccepts512Rejects513() (gas: 5813174)\n[PASS] test_wrongHashStillRejectsProjectedManifest() (gas: 1320600)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 1.07s (4.16s CPU time)\n\nRan 7 tests for test/ManifestStringRegression.t.sol:ManifestStringRegressionTest\n[PASS] testFuzz_retainedArbitraryBytesMatchReference(bytes32,uint8) (runs: 1000, μ: 172040, ~: 171913)\n[PASS] testFuzz_retainedQuotedAsciiMatchesReference(bytes32,uint8) (runs: 1000, μ: 573812, ~: 371120)\n[PASS] testFuzz_validScalarRawAndEscapeMatchReference(uint32,uint8) (runs: 1000, μ: 719046, ~: 704009)\n[PASS] test_mixedRawEscapedScalarsAndSimpleEscapesDecodeExactly() (gas: 262922)\n[PASS] test_rawAndEscapedUnicodeKeysStillDetectDuplicates() (gas: 225974)\n[PASS] test_retainedDecodedByteLimitAccepts1024Rejects1025() (gas: 2746257)\n[PASS] test_retainedInvalidUnicodeAndEscapesReject() (gas: 2941178)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.07s (3.23s CPU time)\n\nRan 1 test for test/RelayInvariant.t.sol:RelayInvariantTest\n[PASS] invariant_conservationAndPermanentHistory() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| RelayHandler | bind         | 1358  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | fail         | 1347  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | propose      | 1372  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | recordResult | 1345  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | retry        | 1387  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | sponsor      | 1383  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.08s (3.08s CPU time)\n\nRan 2 tests for test/adversarial/StateMachineSpec.t.sol:StateMachineSpecTest\n[PASS] invariant_modelFeesReceiptsAssetsAndPermanentCheckpoints() (runs: 256, calls: 24576, reverts: 0)\n\n╭------------------+-----------------+-------+---------+----------╮\n| Contract         | Selector        | Calls | Reverts | Discards |\n+=================================================================+\n| SpecStateHandler | advanceTime     | 2453  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | bind            | 2390  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | donate          | 2424  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | fail            | 2446  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | forkHistory     | 2398  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | hostileCallback | 2430  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | propose         | 2485  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | purchase        | 2505  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | recordResult    | 2512  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | retry           | 2533  | 0       | 0        |\n╰------------------+-----------------+-------+---------+----------╯\n\n[PASS] test_modelExercisesRefusalRetryChildContinuationAndHistoricalFork() (gas: 26033338)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 18.65s (18.64s CPU time)\n\nRan 20 test suites in 18.65s (33.90s CPU time): 169 tests passed, 0 failed, 0 skipped (169 total tests)\n","passed":true},{"durationMs":172,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"RelayBranch.bind(bytes,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.onIntakeFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"RelayBranch.onIntakeResult(bytes32,bytes32,string)\",\"RelayBranch.propose((bytes32,uint8,bytes32,bytes32[],string,string,string,bool),(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.retry(uint256,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.sponsor(uint256,uint256,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayFactory.createProject(string)\",\"RelayFactory.fork(address,uint64,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[],string)\"],\"files\":{\".gitignore\":7,\"ADAPTATION.md\":113,\"DESIGN.md\":124,\"LICENSE\":21,\"README.md\":48,\"abi/IIntake.json\":82,\"abi/RelayBranch.json\":1455,\"abi/RelayEncoder.json\":353,\"abi/RelayFactory.json\":306,\"abi/RelayVerifier.json\":245,\"cli/relay.mjs\":88,\"config/production-gate.json\":89,\"config/production-gate.schema.json\":273,\"config/release.json\":367,\"dist/assets/dist-V2jKd6xN.js\":3,\"dist/assets/index-4UpPiOax.css\":1,\"dist/assets/index-CNVEwO4S.js\":128,\"dist/favicon.svg\":1,\"dist/index.html\":18,\"dist/local-config.json\":103,\"dist/og.png\":190,\"dist/og.svg\":1,\"docs/ACCEPTANCE.md\":5,\"docs/AGENT-GUIDE.md\":13,\"docs/BUILD.md\":51,\"docs/CLI.md\":29,\"docs/CONTRACTS.md\":33,\"docs/DESIGN.md\":5,\"docs/ENTRYPOINTS.md\":72,\"docs/FRONTEND.md\":5,\"docs/HANDOFF.md\":47,\"docs/LIMITS.md\":34,\"docs/LIVE-VALIDATION.md\":23,\"docs/OPERATIONS.md\":49,\"docs/PLATFORM-AUTHORING.md\":5,\"docs/PROTOCOL-OVERVIEW.md\":31,\"docs/RESOLVER-PROPOSAL.md\":9,\"docs/REVIEW.md\":28,\"docs/SDK-API.md\":23,\"docs/SDK-BROWSER.md\":9,\"docs/agent/SDK-CLI-A1.md\":5,\"docs/agent/sdk-cli-checks.md\":5,\"docs/frontend-README.md\":5,\"docs/history/README.md\":32,\"docs/history/a1-fixtures.tar.xz\":13,\"docs/history/accepted-platform-validation-index.json.xz\":38,\"docs/history/accepted-rc-raw-index.json.xz\":6,\"docs/history/accepted-rc-raw.tar.xz\":140,\"docs/history/fixtures-index.json\":72,\"docs/history/imported-index.json.xz\":190,\"docs/history/integration-predecessor.json\":71,\"docs/validation/boundary-revision/README.md\":111,\"docs/validation/boundary-revision/archive-index.json.xz\":60,\"docs/validation/boundary-revision/summary.json\":334,\"docs/validation/documentation-v1/README.md\":69,\"docs/validation/documentation-v1/archive-index.json\":42,\"docs/validation/documentation-v1/docs-hashes.sha256.json.xz\":15,\"docs/validation/documentation-v1/runtime-export.sha256.json.xz\":48,\"docs/validation/integration-v1/README.md\":38,\"docs/validation/integration-v1/archive-index.json\":268,\"docs/validation/launch-packaging-v1/README.md\":62,\"docs/validation/launch-packaging-v1/bytecode-inspection.json\":70,\"docs/validation/launch-packaging-v1/deployment-rehearsal.json\":293,\"docs/validation/launch-packaging-v1/metadata-binding.json\":179,\"docs/validation/launch-packaging-v1/retained-binding.json\":145,\"docs/validation/local-repair-v1/README.md\":66,\"docs/validation/local-repair-v1/archive-index.json.xz\":17,\"docs/validation/local-repair-v1/delivery-size.json\":40,\"docs/validation/local-repair-v1/evidence.tar.xz\":832,\"docs/validation/local-repair-v1/measurements.json\":287,\"docs/validation/local-repair-v1/source-manifest.json.xz\":58,\"docs/validation/multi-file-revision/README.md\":97,\"docs/validation/multi-file-revision/archive-index.json.xz\":44,\"docs/validation/multi-file-revision/summary.json\":213,\"docs/validation/public-ui-v1/raw/build.log\":12,\"docs/validation/rc-v1/README.md\":110,\"docs/validation/rc-v1/archive-index.json\":242,\"docs/validation/rc-v1/authenticated-results-index.json\":54,\"docs/validation/rc-v1/delivery-size.json\":40,\"docs/validation/rc-v1/initial-frontend-typecheck-failure.txt\":10,\"docs/validation/rc-v1/initial-gas-limit-metric-failure.txt\":31,\"docs/validation/rc-v1/initial-launch-test-failure.txt\":24,\"docs/validation/rc-v1/initial-name-validation-unit-failure.txt\":39,\"docs/validation/rc-v1/initial-public-browser-harness-failure.txt\":14,\"docs/validation/rc-v1/raw-result-test-compile-failure.txt\":8,\"docs/validation/rc-v1/rendered-review.json\":33,\"docs/validation/rc-v1/source-manifest.json.xz\":71,\"foundry.toml\":16,\"frontend/.gitignore\":6,\"frontend/.npmrc\":1,\"frontend/DESIGN.md\":5,\"frontend/README.md\":5,\"frontend/REVIEW.md\":5,\"frontend/docs/A1-HANDOFF.md\":5,\"frontend/docs/W1-README.md\":5,\"frontend/docs/licenses/Noto-Sans-OFL.txt\":92,\"frontend/docs/licenses/Noto-Sans-provenance.json\":9,\"frontend/docs/licenses/better-interface-LICENSE.txt\":220,\"frontend/docs/licenses/eth-frontend-ux-LICENSE.txt\":30,\"frontend/index.html\":16,\"frontend/package-lock.json\":2700,\"frontend/package.json\":45,\"frontend/playwright.config.ts\":28,\"frontend/public/favicon.svg\":1,\"frontend/public/local-config.json\":103,\"frontend/public/og.png\":190,\"frontend/public/og.svg\":1,\"frontend/scripts/audit-local-evidence.mjs\":70,\"frontend/scripts/check-integration.mjs\":50,\"frontend/scripts/design-review.mjs\":74,\"frontend/scripts/local-deliver.mjs\":59,\"frontend/scripts/local-setup.mjs\":89,\"frontend/scripts/measure-platform.mjs\":33,\"frontend/scripts/measure-submission.mjs\":33,\"frontend/scripts/platform-review.mjs\":26,\"frontend/scripts/prepare-webkit.sh\":51,\"frontend/scripts/record-release.mjs\":97,\"frontend/scripts/static-preview.mjs\":12,\"frontend/scripts/validate.mjs\":37,\"frontend/src/App.tsx\":46,\"frontend/src/components/ArtifactViewer.tsx\":27,\"frontend/src/components/FundingSheet.tsx\":6,\"frontend/src/components/Sheet.tsx\":28,\"frontend/src/components/VerifiedThumbnail.tsx\":12,\"frontend/src/components/WalletButton.tsx\":3,\"frontend/src/components/platform.tsx\":75,\"frontend/src/config.ts\":22,\"frontend/src/domain/adapter.ts\":72,\"frontend/src/domain/chainAdapter.ts\":470,\"frontend/src/domain/files.ts\":107,\"frontend/src/domain/fixtureAdapter.ts\":519,\"frontend/src/domain/fixtures.ts\":63,\"frontend/src/domain/liveAdapter.ts\":58,\"frontend/src/domain/publicMode.ts\":44,\"frontend/src/domain/sdk.ts\":11,\"frontend/src/domain/types.ts\":208,\"frontend/src/main.tsx\":24,\"frontend/src/preview/FilePreview.tsx\":114,\"frontend/src/preview/sanitize.ts\":77,\"frontend/src/styles.css\":259,\"frontend/src/ui/ErrorBoundary.tsx\":19,\"frontend/src/ui/LocalApp.tsx\":63,\"frontend/src/ui/ProjectList.tsx\":119,\"frontend/src/ui/ProposeForm.tsx\":219,\"frontend/src/ui/Showcase.tsx\":18,\"frontend/src/ui/SponsorPanel.tsx\":64,\"frontend/src/ui/Workspace.tsx\":146,\"frontend/src/ui/actionScope.ts\":18,\"frontend/src/ui/format.tsx\":70,\"frontend/src/ui/recovery.ts\":41,\"frontend/src/ui/snapshot.ts\":12,\"frontend/src/ui/verification.ts\":38,\"frontend/src/wallet/ConnectSheet.tsx\":98,\"frontend/src/wallet/icons.ts\":8,\"frontend/src/wallet/open-in.ts\":19,\"frontend/src/wallet/wagmi.ts\":13,\"frontend/tests/e2e/actions.ts\":56,\"frontend/tests/e2e/harness.ts\":34,\"frontend/tests/e2e/journey.spec.ts\":214,\"frontend/tests/e2e/layout.spec.ts\":65,\"frontend/tests/e2e/platform.spec.ts\":102,\"frontend/tests/e2e/revision.spec.ts\":258,\"frontend/tests/e2e/w1.spec.ts\":306,\"frontend/tests/e2e/wallet.spec.ts\":88,\"frontend/tests/fixtures/wide.png\":3,\"frontend/tests/integration/browser-chain.mjs\":701,\"frontend/tests/integration/local-command.mjs\":37,\"frontend/tests/integration/navigation-race.mjs\":32,\"frontend/tests/integration/platform-chain.mjs\":87,\"frontend/tests/integration/public-chain.mjs\":137,\"frontend/tests/run-browsers.mjs\":14,\"frontend/tests/unit/chain-provider.test.ts\":62,\"frontend/tests/unit/domain.test.ts\":120,\"frontend/tests/unit/multi-file.test.ts\":54,\"frontend/tests/unit/platform.test.tsx\":103,\"frontend/tests/unit/public-transport.test.ts\":290,\"frontend/tests/unit/reopened.test.ts\":111,\"frontend/tests/unit/security.test.tsx\":228,\"frontend/tests/unit/setup.ts\":1,\"frontend/tsconfig.json\":19,\"frontend/vite.config.ts\":10,\"frontend/vitest.config.ts\":11,\"launch.json\":21,\"package-lock.json\":127,\"package.json\":20,\"remappings.txt\":1,\"sdk/abi.mjs\":16,\"sdk/browser.mjs\":30,\"sdk/config.mjs\":91,\"sdk/core.mjs\":403,\"sdk/deployment.mjs\":56,\"sdk/files-browser.mjs\":173,\"sdk/files.mjs\":177,\"sdk/gates.mjs\":23,\"sdk/handoff.mjs\":81,\"sdk/index.mjs\":17,\"sdk/observation.mjs\":47,\"sdk/public-rpc.mjs\":106,\"sdk/public.mjs\":110,\"sdk/strict-json.mjs\":159,\"src/RelayBranch.sol\":309,\"src/RelayEncoder.sol\":205,\"src/RelayFactory.sol\":100,\"src/RelayTypes.sol\":78,\"src/RelayVerifier.sol\":84,\"src/interfaces/IIntake.sol\":20,\"src/libraries/Assets.sol\":141,\"src/libraries/ManifestJSON.sol\":645,\"src/libraries/Policy.sol\":51,\"src/libraries/StrictJSON.sol\":260,\"src/libraries/Text.sol\":175,\"test-sdk/browser-sdk.test.mjs\":178,\"test-sdk/deployment.test.mjs\":89,\"test-sdk/files.test.mjs\":58,\"test-sdk/mock-rpc.mjs\":14,\"test-sdk/multi-file.test.mjs\":62,\"test-sdk/network-address.test.mjs\":85,\"test-sdk/parity-vectors.mjs\":100,\"test-sdk/public-rpc.test.mjs\":153,\"test-sdk/public.test.mjs\":82,\"test-sdk/relay.test.mjs\":244,\"test-sdk/review-regressions.test.mjs\":94,\"test-sdk/transaction-metrics.test.mjs\":12,\"test/CrossLanguage.t.sol\":37,\"test/IntakeCompatibility.t.sol\":105,\"test/LaunchCompatibility.t.sol\":175,\"test/ManifestEnvelopeRegression.t.sol\":366,\"test/ManifestSegmentBudget.t.sol\":373,\"test/ManifestStringRegression.t.sol\":189,\"test/MetadataScannerDifferential.t.sol\":120,\"test/MultiFileResults.t.sol\":133,\"test/PublicResults.t.sol\":34,\"test/RelayHistory.t.sol\":233,\"test/RelayInvariant.t.sol\":151,\"test/RelayMappingRegression.t.sol\":187,\"test/RelayPayments.t.sol\":240,\"test/RelayProfiles.t.sol\":396,\"test/RelaySetup.sol\":137,\"test/StrictManifest.t.sol\":254,\"test/TestBase.sol\":100,\"test/adversarial/ContinuationSpec.t.sol\":338,\"test/adversarial/ManifestSpec.t.sol\":400,\"test/adversarial/PaymentSpec.t.sol\":376,\"test/adversarial/ProfileBoundarySpec.t.sol\":227,\"test/adversarial/README.md\":40,\"test/adversarial/SpecSupport.sol\":462,\"test/adversarial/StateMachineSpec.t.sol\":482,\"test/adversarial/check-inline-fixtures.py\":43,\"test/fixtures/FixtureData.sol\":54,\"test/fixtures/LiveResultFixture.sol\":14,\"test/fixtures/MultiFileResult.sol\":11,\"test/fixtures/PublicResults.sol\":29,\"test/fixtures/SdkGolden.sol\":13,\"test/fixtures/document-updated.md\":5,\"test/fixtures/document-updated.md.result.json\":1,\"test/fixtures/document.md\":3,\"test/fixtures/document.md.result.json\":1,\"test/fixtures/html-1.html\":1,\"test/fixtures/html-1.html.result.json\":1,\"test/fixtures/html-3.html\":1,\"test/fixtures/html-3.html.result.json\":1,\"test/fixtures/image-2.png\":3,\"test/fixtures/image-2.png.result.json\":1,\"test/fixtures/public/completed-0.json\":1,\"test/fixtures/public/completed-1.json\":1,\"test/fixtures/public/completed-2.json\":1,\"test/fixtures/public/completed-3.json\":1,\"test/fixtures/public/mutable-job-0.json\":1,\"test/fixtures/public/mutable-job-1.json\":1,\"test/fixtures/public/mutable-job-2.json\":1,\"test/fixtures/public/mutable-job-3.json\":1,\"test/fixtures/public/observed-multiple-files.json\":1,\"test/fixtures/public/observed-one-file.json\":1,\"test/fixtures/sdk-golden.json\":20,\"test/mocks/MockIntake.sol\":101,\"test/mocks/MockToken.sol\":63,\"tools/build-release.mjs\":9,\"tools/check-delivery.py\":57,\"tools/check-official-bodies.mjs\":42,\"tools/check-release.mjs\":47,\"tools/compilation-context.mjs\":26,\"tools/deployment-rehearsal.mjs\":78,\"tools/export-abi.mjs\":7,\"tools/generate-fixtures.py\":27,\"tools/generate-local-config.mjs\":35,\"tools/generate-sdk-abi.mjs\":25,\"tools/generate-sdk-fixtures.mjs\":26,\"tools/import-deployment.mjs\":59,\"tools/inspect-bytecode.mjs\":43,\"tools/local-integration.mjs\":278,\"tools/measure-binding.mjs\":89,\"tools/measure-release.mjs\":21,\"tools/measure-retained-binding.mjs\":98,\"tools/observe-ethereum.mjs\":16,\"tools/sdk-local-check.mjs\":159,\"tools/sdk-local-scenario.mjs\":107,\"tools/sync-release.mjs\":31,\"tools/transaction-metrics.mjs\":11,\"tools/validate-live.mjs\":23,\"tools/verify-history.py\":55,\"vendor/ethers/LICENSE.md\":21,\"vendor/ethers/PROVENANCE.md\":1,\"vendor/ethers/ethers.mjs\":26619,\"vendor/npm/PROVENANCE.json\":56,\"vendor/npm/adraffy-ens-normalize-1.11.1.tgz\":813,\"vendor/npm/aes-js-4.0.0-beta.5.tgz\":1433,\"vendor/npm/ethers-6.17.0.tgz\":10241,\"vendor/npm/noble-curves-1.2.0.tgz\":1096,\"vendor/npm/noble-hashes-1.3.2.tgz\":443,\"vendor/npm/tslib-2.7.0.tgz\":58,\"vendor/npm/types-node-22.7.5.tgz\":1658,\"vendor/npm/undici-types-6.19.8.tgz\":78,\"vendor/npm/ws-8.21.0.tgz\":142},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"0fe7beffef249cbc040a45773ad8ed764935a821e53359a4db66367adeced235","verifiedTreeHash":"cd7aa2abb569ba387baa273b1af28b9fbc96d6a3","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":136181,"exitCode":0,"name":"build","output":"Compiling 49 files with Solc 0.8.26\nSolc 0.8.26 finished in 136.11s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> test/RelayProfiles.t.sol:331:13:\n    |\n331 |             bytes memory raw = _manifest(Text.hex32(keccak256(abi.encode(i))), Policy.kind(profile), 32);\n    |             ^^^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n   --> test/RelayProfiles.t.sol:339:9:\n    |\n339 |         bytes memory raw = _manifest(Text.hex32(keccak256(\"new job\")), T.Kind.Markdown, 42);\n    |         ^^^^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":22970,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/CrossLanguage.t.sol:CrossLanguageTest\n[PASS] test_sdkCalldataActuallyCreatesBranchWithoutPayment() (gas: 2871398)\n[PASS] test_sdkCanonicalWitnessMatchesSolidity() (gas: 504415)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.09ms (1.12ms CPU time)\n\nRan 1 test for test/PublicResults.t.sol:PublicResultsTest\n[PASS] test_exactAuthenticatedPublicZeroFileResultsNeverSettleOrRebuy() (gas: 19886146)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 23.51ms (22.33ms CPU time)\n\nRan 5 tests for test/MultiFileResults.t.sol:MultiFileResultsTest\n[PASS] test_changingEvenIgnoredFileBytesCannotBindOrBuyAgain() (gas: 5733032)\n[PASS] test_declaredOutputAtBeginningOrEndOfFourAndSeventeenFiles() (gas: 8716113)\n[PASS] test_duplicateOutputNamePathOrExactMatchIsAmbiguous() (gas: 5697513)\n[PASS] test_exactObservedTwoFileResultBindsDeclaredOutputAndForks() (gas: 6443198)\n[PASS] test_invalidExtraJSONAndRetainedBoundsStillReject() (gas: 2560217)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 28.18ms (44.40ms CPU time)\n\nRan 7 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] test_badPolicyAndBadInputsFailBeforeCreateAndRegistration() (gas: 179829)\n[PASS] test_callbackUriAtLimitWithinOfficialStipendAndAboveStaysPending() (gas: 2261838)\n[PASS] test_constructorRejectsZeroAndDuplicateDependencies() (gas: 12577)\n[PASS] test_directChildrenAreCompleteIndependentPayers() (gas: 6867385)\n[PASS] test_launchAndRuntimeChildPassProtectedOpcodeRule() (gas: 21033043)\n[PASS] test_namedBatchBackwardReferencesThenRuntimeChild() (gas: 13443717)\n[PASS] test_staticFactoryConstructorAcceptsEmptyDependenciesWithoutCallsOrChildren() (gas: 53669)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 57.27ms (56.14ms CPU time)\n\nRan 13 tests for test/RelayMappingRegression.t.sol:RelayMappingRegressionTest\n[PASS] test_createRejectsExistingNameEvenWhenPathAndSlotDifferBeforePayment() (gas: 3186564)\n[PASS] test_createRejectsExistingPathEvenWhenNameAndSlotDifferBeforePayment() (gas: 3191092)\n[PASS] test_distLikeNamesAndNestedNonWebsiteDistDirectoryRemainAllowed() (gas: 1676948)\n[PASS] test_historicalForkKeepsSourceProvenanceAndCanUpdateInheritedSlot() (gas: 8127282)\n[PASS] test_legacyIndependentDescriptorsStayReadableButCollidingUpdateIsRejected() (gas: 3542557)\n[PASS] test_markdownAndImageCannotWriteAnyTopLevelDistDescendant() (gas: 746559)\n[PASS] test_namesCannotCollideAcrossDifferentAssetKinds() (gas: 3190052)\n[PASS] test_pathAncestorCannotReplaceAnExistingDirectoryWithFileBeforePayment() (gas: 5684530)\n[PASS] test_pathAncestorCollisionWithOtherSlotAlsoRejectsUpdates() (gas: 3322581)\n[PASS] test_pathCommonDirectoriesAndNonBoundaryPrefixesAreAllowed() (gas: 4232571)\n[PASS] test_pathDescendantCannotTreatAnExistingFileAsDirectoryBeforePayment() (gas: 3194702)\n[PASS] test_secondHtmlSlotRejectsFixedPathCollision() (gas: 6180713)\n[PASS] test_uniqueCreateAndUpdatePreserveOtherAssetProvenance() (gas: 13675407)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 70.68ms (69.67ms CPU time)\n\nRan 5 tests for test/adversarial/ContinuationSpec.t.sol:ContinuationSpecTest\n[PASS] test_checkpointPreimageBindsChainFactoryBranchPolicyRevisionAndSource() (gas: 9316712)\n[PASS] test_currentProposalsSelectableInEitherOrderAndLosingSponsorPaysNothing() (gas: 9133908)\n[PASS] test_everyWitnessFieldAuthenticatedForSponsorBindAndHistoricalFork() (gas: 9955163)\n[PASS] test_fiveRootRoundsTwoSponsorsHistoricalForkAndTwoChildRounds() (gas: 44590786)\n[PASS] test_foreignFactoryAndUnregisteredLookalikeCannotForgeHistoricalFork() (gas: 6260449)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 83.25ms (81.54ms CPU time)\n\nRan 9 tests for test/RelayHistory.t.sol:RelayHistoryTest\n[PASS] test_badBindingPreservesResultThenCorrectWitnessWorksWithoutPurchase() (gas: 6743542)\n[PASS] test_childCannotBindParentsProjectAsOwn() (gas: 9374123)\n[PASS] test_forkCannotAuthenticateFakeParentLatestWitnessOrForgedProvenance() (gas: 6774606)\n[PASS] test_forkChosenHistoricalCheckpointStartsOwnProjectAndPayer() (gas: 18252558)\n[PASS] test_forkIsAllowedWhileParentPendingOrFrozen() (gas: 11736004)\n[PASS] test_htmlImageHtmlLatestJobAndOlderSelectedInputs() (gas: 27069914)\n[PASS] test_projectMismatchCannotOverwriteCheckpoint() (gas: 7223796)\n[PASS] test_removedInitializerCannotChangeAuthorityEvenForFactory() (gas: 139171)\n[PASS] test_reusedJobCannotCreateNewRevision() (gas: 6303754)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 87.66ms (86.49ms CPU time)\n\nRan 5 tests for test/IntakeCompatibility.t.sol:IntakeCompatibilityTest\n[PASS] test_currentCatalogShapeAndOutputNamespaceAreEncoded() (gas: 6964887)\n[PASS] test_legacyDescriptorRemainsExactAndMigrationRequiresExplicitCanonicalUpdate() (gas: 4425603)\n[PASS] test_legacyHTMLCannotCreateSecondHTMLSlotAndExplicitUpdateMigrates() (gas: 4759435)\n[PASS] test_namesRequireInitialLetterButHistoricalNamesRemainReadable() (gas: 3302403)\n[PASS] test_oldOutputNamespaceRejectedBeforePayment() (gas: 273419)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 234.73ms (49.88ms CPU time)\n\nRan 6 tests for test/MetadataScannerDifferential.t.sol:MetadataScannerDifferentialTest\n[PASS] testFuzz_ArbitraryRawString(bytes32,bytes32) (runs: 256, μ: 393322, ~: 391583)\n[PASS] testFuzz_RawUnicode(uint32) (runs: 256, μ: 396136, ~: 399168)\n[PASS] testFuzz_UnicodeEscape(uint16,uint16) (runs: 256, μ: 413409, ~: 414141)\n[PASS] test_ControlsInvalidHexAndSurrogates() (gas: 6713765)\n[PASS] test_MixedRawAndEscapedUnicode() (gas: 2435015)\n[PASS] test_RetainedASCIICopyAtWordBoundaries() (gas: 10834619)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 465.75ms (709.23ms CPU time)\n\nRan 11 tests for test/adversarial/ManifestSpec.t.sol:ManifestSpecTest\n[PASS] testFuzz_nonWhitespaceTrailingByteAlwaysRejected(uint8) (runs: 1000, μ: 72226, ~: 72227)\n[PASS] testFuzz_unicodeScalarEscapesDecodeAndDuplicateKeysReject(uint32) (runs: 1000, μ: 243663, ~: 242436)\n[PASS] test_callbackDigestBindsWhitespaceAndKeyOrderOfOriginalBytes() (gas: 3568304)\n[PASS] test_exactDepthMemberKeyAndTokenBoundaries() (gas: 4652769)\n[PASS] test_exactManifestAndStringByteLimitsAcceptBoundaryRejectOneMore() (gas: 15285661)\n[PASS] test_fileSizeIntegerGrammarAndAllProfileDeclaredCaps() (gas: 23964974)\n[PASS] test_hashEncodingTypeWidthNonhexAndZeroAreCheckedForBothDigests() (gas: 99413604)\n[PASS] test_identityLengthDecodedFieldsAndEmptyAcceptedFiles() (gas: 8505003)\n[PASS] test_manifestRejectionsKeepRecordedDigestAndOldHistory() (gas: 110336568)\n[PASS] test_projectSwitchAndHistoricalJobReplayPreservePreviousCheckpoint() (gas: 19277773)\n[PASS] test_sourceAndLaterGitMetadataNeverReplaceAcceptedFilesDescriptor() (gas: 3647342)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 924.65ms (1.43s CPU time)\n\nRan 5 tests for test/adversarial/ProfileBoundarySpec.t.sol:ProfileBoundarySpecTest\n[PASS] testFuzz_htmlBase64RoundingAndOneByteOverTheKnownInputBudget(uint32) (runs: 1000, μ: 992660, ~: 992685)\n[PASS] test_realEightAssetWitnessExact16384ByteRequestAndOneByteOverRejectedBeforePayment() (gas: 138060866)\n[PASS] test_slotReservationInputCountAndFullCapacityUpdateBoundaries() (gas: 9075210)\n[PASS] test_unsafePathComponentsInvalidUtf8AndDisabledModesRejectWithoutSpending() (gas: 2664969)\n[PASS] test_utf8TextLimitsCountBytesAndOutputMappingLengthsAreBounded() (gas: 32437589)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 924.67ms (1.22s CPU time)\n\nRan 15 tests for test/StrictManifest.t.sol:StrictManifestTest\n[PASS] testFuzz_asciiJSONQuoteDecodeRoundTrip(bytes32,uint8) (runs: 1000, μ: 275023, ~: 139202)\n[PASS] testFuzz_decodedDuplicateKeyAlwaysRejected(uint8) (runs: 1000, μ: 77950, ~: 77933)\n[PASS] test_actualFileHashesAndManifestKeccakAreDistinct() (gas: 447728)\n[PASS] test_boundedLargeManifestMeasurement() (gas: 5049071)\n[PASS] test_onlyDeclaredFilesNotSourceOrGitMetadataSupplyAcceptedFile() (gas: 4148207)\n[PASS] test_parserBoundsManifestStringDepthMembersAndTokens() (gas: 2643565)\n[PASS] test_rejectDuplicateKeysIncludingDecodedEscapesAtEveryDepth() (gas: 5852323)\n[PASS] test_rejectEmptyOrMalformedExtraFileEntries() (gas: 3905093)\n[PASS] test_rejectIncompleteWrongIdentityTypesAndWrongFileTypes() (gas: 13253919)\n[PASS] test_rejectInvalidUTF8UnicodeSurrogatesAndNoncharacters() (gas: 871715)\n[PASS] test_rejectPathsTraversalHiddenURLAbsoluteAndDecodedControl() (gas: 20537073)\n[PASS] test_rejectTrailingAndMalformedJSON() (gas: 1235180)\n[PASS] test_rejectZeroOversizedNonIntegerAndStringFileBytes() (gas: 15406077)\n[PASS] test_validUTF8EscapesAndSurrogatePairsDecodeExactly() (gas: 1594868)\n[PASS] test_whitespaceIsLegalButDigestIsOverExactRawBytes() (gas: 463327)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 933.53ms (1.20s CPU time)\n\nRan 13 tests for test/ManifestSegmentBudget.t.sol:ManifestSegmentBudgetTest\n[PASS] test_asciiPrefixBeforeEscapeOrScalarDecodesExactly() (gas: 2318812)\n[PASS] test_asciiPrefixKeysStillDetectDuplicates() (gas: 489087)\n[PASS] test_asciiPrefixStillCountsTowardRetainedLimit() (gas: 1848363)\n[PASS] test_auditAlternatingEscapeShapeIsRejectedByBudgetNotGas() (gas: 200501187)\n[PASS] test_bindAsciiPrefixThenRawScalarWithFullWitness() (gas: 201477242)\n[PASS] test_bindAsciiPrefixThenSimpleEscapeWithFullWitness() (gas: 201488101)\n[PASS] test_bindAsciiPrefixThenUnicodeEscapeWithFullWitness() (gas: 201486297)\n[PASS] test_bindBudgetedAlternatingEscapesWithFullWitness() (gas: 185072031)\n[PASS] test_bindMaximumBudgetedSegmentFlushesWithFullWitness() (gas: 200590728)\n[PASS] test_bindOriginalCGas01ShapeWithFullWitnessBelowCap() (gas: 202899651)\n[PASS] test_consecutiveSimpleEscapesAreChargedOnlyOnce() (gas: 31602324)\n[PASS] test_segmentFlushBudgetAcceptsBoundaryRejectsOneMore() (gas: 17584038)\n[PASS] test_unicodeEscapesAndIgnoredStringsAreNotCharged() (gas: 157917183)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 941.99ms (2.32s CPU time)\n\nRan 14 tests for test/RelayProfiles.t.sol:RelayProfilesTest\n[PASS] test_capacityEndToEndSixteenAssetsThenUpdate() (gas: 91718152)\n[PASS] test_htmlImagesPerFileAggregateAndBase64OverheadBounds() (gas: 1375271)\n[PASS] test_imageReferencesAndMarkdownImageInputsDisabled() (gas: 3390159)\n[PASS] test_invalidTextAndCanonicalWitnessRejectBeforePayment() (gas: 346980)\n[PASS] test_jsonEscapingCannotInjectRuntimeFields() (gas: 1027576)\n[PASS] test_maximumCompleteBindingASCIIFitsGasBudget() (gas: 227195804)\n[PASS] test_maximumCompleteBindingEscapedUnicodeFitsGasBudget() (gas: 251560161)\n[PASS] test_maximumCompleteBindingWideObjectsFitsGasBudget() (gas: 256251480)\n[PASS] test_measureMaximumWitnessAndLargeManifestTogether() (gas: 14174902)\n[PASS] test_publishDisabledAndOutputMappingFixedBeforePayment() (gas: 360429)\n[PASS] test_requestBodyUTF8ByteLimitCheckedBeforePayment() (gas: 6269331)\n[PASS] test_reserveEachEnabledTypeAndExistingSlotsUpdatableAtCapacity() (gas: 4280279)\n[PASS] test_selectedInputsMustBeCurrentSortedUniqueAndWithinEight() (gas: 10490710)\n[PASS] test_updateTargetMandatoryCreateCannotOverwriteAndRenameDisabled() (gas: 3865826)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 941.97ms (1.44s CPU time)\n\nRan 21 tests for test/ManifestEnvelopeRegression.t.sol:ManifestEnvelopeRegressionTest\n[PASS] test_bind33ActualSourceDescriptorsWithoutAnotherPurchase() (gas: 9869743)\n[PASS] test_bind33StructuredSourceEntriesWithoutAnotherPurchase() (gas: 5637779)\n[PASS] test_bindLongMetadataOnTheAcceptedFileWithoutAnotherPurchase() (gas: 4950120)\n[PASS] test_bindMaximumEscapedKeyBytesWithFullWitness() (gas: 247742772)\n[PASS] test_bindMaximumIgnoredNumberWithFullWitness() (gas: 184642766)\n[PASS] test_bindMaximumMetadataComplexityWithFullWitness() (gas: 197167419)\n[PASS] test_bindMaximumMetadataValuesAndUnicodeWithFullWitness() (gas: 201969624)\n[PASS] test_bindMaximumRetainedEscapedSurrogatesWithFullWitness() (gas: 185404023)\n[PASS] test_bindMaximumRetainedEscapedUtf8WithFullWitness() (gas: 187986071)\n[PASS] test_bindMaximumRetainedRawUtf8FourByteWithFullWitness() (gas: 183804732)\n[PASS] test_bindMaximumRetainedRawUtf8ThreeByteWithFullWitness() (gas: 184806019)\n[PASS] test_bindMaximumRetainedRawUtf8TwoByteWithFullWitness() (gas: 185822673)\n[PASS] test_bindMaximumRetainedSimpleEscapesWithFullWitness() (gas: 189126914)\n[PASS] test_bindMaximumWhitespaceWithFullWitness() (gas: 174492294)\n[PASS] test_bindMetadataBeyond8192BytesWithoutAnotherPurchase() (gas: 9051801)\n[PASS] test_exactPreviouslyObservedIMDResultBindsWithoutReserialization() (gas: 3494451)\n[PASS] test_invalidIgnoredMetadataCannotHideBehindProjection() (gas: 4480194)\n[PASS] test_longIgnoredStringStillRejectsLateInvalidUtf8AndDuplicateKeys() (gas: 20271255)\n[PASS] test_manifestAggregateKeyBudgetAccepts2048Rejects2049() (gas: 3594717)\n[PASS] test_manifestValueBudgetAccepts512Rejects513() (gas: 5813174)\n[PASS] test_wrongHashStillRejectsProjectedManifest() (gas: 1320600)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 942.16ms (3.48s CPU time)\n\nRan 14 tests for test/adversarial/PaymentSpec.t.sol:PaymentSpecTest\n[PASS] testFuzz_priceChangeCapAndDonationsConserveEveryWei(uint96,uint64) (runs: 1000, μ: 3011882, ~: 3012464)\n[PASS] testFuzz_unknownFailureFrozenDespiteNewProposalsAndTime(uint8) (runs: 1000, μ: 3334928, ~: 3334930)\n[PASS] test_continuationRetryRetainsParentAndFullSelectedSnapshot() (gas: 8236262)\n[PASS] test_exactWholeBalanceAndMaxFeeDoesNotOvercharge() (gas: 2250898)\n[PASS] test_insufficientApprovalAndBalanceRollbackBeforeAnyReceipt() (gas: 3490587)\n[PASS] test_intakeRevertPartialPullZeroIdAndClearFailureRollbackAllEffects() (gas: 7692767)\n[PASS] test_malformedResultIsRecordedWithoutParsingThenBadBindingPreservesIt() (gas: 2697688)\n[PASS] test_maximumCallbackURIWithinStipendAndOversizeFailureStaysPending() (gas: 6467337)\n[PASS] test_missingCallbackHasNoTimeoutButAuthenticLateCallbackStillWorks() (gas: 3227207)\n[PASS] test_reentrancyAtTransferApprovalAndIntakeCannotProposeOrBuyAgain() (gas: 13300793)\n[PASS] test_refusalCannotSubstituteProposalAndRetryRacesCostOnlyWinner() (gas: 6139693)\n[PASS] test_reusedIntakeRequestIdOnRetryCannotOverwriteAttemptOrDoubleCharge() (gas: 4586111)\n[PASS] test_spoofForeignCrossBranchAndReplayCallbacksCannotSettleOwnRequest() (gas: 8657651)\n[PASS] test_synchronousIntakeResultAndFailureCannotSettlePurchasingState() (gas: 4024590)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 945.54ms (1.53s CPU time)\n\nRan 7 tests for test/ManifestStringRegression.t.sol:ManifestStringRegressionTest\n[PASS] testFuzz_retainedArbitraryBytesMatchReference(bytes32,uint8) (runs: 1000, μ: 172048, ~: 171765)\n[PASS] testFuzz_retainedQuotedAsciiMatchesReference(bytes32,uint8) (runs: 1000, μ: 573314, ~: 372274)\n[PASS] testFuzz_validScalarRawAndEscapeMatchReference(uint32,uint8) (runs: 1000, μ: 720261, ~: 704009)\n[PASS] test_mixedRawEscapedScalarsAndSimpleEscapesDecodeExactly() (gas: 262922)\n[PASS] test_rawAndEscapedUnicodeKeysStillDetectDuplicates() (gas: 225974)\n[PASS] test_retainedDecodedByteLimitAccepts1024Rejects1025() (gas: 2746257)\n[PASS] test_retainedInvalidUnicodeAndEscapesReject() (gas: 2941178)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 945.72ms (2.83s CPU time)\n\nRan 13 tests for test/RelayPayments.t.sol:RelayPaymentsTest\n[PASS] testFuzz_exactDynamicFeeConservesBalances(uint96) (runs: 1000, μ: 2013472, ~: 2013496)\n[PASS] testFuzz_nonRefusalFailureAlwaysFreezes(uint8) (runs: 1000, μ: 2191654, ~: 2191655)\n[PASS] test_callbacksAuthenticateSenderOwnRequestAndSingleDelivery() (gas: 2258915)\n[PASS] test_creationAndProposalsDoNotPurchaseOrMoveAnchor() (gas: 3609551)\n[PASS] test_dynamicFeeBranchPayerExactBodyAndSelectors() (gas: 2485141)\n[PASS] test_feeOnTransferSenderTaxFalseAndPartialPullRevertAtomically() (gas: 3683362)\n[PASS] test_foreignIntakeRequestCannotSettleBranch() (gas: 2291558)\n[PASS] test_missingCallbackStaysPendingIndefinitely() (gas: 2122727)\n[PASS] test_noReturnTokenAndStickyAllowanceCleared() (gas: 2016329)\n[PASS] test_refusedOnlyExplicitIdenticalRetryWithNewReceipt() (gas: 5281228)\n[PASS] test_stipendCallbackOnlyRecordsAndBindingIsPermissionless() (gas: 3028585)\n[PASS] test_tokenReentrancyAndSynchronousCallbackAreRejected() (gas: 3197393)\n[PASS] test_zeroUnknownProposalFeeCapAndUnpricedRejectBeforeTransfer() (gas: 1663610)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 1.58s (2.20s CPU time)\n\nRan 4 tests for test/release/ExactGasRegression.t.sol:ExactGasRegressionTest\n[PASS] testFuzz_anyOriginalByteMutationKeepsResultAndHistory(uint16,uint8) (runs: 128, μ: 14171682, ~: 14171682)\n[PASS] test_exactOriginalBytesAndOriginalWitnessBindBelowTransactionCap() (gas: 36310613)\n[PASS] test_ignoredMetadataAndWhitespaceRemainBoundThenOriginalStillSucceeds() (gas: 37068541)\n[PASS] test_originalWitnessMutationCannotBeUsedForBindingOrHistoricalFork() (gas: 19101636)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.58s (1.44s CPU time)\n\nRan 1 test for test/RelayInvariant.t.sol:RelayInvariantTest\n[PASS] invariant_conservationAndPermanentHistory() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| RelayHandler | bind         | 1358  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | fail         | 1347  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | propose      | 1372  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | recordResult | 1345  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | retry        | 1387  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | sponsor      | 1383  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.97s (2.97s CPU time)\n\nRan 2 tests for test/adversarial/StateMachineSpec.t.sol:StateMachineSpecTest\n[PASS] invariant_modelFeesReceiptsAssetsAndPermanentCheckpoints() (runs: 256, calls: 24576, reverts: 0)\n\n╭------------------+-----------------+-------+---------+----------╮\n| Contract         | Selector        | Calls | Reverts | Discards |\n+=================================================================+\n| SpecStateHandler | advanceTime     | 2453  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | bind            | 2390  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | donate          | 2424  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | fail            | 2446  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | forkHistory     | 2398  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | hostileCallback | 2430  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | propose         | 2485  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | purchase        | 2505  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | recordResult    | 2512  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | retry           | 2533  | 0       | 0        |\n╰------------------+-----------------+-------+---------+----------╯\n\n[PASS] test_modelExercisesRefusalRetryChildContinuationAndHistoricalFork() (gas: 26033338)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 17.35s (17.34s CPU time)\n\nRan 2 tests for test/release/PurchaseAtomicityInvariant.t.sol:PurchaseAtomicityInvariantTest\n[PASS] invariant_faultsNeverSpendDonationsOrRewriteReceipts() (runs: 256, calls: 24576, reverts: 0)\n\n╭--------------------------+---------------------+-------+---------+----------╮\n| Contract                 | Selector            | Calls | Reverts | Discards |\n+=============================================================================+\n| PurchaseAtomicityHandler | bind                | 4904  | 0       | 0        |\n|--------------------------+---------------------+-------+---------+----------|\n| PurchaseAtomicityHandler | crossBranchCallback | 4907  | 0       | 0        |\n|--------------------------+---------------------+-------+---------+----------|\n| PurchaseAtomicityHandler | donate              | 4881  | 0       | 0        |\n|--------------------------+---------------------+-------+---------+----------|\n| PurchaseAtomicityHandler | purchase            | 4896  | 0       | 0        |\n|--------------------------+---------------------+-------+---------+----------|\n| PurchaseAtomicityHandler | respond             | 4988  | 0       | 0        |\n╰--------------------------+---------------------+-------+---------+----------╯\n\n[PASS] test_allFaultsOnContinuationAndRetryThenRecovery() (gas: 82670005)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 22.88s (22.93s CPU time)\n\nRan 22 test suites in 22.88s (54.91s CPU time): 175 tests passed, 0 failed, 0 skipped (175 total tests)\n","passed":true},{"durationMs":195,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"RelayBranch.bind(bytes,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.onIntakeFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"RelayBranch.onIntakeResult(bytes32,bytes32,string)\",\"RelayBranch.propose((bytes32,uint8,bytes32,bytes32[],string,string,string,bool),(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.retry(uint256,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.sponsor(uint256,uint256,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayFactory.createProject(string)\",\"RelayFactory.fork(address,uint64,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[],string)\"],\"files\":{\".gitignore\":7,\"ADAPTATION.md\":113,\"DESIGN.md\":124,\"LICENSE\":21,\"README.md\":48,\"abi/IIntake.json\":82,\"abi/RelayBranch.json\":1455,\"abi/RelayEncoder.json\":353,\"abi/RelayFactory.json\":306,\"abi/RelayVerifier.json\":245,\"cli/relay.mjs\":88,\"config/production-gate.json\":89,\"config/production-gate.schema.json\":273,\"config/release.json\":367,\"dist/assets/dist-V2jKd6xN.js\":3,\"dist/assets/index-4UpPiOax.css\":1,\"dist/assets/index-CNVEwO4S.js\":128,\"dist/favicon.svg\":1,\"dist/index.html\":18,\"dist/local-config.json\":103,\"dist/og.png\":190,\"dist/og.svg\":1,\"docs/ACCEPTANCE.md\":5,\"docs/AGENT-GUIDE.md\":13,\"docs/BUILD.md\":51,\"docs/CLI.md\":29,\"docs/CONTRACTS.md\":33,\"docs/DESIGN.md\":5,\"docs/ENTRYPOINTS.md\":72,\"docs/FRONTEND.md\":5,\"docs/HANDOFF.md\":47,\"docs/LIMITS.md\":34,\"docs/LIVE-VALIDATION.md\":23,\"docs/OPERATIONS.md\":49,\"docs/PLATFORM-AUTHORING.md\":5,\"docs/PROTOCOL-OVERVIEW.md\":31,\"docs/RESOLVER-PROPOSAL.md\":9,\"docs/REVIEW.md\":28,\"docs/SDK-API.md\":23,\"docs/SDK-BROWSER.md\":9,\"docs/agent/SDK-CLI-A1.md\":5,\"docs/agent/sdk-cli-checks.md\":5,\"docs/frontend-README.md\":5,\"docs/history/README.md\":32,\"docs/history/a1-fixtures.tar.xz\":13,\"docs/history/accepted-platform-validation-index.json.xz\":38,\"docs/history/accepted-rc-raw-index.json.xz\":6,\"docs/history/accepted-rc-raw.tar.xz\":140,\"docs/history/fixtures-index.json\":72,\"docs/history/imported-index.json.xz\":190,\"docs/history/integration-predecessor.json\":71,\"docs/validation/boundary-revision/README.md\":111,\"docs/validation/boundary-revision/archive-index.json.xz\":60,\"docs/validation/boundary-revision/summary.json\":334,\"docs/validation/documentation-v1/README.md\":69,\"docs/validation/documentation-v1/archive-index.json\":42,\"docs/validation/documentation-v1/docs-hashes.sha256.json.xz\":15,\"docs/validation/documentation-v1/runtime-export.sha256.json.xz\":48,\"docs/validation/integration-v1/README.md\":38,\"docs/validation/integration-v1/archive-index.json\":268,\"docs/validation/launch-packaging-v1/README.md\":62,\"docs/validation/launch-packaging-v1/bytecode-inspection.json\":70,\"docs/validation/launch-packaging-v1/deployment-rehearsal.json\":293,\"docs/validation/launch-packaging-v1/metadata-binding.json\":179,\"docs/validation/launch-packaging-v1/retained-binding.json\":145,\"docs/validation/local-repair-v1/README.md\":66,\"docs/validation/local-repair-v1/archive-index.json.xz\":17,\"docs/validation/local-repair-v1/delivery-size.json\":40,\"docs/validation/local-repair-v1/evidence.tar.xz\":832,\"docs/validation/local-repair-v1/measurements.json\":287,\"docs/validation/local-repair-v1/source-manifest.json.xz\":58,\"docs/validation/multi-file-revision/README.md\":97,\"docs/validation/multi-file-revision/archive-index.json.xz\":44,\"docs/validation/multi-file-revision/summary.json\":213,\"docs/validation/public-ui-v1/raw/build.log\":12,\"docs/validation/rc-v1/README.md\":110,\"docs/validation/rc-v1/archive-index.json\":242,\"docs/validation/rc-v1/authenticated-results-index.json\":54,\"docs/validation/rc-v1/delivery-size.json\":40,\"docs/validation/rc-v1/initial-frontend-typecheck-failure.txt\":10,\"docs/validation/rc-v1/initial-gas-limit-metric-failure.txt\":31,\"docs/validation/rc-v1/initial-launch-test-failure.txt\":24,\"docs/validation/rc-v1/initial-name-validation-unit-failure.txt\":39,\"docs/validation/rc-v1/initial-public-browser-harness-failure.txt\":14,\"docs/validation/rc-v1/raw-result-test-compile-failure.txt\":8,\"docs/validation/rc-v1/rendered-review.json\":33,\"docs/validation/rc-v1/source-manifest.json.xz\":71,\"foundry.toml\":16,\"frontend/.gitignore\":6,\"frontend/.npmrc\":1,\"frontend/DESIGN.md\":5,\"frontend/README.md\":5,\"frontend/REVIEW.md\":5,\"frontend/docs/A1-HANDOFF.md\":5,\"frontend/docs/W1-README.md\":5,\"frontend/docs/licenses/Noto-Sans-OFL.txt\":92,\"frontend/docs/licenses/Noto-Sans-provenance.json\":9,\"frontend/docs/licenses/better-interface-LICENSE.txt\":220,\"frontend/docs/licenses/eth-frontend-ux-LICENSE.txt\":30,\"frontend/index.html\":16,\"frontend/package-lock.json\":2700,\"frontend/package.json\":45,\"frontend/playwright.config.ts\":28,\"frontend/public/favicon.svg\":1,\"frontend/public/local-config.json\":103,\"frontend/public/og.png\":190,\"frontend/public/og.svg\":1,\"frontend/scripts/audit-local-evidence.mjs\":70,\"frontend/scripts/check-integration.mjs\":50,\"frontend/scripts/design-review.mjs\":74,\"frontend/scripts/local-deliver.mjs\":59,\"frontend/scripts/local-setup.mjs\":89,\"frontend/scripts/measure-platform.mjs\":33,\"frontend/scripts/measure-submission.mjs\":33,\"frontend/scripts/platform-review.mjs\":26,\"frontend/scripts/prepare-webkit.sh\":51,\"frontend/scripts/record-release.mjs\":97,\"frontend/scripts/static-preview.mjs\":12,\"frontend/scripts/validate.mjs\":37,\"frontend/src/App.tsx\":46,\"frontend/src/components/ArtifactViewer.tsx\":27,\"frontend/src/components/FundingSheet.tsx\":6,\"frontend/src/components/Sheet.tsx\":28,\"frontend/src/components/VerifiedThumbnail.tsx\":12,\"frontend/src/components/WalletButton.tsx\":3,\"frontend/src/components/platform.tsx\":75,\"frontend/src/config.ts\":22,\"frontend/src/domain/adapter.ts\":72,\"frontend/src/domain/chainAdapter.ts\":470,\"frontend/src/domain/files.ts\":107,\"frontend/src/domain/fixtureAdapter.ts\":519,\"frontend/src/domain/fixtures.ts\":63,\"frontend/src/domain/liveAdapter.ts\":58,\"frontend/src/domain/publicMode.ts\":44,\"frontend/src/domain/sdk.ts\":11,\"frontend/src/domain/types.ts\":208,\"frontend/src/main.tsx\":24,\"frontend/src/preview/FilePreview.tsx\":114,\"frontend/src/preview/sanitize.ts\":77,\"frontend/src/styles.css\":259,\"frontend/src/ui/ErrorBoundary.tsx\":19,\"frontend/src/ui/LocalApp.tsx\":63,\"frontend/src/ui/ProjectList.tsx\":119,\"frontend/src/ui/ProposeForm.tsx\":219,\"frontend/src/ui/Showcase.tsx\":18,\"frontend/src/ui/SponsorPanel.tsx\":64,\"frontend/src/ui/Workspace.tsx\":146,\"frontend/src/ui/actionScope.ts\":18,\"frontend/src/ui/format.tsx\":70,\"frontend/src/ui/recovery.ts\":41,\"frontend/src/ui/snapshot.ts\":12,\"frontend/src/ui/verification.ts\":38,\"frontend/src/wallet/ConnectSheet.tsx\":98,\"frontend/src/wallet/icons.ts\":8,\"frontend/src/wallet/open-in.ts\":19,\"frontend/src/wallet/wagmi.ts\":13,\"frontend/tests/e2e/actions.ts\":56,\"frontend/tests/e2e/harness.ts\":34,\"frontend/tests/e2e/journey.spec.ts\":214,\"frontend/tests/e2e/layout.spec.ts\":65,\"frontend/tests/e2e/platform.spec.ts\":102,\"frontend/tests/e2e/revision.spec.ts\":258,\"frontend/tests/e2e/w1.spec.ts\":306,\"frontend/tests/e2e/wallet.spec.ts\":88,\"frontend/tests/fixtures/wide.png\":3,\"frontend/tests/integration/browser-chain.mjs\":701,\"frontend/tests/integration/local-command.mjs\":37,\"frontend/tests/integration/navigation-race.mjs\":32,\"frontend/tests/integration/platform-chain.mjs\":87,\"frontend/tests/integration/public-chain.mjs\":137,\"frontend/tests/run-browsers.mjs\":14,\"frontend/tests/unit/chain-provider.test.ts\":62,\"frontend/tests/unit/domain.test.ts\":120,\"frontend/tests/unit/multi-file.test.ts\":54,\"frontend/tests/unit/platform.test.tsx\":103,\"frontend/tests/unit/public-transport.test.ts\":290,\"frontend/tests/unit/reopened.test.ts\":111,\"frontend/tests/unit/security.test.tsx\":228,\"frontend/tests/unit/setup.ts\":1,\"frontend/tsconfig.json\":19,\"frontend/vite.config.ts\":10,\"frontend/vitest.config.ts\":11,\"package-lock.json\":127,\"package.json\":20,\"remappings.txt\":1,\"sdk/abi.mjs\":16,\"sdk/browser.mjs\":30,\"sdk/config.mjs\":91,\"sdk/core.mjs\":403,\"sdk/deployment.mjs\":56,\"sdk/files-browser.mjs\":173,\"sdk/files.mjs\":177,\"sdk/gates.mjs\":23,\"sdk/handoff.mjs\":81,\"sdk/index.mjs\":17,\"sdk/observation.mjs\":47,\"sdk/public-rpc.mjs\":106,\"sdk/public.mjs\":110,\"sdk/strict-json.mjs\":159,\"src/RelayBranch.sol\":309,\"src/RelayEncoder.sol\":205,\"src/RelayFactory.sol\":100,\"src/RelayTypes.sol\":78,\"src/RelayVerifier.sol\":84,\"src/interfaces/IIntake.sol\":20,\"src/libraries/Assets.sol\":141,\"src/libraries/ManifestJSON.sol\":645,\"src/libraries/Policy.sol\":51,\"src/libraries/StrictJSON.sol\":260,\"src/libraries/Text.sol\":175,\"test-sdk/browser-sdk.test.mjs\":178,\"test-sdk/deployment.test.mjs\":89,\"test-sdk/files.test.mjs\":58,\"test-sdk/mock-rpc.mjs\":14,\"test-sdk/multi-file.test.mjs\":62,\"test-sdk/network-address.test.mjs\":85,\"test-sdk/parity-vectors.mjs\":100,\"test-sdk/public-rpc.test.mjs\":153,\"test-sdk/public.test.mjs\":82,\"test-sdk/relay.test.mjs\":244,\"test-sdk/review-regressions.test.mjs\":94,\"test-sdk/transaction-metrics.test.mjs\":12,\"test/CrossLanguage.t.sol\":37,\"test/IntakeCompatibility.t.sol\":105,\"test/LaunchCompatibility.t.sol\":175,\"test/ManifestEnvelopeRegression.t.sol\":366,\"test/ManifestSegmentBudget.t.sol\":373,\"test/ManifestStringRegression.t.sol\":189,\"test/MetadataScannerDifferential.t.sol\":120,\"test/MultiFileResults.t.sol\":133,\"test/PublicResults.t.sol\":34,\"test/RelayHistory.t.sol\":233,\"test/RelayInvariant.t.sol\":151,\"test/RelayMappingRegression.t.sol\":187,\"test/RelayPayments.t.sol\":240,\"test/RelayProfiles.t.sol\":396,\"test/RelaySetup.sol\":137,\"test/StrictManifest.t.sol\":254,\"test/TestBase.sol\":100,\"test/adversarial/ContinuationSpec.t.sol\":338,\"test/adversarial/ManifestSpec.t.sol\":400,\"test/adversarial/PaymentSpec.t.sol\":376,\"test/adversarial/ProfileBoundarySpec.t.sol\":227,\"test/adversarial/README.md\":40,\"test/adversarial/SpecSupport.sol\":462,\"test/adversarial/StateMachineSpec.t.sol\":482,\"test/adversarial/check-inline-fixtures.py\":43,\"test/fixtures/FixtureData.sol\":54,\"test/fixtures/LiveResultFixture.sol\":14,\"test/fixtures/MultiFileResult.sol\":11,\"test/fixtures/PublicResults.sol\":29,\"test/fixtures/SdkGolden.sol\":13,\"test/fixtures/document-updated.md\":5,\"test/fixtures/document-updated.md.result.json\":1,\"test/fixtures/document.md\":3,\"test/fixtures/document.md.result.json\":1,\"test/fixtures/html-1.html\":1,\"test/fixtures/html-1.html.result.json\":1,\"test/fixtures/html-3.html\":1,\"test/fixtures/html-3.html.result.json\":1,\"test/fixtures/image-2.png\":3,\"test/fixtures/image-2.png.result.json\":1,\"test/fixtures/public/completed-0.json\":1,\"test/fixtures/public/completed-1.json\":1,\"test/fixtures/public/completed-2.json\":1,\"test/fixtures/public/completed-3.json\":1,\"test/fixtures/public/mutable-job-0.json\":1,\"test/fixtures/public/mutable-job-1.json\":1,\"test/fixtures/public/mutable-job-2.json\":1,\"test/fixtures/public/mutable-job-3.json\":1,\"test/fixtures/public/observed-multiple-files.json\":1,\"test/fixtures/public/observed-one-file.json\":1,\"test/fixtures/sdk-golden.json\":20,\"test/mocks/MockIntake.sol\":101,\"test/mocks/MockToken.sol\":63,\"test/release/ExactGasRegression.t.sol\":216,\"test/release/PurchaseAtomicityInvariant.t.sol\":389,\"test/release/README.md\":99,\"test/release/local-replay-evidence.json\":117,\"test/release/replay-exact-gas.mjs\":230,\"tools/build-release.mjs\":9,\"tools/check-delivery.py\":57,\"tools/check-official-bodies.mjs\":42,\"tools/check-release.mjs\":47,\"tools/compilation-context.mjs\":26,\"tools/deployment-rehearsal.mjs\":78,\"tools/export-abi.mjs\":7,\"tools/generate-fixtures.py\":27,\"tools/generate-local-config.mjs\":35,\"tools/generate-sdk-abi.mjs\":25,\"tools/generate-sdk-fixtures.mjs\":26,\"tools/import-deployment.mjs\":59,\"tools/inspect-bytecode.mjs\":43,\"tools/local-integration.mjs\":278,\"tools/measure-binding.mjs\":89,\"tools/measure-release.mjs\":21,\"tools/measure-retained-binding.mjs\":98,\"tools/observe-ethereum.mjs\":16,\"tools/sdk-local-check.mjs\":159,\"tools/sdk-local-scenario.mjs\":107,\"tools/sync-release.mjs\":31,\"tools/transaction-metrics.mjs\":11,\"tools/validate-live.mjs\":23,\"tools/verify-history.py\":55,\"vendor/ethers/LICENSE.md\":21,\"vendor/ethers/PROVENANCE.md\":1,\"vendor/ethers/ethers.mjs\":26619,\"vendor/npm/PROVENANCE.json\":56,\"vendor/npm/adraffy-ens-normalize-1.11.1.tgz\":813,\"vendor/npm/aes-js-4.0.0-beta.5.tgz\":1433,\"vendor/npm/ethers-6.17.0.tgz\":10241,\"vendor/npm/noble-curves-1.2.0.tgz\":1096,\"vendor/npm/noble-hashes-1.3.2.tgz\":443,\"vendor/npm/tslib-2.7.0.tgz\":58,\"vendor/npm/types-node-22.7.5.tgz\":1658,\"vendor/npm/undici-types-6.19.8.tgz\":78,\"vendor/npm/ws-8.21.0.tgz\":142},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"44d8b208090a886a99ffdd4a7c5e618ced761e16804aec2eb666cba40b84f16a","verifiedTreeHash":"38fa861960202eb26f3dcd3d080f44cdd9cb6ae7","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":270463,"exitCode":0,"name":"build","output":"Compiling 48 files with Solc 0.8.26\nSolc 0.8.26 finished in 270.33s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> test/RelayProfiles.t.sol:331:13:\n    |\n331 |             bytes memory raw = _manifest(Text.hex32(keccak256(abi.encode(i))), Policy.kind(profile), 32);\n    |             ^^^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n   --> test/RelayProfiles.t.sol:339:9:\n    |\n339 |         bytes memory raw = _manifest(Text.hex32(keccak256(\"new job\")), T.Kind.Markdown, 42);\n    |         ^^^^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":32629,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/PublicResults.t.sol:PublicResultsTest\n[PASS] test_exactAuthenticatedPublicZeroFileResultsNeverSettleOrRebuy() (gas: 20754650)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 29.47ms (25.17ms CPU time)\n\nRan 7 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] test_badPolicyAndBadInputsFailBeforeCreateAndRegistration() (gas: 179829)\n[PASS] test_callbackUriAtLimitWithinOfficialStipendAndAboveStaysPending() (gas: 2261838)\n[PASS] test_constructorRejectsZeroAndDuplicateDependencies() (gas: 12577)\n[PASS] test_directChildrenAreCompleteIndependentPayers() (gas: 6867385)\n[PASS] test_launchAndRuntimeChildPassProtectedOpcodeRule() (gas: 21037341)\n[PASS] test_namedBatchBackwardReferencesThenRuntimeChild() (gas: 13446709)\n[PASS] test_staticFactoryConstructorAcceptsEmptyDependenciesWithoutCallsOrChildren() (gas: 53669)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 79.97ms (78.45ms CPU time)\n\nRan 5 tests for test/IntakeCompatibility.t.sol:IntakeCompatibilityTest\n[PASS] test_currentCatalogShapeAndOutputNamespaceAreEncoded() (gas: 6964887)\n[PASS] test_legacyDescriptorRemainsExactAndMigrationRequiresExplicitCanonicalUpdate() (gas: 4645597)\n[PASS] test_legacyHTMLCannotCreateSecondHTMLSlotAndExplicitUpdateMigrates() (gas: 4979429)\n[PASS] test_namesRequireInitialLetterButHistoricalNamesRemainReadable() (gas: 3522397)\n[PASS] test_oldOutputNamespaceRejectedBeforePayment() (gas: 273419)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 109.37ms (126.25ms CPU time)\n\nRan 13 tests for test/RelayMappingRegression.t.sol:RelayMappingRegressionTest\n[PASS] test_createRejectsExistingNameEvenWhenPathAndSlotDifferBeforePayment() (gas: 3406558)\n[PASS] test_createRejectsExistingPathEvenWhenNameAndSlotDifferBeforePayment() (gas: 3411086)\n[PASS] test_distLikeNamesAndNestedNonWebsiteDistDirectoryRemainAllowed() (gas: 1676948)\n[PASS] test_historicalForkKeepsSourceProvenanceAndCanUpdateInheritedSlot() (gas: 8347276)\n[PASS] test_legacyIndependentDescriptorsStayReadableButCollidingUpdateIsRejected() (gas: 3762551)\n[PASS] test_markdownAndImageCannotWriteAnyTopLevelDistDescendant() (gas: 746559)\n[PASS] test_namesCannotCollideAcrossDifferentAssetKinds() (gas: 3410046)\n[PASS] test_pathAncestorCannotReplaceAnExistingDirectoryWithFileBeforePayment() (gas: 5904524)\n[PASS] test_pathAncestorCollisionWithOtherSlotAlsoRejectsUpdates() (gas: 3542575)\n[PASS] test_pathCommonDirectoriesAndNonBoundaryPrefixesAreAllowed() (gas: 4452565)\n[PASS] test_pathDescendantCannotTreatAnExistingFileAsDirectoryBeforePayment() (gas: 3414696)\n[PASS] test_secondHtmlSlotRejectsFixedPathCollision() (gas: 6400755)\n[PASS] test_uniqueCreateAndUpdatePreserveOtherAssetProvenance() (gas: 14337237)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 131.16ms (128.63ms CPU time)\n\nRan 2 tests for test/CrossLanguage.t.sol:CrossLanguageTest\n[PASS] test_sdkCalldataActuallyCreatesBranchWithoutPayment() (gas: 2871398)\n[PASS] test_sdkCanonicalWitnessMatchesSolidity() (gas: 724409)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 167.44ms (11.53ms CPU time)\n\nRan 5 tests for test/MultiFileResults.t.sol:MultiFileResultsTest\n[PASS] test_changingEvenIgnoredFileBytesCannotBindOrBuyAgain() (gas: 5957634)\n[PASS] test_declaredOutputAtBeginningOrEndOfFourAndSeventeenFiles() (gas: 9654481)\n[PASS] test_duplicateOutputNamePathOrExactMatchIsAmbiguous() (gas: 6576373)\n[PASS] test_exactObservedTwoFileResultBindsDeclaredOutputAndForks() (gas: 6666204)\n[PASS] test_invalidExtraJSONAndRetainedBoundsStillReject() (gas: 2995033)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 251.42ms (151.98ms CPU time)\n\nRan 5 tests for test/adversarial/ContinuationSpec.t.sol:ContinuationSpecTest\n[PASS] test_checkpointPreimageBindsChainFactoryBranchPolicyRevisionAndSource() (gas: 9536598)\n[PASS] test_currentProposalsSelectableInEitherOrderAndLosingSponsorPaysNothing() (gas: 9353782)\n[PASS] test_everyWitnessFieldAuthenticatedForSponsorBindAndHistoricalFork() (gas: 10395247)\n[PASS] test_fiveRootRoundsTwoSponsorsHistoricalForkAndTwoChildRounds() (gas: 46138388)\n[PASS] test_foreignFactoryAndUnregisteredLookalikeCannotForgeHistoricalFork() (gas: 6480335)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 270.39ms (265.64ms CPU time)\n\nRan 9 tests for test/RelayHistory.t.sol:RelayHistoryTest\n[PASS] test_badBindingPreservesResultThenCorrectWitnessWorksWithoutPurchase() (gas: 7183854)\n[PASS] test_childCannotBindParentsProjectAsOwn() (gas: 9814435)\n[PASS] test_forkCannotAuthenticateFakeParentLatestWitnessOrForgedProvenance() (gas: 7214918)\n[PASS] test_forkChosenHistoricalCheckpointStartsOwnProjectAndPayer() (gas: 18913620)\n[PASS] test_forkIsAllowedWhileParentPendingOrFrozen() (gas: 11955998)\n[PASS] test_htmlImageHtmlLatestJobAndOlderSelectedInputs() (gas: 28175488)\n[PASS] test_projectMismatchCannotOverwriteCheckpoint() (gas: 7664084)\n[PASS] test_removedInitializerCannotChangeAuthorityEvenForFactory() (gas: 139171)\n[PASS] test_reusedJobCannotCreateNewRevision() (gas: 6744066)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 272.69ms (269.20ms CPU time)\n\nRan 14 tests for test/RelayProfiles.t.sol:RelayProfilesTest\n[PASS] test_capacityEndToEndSixteenAssetsThenUpdate() (gas: 95558802)\n[PASS] test_htmlImagesPerFileAggregateAndBase64OverheadBounds() (gas: 1375271)\n[PASS] test_imageReferencesAndMarkdownImageInputsDisabled() (gas: 3610153)\n[PASS] test_invalidTextAndCanonicalWitnessRejectBeforePayment() (gas: 346980)\n[PASS] test_jsonEscapingCannotInjectRuntimeFields() (gas: 1027576)\n[PASS] test_maximumCompleteBindingASCIIFitsGasBudget() (gas: 231067930)\n[PASS] test_maximumCompleteBindingEscapedUnicodeFitsGasBudget() (gas: 255432287)\n[PASS] test_maximumCompleteBindingWideObjectsFitsGasBudget() (gas: 260123606)\n[PASS] test_measureMaximumWitnessAndLargeManifestTogether() (gas: 14411156)\n[PASS] test_publishDisabledAndOutputMappingFixedBeforePayment() (gas: 360429)\n[PASS] test_requestBodyUTF8ByteLimitCheckedBeforePayment() (gas: 6269331)\n[PASS] test_reserveEachEnabledTypeAndExistingSlotsUpdatableAtCapacity() (gas: 4280279)\n[PASS] test_selectedInputsMustBeCurrentSortedUniqueAndWithinEight() (gas: 10931478)\n[PASS] test_updateTargetMandatoryCreateCannotOverwriteAndRenameDisabled() (gas: 4085820)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 1.36s (3.11s CPU time)\n\nRan 5 tests for test/adversarial/ProfileBoundarySpec.t.sol:ProfileBoundarySpecTest\n[PASS] testFuzz_htmlBase64RoundingAndOneByteOverTheKnownInputBudget(uint32) (runs: 1000, μ: 992664, ~: 992685)\n[PASS] test_realEightAssetWitnessExact16384ByteRequestAndOneByteOverRejectedBeforePayment() (gas: 139846114)\n[PASS] test_slotReservationInputCountAndFullCapacityUpdateBoundaries() (gas: 9075210)\n[PASS] test_unsafePathComponentsInvalidUtf8AndDisabledModesRejectWithoutSpending() (gas: 2664969)\n[PASS] test_utf8TextLimitsCountBytesAndOutputMappingLengthsAreBounded() (gas: 32437589)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.60s (3.21s CPU time)\n\nRan 15 tests for test/StrictManifest.t.sol:StrictManifestTest\n[PASS] testFuzz_asciiJSONQuoteDecodeRoundTrip(bytes32,uint8) (runs: 1000, μ: 267665, ~: 137815)\n[PASS] testFuzz_decodedDuplicateKeyAlwaysRejected(uint8) (runs: 1000, μ: 77949, ~: 77933)\n[PASS] test_actualFileHashesAndManifestKeccakAreDistinct() (gas: 667710)\n[PASS] test_boundedLargeManifestMeasurement() (gas: 5271789)\n[PASS] test_onlyDeclaredFilesNotSourceOrGitMetadataSupplyAcceptedFile() (gas: 4803737)\n[PASS] test_parserBoundsManifestStringDepthMembersAndTokens() (gas: 2643565)\n[PASS] test_rejectDuplicateKeysIncludingDecodedEscapesAtEveryDepth() (gas: 6934845)\n[PASS] test_rejectEmptyOrMalformedExtraFileEntries() (gas: 4561931)\n[PASS] test_rejectIncompleteWrongIdentityTypesAndWrongFileTypes() (gas: 15223173)\n[PASS] test_rejectInvalidUTF8UnicodeSurrogatesAndNoncharacters() (gas: 871715)\n[PASS] test_rejectPathsTraversalHiddenURLAbsoluteAndDecodedControl() (gas: 22727017)\n[PASS] test_rejectTrailingAndMalformedJSON() (gas: 1235180)\n[PASS] test_rejectZeroOversizedNonIntegerAndStringFileBytes() (gas: 17160761)\n[PASS] test_validUTF8EscapesAndSurrogatePairsDecodeExactly() (gas: 1814850)\n[PASS] test_whitespaceIsLegalButDigestIsOverExactRawBytes() (gas: 683309)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 2.60s (4.38s CPU time)\n\nRan 14 tests for test/adversarial/PaymentSpec.t.sol:PaymentSpecTest\n[PASS] testFuzz_priceChangeCapAndDonationsConserveEveryWei(uint96,uint64) (runs: 1000, μ: 3011848, ~: 3012380)\n[PASS] testFuzz_unknownFailureFrozenDespiteNewProposalsAndTime(uint8) (runs: 1000, μ: 3334928, ~: 3334930)\n[PASS] test_continuationRetryRetainsParentAndFullSelectedSnapshot() (gas: 8456148)\n[PASS] test_exactWholeBalanceAndMaxFeeDoesNotOvercharge() (gas: 2250898)\n[PASS] test_insufficientApprovalAndBalanceRollbackBeforeAnyReceipt() (gas: 3490587)\n[PASS] test_intakeRevertPartialPullZeroIdAndClearFailureRollbackAllEffects() (gas: 7692767)\n[PASS] test_malformedResultIsRecordedWithoutParsingThenBadBindingPreservesIt() (gas: 2912546)\n[PASS] test_maximumCallbackURIWithinStipendAndOversizeFailureStaysPending() (gas: 6687223)\n[PASS] test_missingCallbackHasNoTimeoutButAuthenticLateCallbackStillWorks() (gas: 3447093)\n[PASS] test_reentrancyAtTransferApprovalAndIntakeCannotProposeOrBuyAgain() (gas: 13300793)\n[PASS] test_refusalCannotSubstituteProposalAndRetryRacesCostOnlyWinner() (gas: 6359579)\n[PASS] test_reusedIntakeRequestIdOnRetryCannotOverwriteAttemptOrDoubleCharge() (gas: 4586111)\n[PASS] test_spoofForeignCrossBranchAndReplayCallbacksCannotSettleOwnRequest() (gas: 8877537)\n[PASS] test_synchronousIntakeResultAndFailureCannotSettlePurchasingState() (gas: 4024590)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 2.60s (4.39s CPU time)\n\nRan 6 tests for test/MetadataScannerDifferential.t.sol:MetadataScannerDifferentialTest\n[PASS] testFuzz_ArbitraryRawString(bytes32,bytes32) (runs: 256, μ: 826519, ~: 824228)\n[PASS] testFuzz_RawUnicode(uint32) (runs: 256, μ: 828830, ~: 831760)\n[PASS] testFuzz_UnicodeEscape(uint16,uint16) (runs: 256, μ: 845853, ~: 846733)\n[PASS] test_ControlsInvalidHexAndSurrogates() (gas: 14067157)\n[PASS] test_MixedRawAndEscapedUnicode() (gas: 5030399)\n[PASS] test_RetainedASCIICopyAtWordBoundaries() (gas: 16028051)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.60s (3.99s CPU time)\n\nRan 13 tests for test/RelayPayments.t.sol:RelayPaymentsTest\n[PASS] testFuzz_exactDynamicFeeConservesBalances(uint96) (runs: 1000, μ: 2013454, ~: 2013424)\n[PASS] testFuzz_nonRefusalFailureAlwaysFreezes(uint8) (runs: 1000, μ: 2191654, ~: 2191655)\n[PASS] test_callbacksAuthenticateSenderOwnRequestAndSingleDelivery() (gas: 2258915)\n[PASS] test_creationAndProposalsDoNotPurchaseOrMoveAnchor() (gas: 3829545)\n[PASS] test_dynamicFeeBranchPayerExactBodyAndSelectors() (gas: 2485141)\n[PASS] test_feeOnTransferSenderTaxFalseAndPartialPullRevertAtomically() (gas: 3683362)\n[PASS] test_foreignIntakeRequestCannotSettleBranch() (gas: 2291558)\n[PASS] test_missingCallbackStaysPendingIndefinitely() (gas: 2122727)\n[PASS] test_noReturnTokenAndStickyAllowanceCleared() (gas: 2016329)\n[PASS] test_refusedOnlyExplicitIdenticalRetryWithNewReceipt() (gas: 5501222)\n[PASS] test_stipendCallbackOnlyRecordsAndBindingIsPermissionless() (gas: 3248579)\n[PASS] test_tokenReentrancyAndSynchronousCallbackAreRejected() (gas: 3417387)\n[PASS] test_zeroUnknownProposalFeeCapAndUnpricedRejectBeforeTransfer() (gas: 1663610)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 2.60s (4.90s CPU time)\n\nRan 5 tests for test/ManifestRetainedTokens.t.sol:ManifestRetainedTokensTest\n[PASS] test_capIsTwiceTheValueBudget() (gas: 320)\n[PASS] test_twentyFileResultBindsAsCompleteBranchTransaction() (gas: 5657983)\n[PASS] test_twentyFileResultVerifiesUnderFiveKilobytes() (gas: 3059203)\n[PASS] test_valueBudgetRefusesBeforeRetainedTokenCap() (gas: 10253877)\n[PASS] test_workBudgetRefusesBeforeRetainedTokenCap() (gas: 162763191)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.60s (335.59ms CPU time)\n\nRan 13 tests for test/ManifestSegmentBudget.t.sol:ManifestSegmentBudgetTest\n[PASS] test_asciiPrefixBeforeEscapeOrScalarDecodesExactly() (gas: 3760346)\n[PASS] test_asciiPrefixKeysStillDetectDuplicates() (gas: 901235)\n[PASS] test_asciiPrefixStillCountsTowardRetainedLimit() (gas: 2879009)\n[PASS] test_auditAlternatingEscapeShapeIsRejectedByBudgetNotGas() (gas: 204603687)\n[PASS] test_bindAsciiPrefixThenRawScalarWithFullWitness() (gas: 205363732)\n[PASS] test_bindAsciiPrefixThenSimpleEscapeWithFullWitness() (gas: 205374591)\n[PASS] test_bindAsciiPrefixThenUnicodeEscapeWithFullWitness() (gas: 205372787)\n[PASS] test_bindBudgetedAlternatingEscapesWithFullWitness() (gas: 188942501)\n[PASS] test_bindMaximumBudgetedSegmentFlushesWithFullWitness() (gas: 204476258)\n[PASS] test_bindOriginalCGas01ShapeWithFullWitnessBelowCap() (gas: 206786141)\n[PASS] test_consecutiveSimpleEscapesAreChargedOnlyOnce() (gas: 32450836)\n[PASS] test_segmentFlushBudgetAcceptsBoundaryRejectsOneMore() (gas: 18016682)\n[PASS] test_unicodeEscapesAndIgnoredStringsAreNotCharged() (gas: 159188403)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 2.68s (7.17s CPU time)\n\nRan 11 tests for test/adversarial/ManifestSpec.t.sol:ManifestSpecTest\n[PASS] testFuzz_nonWhitespaceTrailingByteAlwaysRejected(uint8) (runs: 1000, μ: 72226, ~: 72227)\n[PASS] testFuzz_unicodeScalarEscapesDecodeAndDuplicateKeysReject(uint32) (runs: 1000, μ: 243836, ~: 242436)\n[PASS] test_callbackDigestBindsWhitespaceAndKeyOrderOfOriginalBytes() (gas: 3788190)\n[PASS] test_exactDepthMemberKeyAndTokenBoundaries() (gas: 4652769)\n[PASS] test_exactManifestAndStringByteLimitsAcceptBoundaryRejectOneMore() (gas: 15517703)\n[PASS] test_fileSizeIntegerGrammarAndAllProfileDeclaredCaps() (gas: 27911654)\n[PASS] test_hashEncodingTypeWidthNonhexAndZeroAreCheckedForBothDigests() (gas: 103797692)\n[PASS] test_identityLengthDecodedFieldsAndEmptyAcceptedFiles() (gas: 9379375)\n[PASS] test_manifestRejectionsKeepRecordedDigestAndOldHistory() (gas: 114253200)\n[PASS] test_projectSwitchAndHistoricalJobReplayPreservePreviousCheckpoint() (gas: 20378139)\n[PASS] test_sourceAndLaterGitMetadataNeverReplaceAcceptedFilesDescriptor() (gas: 3867312)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 2.68s (6.05s CPU time)\n\nRan 21 tests for test/ManifestEnvelopeRegression.t.sol:ManifestEnvelopeRegressionTest\n[PASS] test_bind33ActualSourceDescriptorsWithoutAnotherPurchase() (gas: 10093781)\n[PASS] test_bind33StructuredSourceEntriesWithoutAnotherPurchase() (gas: 5858949)\n[PASS] test_bindLongMetadataOnTheAcceptedFileWithoutAnotherPurchase() (gas: 5170786)\n[PASS] test_bindMaximumEscapedKeyBytesWithFullWitness() (gas: 251614862)\n[PASS] test_bindMaximumIgnoredNumberWithFullWitness() (gas: 188514856)\n[PASS] test_bindMaximumMetadataComplexityWithFullWitness() (gas: 201270927)\n[PASS] test_bindMaximumMetadataValuesAndUnicodeWithFullWitness() (gas: 206065224)\n[PASS] test_bindMaximumRetainedEscapedSurrogatesWithFullWitness() (gas: 189280913)\n[PASS] test_bindMaximumRetainedEscapedUtf8WithFullWitness() (gas: 191862961)\n[PASS] test_bindMaximumRetainedRawUtf8FourByteWithFullWitness() (gas: 187691222)\n[PASS] test_bindMaximumRetainedRawUtf8ThreeByteWithFullWitness() (gas: 188692509)\n[PASS] test_bindMaximumRetainedRawUtf8TwoByteWithFullWitness() (gas: 189709163)\n[PASS] test_bindMaximumRetainedSimpleEscapesWithFullWitness() (gas: 193005724)\n[PASS] test_bindMaximumWhitespaceWithFullWitness() (gas: 178364384)\n[PASS] test_bindMetadataBeyond8192BytesWithoutAnotherPurchase() (gas: 9275071)\n[PASS] test_exactPreviouslyObservedIMDResultBindsWithoutReserialization() (gas: 3714901)\n[PASS] test_invalidIgnoredMetadataCannotHideBehindProjection() (gas: 6211022)\n[PASS] test_longIgnoredStringStillRejectsLateInvalidUtf8AndDuplicateKeys() (gas: 21150163)\n[PASS] test_manifestAggregateKeyBudgetAccepts2048Rejects2049() (gas: 4034429)\n[PASS] test_manifestValueBudgetAccepts512Rejects513() (gas: 6252178)\n[PASS] test_wrongHashStillRejectsProjectedManifest() (gas: 1320600)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 2.70s (7.37s CPU time)\n\nRan 7 tests for test/ManifestStringRegression.t.sol:ManifestStringRegressionTest\n[PASS] testFuzz_retainedArbitraryBytesMatchReference(bytes32,uint8) (runs: 1000, μ: 377838, ~: 377676)\n[PASS] testFuzz_retainedQuotedAsciiMatchesReference(bytes32,uint8) (runs: 1000, μ: 975293, ~: 783601)\n[PASS] testFuzz_validScalarRawAndEscapeMatchReference(uint32,uint8) (runs: 1000, μ: 1750570, ~: 1733567)\n[PASS] test_mixedRawEscapedScalarsAndSimpleEscapesDecodeExactly() (gas: 468790)\n[PASS] test_rawAndEscapedUnicodeKeysStillDetectDuplicates() (gas: 637558)\n[PASS] test_retainedDecodedByteLimitAccepts1024Rejects1025() (gas: 3573361)\n[PASS] test_retainedInvalidUnicodeAndEscapesReject() (gas: 8497400)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 2.70s (7.74s CPU time)\n\nRan 1 test for test/RelayInvariant.t.sol:RelayInvariantTest\n[PASS] invariant_conservationAndPermanentHistory() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| RelayHandler | bind         | 1358  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | fail         | 1347  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | propose      | 1372  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | recordResult | 1345  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | retry        | 1387  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | sponsor      | 1383  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.69s (6.68s CPU time)\n\nRan 2 tests for test/adversarial/StateMachineSpec.t.sol:StateMachineSpecTest\n[PASS] invariant_modelFeesReceiptsAssetsAndPermanentCheckpoints() (runs: 256, calls: 24576, reverts: 0)\n\n╭------------------+-----------------+-------+---------+----------╮\n| Contract         | Selector        | Calls | Reverts | Discards |\n+=================================================================+\n| SpecStateHandler | advanceTime     | 2453  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | bind            | 2390  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | donate          | 2424  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | fail            | 2446  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | forkHistory     | 2398  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | hostileCallback | 2430  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | propose         | 2485  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | purchase        | 2505  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | recordResult    | 2512  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | retry           | 2533  | 0       | 0        |\n╰------------------+-----------------+-------+---------+----------╯\n\n[PASS] test_modelExercisesRefusalRetryChildContinuationAndHistoricalFork() (gas: 26475558)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 32.47s (32.48s CPU time)\n\nRan 21 test suites in 32.47s (68.17s CPU time): 174 tests passed, 0 failed, 0 skipped (174 total tests)\n","passed":true},{"durationMs":259,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"RelayBranch.bind(bytes,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.onIntakeFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"RelayBranch.onIntakeResult(bytes32,bytes32,string)\",\"RelayBranch.propose((bytes32,uint8,bytes32,bytes32[],string,string,string,bool),(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.retry(uint256,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.sponsor(uint256,uint256,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayFactory.createProject(string)\",\"RelayFactory.fork(address,uint64,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[],string)\"],\"files\":{\".gitignore\":7,\"ADAPTATION.md\":147,\"DESIGN.md\":124,\"LICENSE\":21,\"README.md\":48,\"abi/IIntake.json\":82,\"abi/RelayBranch.json\":1455,\"abi/RelayEncoder.json\":353,\"abi/RelayFactory.json\":306,\"abi/RelayVerifier.json\":245,\"cli/relay.mjs\":88,\"config/production-gate.json\":89,\"config/production-gate.schema.json\":273,\"config/release.json\":369,\"dist/assets/dist-V2jKd6xN.js\":3,\"dist/assets/index-4UpPiOax.css\":1,\"dist/assets/index-CNVEwO4S.js\":128,\"dist/favicon.svg\":1,\"dist/index.html\":18,\"dist/local-config.json\":103,\"dist/og.png\":190,\"dist/og.svg\":1,\"docs/ACCEPTANCE.md\":5,\"docs/AGENT-GUIDE.md\":13,\"docs/BUILD.md\":51,\"docs/CLI.md\":29,\"docs/CONTRACTS.md\":33,\"docs/DESIGN.md\":5,\"docs/ENTRYPOINTS.md\":72,\"docs/FRONTEND.md\":5,\"docs/HANDOFF.md\":47,\"docs/LIMITS.md\":45,\"docs/LIVE-VALIDATION.md\":23,\"docs/OPERATIONS.md\":49,\"docs/PLATFORM-AUTHORING.md\":5,\"docs/PROTOCOL-OVERVIEW.md\":31,\"docs/RESOLVER-PROPOSAL.md\":9,\"docs/REVIEW.md\":28,\"docs/SDK-API.md\":23,\"docs/SDK-BROWSER.md\":9,\"docs/agent/SDK-CLI-A1.md\":5,\"docs/agent/sdk-cli-checks.md\":5,\"docs/frontend-README.md\":5,\"docs/history/README.md\":32,\"docs/history/a1-fixtures.tar.xz\":13,\"docs/history/accepted-platform-validation-index.json.xz\":38,\"docs/history/accepted-rc-raw-index.json.xz\":6,\"docs/history/accepted-rc-raw.tar.xz\":140,\"docs/history/fixtures-index.json\":72,\"docs/history/imported-index.json.xz\":190,\"docs/history/integration-predecessor.json\":71,\"docs/validation/boundary-revision/README.md\":111,\"docs/validation/boundary-revision/archive-index.json.xz\":60,\"docs/validation/boundary-revision/summary.json\":334,\"docs/validation/documentation-v1/README.md\":69,\"docs/validation/documentation-v1/archive-index.json\":42,\"docs/validation/documentation-v1/docs-hashes.sha256.json.xz\":15,\"docs/validation/documentation-v1/runtime-export.sha256.json.xz\":48,\"docs/validation/integration-v1/README.md\":38,\"docs/validation/integration-v1/archive-index.json\":268,\"docs/validation/launch-packaging-v1/README.md\":100,\"docs/validation/launch-packaging-v1/bytecode-inspection.json\":70,\"docs/validation/launch-packaging-v1/deployment-rehearsal.json\":293,\"docs/validation/launch-packaging-v1/metadata-binding.json\":179,\"docs/validation/launch-packaging-v1/retained-binding.json\":145,\"docs/validation/launch-packaging-v1/revision-1/bytecode-inspection.json\":70,\"docs/validation/launch-packaging-v1/revision-1/metadata-binding.json\":179,\"docs/validation/launch-packaging-v1/revision-1/retained-binding.json\":145,\"docs/validation/local-repair-v1/README.md\":66,\"docs/validation/local-repair-v1/archive-index.json.xz\":17,\"docs/validation/local-repair-v1/delivery-size.json\":40,\"docs/validation/local-repair-v1/evidence.tar.xz\":832,\"docs/validation/local-repair-v1/measurements.json\":287,\"docs/validation/local-repair-v1/source-manifest.json.xz\":58,\"docs/validation/multi-file-revision/README.md\":97,\"docs/validation/multi-file-revision/archive-index.json.xz\":44,\"docs/validation/multi-file-revision/summary.json\":213,\"docs/validation/public-ui-v1/raw/build.log\":12,\"docs/validation/rc-v1/README.md\":110,\"docs/validation/rc-v1/archive-index.json\":242,\"docs/validation/rc-v1/authenticated-results-index.json\":54,\"docs/validation/rc-v1/delivery-size.json\":40,\"docs/validation/rc-v1/initial-frontend-typecheck-failure.txt\":10,\"docs/validation/rc-v1/initial-gas-limit-metric-failure.txt\":31,\"docs/validation/rc-v1/initial-launch-test-failure.txt\":24,\"docs/validation/rc-v1/initial-name-validation-unit-failure.txt\":39,\"docs/validation/rc-v1/initial-public-browser-harness-failure.txt\":14,\"docs/validation/rc-v1/raw-result-test-compile-failure.txt\":8,\"docs/validation/rc-v1/rendered-review.json\":33,\"docs/validation/rc-v1/source-manifest.json.xz\":71,\"foundry.toml\":16,\"frontend/.gitignore\":6,\"frontend/.npmrc\":1,\"frontend/DESIGN.md\":5,\"frontend/README.md\":5,\"frontend/REVIEW.md\":5,\"frontend/docs/A1-HANDOFF.md\":5,\"frontend/docs/W1-README.md\":5,\"frontend/docs/licenses/Noto-Sans-OFL.txt\":92,\"frontend/docs/licenses/Noto-Sans-provenance.json\":9,\"frontend/docs/licenses/better-interface-LICENSE.txt\":220,\"frontend/docs/licenses/eth-frontend-ux-LICENSE.txt\":30,\"frontend/index.html\":16,\"frontend/package-lock.json\":2700,\"frontend/package.json\":45,\"frontend/playwright.config.ts\":28,\"frontend/public/favicon.svg\":1,\"frontend/public/local-config.json\":103,\"frontend/public/og.png\":190,\"frontend/public/og.svg\":1,\"frontend/scripts/audit-local-evidence.mjs\":70,\"frontend/scripts/check-integration.mjs\":50,\"frontend/scripts/design-review.mjs\":74,\"frontend/scripts/local-deliver.mjs\":59,\"frontend/scripts/local-setup.mjs\":89,\"frontend/scripts/measure-platform.mjs\":33,\"frontend/scripts/measure-submission.mjs\":33,\"frontend/scripts/platform-review.mjs\":26,\"frontend/scripts/prepare-webkit.sh\":51,\"frontend/scripts/record-release.mjs\":97,\"frontend/scripts/static-preview.mjs\":12,\"frontend/scripts/validate.mjs\":37,\"frontend/src/App.tsx\":46,\"frontend/src/components/ArtifactViewer.tsx\":27,\"frontend/src/components/FundingSheet.tsx\":6,\"frontend/src/components/Sheet.tsx\":28,\"frontend/src/components/VerifiedThumbnail.tsx\":12,\"frontend/src/components/WalletButton.tsx\":3,\"frontend/src/components/platform.tsx\":75,\"frontend/src/config.ts\":22,\"frontend/src/domain/adapter.ts\":72,\"frontend/src/domain/chainAdapter.ts\":470,\"frontend/src/domain/files.ts\":107,\"frontend/src/domain/fixtureAdapter.ts\":519,\"frontend/src/domain/fixtures.ts\":63,\"frontend/src/domain/liveAdapter.ts\":58,\"frontend/src/domain/publicMode.ts\":44,\"frontend/src/domain/sdk.ts\":11,\"frontend/src/domain/types.ts\":208,\"frontend/src/main.tsx\":24,\"frontend/src/preview/FilePreview.tsx\":114,\"frontend/src/preview/sanitize.ts\":77,\"frontend/src/styles.css\":259,\"frontend/src/ui/ErrorBoundary.tsx\":19,\"frontend/src/ui/LocalApp.tsx\":63,\"frontend/src/ui/ProjectList.tsx\":119,\"frontend/src/ui/ProposeForm.tsx\":219,\"frontend/src/ui/Showcase.tsx\":18,\"frontend/src/ui/SponsorPanel.tsx\":64,\"frontend/src/ui/Workspace.tsx\":146,\"frontend/src/ui/actionScope.ts\":18,\"frontend/src/ui/format.tsx\":70,\"frontend/src/ui/recovery.ts\":41,\"frontend/src/ui/snapshot.ts\":12,\"frontend/src/ui/verification.ts\":38,\"frontend/src/wallet/ConnectSheet.tsx\":98,\"frontend/src/wallet/icons.ts\":8,\"frontend/src/wallet/open-in.ts\":19,\"frontend/src/wallet/wagmi.ts\":13,\"frontend/tests/e2e/actions.ts\":56,\"frontend/tests/e2e/harness.ts\":34,\"frontend/tests/e2e/journey.spec.ts\":214,\"frontend/tests/e2e/layout.spec.ts\":65,\"frontend/tests/e2e/platform.spec.ts\":102,\"frontend/tests/e2e/revision.spec.ts\":258,\"frontend/tests/e2e/w1.spec.ts\":306,\"frontend/tests/e2e/wallet.spec.ts\":88,\"frontend/tests/fixtures/wide.png\":3,\"frontend/tests/integration/browser-chain.mjs\":701,\"frontend/tests/integration/local-command.mjs\":37,\"frontend/tests/integration/navigation-race.mjs\":32,\"frontend/tests/integration/platform-chain.mjs\":87,\"frontend/tests/integration/public-chain.mjs\":137,\"frontend/tests/run-browsers.mjs\":14,\"frontend/tests/unit/chain-provider.test.ts\":62,\"frontend/tests/unit/domain.test.ts\":120,\"frontend/tests/unit/multi-file.test.ts\":54,\"frontend/tests/unit/platform.test.tsx\":103,\"frontend/tests/unit/public-transport.test.ts\":290,\"frontend/tests/unit/reopened.test.ts\":111,\"frontend/tests/unit/security.test.tsx\":228,\"frontend/tests/unit/setup.ts\":1,\"frontend/tsconfig.json\":19,\"frontend/vite.config.ts\":10,\"frontend/vitest.config.ts\":11,\"package-lock.json\":127,\"package.json\":20,\"remappings.txt\":1,\"sdk/abi.mjs\":16,\"sdk/browser.mjs\":30,\"sdk/config.mjs\":91,\"sdk/core.mjs\":403,\"sdk/deployment.mjs\":56,\"sdk/files-browser.mjs\":173,\"sdk/files.mjs\":177,\"sdk/gates.mjs\":23,\"sdk/handoff.mjs\":81,\"sdk/index.mjs\":17,\"sdk/observation.mjs\":47,\"sdk/public-rpc.mjs\":106,\"sdk/public.mjs\":110,\"sdk/strict-json.mjs\":159,\"src/RelayBranch.sol\":309,\"src/RelayEncoder.sol\":205,\"src/RelayFactory.sol\":100,\"src/RelayTypes.sol\":78,\"src/RelayVerifier.sol\":84,\"src/interfaces/IIntake.sol\":20,\"src/libraries/Assets.sol\":141,\"src/libraries/ManifestJSON.sol\":648,\"src/libraries/Policy.sol\":51,\"src/libraries/StrictJSON.sol\":260,\"src/libraries/Text.sol\":175,\"test-sdk/browser-sdk.test.mjs\":178,\"test-sdk/deployment.test.mjs\":89,\"test-sdk/files.test.mjs\":58,\"test-sdk/mock-rpc.mjs\":14,\"test-sdk/multi-file.test.mjs\":62,\"test-sdk/network-address.test.mjs\":85,\"test-sdk/parity-vectors.mjs\":100,\"test-sdk/public-rpc.test.mjs\":153,\"test-sdk/public.test.mjs\":82,\"test-sdk/relay.test.mjs\":244,\"test-sdk/review-regressions.test.mjs\":113,\"test-sdk/transaction-metrics.test.mjs\":12,\"test/CrossLanguage.t.sol\":37,\"test/IntakeCompatibility.t.sol\":105,\"test/LaunchCompatibility.t.sol\":175,\"test/ManifestEnvelopeRegression.t.sol\":366,\"test/ManifestRetainedTokens.t.sol\":177,\"test/ManifestSegmentBudget.t.sol\":373,\"test/ManifestStringRegression.t.sol\":189,\"test/MetadataScannerDifferential.t.sol\":120,\"test/MultiFileResults.t.sol\":133,\"test/PublicResults.t.sol\":34,\"test/RelayHistory.t.sol\":233,\"test/RelayInvariant.t.sol\":151,\"test/RelayMappingRegression.t.sol\":187,\"test/RelayPayments.t.sol\":240,\"test/RelayProfiles.t.sol\":396,\"test/RelaySetup.sol\":137,\"test/StrictManifest.t.sol\":254,\"test/TestBase.sol\":100,\"test/adversarial/ContinuationSpec.t.sol\":338,\"test/adversarial/ManifestSpec.t.sol\":400,\"test/adversarial/PaymentSpec.t.sol\":376,\"test/adversarial/ProfileBoundarySpec.t.sol\":227,\"test/adversarial/README.md\":40,\"test/adversarial/SpecSupport.sol\":462,\"test/adversarial/StateMachineSpec.t.sol\":482,\"test/adversarial/check-inline-fixtures.py\":43,\"test/fixtures/FixtureData.sol\":54,\"test/fixtures/LiveResultFixture.sol\":14,\"test/fixtures/MultiFileResult.sol\":11,\"test/fixtures/PublicResults.sol\":29,\"test/fixtures/SdkGolden.sol\":13,\"test/fixtures/document-updated.md\":5,\"test/fixtures/document-updated.md.result.json\":1,\"test/fixtures/document.md\":3,\"test/fixtures/document.md.result.json\":1,\"test/fixtures/html-1.html\":1,\"test/fixtures/html-1.html.result.json\":1,\"test/fixtures/html-3.html\":1,\"test/fixtures/html-3.html.result.json\":1,\"test/fixtures/image-2.png\":3,\"test/fixtures/image-2.png.result.json\":1,\"test/fixtures/public/completed-0.json\":1,\"test/fixtures/public/completed-1.json\":1,\"test/fixtures/public/completed-2.json\":1,\"test/fixtures/public/completed-3.json\":1,\"test/fixtures/public/mutable-job-0.json\":1,\"test/fixtures/public/mutable-job-1.json\":1,\"test/fixtures/public/mutable-job-2.json\":1,\"test/fixtures/public/mutable-job-3.json\":1,\"test/fixtures/public/observed-multiple-files.json\":1,\"test/fixtures/public/observed-one-file.json\":1,\"test/fixtures/sdk-golden.json\":20,\"test/mocks/MockIntake.sol\":101,\"test/mocks/MockToken.sol\":63,\"tools/build-release.mjs\":9,\"tools/check-delivery.py\":57,\"tools/check-official-bodies.mjs\":42,\"tools/check-release.mjs\":47,\"tools/compilation-context.mjs\":26,\"tools/deployment-rehearsal.mjs\":78,\"tools/export-abi.mjs\":7,\"tools/generate-fixtures.py\":27,\"tools/generate-local-config.mjs\":35,\"tools/generate-sdk-abi.mjs\":25,\"tools/generate-sdk-fixtures.mjs\":26,\"tools/import-deployment.mjs\":59,\"tools/inspect-bytecode.mjs\":43,\"tools/local-integration.mjs\":278,\"tools/measure-binding.mjs\":89,\"tools/measure-release.mjs\":21,\"tools/measure-retained-binding.mjs\":98,\"tools/observe-ethereum.mjs\":16,\"tools/sdk-local-check.mjs\":159,\"tools/sdk-local-scenario.mjs\":107,\"tools/sync-release.mjs\":31,\"tools/transaction-metrics.mjs\":11,\"tools/validate-live.mjs\":23,\"tools/verify-history.py\":55,\"vendor/ethers/LICENSE.md\":21,\"vendor/ethers/PROVENANCE.md\":1,\"vendor/ethers/ethers.mjs\":26619,\"vendor/npm/PROVENANCE.json\":56,\"vendor/npm/adraffy-ens-normalize-1.11.1.tgz\":813,\"vendor/npm/aes-js-4.0.0-beta.5.tgz\":1433,\"vendor/npm/ethers-6.17.0.tgz\":10241,\"vendor/npm/noble-curves-1.2.0.tgz\":1096,\"vendor/npm/noble-hashes-1.3.2.tgz\":443,\"vendor/npm/tslib-2.7.0.tgz\":58,\"vendor/npm/types-node-22.7.5.tgz\":1658,\"vendor/npm/undici-types-6.19.8.tgz\":78,\"vendor/npm/ws-8.21.0.tgz\":142},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":17503,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/RelayBranch.sol:179: Reentrancy in RelayBranch._purchase(uint256,bytes32,bytes,uint256) (src/RelayBranch.sol#179-218):\n[medium/medium] divide-before-multiply at src/RelayEncoder.sol:79: RelayEncoder._validate(RelayTypes.Proposal,RelayTypes.Asset[]) (src/RelayEncoder.sol#79-153) performs a multiplication on the result of a division:\n[medium/medium] uninitialized-local at src/libraries/Assets.sol:129: Assets.replace(RelayTypes.Asset[],RelayTypes.Asset).j (src/libraries/Assets.sol#129) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/StrictJSON.sol:109: StrictJSON._object(StrictJSON.Parser,uint256).keys (src/libraries/StrictJSON.sol#109) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Assets.sol:11: Assets.validate(RelayTypes.Asset[]).last (src/libraries/Assets.sol#11) is a local variable never initialized\n[medium/medium] uninitialized-local at src/RelayEncoder.sol:128: RelayEncoder._validate(RelayTypes.Proposal,RelayTypes.Asset[]).last (src/RelayEncoder.sol#128) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Assets.sol:130: Assets.replace(RelayTypes.Asset[],RelayTypes.Asset).inserted (src/libraries/Assets.sol#130) is a local variable never initialized\n[medium/medium] uninitialized-local at src/RelayEncoder.sol:130: RelayEncoder._validate(RelayTypes.Proposal,RelayTypes.Asset[]).htmlBytes (src/RelayEncoder.sol#130) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Text.sol:145: Text.unhex32(string).v (src/libraries/Text.sol#145) is a local variable never initialized\n[medium/medium] uninitialized-local at src/RelayEncoder.sol:127: RelayEncoder._validate(RelayTypes.Proposal,RelayTypes.Asset[]).selectedTarget (src/RelayEncoder.sol#127) is a local variable never initialized\n[medium/medium] uninitialized-local at src/RelayVerifier.sol:36: RelayVerifier.verify(bytes,bytes32,RelayTypes.Proposal,RelayTypes.Asset[],address,uint64).a (src/RelayVerifier.sol#36) is a local variable never initialized\n[medium/medium] uninitialized-local at src/RelayEncoder.sol:131: RelayEncoder._validate(RelayTypes.Proposal,RelayTypes.Asset[]).embeddedBytes (src/RelayEncoder.sol#131) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Assets.sol:22: Assets.validate(RelayTypes.Asset[]).missing (src/libraries/Assets.sol#22) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Text.sol:19: Text.utf8(bytes).n (src/libraries/Text.sol#19) is a local variable never initialized\n[medium/medium] uninitialized-local at src/RelayEncoder.sol:129: RelayEncoder._validate(RelayTypes.Proposal,RelayTypes.Asset[]).imageBytes (src/RelayEncoder.sol#129) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Text.sol:20: Text.utf8(bytes).minimum (src/libraries/Text.sol#20) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/ManifestJSON.sol:68: ManifestJSON._value(ManifestJSON.Parser,uint256,uint8).at (src/libraries/ManifestJSON.sol#68) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Assets.sol:12: Assets.validate(RelayTypes.Asset[]).kinds (src/libraries/Assets.sol#12) is a local variable never initialized\n[medium/medium] uninitialized-local at src/RelayEncoder.sol:108: RelayEncoder._validate(RelayTypes.Proposal,RelayTypes.Asset[]).missing (src/RelayEncoder.sol#108) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/ManifestJSON.sol:116: ManifestJSON._object(ManifestJSON.Parser,uint256,uint8).count (src/libraries/ManifestJSON.sol#116) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Text.sol:142: Text.unhex32(string).offset (src/libraries/Text.sol#142) is a local variable never initialized\n[medium/medium] unused-return at src/RelayBranch.sol:132: RelayBranch.propose(RelayTypes.Proposal,RelayTypes.Asset[]) (src/RelayBranch.sol#132-144) ignores return value by (None,body) = encoder.encode(goal,direction,latestJobId,p,current) (src/RelayBranch.sol#139)\n[medium/high] write-after-write at src/libraries/ManifestJSON.sol:247: ManifestJSON._stringInto(ManifestJSON.Parser,bytes,uint256).status (src/libraries/ManifestJSON.sol#247) is written in both\n[low/medium] reentrancy-benign at src/RelayBranch.sol:179: Reentrancy in RelayBranch._purchase(uint256,bytes32,bytes,uint256) (src/RelayBranch.sol#179-218):\n[low/medium] reentrancy-events at src/RelayBranch.sol:179: Reentrancy in RelayBranch._purchase(uint256,bytes32,bytes,uint256) (src/RelayBranch.sol#179-218):","passed":true},{"durationMs":1045,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/RelayBranch.sol:139: Reentrancy: State change after external call (2 places)\n[low] internal-function-used-once at src/libraries/Assets.sol:30: Internal Function Used Only Once (4 places)\n[low] literal-instead-of-constant at src/RelayEncoder.sol:39: Literal Instead of Constant (83 places)\n[low] require-revert-in-loop at src/RelayEncoder.sol:118: Loop Contains `require`/`revert` (15 places)\n[low] state-variable-could-be-immutable at src/RelayBranch.sol:22: State Variable Could Be Immutable (3 places)\n[low] unchecked-return at src/libraries/ManifestJSON.sol:599: Unchecked Return (5 places)\n[low] uninitialized-local-variable at src/RelayEncoder.sol:108: Uninitialized Local Variable (8 places)","passed":true},{"durationMs":18586,"exitCode":0,"name":"proof 16331cb93f74","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 18.34s\nCompiler run successful!\n\nRan 2 tests for test/imd-proof-75c72f8b/Proof_16331cb93f74.t.sol:RetainedTokenCapProofTest\n[PASS] test_nineteenFileResultBinds() (gas: 2903666)\n[PASS] test_twentyFileResultUnderFiveKilobytesBinds() (gas: 3034493)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 14.78ms (24.48ms CPU time)\n\nRan 1 test suite in 15.69ms (14.78ms CPU time): 2 tests passed, 0 failed, 0 skipped (2 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"70af53152493e0d7cfcc86ece1b58c9865e823d2098d7070926f6262615cabf4","verifiedTreeHash":"89202f5233e53cc2e06e8afee95945eb72f5b398","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":276483,"exitCode":0,"name":"build","output":"Compiling 48 files with Solc 0.8.26\nSolc 0.8.26 finished in 276.35s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> test/RelayProfiles.t.sol:331:13:\n    |\n331 |             bytes memory raw = _manifest(Text.hex32(keccak256(abi.encode(i))), Policy.kind(profile), 32);\n    |             ^^^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n   --> test/RelayProfiles.t.sol:339:9:\n    |\n339 |         bytes memory raw = _manifest(Text.hex32(keccak256(\"new job\")), T.Kind.Markdown, 42);\n    |         ^^^^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":31638,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/CrossLanguage.t.sol:CrossLanguageTest\n[PASS] test_sdkCalldataActuallyCreatesBranchWithoutPayment() (gas: 2871398)\n[PASS] test_sdkCanonicalWitnessMatchesSolidity() (gas: 724409)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.94ms (2.64ms CPU time)\n\nRan 1 test for test/PublicResults.t.sol:PublicResultsTest\n[PASS] test_exactAuthenticatedPublicZeroFileResultsNeverSettleOrRebuy() (gas: 20754650)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 30.70ms (28.50ms CPU time)\n\nRan 5 tests for test/MultiFileResults.t.sol:MultiFileResultsTest\n[PASS] test_changingEvenIgnoredFileBytesCannotBindOrBuyAgain() (gas: 5957634)\n[PASS] test_declaredOutputAtBeginningOrEndOfFourAndSeventeenFiles() (gas: 9654481)\n[PASS] test_duplicateOutputNamePathOrExactMatchIsAmbiguous() (gas: 6576373)\n[PASS] test_exactObservedTwoFileResultBindsDeclaredOutputAndForks() (gas: 6666204)\n[PASS] test_invalidExtraJSONAndRetainedBoundsStillReject() (gas: 2995033)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 181.50ms (85.24ms CPU time)\n\nRan 9 tests for test/RelayHistory.t.sol:RelayHistoryTest\n[PASS] test_badBindingPreservesResultThenCorrectWitnessWorksWithoutPurchase() (gas: 7183854)\n[PASS] test_childCannotBindParentsProjectAsOwn() (gas: 9814435)\n[PASS] test_forkCannotAuthenticateFakeParentLatestWitnessOrForgedProvenance() (gas: 7214918)\n[PASS] test_forkChosenHistoricalCheckpointStartsOwnProjectAndPayer() (gas: 18913620)\n[PASS] test_forkIsAllowedWhileParentPendingOrFrozen() (gas: 11955998)\n[PASS] test_htmlImageHtmlLatestJobAndOlderSelectedInputs() (gas: 28175488)\n[PASS] test_projectMismatchCannotOverwriteCheckpoint() (gas: 7664084)\n[PASS] test_removedInitializerCannotChangeAuthorityEvenForFactory() (gas: 139171)\n[PASS] test_reusedJobCannotCreateNewRevision() (gas: 6744066)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 187.26ms (184.73ms CPU time)\n\nRan 7 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] test_badPolicyAndBadInputsFailBeforeCreateAndRegistration() (gas: 179829)\n[PASS] test_callbackUriAtLimitWithinOfficialStipendAndAboveStaysPending() (gas: 2261838)\n[PASS] test_constructorRejectsZeroAndDuplicateDependencies() (gas: 12577)\n[PASS] test_directChildrenAreCompleteIndependentPayers() (gas: 6867385)\n[PASS] test_launchAndRuntimeChildPassProtectedOpcodeRule() (gas: 21037341)\n[PASS] test_namedBatchBackwardReferencesThenRuntimeChild() (gas: 13446709)\n[PASS] test_staticFactoryConstructorAcceptsEmptyDependenciesWithoutCallsOrChildren() (gas: 53669)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 211.33ms (111.28ms CPU time)\n\nRan 5 tests for test/ManifestRetainedTokens.t.sol:ManifestRetainedTokensTest\n[PASS] test_capIsTwiceTheValueBudget() (gas: 320)\n[PASS] test_twentyFileResultBindsAsCompleteBranchTransaction() (gas: 5657983)\n[PASS] test_twentyFileResultVerifiesUnderFiveKilobytes() (gas: 3059203)\n[PASS] test_valueBudgetRefusesBeforeRetainedTokenCap() (gas: 10253877)\n[PASS] test_workBudgetRefusesBeforeRetainedTokenCap() (gas: 162763191)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 357.00ms (354.72ms CPU time)\n\nRan 13 tests for test/RelayMappingRegression.t.sol:RelayMappingRegressionTest\n[PASS] test_createRejectsExistingNameEvenWhenPathAndSlotDifferBeforePayment() (gas: 3406558)\n[PASS] test_createRejectsExistingPathEvenWhenNameAndSlotDifferBeforePayment() (gas: 3411086)\n[PASS] test_distLikeNamesAndNestedNonWebsiteDistDirectoryRemainAllowed() (gas: 1676948)\n[PASS] test_historicalForkKeepsSourceProvenanceAndCanUpdateInheritedSlot() (gas: 8347276)\n[PASS] test_legacyIndependentDescriptorsStayReadableButCollidingUpdateIsRejected() (gas: 3762551)\n[PASS] test_markdownAndImageCannotWriteAnyTopLevelDistDescendant() (gas: 746559)\n[PASS] test_namesCannotCollideAcrossDifferentAssetKinds() (gas: 3410046)\n[PASS] test_pathAncestorCannotReplaceAnExistingDirectoryWithFileBeforePayment() (gas: 5904524)\n[PASS] test_pathAncestorCollisionWithOtherSlotAlsoRejectsUpdates() (gas: 3542575)\n[PASS] test_pathCommonDirectoriesAndNonBoundaryPrefixesAreAllowed() (gas: 4452565)\n[PASS] test_pathDescendantCannotTreatAnExistingFileAsDirectoryBeforePayment() (gas: 3414696)\n[PASS] test_secondHtmlSlotRejectsFixedPathCollision() (gas: 6400755)\n[PASS] test_uniqueCreateAndUpdatePreserveOtherAssetProvenance() (gas: 14337237)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 528.15ms (123.18ms CPU time)\n\nRan 5 tests for test/IntakeCompatibility.t.sol:IntakeCompatibilityTest\n[PASS] test_currentCatalogShapeAndOutputNamespaceAreEncoded() (gas: 6964887)\n[PASS] test_legacyDescriptorRemainsExactAndMigrationRequiresExplicitCanonicalUpdate() (gas: 4645597)\n[PASS] test_legacyHTMLCannotCreateSecondHTMLSlotAndExplicitUpdateMigrates() (gas: 4979429)\n[PASS] test_namesRequireInitialLetterButHistoricalNamesRemainReadable() (gas: 3522397)\n[PASS] test_oldOutputNamespaceRejectedBeforePayment() (gas: 273419)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 595.60ms (59.74ms CPU time)\n\nRan 11 tests for test/adversarial/ManifestSpec.t.sol:ManifestSpecTest\n[PASS] testFuzz_nonWhitespaceTrailingByteAlwaysRejected(uint8) (runs: 1000, μ: 72226, ~: 72227)\n[PASS] testFuzz_unicodeScalarEscapesDecodeAndDuplicateKeysReject(uint32) (runs: 1000, μ: 243836, ~: 242436)\n[PASS] test_callbackDigestBindsWhitespaceAndKeyOrderOfOriginalBytes() (gas: 3788190)\n[PASS] test_exactDepthMemberKeyAndTokenBoundaries() (gas: 4652769)\n[PASS] test_exactManifestAndStringByteLimitsAcceptBoundaryRejectOneMore() (gas: 15517703)\n[PASS] test_fileSizeIntegerGrammarAndAllProfileDeclaredCaps() (gas: 27911654)\n[PASS] test_hashEncodingTypeWidthNonhexAndZeroAreCheckedForBothDigests() (gas: 103797692)\n[PASS] test_identityLengthDecodedFieldsAndEmptyAcceptedFiles() (gas: 9379375)\n[PASS] test_manifestRejectionsKeepRecordedDigestAndOldHistory() (gas: 114253200)\n[PASS] test_projectSwitchAndHistoricalJobReplayPreservePreviousCheckpoint() (gas: 20378139)\n[PASS] test_sourceAndLaterGitMetadataNeverReplaceAcceptedFilesDescriptor() (gas: 3867312)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 1.75s (2.10s CPU time)\n\nRan 15 tests for test/StrictManifest.t.sol:StrictManifestTest\n[PASS] testFuzz_asciiJSONQuoteDecodeRoundTrip(bytes32,uint8) (runs: 1000, μ: 267665, ~: 137815)\n[PASS] testFuzz_decodedDuplicateKeyAlwaysRejected(uint8) (runs: 1000, μ: 77949, ~: 77933)\n[PASS] test_actualFileHashesAndManifestKeccakAreDistinct() (gas: 667710)\n[PASS] test_boundedLargeManifestMeasurement() (gas: 5271789)\n[PASS] test_onlyDeclaredFilesNotSourceOrGitMetadataSupplyAcceptedFile() (gas: 4803737)\n[PASS] test_parserBoundsManifestStringDepthMembersAndTokens() (gas: 2643565)\n[PASS] test_rejectDuplicateKeysIncludingDecodedEscapesAtEveryDepth() (gas: 6934845)\n[PASS] test_rejectEmptyOrMalformedExtraFileEntries() (gas: 4561931)\n[PASS] test_rejectIncompleteWrongIdentityTypesAndWrongFileTypes() (gas: 15223173)\n[PASS] test_rejectInvalidUTF8UnicodeSurrogatesAndNoncharacters() (gas: 871715)\n[PASS] test_rejectPathsTraversalHiddenURLAbsoluteAndDecodedControl() (gas: 22727017)\n[PASS] test_rejectTrailingAndMalformedJSON() (gas: 1235180)\n[PASS] test_rejectZeroOversizedNonIntegerAndStringFileBytes() (gas: 17160761)\n[PASS] test_validUTF8EscapesAndSurrogatePairsDecodeExactly() (gas: 1814850)\n[PASS] test_whitespaceIsLegalButDigestIsOverExactRawBytes() (gas: 683309)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 2.06s (1.76s CPU time)\n\nRan 7 tests for test/ManifestStringRegression.t.sol:ManifestStringRegressionTest\n[PASS] testFuzz_retainedArbitraryBytesMatchReference(bytes32,uint8) (runs: 1000, μ: 377838, ~: 377676)\n[PASS] testFuzz_retainedQuotedAsciiMatchesReference(bytes32,uint8) (runs: 1000, μ: 975293, ~: 783601)\n[PASS] testFuzz_validScalarRawAndEscapeMatchReference(uint32,uint8) (runs: 1000, μ: 1750570, ~: 1733567)\n[PASS] test_mixedRawEscapedScalarsAndSimpleEscapesDecodeExactly() (gas: 468790)\n[PASS] test_rawAndEscapedUnicodeKeysStillDetectDuplicates() (gas: 637558)\n[PASS] test_retainedDecodedByteLimitAccepts1024Rejects1025() (gas: 3573361)\n[PASS] test_retainedInvalidUnicodeAndEscapesReject() (gas: 8497400)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 2.10s (5.84s CPU time)\n\nRan 5 tests for test/adversarial/ProfileBoundarySpec.t.sol:ProfileBoundarySpecTest\n[PASS] testFuzz_htmlBase64RoundingAndOneByteOverTheKnownInputBudget(uint32) (runs: 1000, μ: 992664, ~: 992685)\n[PASS] test_realEightAssetWitnessExact16384ByteRequestAndOneByteOverRejectedBeforePayment() (gas: 139846114)\n[PASS] test_slotReservationInputCountAndFullCapacityUpdateBoundaries() (gas: 9075210)\n[PASS] test_unsafePathComponentsInvalidUtf8AndDisabledModesRejectWithoutSpending() (gas: 2664969)\n[PASS] test_utf8TextLimitsCountBytesAndOutputMappingLengthsAreBounded() (gas: 32437589)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.11s (2.54s CPU time)\n\nRan 14 tests for test/RelayProfiles.t.sol:RelayProfilesTest\n[PASS] test_capacityEndToEndSixteenAssetsThenUpdate() (gas: 95558802)\n[PASS] test_htmlImagesPerFileAggregateAndBase64OverheadBounds() (gas: 1375271)\n[PASS] test_imageReferencesAndMarkdownImageInputsDisabled() (gas: 3610153)\n[PASS] test_invalidTextAndCanonicalWitnessRejectBeforePayment() (gas: 346980)\n[PASS] test_jsonEscapingCannotInjectRuntimeFields() (gas: 1027576)\n[PASS] test_maximumCompleteBindingASCIIFitsGasBudget() (gas: 231067930)\n[PASS] test_maximumCompleteBindingEscapedUnicodeFitsGasBudget() (gas: 255432287)\n[PASS] test_maximumCompleteBindingWideObjectsFitsGasBudget() (gas: 260123606)\n[PASS] test_measureMaximumWitnessAndLargeManifestTogether() (gas: 14411156)\n[PASS] test_publishDisabledAndOutputMappingFixedBeforePayment() (gas: 360429)\n[PASS] test_requestBodyUTF8ByteLimitCheckedBeforePayment() (gas: 6269331)\n[PASS] test_reserveEachEnabledTypeAndExistingSlotsUpdatableAtCapacity() (gas: 4280279)\n[PASS] test_selectedInputsMustBeCurrentSortedUniqueAndWithinEight() (gas: 10931478)\n[PASS] test_updateTargetMandatoryCreateCannotOverwriteAndRenameDisabled() (gas: 4085820)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 2.18s (3.17s CPU time)\n\nRan 6 tests for test/MetadataScannerDifferential.t.sol:MetadataScannerDifferentialTest\n[PASS] testFuzz_ArbitraryRawString(bytes32,bytes32) (runs: 256, μ: 826519, ~: 824228)\n[PASS] testFuzz_RawUnicode(uint32) (runs: 256, μ: 828830, ~: 831760)\n[PASS] testFuzz_UnicodeEscape(uint16,uint16) (runs: 256, μ: 845853, ~: 846733)\n[PASS] test_ControlsInvalidHexAndSurrogates() (gas: 14067157)\n[PASS] test_MixedRawAndEscapedUnicode() (gas: 5030399)\n[PASS] test_RetainedASCIICopyAtWordBoundaries() (gas: 16028051)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.19s (4.14s CPU time)\n\nRan 5 tests for test/adversarial/ContinuationSpec.t.sol:ContinuationSpecTest\n[PASS] test_checkpointPreimageBindsChainFactoryBranchPolicyRevisionAndSource() (gas: 9536598)\n[PASS] test_currentProposalsSelectableInEitherOrderAndLosingSponsorPaysNothing() (gas: 9353782)\n[PASS] test_everyWitnessFieldAuthenticatedForSponsorBindAndHistoricalFork() (gas: 10395247)\n[PASS] test_fiveRootRoundsTwoSponsorsHistoricalForkAndTwoChildRounds() (gas: 46138388)\n[PASS] test_foreignFactoryAndUnregisteredLookalikeCannotForgeHistoricalFork() (gas: 6480335)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.19s (158.02ms CPU time)\n\nRan 13 tests for test/ManifestSegmentBudget.t.sol:ManifestSegmentBudgetTest\n[PASS] test_asciiPrefixBeforeEscapeOrScalarDecodesExactly() (gas: 3760346)\n[PASS] test_asciiPrefixKeysStillDetectDuplicates() (gas: 901235)\n[PASS] test_asciiPrefixStillCountsTowardRetainedLimit() (gas: 2879009)\n[PASS] test_auditAlternatingEscapeShapeIsRejectedByBudgetNotGas() (gas: 204603687)\n[PASS] test_bindAsciiPrefixThenRawScalarWithFullWitness() (gas: 205363732)\n[PASS] test_bindAsciiPrefixThenSimpleEscapeWithFullWitness() (gas: 205374591)\n[PASS] test_bindAsciiPrefixThenUnicodeEscapeWithFullWitness() (gas: 205372787)\n[PASS] test_bindBudgetedAlternatingEscapesWithFullWitness() (gas: 188942501)\n[PASS] test_bindMaximumBudgetedSegmentFlushesWithFullWitness() (gas: 204476258)\n[PASS] test_bindOriginalCGas01ShapeWithFullWitnessBelowCap() (gas: 206786141)\n[PASS] test_consecutiveSimpleEscapesAreChargedOnlyOnce() (gas: 32450836)\n[PASS] test_segmentFlushBudgetAcceptsBoundaryRejectsOneMore() (gas: 18016682)\n[PASS] test_unicodeEscapesAndIgnoredStringsAreNotCharged() (gas: 159188403)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 2.19s (5.20s CPU time)\n\nRan 21 tests for test/ManifestEnvelopeRegression.t.sol:ManifestEnvelopeRegressionTest\n[PASS] test_bind33ActualSourceDescriptorsWithoutAnotherPurchase() (gas: 10093781)\n[PASS] test_bind33StructuredSourceEntriesWithoutAnotherPurchase() (gas: 5858949)\n[PASS] test_bindLongMetadataOnTheAcceptedFileWithoutAnotherPurchase() (gas: 5170786)\n[PASS] test_bindMaximumEscapedKeyBytesWithFullWitness() (gas: 251614862)\n[PASS] test_bindMaximumIgnoredNumberWithFullWitness() (gas: 188514856)\n[PASS] test_bindMaximumMetadataComplexityWithFullWitness() (gas: 201270927)\n[PASS] test_bindMaximumMetadataValuesAndUnicodeWithFullWitness() (gas: 206065224)\n[PASS] test_bindMaximumRetainedEscapedSurrogatesWithFullWitness() (gas: 189280913)\n[PASS] test_bindMaximumRetainedEscapedUtf8WithFullWitness() (gas: 191862961)\n[PASS] test_bindMaximumRetainedRawUtf8FourByteWithFullWitness() (gas: 187691222)\n[PASS] test_bindMaximumRetainedRawUtf8ThreeByteWithFullWitness() (gas: 188692509)\n[PASS] test_bindMaximumRetainedRawUtf8TwoByteWithFullWitness() (gas: 189709163)\n[PASS] test_bindMaximumRetainedSimpleEscapesWithFullWitness() (gas: 193005724)\n[PASS] test_bindMaximumWhitespaceWithFullWitness() (gas: 178364384)\n[PASS] test_bindMetadataBeyond8192BytesWithoutAnotherPurchase() (gas: 9275071)\n[PASS] test_exactPreviouslyObservedIMDResultBindsWithoutReserialization() (gas: 3714901)\n[PASS] test_invalidIgnoredMetadataCannotHideBehindProjection() (gas: 6211022)\n[PASS] test_longIgnoredStringStillRejectsLateInvalidUtf8AndDuplicateKeys() (gas: 21150163)\n[PASS] test_manifestAggregateKeyBudgetAccepts2048Rejects2049() (gas: 4034429)\n[PASS] test_manifestValueBudgetAccepts512Rejects513() (gas: 6252178)\n[PASS] test_wrongHashStillRejectsProjectedManifest() (gas: 1320600)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 2.19s (7.56s CPU time)\n\nRan 14 tests for test/adversarial/PaymentSpec.t.sol:PaymentSpecTest\n[PASS] testFuzz_priceChangeCapAndDonationsConserveEveryWei(uint96,uint64) (runs: 1000, μ: 3011848, ~: 3012380)\n[PASS] testFuzz_unknownFailureFrozenDespiteNewProposalsAndTime(uint8) (runs: 1000, μ: 3334928, ~: 3334930)\n[PASS] test_continuationRetryRetainsParentAndFullSelectedSnapshot() (gas: 8456148)\n[PASS] test_exactWholeBalanceAndMaxFeeDoesNotOvercharge() (gas: 2250898)\n[PASS] test_insufficientApprovalAndBalanceRollbackBeforeAnyReceipt() (gas: 3490587)\n[PASS] test_intakeRevertPartialPullZeroIdAndClearFailureRollbackAllEffects() (gas: 7692767)\n[PASS] test_malformedResultIsRecordedWithoutParsingThenBadBindingPreservesIt() (gas: 2912546)\n[PASS] test_maximumCallbackURIWithinStipendAndOversizeFailureStaysPending() (gas: 6687223)\n[PASS] test_missingCallbackHasNoTimeoutButAuthenticLateCallbackStillWorks() (gas: 3447093)\n[PASS] test_reentrancyAtTransferApprovalAndIntakeCannotProposeOrBuyAgain() (gas: 13300793)\n[PASS] test_refusalCannotSubstituteProposalAndRetryRacesCostOnlyWinner() (gas: 6359579)\n[PASS] test_reusedIntakeRequestIdOnRetryCannotOverwriteAttemptOrDoubleCharge() (gas: 4586111)\n[PASS] test_spoofForeignCrossBranchAndReplayCallbacksCannotSettleOwnRequest() (gas: 8877537)\n[PASS] test_synchronousIntakeResultAndFailureCannotSettlePurchasingState() (gas: 4024590)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 2.19s (3.60s CPU time)\n\nRan 13 tests for test/RelayPayments.t.sol:RelayPaymentsTest\n[PASS] testFuzz_exactDynamicFeeConservesBalances(uint96) (runs: 1000, μ: 2013454, ~: 2013424)\n[PASS] testFuzz_nonRefusalFailureAlwaysFreezes(uint8) (runs: 1000, μ: 2191654, ~: 2191655)\n[PASS] test_callbacksAuthenticateSenderOwnRequestAndSingleDelivery() (gas: 2258915)\n[PASS] test_creationAndProposalsDoNotPurchaseOrMoveAnchor() (gas: 3829545)\n[PASS] test_dynamicFeeBranchPayerExactBodyAndSelectors() (gas: 2485141)\n[PASS] test_feeOnTransferSenderTaxFalseAndPartialPullRevertAtomically() (gas: 3683362)\n[PASS] test_foreignIntakeRequestCannotSettleBranch() (gas: 2291558)\n[PASS] test_missingCallbackStaysPendingIndefinitely() (gas: 2122727)\n[PASS] test_noReturnTokenAndStickyAllowanceCleared() (gas: 2016329)\n[PASS] test_refusedOnlyExplicitIdenticalRetryWithNewReceipt() (gas: 5501222)\n[PASS] test_stipendCallbackOnlyRecordsAndBindingIsPermissionless() (gas: 3248579)\n[PASS] test_tokenReentrancyAndSynchronousCallbackAreRejected() (gas: 3417387)\n[PASS] test_zeroUnknownProposalFeeCapAndUnpricedRejectBeforeTransfer() (gas: 1663610)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 2.19s (3.59s CPU time)\n\nRan 1 test for test/RelayInvariant.t.sol:RelayInvariantTest\n[PASS] invariant_conservationAndPermanentHistory() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| RelayHandler | bind         | 1358  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | fail         | 1347  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | propose      | 1372  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | recordResult | 1345  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | retry        | 1387  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | sponsor      | 1383  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.22s (6.21s CPU time)\n\nRan 2 tests for test/adversarial/StateMachineSpec.t.sol:StateMachineSpecTest\n[PASS] invariant_modelFeesReceiptsAssetsAndPermanentCheckpoints() (runs: 256, calls: 24576, reverts: 0)\n\n╭------------------+-----------------+-------+---------+----------╮\n| Contract         | Selector        | Calls | Reverts | Discards |\n+=================================================================+\n| SpecStateHandler | advanceTime     | 2453  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | bind            | 2390  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | donate          | 2424  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | fail            | 2446  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | forkHistory     | 2398  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | hostileCallback | 2430  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | propose         | 2485  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | purchase        | 2505  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | recordResult    | 2512  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | retry           | 2533  | 0       | 0        |\n╰------------------+-----------------+-------+---------+----------╯\n\n[PASS] test_modelExercisesRefusalRetryChildContinuationAndHistoricalFork() (gas: 26475558)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 31.49s (31.49s CPU time)\n\nRan 21 test suites in 31.49s (63.12s CPU time): 174 tests passed, 0 failed, 0 skipped (174 total tests)\n","passed":true},{"durationMs":322,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"RelayBranch.bind(bytes,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.onIntakeFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"RelayBranch.onIntakeResult(bytes32,bytes32,string)\",\"RelayBranch.propose((bytes32,uint8,bytes32,bytes32[],string,string,string,bool),(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.retry(uint256,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.sponsor(uint256,uint256,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayFactory.createProject(string)\",\"RelayFactory.fork(address,uint64,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[],string)\"],\"files\":{\".gitignore\":7,\"ADAPTATION.md\":147,\"DESIGN.md\":124,\"LICENSE\":21,\"README.md\":48,\"abi/IIntake.json\":82,\"abi/RelayBranch.json\":1455,\"abi/RelayEncoder.json\":353,\"abi/RelayFactory.json\":306,\"abi/RelayVerifier.json\":245,\"cli/relay.mjs\":88,\"config/production-gate.json\":89,\"config/production-gate.schema.json\":273,\"config/release.json\":369,\"dist/assets/dist-V2jKd6xN.js\":3,\"dist/assets/index-4UpPiOax.css\":1,\"dist/assets/index-CNVEwO4S.js\":128,\"dist/favicon.svg\":1,\"dist/index.html\":18,\"dist/local-config.json\":103,\"dist/og.png\":190,\"dist/og.svg\":1,\"docs/ACCEPTANCE.md\":5,\"docs/AGENT-GUIDE.md\":13,\"docs/BUILD.md\":51,\"docs/CLI.md\":29,\"docs/CONTRACTS.md\":33,\"docs/DESIGN.md\":5,\"docs/ENTRYPOINTS.md\":72,\"docs/FRONTEND.md\":5,\"docs/HANDOFF.md\":47,\"docs/LIMITS.md\":45,\"docs/LIVE-VALIDATION.md\":23,\"docs/OPERATIONS.md\":49,\"docs/PLATFORM-AUTHORING.md\":5,\"docs/PROTOCOL-OVERVIEW.md\":31,\"docs/RESOLVER-PROPOSAL.md\":9,\"docs/REVIEW.md\":28,\"docs/SDK-API.md\":23,\"docs/SDK-BROWSER.md\":9,\"docs/agent/SDK-CLI-A1.md\":5,\"docs/agent/sdk-cli-checks.md\":5,\"docs/frontend-README.md\":5,\"docs/history/README.md\":32,\"docs/history/a1-fixtures.tar.xz\":13,\"docs/history/accepted-platform-validation-index.json.xz\":38,\"docs/history/accepted-rc-raw-index.json.xz\":6,\"docs/history/accepted-rc-raw.tar.xz\":140,\"docs/history/fixtures-index.json\":72,\"docs/history/imported-index.json.xz\":190,\"docs/history/integration-predecessor.json\":71,\"docs/validation/boundary-revision/README.md\":111,\"docs/validation/boundary-revision/archive-index.json.xz\":60,\"docs/validation/boundary-revision/summary.json\":334,\"docs/validation/documentation-v1/README.md\":69,\"docs/validation/documentation-v1/archive-index.json\":42,\"docs/validation/documentation-v1/docs-hashes.sha256.json.xz\":15,\"docs/validation/documentation-v1/runtime-export.sha256.json.xz\":48,\"docs/validation/integration-v1/README.md\":38,\"docs/validation/integration-v1/archive-index.json\":268,\"docs/validation/launch-packaging-v1/README.md\":100,\"docs/validation/launch-packaging-v1/bytecode-inspection.json\":70,\"docs/validation/launch-packaging-v1/deployment-rehearsal.json\":293,\"docs/validation/launch-packaging-v1/metadata-binding.json\":179,\"docs/validation/launch-packaging-v1/retained-binding.json\":145,\"docs/validation/launch-packaging-v1/revision-1/bytecode-inspection.json\":70,\"docs/validation/launch-packaging-v1/revision-1/metadata-binding.json\":179,\"docs/validation/launch-packaging-v1/revision-1/retained-binding.json\":145,\"docs/validation/local-repair-v1/README.md\":66,\"docs/validation/local-repair-v1/archive-index.json.xz\":17,\"docs/validation/local-repair-v1/delivery-size.json\":40,\"docs/validation/local-repair-v1/evidence.tar.xz\":832,\"docs/validation/local-repair-v1/measurements.json\":287,\"docs/validation/local-repair-v1/source-manifest.json.xz\":58,\"docs/validation/multi-file-revision/README.md\":97,\"docs/validation/multi-file-revision/archive-index.json.xz\":44,\"docs/validation/multi-file-revision/summary.json\":213,\"docs/validation/public-ui-v1/raw/build.log\":12,\"docs/validation/rc-v1/README.md\":110,\"docs/validation/rc-v1/archive-index.json\":242,\"docs/validation/rc-v1/authenticated-results-index.json\":54,\"docs/validation/rc-v1/delivery-size.json\":40,\"docs/validation/rc-v1/initial-frontend-typecheck-failure.txt\":10,\"docs/validation/rc-v1/initial-gas-limit-metric-failure.txt\":31,\"docs/validation/rc-v1/initial-launch-test-failure.txt\":24,\"docs/validation/rc-v1/initial-name-validation-unit-failure.txt\":39,\"docs/validation/rc-v1/initial-public-browser-harness-failure.txt\":14,\"docs/validation/rc-v1/raw-result-test-compile-failure.txt\":8,\"docs/validation/rc-v1/rendered-review.json\":33,\"docs/validation/rc-v1/source-manifest.json.xz\":71,\"foundry.toml\":16,\"frontend/.gitignore\":6,\"frontend/.npmrc\":1,\"frontend/DESIGN.md\":5,\"frontend/README.md\":5,\"frontend/REVIEW.md\":5,\"frontend/docs/A1-HANDOFF.md\":5,\"frontend/docs/W1-README.md\":5,\"frontend/docs/licenses/Noto-Sans-OFL.txt\":92,\"frontend/docs/licenses/Noto-Sans-provenance.json\":9,\"frontend/docs/licenses/better-interface-LICENSE.txt\":220,\"frontend/docs/licenses/eth-frontend-ux-LICENSE.txt\":30,\"frontend/index.html\":16,\"frontend/package-lock.json\":2700,\"frontend/package.json\":45,\"frontend/playwright.config.ts\":28,\"frontend/public/favicon.svg\":1,\"frontend/public/local-config.json\":103,\"frontend/public/og.png\":190,\"frontend/public/og.svg\":1,\"frontend/scripts/audit-local-evidence.mjs\":70,\"frontend/scripts/check-integration.mjs\":50,\"frontend/scripts/design-review.mjs\":74,\"frontend/scripts/local-deliver.mjs\":59,\"frontend/scripts/local-setup.mjs\":89,\"frontend/scripts/measure-platform.mjs\":33,\"frontend/scripts/measure-submission.mjs\":33,\"frontend/scripts/platform-review.mjs\":26,\"frontend/scripts/prepare-webkit.sh\":51,\"frontend/scripts/record-release.mjs\":97,\"frontend/scripts/static-preview.mjs\":12,\"frontend/scripts/validate.mjs\":37,\"frontend/src/App.tsx\":46,\"frontend/src/components/ArtifactViewer.tsx\":27,\"frontend/src/components/FundingSheet.tsx\":6,\"frontend/src/components/Sheet.tsx\":28,\"frontend/src/components/VerifiedThumbnail.tsx\":12,\"frontend/src/components/WalletButton.tsx\":3,\"frontend/src/components/platform.tsx\":75,\"frontend/src/config.ts\":22,\"frontend/src/domain/adapter.ts\":72,\"frontend/src/domain/chainAdapter.ts\":470,\"frontend/src/domain/files.ts\":107,\"frontend/src/domain/fixtureAdapter.ts\":519,\"frontend/src/domain/fixtures.ts\":63,\"frontend/src/domain/liveAdapter.ts\":58,\"frontend/src/domain/publicMode.ts\":44,\"frontend/src/domain/sdk.ts\":11,\"frontend/src/domain/types.ts\":208,\"frontend/src/main.tsx\":24,\"frontend/src/preview/FilePreview.tsx\":114,\"frontend/src/preview/sanitize.ts\":77,\"frontend/src/styles.css\":259,\"frontend/src/ui/ErrorBoundary.tsx\":19,\"frontend/src/ui/LocalApp.tsx\":63,\"frontend/src/ui/ProjectList.tsx\":119,\"frontend/src/ui/ProposeForm.tsx\":219,\"frontend/src/ui/Showcase.tsx\":18,\"frontend/src/ui/SponsorPanel.tsx\":64,\"frontend/src/ui/Workspace.tsx\":146,\"frontend/src/ui/actionScope.ts\":18,\"frontend/src/ui/format.tsx\":70,\"frontend/src/ui/recovery.ts\":41,\"frontend/src/ui/snapshot.ts\":12,\"frontend/src/ui/verification.ts\":38,\"frontend/src/wallet/ConnectSheet.tsx\":98,\"frontend/src/wallet/icons.ts\":8,\"frontend/src/wallet/open-in.ts\":19,\"frontend/src/wallet/wagmi.ts\":13,\"frontend/tests/e2e/actions.ts\":56,\"frontend/tests/e2e/harness.ts\":34,\"frontend/tests/e2e/journey.spec.ts\":214,\"frontend/tests/e2e/layout.spec.ts\":65,\"frontend/tests/e2e/platform.spec.ts\":102,\"frontend/tests/e2e/revision.spec.ts\":258,\"frontend/tests/e2e/w1.spec.ts\":306,\"frontend/tests/e2e/wallet.spec.ts\":88,\"frontend/tests/fixtures/wide.png\":3,\"frontend/tests/integration/browser-chain.mjs\":701,\"frontend/tests/integration/local-command.mjs\":37,\"frontend/tests/integration/navigation-race.mjs\":32,\"frontend/tests/integration/platform-chain.mjs\":87,\"frontend/tests/integration/public-chain.mjs\":137,\"frontend/tests/run-browsers.mjs\":14,\"frontend/tests/unit/chain-provider.test.ts\":62,\"frontend/tests/unit/domain.test.ts\":120,\"frontend/tests/unit/multi-file.test.ts\":54,\"frontend/tests/unit/platform.test.tsx\":103,\"frontend/tests/unit/public-transport.test.ts\":290,\"frontend/tests/unit/reopened.test.ts\":111,\"frontend/tests/unit/security.test.tsx\":228,\"frontend/tests/unit/setup.ts\":1,\"frontend/tsconfig.json\":19,\"frontend/vite.config.ts\":10,\"frontend/vitest.config.ts\":11,\"launch.json\":21,\"package-lock.json\":127,\"package.json\":20,\"remappings.txt\":1,\"sdk/abi.mjs\":16,\"sdk/browser.mjs\":30,\"sdk/config.mjs\":91,\"sdk/core.mjs\":403,\"sdk/deployment.mjs\":56,\"sdk/files-browser.mjs\":173,\"sdk/files.mjs\":177,\"sdk/gates.mjs\":23,\"sdk/handoff.mjs\":81,\"sdk/index.mjs\":17,\"sdk/observation.mjs\":47,\"sdk/public-rpc.mjs\":106,\"sdk/public.mjs\":110,\"sdk/strict-json.mjs\":159,\"src/RelayBranch.sol\":309,\"src/RelayEncoder.sol\":205,\"src/RelayFactory.sol\":100,\"src/RelayTypes.sol\":78,\"src/RelayVerifier.sol\":84,\"src/interfaces/IIntake.sol\":20,\"src/libraries/Assets.sol\":141,\"src/libraries/ManifestJSON.sol\":648,\"src/libraries/Policy.sol\":51,\"src/libraries/StrictJSON.sol\":260,\"src/libraries/Text.sol\":175,\"test-sdk/browser-sdk.test.mjs\":178,\"test-sdk/deployment.test.mjs\":89,\"test-sdk/files.test.mjs\":58,\"test-sdk/mock-rpc.mjs\":14,\"test-sdk/multi-file.test.mjs\":62,\"test-sdk/network-address.test.mjs\":85,\"test-sdk/parity-vectors.mjs\":100,\"test-sdk/public-rpc.test.mjs\":153,\"test-sdk/public.test.mjs\":82,\"test-sdk/relay.test.mjs\":244,\"test-sdk/review-regressions.test.mjs\":113,\"test-sdk/transaction-metrics.test.mjs\":12,\"test/CrossLanguage.t.sol\":37,\"test/IntakeCompatibility.t.sol\":105,\"test/LaunchCompatibility.t.sol\":175,\"test/ManifestEnvelopeRegression.t.sol\":366,\"test/ManifestRetainedTokens.t.sol\":177,\"test/ManifestSegmentBudget.t.sol\":373,\"test/ManifestStringRegression.t.sol\":189,\"test/MetadataScannerDifferential.t.sol\":120,\"test/MultiFileResults.t.sol\":133,\"test/PublicResults.t.sol\":34,\"test/RelayHistory.t.sol\":233,\"test/RelayInvariant.t.sol\":151,\"test/RelayMappingRegression.t.sol\":187,\"test/RelayPayments.t.sol\":240,\"test/RelayProfiles.t.sol\":396,\"test/RelaySetup.sol\":137,\"test/StrictManifest.t.sol\":254,\"test/TestBase.sol\":100,\"test/adversarial/ContinuationSpec.t.sol\":338,\"test/adversarial/ManifestSpec.t.sol\":400,\"test/adversarial/PaymentSpec.t.sol\":376,\"test/adversarial/ProfileBoundarySpec.t.sol\":227,\"test/adversarial/README.md\":40,\"test/adversarial/SpecSupport.sol\":462,\"test/adversarial/StateMachineSpec.t.sol\":482,\"test/adversarial/check-inline-fixtures.py\":43,\"test/fixtures/FixtureData.sol\":54,\"test/fixtures/LiveResultFixture.sol\":14,\"test/fixtures/MultiFileResult.sol\":11,\"test/fixtures/PublicResults.sol\":29,\"test/fixtures/SdkGolden.sol\":13,\"test/fixtures/document-updated.md\":5,\"test/fixtures/document-updated.md.result.json\":1,\"test/fixtures/document.md\":3,\"test/fixtures/document.md.result.json\":1,\"test/fixtures/html-1.html\":1,\"test/fixtures/html-1.html.result.json\":1,\"test/fixtures/html-3.html\":1,\"test/fixtures/html-3.html.result.json\":1,\"test/fixtures/image-2.png\":3,\"test/fixtures/image-2.png.result.json\":1,\"test/fixtures/public/completed-0.json\":1,\"test/fixtures/public/completed-1.json\":1,\"test/fixtures/public/completed-2.json\":1,\"test/fixtures/public/completed-3.json\":1,\"test/fixtures/public/mutable-job-0.json\":1,\"test/fixtures/public/mutable-job-1.json\":1,\"test/fixtures/public/mutable-job-2.json\":1,\"test/fixtures/public/mutable-job-3.json\":1,\"test/fixtures/public/observed-multiple-files.json\":1,\"test/fixtures/public/observed-one-file.json\":1,\"test/fixtures/sdk-golden.json\":20,\"test/mocks/MockIntake.sol\":101,\"test/mocks/MockToken.sol\":63,\"tools/build-release.mjs\":9,\"tools/check-delivery.py\":57,\"tools/check-official-bodies.mjs\":42,\"tools/check-release.mjs\":47,\"tools/compilation-context.mjs\":26,\"tools/deployment-rehearsal.mjs\":78,\"tools/export-abi.mjs\":7,\"tools/generate-fixtures.py\":27,\"tools/generate-local-config.mjs\":35,\"tools/generate-sdk-abi.mjs\":25,\"tools/generate-sdk-fixtures.mjs\":26,\"tools/import-deployment.mjs\":59,\"tools/inspect-bytecode.mjs\":43,\"tools/local-integration.mjs\":278,\"tools/measure-binding.mjs\":89,\"tools/measure-release.mjs\":21,\"tools/measure-retained-binding.mjs\":98,\"tools/observe-ethereum.mjs\":16,\"tools/sdk-local-check.mjs\":159,\"tools/sdk-local-scenario.mjs\":107,\"tools/sync-release.mjs\":31,\"tools/transaction-metrics.mjs\":11,\"tools/validate-live.mjs\":23,\"tools/verify-history.py\":55,\"vendor/ethers/LICENSE.md\":21,\"vendor/ethers/PROVENANCE.md\":1,\"vendor/ethers/ethers.mjs\":26619,\"vendor/npm/PROVENANCE.json\":56,\"vendor/npm/adraffy-ens-normalize-1.11.1.tgz\":813,\"vendor/npm/aes-js-4.0.0-beta.5.tgz\":1433,\"vendor/npm/ethers-6.17.0.tgz\":10241,\"vendor/npm/noble-curves-1.2.0.tgz\":1096,\"vendor/npm/noble-hashes-1.3.2.tgz\":443,\"vendor/npm/tslib-2.7.0.tgz\":58,\"vendor/npm/types-node-22.7.5.tgz\":1658,\"vendor/npm/undici-types-6.19.8.tgz\":78,\"vendor/npm/ws-8.21.0.tgz\":142},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"aa2ac28c9adcd139d68076f8ce66dcbe23064f780f4a811f07455c8dfd059bf2","verifiedTreeHash":"9a59526d5f4f6635c2296b37d04739d481670306","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":111454,"exitCode":0,"name":"build","output":"Compiling 47 files with Solc 0.8.26\nSolc 0.8.26 finished in 111.39s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> test/RelayProfiles.t.sol:331:13:\n    |\n331 |             bytes memory raw = _manifest(Text.hex32(keccak256(abi.encode(i))), Policy.kind(profile), 32);\n    |             ^^^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n   --> test/RelayProfiles.t.sol:339:9:\n    |\n339 |         bytes memory raw = _manifest(Text.hex32(keccak256(\"new job\")), T.Kind.Markdown, 42);\n    |         ^^^^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":16841,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/PublicResults.t.sol:PublicResultsTest\n[PASS] test_exactAuthenticatedPublicZeroFileResultsNeverSettleOrRebuy() (gas: 19886146)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 16.99ms (15.78ms CPU time)\n\nRan 2 tests for test/CrossLanguage.t.sol:CrossLanguageTest\n[PASS] test_sdkCalldataActuallyCreatesBranchWithoutPayment() (gas: 2871398)\n[PASS] test_sdkCanonicalWitnessMatchesSolidity() (gas: 504415)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 18.32ms (2.34ms CPU time)\n\nRan 5 tests for test/MultiFileResults.t.sol:MultiFileResultsTest\n[PASS] test_changingEvenIgnoredFileBytesCannotBindOrBuyAgain() (gas: 5733032)\n[PASS] test_declaredOutputAtBeginningOrEndOfFourAndSeventeenFiles() (gas: 8716113)\n[PASS] test_duplicateOutputNamePathOrExactMatchIsAmbiguous() (gas: 5697513)\n[PASS] test_exactObservedTwoFileResultBindsDeclaredOutputAndForks() (gas: 6443198)\n[PASS] test_invalidExtraJSONAndRetainedBoundsStillReject() (gas: 2560217)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 27.93ms (44.29ms CPU time)\n\nRan 5 tests for test/IntakeCompatibility.t.sol:IntakeCompatibilityTest\n[PASS] test_currentCatalogShapeAndOutputNamespaceAreEncoded() (gas: 6964887)\n[PASS] test_legacyDescriptorRemainsExactAndMigrationRequiresExplicitCanonicalUpdate() (gas: 4425603)\n[PASS] test_legacyHTMLCannotCreateSecondHTMLSlotAndExplicitUpdateMigrates() (gas: 4759435)\n[PASS] test_namesRequireInitialLetterButHistoricalNamesRemainReadable() (gas: 3302403)\n[PASS] test_oldOutputNamespaceRejectedBeforePayment() (gas: 273419)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 45.44ms (44.23ms CPU time)\n\nRan 7 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] test_badPolicyAndBadInputsFailBeforeCreateAndRegistration() (gas: 179829)\n[PASS] test_callbackUriAtLimitWithinOfficialStipendAndAboveStaysPending() (gas: 2261838)\n[PASS] test_constructorRejectsZeroAndDuplicateDependencies() (gas: 12577)\n[PASS] test_directChildrenAreCompleteIndependentPayers() (gas: 6867385)\n[PASS] test_launchAndRuntimeChildPassProtectedOpcodeRule() (gas: 21033043)\n[PASS] test_namedBatchBackwardReferencesThenRuntimeChild() (gas: 13443717)\n[PASS] test_staticFactoryConstructorAcceptsEmptyDependenciesWithoutCallsOrChildren() (gas: 53669)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 76.16ms (74.79ms CPU time)\n\nRan 5 tests for test/adversarial/ContinuationSpec.t.sol:ContinuationSpecTest\n[PASS] test_checkpointPreimageBindsChainFactoryBranchPolicyRevisionAndSource() (gas: 9316712)\n[PASS] test_currentProposalsSelectableInEitherOrderAndLosingSponsorPaysNothing() (gas: 9133908)\n[PASS] test_everyWitnessFieldAuthenticatedForSponsorBindAndHistoricalFork() (gas: 9955163)\n[PASS] test_fiveRootRoundsTwoSponsorsHistoricalForkAndTwoChildRounds() (gas: 44590786)\n[PASS] test_foreignFactoryAndUnregisteredLookalikeCannotForgeHistoricalFork() (gas: 6260449)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 99.26ms (97.64ms CPU time)\n\nRan 9 tests for test/RelayHistory.t.sol:RelayHistoryTest\n[PASS] test_badBindingPreservesResultThenCorrectWitnessWorksWithoutPurchase() (gas: 6743542)\n[PASS] test_childCannotBindParentsProjectAsOwn() (gas: 9374123)\n[PASS] test_forkCannotAuthenticateFakeParentLatestWitnessOrForgedProvenance() (gas: 6774606)\n[PASS] test_forkChosenHistoricalCheckpointStartsOwnProjectAndPayer() (gas: 18252558)\n[PASS] test_forkIsAllowedWhileParentPendingOrFrozen() (gas: 11736004)\n[PASS] test_htmlImageHtmlLatestJobAndOlderSelectedInputs() (gas: 27069914)\n[PASS] test_projectMismatchCannotOverwriteCheckpoint() (gas: 7223796)\n[PASS] test_removedInitializerCannotChangeAuthorityEvenForFactory() (gas: 139171)\n[PASS] test_reusedJobCannotCreateNewRevision() (gas: 6303754)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 102.18ms (100.91ms CPU time)\n\nRan 11 tests for test/adversarial/ManifestSpec.t.sol:ManifestSpecTest\n[PASS] testFuzz_nonWhitespaceTrailingByteAlwaysRejected(uint8) (runs: 1000, μ: 72226, ~: 72227)\n[PASS] testFuzz_unicodeScalarEscapesDecodeAndDuplicateKeysReject(uint32) (runs: 1000, μ: 243756, ~: 242596)\n[PASS] test_callbackDigestBindsWhitespaceAndKeyOrderOfOriginalBytes() (gas: 3568304)\n[PASS] test_exactDepthMemberKeyAndTokenBoundaries() (gas: 4652769)\n[PASS] test_exactManifestAndStringByteLimitsAcceptBoundaryRejectOneMore() (gas: 15285661)\n[PASS] test_fileSizeIntegerGrammarAndAllProfileDeclaredCaps() (gas: 23964974)\n[PASS] test_hashEncodingTypeWidthNonhexAndZeroAreCheckedForBothDigests() (gas: 99413604)\n[PASS] test_identityLengthDecodedFieldsAndEmptyAcceptedFiles() (gas: 8505003)\n[PASS] test_manifestRejectionsKeepRecordedDigestAndOldHistory() (gas: 110336568)\n[PASS] test_projectSwitchAndHistoricalJobReplayPreservePreviousCheckpoint() (gas: 19277773)\n[PASS] test_sourceAndLaterGitMetadataNeverReplaceAcceptedFilesDescriptor() (gas: 3647342)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 778.20ms (888.28ms CPU time)\n\nRan 13 tests for test/RelayMappingRegression.t.sol:RelayMappingRegressionTest\n[PASS] test_createRejectsExistingNameEvenWhenPathAndSlotDifferBeforePayment() (gas: 3186564)\n[PASS] test_createRejectsExistingPathEvenWhenNameAndSlotDifferBeforePayment() (gas: 3191092)\n[PASS] test_distLikeNamesAndNestedNonWebsiteDistDirectoryRemainAllowed() (gas: 1676948)\n[PASS] test_historicalForkKeepsSourceProvenanceAndCanUpdateInheritedSlot() (gas: 8127282)\n[PASS] test_legacyIndependentDescriptorsStayReadableButCollidingUpdateIsRejected() (gas: 3542557)\n[PASS] test_markdownAndImageCannotWriteAnyTopLevelDistDescendant() (gas: 746559)\n[PASS] test_namesCannotCollideAcrossDifferentAssetKinds() (gas: 3190052)\n[PASS] test_pathAncestorCannotReplaceAnExistingDirectoryWithFileBeforePayment() (gas: 5684530)\n[PASS] test_pathAncestorCollisionWithOtherSlotAlsoRejectsUpdates() (gas: 3322581)\n[PASS] test_pathCommonDirectoriesAndNonBoundaryPrefixesAreAllowed() (gas: 4232571)\n[PASS] test_pathDescendantCannotTreatAnExistingFileAsDirectoryBeforePayment() (gas: 3194702)\n[PASS] test_secondHtmlSlotRejectsFixedPathCollision() (gas: 6180713)\n[PASS] test_uniqueCreateAndUpdatePreserveOtherAssetProvenance() (gas: 13675407)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 803.29ms (87.42ms CPU time)\n\nRan 15 tests for test/StrictManifest.t.sol:StrictManifestTest\n[PASS] testFuzz_asciiJSONQuoteDecodeRoundTrip(bytes32,uint8) (runs: 1000, μ: 275046, ~: 138192)\n[PASS] testFuzz_decodedDuplicateKeyAlwaysRejected(uint8) (runs: 1000, μ: 77950, ~: 77933)\n[PASS] test_actualFileHashesAndManifestKeccakAreDistinct() (gas: 447728)\n[PASS] test_boundedLargeManifestMeasurement() (gas: 5049071)\n[PASS] test_onlyDeclaredFilesNotSourceOrGitMetadataSupplyAcceptedFile() (gas: 4148207)\n[PASS] test_parserBoundsManifestStringDepthMembersAndTokens() (gas: 2643565)\n[PASS] test_rejectDuplicateKeysIncludingDecodedEscapesAtEveryDepth() (gas: 5852323)\n[PASS] test_rejectEmptyOrMalformedExtraFileEntries() (gas: 3905093)\n[PASS] test_rejectIncompleteWrongIdentityTypesAndWrongFileTypes() (gas: 13253919)\n[PASS] test_rejectInvalidUTF8UnicodeSurrogatesAndNoncharacters() (gas: 871715)\n[PASS] test_rejectPathsTraversalHiddenURLAbsoluteAndDecodedControl() (gas: 20537073)\n[PASS] test_rejectTrailingAndMalformedJSON() (gas: 1235180)\n[PASS] test_rejectZeroOversizedNonIntegerAndStringFileBytes() (gas: 15406077)\n[PASS] test_validUTF8EscapesAndSurrogatePairsDecodeExactly() (gas: 1594868)\n[PASS] test_whitespaceIsLegalButDigestIsOverExactRawBytes() (gas: 463327)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 834.48ms (1.37s CPU time)\n\nRan 13 tests for test/ManifestSegmentBudget.t.sol:ManifestSegmentBudgetTest\n[PASS] test_asciiPrefixBeforeEscapeOrScalarDecodesExactly() (gas: 2318812)\n[PASS] test_asciiPrefixKeysStillDetectDuplicates() (gas: 489087)\n[PASS] test_asciiPrefixStillCountsTowardRetainedLimit() (gas: 1848363)\n[PASS] test_auditAlternatingEscapeShapeIsRejectedByBudgetNotGas() (gas: 200501187)\n[PASS] test_bindAsciiPrefixThenRawScalarWithFullWitness() (gas: 201477242)\n[PASS] test_bindAsciiPrefixThenSimpleEscapeWithFullWitness() (gas: 201488101)\n[PASS] test_bindAsciiPrefixThenUnicodeEscapeWithFullWitness() (gas: 201486297)\n[PASS] test_bindBudgetedAlternatingEscapesWithFullWitness() (gas: 185072031)\n[PASS] test_bindMaximumBudgetedSegmentFlushesWithFullWitness() (gas: 200590728)\n[PASS] test_bindOriginalCGas01ShapeWithFullWitnessBelowCap() (gas: 202899651)\n[PASS] test_consecutiveSimpleEscapesAreChargedOnlyOnce() (gas: 31602324)\n[PASS] test_segmentFlushBudgetAcceptsBoundaryRejectsOneMore() (gas: 17584038)\n[PASS] test_unicodeEscapesAndIgnoredStringsAreNotCharged() (gas: 157917183)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 844.88ms (2.24s CPU time)\n\nRan 14 tests for test/adversarial/PaymentSpec.t.sol:PaymentSpecTest\n[PASS] testFuzz_priceChangeCapAndDonationsConserveEveryWei(uint96,uint64) (runs: 1000, μ: 3011897, ~: 3012380)\n[PASS] testFuzz_unknownFailureFrozenDespiteNewProposalsAndTime(uint8) (runs: 1000, μ: 3334928, ~: 3334930)\n[PASS] test_continuationRetryRetainsParentAndFullSelectedSnapshot() (gas: 8236262)\n[PASS] test_exactWholeBalanceAndMaxFeeDoesNotOvercharge() (gas: 2250898)\n[PASS] test_insufficientApprovalAndBalanceRollbackBeforeAnyReceipt() (gas: 3490587)\n[PASS] test_intakeRevertPartialPullZeroIdAndClearFailureRollbackAllEffects() (gas: 7692767)\n[PASS] test_malformedResultIsRecordedWithoutParsingThenBadBindingPreservesIt() (gas: 2697688)\n[PASS] test_maximumCallbackURIWithinStipendAndOversizeFailureStaysPending() (gas: 6467337)\n[PASS] test_missingCallbackHasNoTimeoutButAuthenticLateCallbackStillWorks() (gas: 3227207)\n[PASS] test_reentrancyAtTransferApprovalAndIntakeCannotProposeOrBuyAgain() (gas: 13300793)\n[PASS] test_refusalCannotSubstituteProposalAndRetryRacesCostOnlyWinner() (gas: 6139693)\n[PASS] test_reusedIntakeRequestIdOnRetryCannotOverwriteAttemptOrDoubleCharge() (gas: 4586111)\n[PASS] test_spoofForeignCrossBranchAndReplayCallbacksCannotSettleOwnRequest() (gas: 8657651)\n[PASS] test_synchronousIntakeResultAndFailureCannotSettlePurchasingState() (gas: 4024590)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 845.10ms (1.22s CPU time)\n\nRan 6 tests for test/MetadataScannerDifferential.t.sol:MetadataScannerDifferentialTest\n[PASS] testFuzz_ArbitraryRawString(bytes32,bytes32) (runs: 256, μ: 393649, ~: 391620)\n[PASS] testFuzz_RawUnicode(uint32) (runs: 256, μ: 396026, ~: 399168)\n[PASS] testFuzz_UnicodeEscape(uint16,uint16) (runs: 256, μ: 413515, ~: 414221)\n[PASS] test_ControlsInvalidHexAndSurrogates() (gas: 6713765)\n[PASS] test_MixedRawAndEscapedUnicode() (gas: 2435015)\n[PASS] test_RetainedASCIICopyAtWordBoundaries() (gas: 10834619)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 845.04ms (1.67s CPU time)\n\nRan 13 tests for test/RelayPayments.t.sol:RelayPaymentsTest\n[PASS] testFuzz_exactDynamicFeeConservesBalances(uint96) (runs: 1000, μ: 2013455, ~: 2013424)\n[PASS] testFuzz_nonRefusalFailureAlwaysFreezes(uint8) (runs: 1000, μ: 2191654, ~: 2191655)\n[PASS] test_callbacksAuthenticateSenderOwnRequestAndSingleDelivery() (gas: 2258915)\n[PASS] test_creationAndProposalsDoNotPurchaseOrMoveAnchor() (gas: 3609551)\n[PASS] test_dynamicFeeBranchPayerExactBodyAndSelectors() (gas: 2485141)\n[PASS] test_feeOnTransferSenderTaxFalseAndPartialPullRevertAtomically() (gas: 3683362)\n[PASS] test_foreignIntakeRequestCannotSettleBranch() (gas: 2291558)\n[PASS] test_missingCallbackStaysPendingIndefinitely() (gas: 2122727)\n[PASS] test_noReturnTokenAndStickyAllowanceCleared() (gas: 2016329)\n[PASS] test_refusedOnlyExplicitIdenticalRetryWithNewReceipt() (gas: 5281228)\n[PASS] test_stipendCallbackOnlyRecordsAndBindingIsPermissionless() (gas: 3028585)\n[PASS] test_tokenReentrancyAndSynchronousCallbackAreRejected() (gas: 3197393)\n[PASS] test_zeroUnknownProposalFeeCapAndUnpricedRejectBeforeTransfer() (gas: 1663610)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 845.02ms (1.66s CPU time)\n\nRan 21 tests for test/ManifestEnvelopeRegression.t.sol:ManifestEnvelopeRegressionTest\n[PASS] test_bind33ActualSourceDescriptorsWithoutAnotherPurchase() (gas: 9869743)\n[PASS] test_bind33StructuredSourceEntriesWithoutAnotherPurchase() (gas: 5637779)\n[PASS] test_bindLongMetadataOnTheAcceptedFileWithoutAnotherPurchase() (gas: 4950120)\n[PASS] test_bindMaximumEscapedKeyBytesWithFullWitness() (gas: 247742772)\n[PASS] test_bindMaximumIgnoredNumberWithFullWitness() (gas: 184642766)\n[PASS] test_bindMaximumMetadataComplexityWithFullWitness() (gas: 197167419)\n[PASS] test_bindMaximumMetadataValuesAndUnicodeWithFullWitness() (gas: 201969624)\n[PASS] test_bindMaximumRetainedEscapedSurrogatesWithFullWitness() (gas: 185404023)\n[PASS] test_bindMaximumRetainedEscapedUtf8WithFullWitness() (gas: 187986071)\n[PASS] test_bindMaximumRetainedRawUtf8FourByteWithFullWitness() (gas: 183804732)\n[PASS] test_bindMaximumRetainedRawUtf8ThreeByteWithFullWitness() (gas: 184806019)\n[PASS] test_bindMaximumRetainedRawUtf8TwoByteWithFullWitness() (gas: 185822673)\n[PASS] test_bindMaximumRetainedSimpleEscapesWithFullWitness() (gas: 189126914)\n[PASS] test_bindMaximumWhitespaceWithFullWitness() (gas: 174492294)\n[PASS] test_bindMetadataBeyond8192BytesWithoutAnotherPurchase() (gas: 9051801)\n[PASS] test_exactPreviouslyObservedIMDResultBindsWithoutReserialization() (gas: 3494451)\n[PASS] test_invalidIgnoredMetadataCannotHideBehindProjection() (gas: 4480194)\n[PASS] test_longIgnoredStringStillRejectsLateInvalidUtf8AndDuplicateKeys() (gas: 20271255)\n[PASS] test_manifestAggregateKeyBudgetAccepts2048Rejects2049() (gas: 3594717)\n[PASS] test_manifestValueBudgetAccepts512Rejects513() (gas: 5813174)\n[PASS] test_wrongHashStillRejectsProjectedManifest() (gas: 1320600)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 845.09ms (3.11s CPU time)\n\nRan 5 tests for test/adversarial/ProfileBoundarySpec.t.sol:ProfileBoundarySpecTest\n[PASS] testFuzz_htmlBase64RoundingAndOneByteOverTheKnownInputBudget(uint32) (runs: 1000, μ: 992660, ~: 992685)\n[PASS] test_realEightAssetWitnessExact16384ByteRequestAndOneByteOverRejectedBeforePayment() (gas: 138060866)\n[PASS] test_slotReservationInputCountAndFullCapacityUpdateBoundaries() (gas: 9075210)\n[PASS] test_unsafePathComponentsInvalidUtf8AndDisabledModesRejectWithoutSpending() (gas: 2664969)\n[PASS] test_utf8TextLimitsCountBytesAndOutputMappingLengthsAreBounded() (gas: 32437589)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 845.13ms (1.14s CPU time)\n\nRan 7 tests for test/ManifestStringRegression.t.sol:ManifestStringRegressionTest\n[PASS] testFuzz_retainedArbitraryBytesMatchReference(bytes32,uint8) (runs: 1000, μ: 172040, ~: 171913)\n[PASS] testFuzz_retainedQuotedAsciiMatchesReference(bytes32,uint8) (runs: 1000, μ: 573812, ~: 371120)\n[PASS] testFuzz_validScalarRawAndEscapeMatchReference(uint32,uint8) (runs: 1000, μ: 719046, ~: 704009)\n[PASS] test_mixedRawEscapedScalarsAndSimpleEscapesDecodeExactly() (gas: 262922)\n[PASS] test_rawAndEscapedUnicodeKeysStillDetectDuplicates() (gas: 225974)\n[PASS] test_retainedDecodedByteLimitAccepts1024Rejects1025() (gas: 2746257)\n[PASS] test_retainedInvalidUnicodeAndEscapesReject() (gas: 2941178)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 845.12ms (2.26s CPU time)\n\nRan 14 tests for test/RelayProfiles.t.sol:RelayProfilesTest\n[PASS] test_capacityEndToEndSixteenAssetsThenUpdate() (gas: 91718152)\n[PASS] test_htmlImagesPerFileAggregateAndBase64OverheadBounds() (gas: 1375271)\n[PASS] test_imageReferencesAndMarkdownImageInputsDisabled() (gas: 3390159)\n[PASS] test_invalidTextAndCanonicalWitnessRejectBeforePayment() (gas: 346980)\n[PASS] test_jsonEscapingCannotInjectRuntimeFields() (gas: 1027576)\n[PASS] test_maximumCompleteBindingASCIIFitsGasBudget() (gas: 227195804)\n[PASS] test_maximumCompleteBindingEscapedUnicodeFitsGasBudget() (gas: 251560161)\n[PASS] test_maximumCompleteBindingWideObjectsFitsGasBudget() (gas: 256251480)\n[PASS] test_measureMaximumWitnessAndLargeManifestTogether() (gas: 14174902)\n[PASS] test_publishDisabledAndOutputMappingFixedBeforePayment() (gas: 360429)\n[PASS] test_requestBodyUTF8ByteLimitCheckedBeforePayment() (gas: 6269331)\n[PASS] test_reserveEachEnabledTypeAndExistingSlotsUpdatableAtCapacity() (gas: 4280279)\n[PASS] test_selectedInputsMustBeCurrentSortedUniqueAndWithinEight() (gas: 10490710)\n[PASS] test_updateTargetMandatoryCreateCannotOverwriteAndRenameDisabled() (gas: 3865826)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 845.08ms (1.27s CPU time)\n\nRan 1 test for test/RelayInvariant.t.sol:RelayInvariantTest\n[PASS] invariant_conservationAndPermanentHistory() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| RelayHandler | bind         | 1358  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | fail         | 1347  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | propose      | 1372  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | recordResult | 1345  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | retry        | 1387  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | sponsor      | 1383  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.74s (2.74s CPU time)\n\nRan 2 tests for test/adversarial/StateMachineSpec.t.sol:StateMachineSpecTest\n[PASS] invariant_modelFeesReceiptsAssetsAndPermanentCheckpoints() (runs: 256, calls: 24576, reverts: 0)\n\n╭------------------+-----------------+-------+---------+----------╮\n| Contract         | Selector        | Calls | Reverts | Discards |\n+=================================================================+\n| SpecStateHandler | advanceTime     | 2453  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | bind            | 2390  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | donate          | 2424  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | fail            | 2446  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | forkHistory     | 2398  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | hostileCallback | 2430  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | propose         | 2485  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | purchase        | 2505  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | recordResult    | 2512  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | retry           | 2533  | 0       | 0        |\n╰------------------+-----------------+-------+---------+----------╯\n\n[PASS] test_modelExercisesRefusalRetryChildContinuationAndHistoricalFork() (gas: 26033338)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 16.77s (16.76s CPU time)\n\nRan 20 test suites in 16.77s (29.07s CPU time): 169 tests passed, 0 failed, 0 skipped (169 total tests)\n","passed":true},{"durationMs":161,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"RelayBranch.bind(bytes,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.onIntakeFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"RelayBranch.onIntakeResult(bytes32,bytes32,string)\",\"RelayBranch.propose((bytes32,uint8,bytes32,bytes32[],string,string,string,bool),(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.retry(uint256,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.sponsor(uint256,uint256,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayFactory.createProject(string)\",\"RelayFactory.fork(address,uint64,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[],string)\"],\"files\":{\".gitignore\":7,\"ADAPTATION.md\":113,\"DESIGN.md\":124,\"LICENSE\":21,\"README.md\":48,\"abi/IIntake.json\":82,\"abi/RelayBranch.json\":1455,\"abi/RelayEncoder.json\":353,\"abi/RelayFactory.json\":306,\"abi/RelayVerifier.json\":245,\"cli/relay.mjs\":88,\"config/production-gate.json\":89,\"config/production-gate.schema.json\":273,\"config/release.json\":367,\"dist/assets/dist-V2jKd6xN.js\":3,\"dist/assets/index-4UpPiOax.css\":1,\"dist/assets/index-CNVEwO4S.js\":128,\"dist/favicon.svg\":1,\"dist/index.html\":18,\"dist/local-config.json\":103,\"dist/og.png\":190,\"dist/og.svg\":1,\"docs/ACCEPTANCE.md\":5,\"docs/AGENT-GUIDE.md\":13,\"docs/BUILD.md\":51,\"docs/CLI.md\":29,\"docs/CONTRACTS.md\":33,\"docs/DESIGN.md\":5,\"docs/ENTRYPOINTS.md\":72,\"docs/FRONTEND.md\":5,\"docs/HANDOFF.md\":47,\"docs/LIMITS.md\":34,\"docs/LIVE-VALIDATION.md\":23,\"docs/OPERATIONS.md\":49,\"docs/PLATFORM-AUTHORING.md\":5,\"docs/PROTOCOL-OVERVIEW.md\":31,\"docs/RESOLVER-PROPOSAL.md\":9,\"docs/REVIEW.md\":28,\"docs/SDK-API.md\":23,\"docs/SDK-BROWSER.md\":9,\"docs/agent/SDK-CLI-A1.md\":5,\"docs/agent/sdk-cli-checks.md\":5,\"docs/frontend-README.md\":5,\"docs/history/README.md\":32,\"docs/history/a1-fixtures.tar.xz\":13,\"docs/history/accepted-platform-validation-index.json.xz\":38,\"docs/history/accepted-rc-raw-index.json.xz\":6,\"docs/history/accepted-rc-raw.tar.xz\":140,\"docs/history/fixtures-index.json\":72,\"docs/history/imported-index.json.xz\":190,\"docs/history/integration-predecessor.json\":71,\"docs/validation/boundary-revision/README.md\":111,\"docs/validation/boundary-revision/archive-index.json.xz\":60,\"docs/validation/boundary-revision/summary.json\":334,\"docs/validation/documentation-v1/README.md\":69,\"docs/validation/documentation-v1/archive-index.json\":42,\"docs/validation/documentation-v1/docs-hashes.sha256.json.xz\":15,\"docs/validation/documentation-v1/runtime-export.sha256.json.xz\":48,\"docs/validation/integration-v1/README.md\":38,\"docs/validation/integration-v1/archive-index.json\":268,\"docs/validation/launch-packaging-v1/README.md\":62,\"docs/validation/launch-packaging-v1/bytecode-inspection.json\":70,\"docs/validation/launch-packaging-v1/deployment-rehearsal.json\":293,\"docs/validation/launch-packaging-v1/metadata-binding.json\":179,\"docs/validation/launch-packaging-v1/retained-binding.json\":145,\"docs/validation/local-repair-v1/README.md\":66,\"docs/validation/local-repair-v1/archive-index.json.xz\":17,\"docs/validation/local-repair-v1/delivery-size.json\":40,\"docs/validation/local-repair-v1/evidence.tar.xz\":832,\"docs/validation/local-repair-v1/measurements.json\":287,\"docs/validation/local-repair-v1/source-manifest.json.xz\":58,\"docs/validation/multi-file-revision/README.md\":97,\"docs/validation/multi-file-revision/archive-index.json.xz\":44,\"docs/validation/multi-file-revision/summary.json\":213,\"docs/validation/public-ui-v1/raw/build.log\":12,\"docs/validation/rc-v1/README.md\":110,\"docs/validation/rc-v1/archive-index.json\":242,\"docs/validation/rc-v1/authenticated-results-index.json\":54,\"docs/validation/rc-v1/delivery-size.json\":40,\"docs/validation/rc-v1/initial-frontend-typecheck-failure.txt\":10,\"docs/validation/rc-v1/initial-gas-limit-metric-failure.txt\":31,\"docs/validation/rc-v1/initial-launch-test-failure.txt\":24,\"docs/validation/rc-v1/initial-name-validation-unit-failure.txt\":39,\"docs/validation/rc-v1/initial-public-browser-harness-failure.txt\":14,\"docs/validation/rc-v1/raw-result-test-compile-failure.txt\":8,\"docs/validation/rc-v1/rendered-review.json\":33,\"docs/validation/rc-v1/source-manifest.json.xz\":71,\"foundry.toml\":16,\"frontend/.gitignore\":6,\"frontend/.npmrc\":1,\"frontend/DESIGN.md\":5,\"frontend/README.md\":5,\"frontend/REVIEW.md\":5,\"frontend/docs/A1-HANDOFF.md\":5,\"frontend/docs/W1-README.md\":5,\"frontend/docs/licenses/Noto-Sans-OFL.txt\":92,\"frontend/docs/licenses/Noto-Sans-provenance.json\":9,\"frontend/docs/licenses/better-interface-LICENSE.txt\":220,\"frontend/docs/licenses/eth-frontend-ux-LICENSE.txt\":30,\"frontend/index.html\":16,\"frontend/package-lock.json\":2700,\"frontend/package.json\":45,\"frontend/playwright.config.ts\":28,\"frontend/public/favicon.svg\":1,\"frontend/public/local-config.json\":103,\"frontend/public/og.png\":190,\"frontend/public/og.svg\":1,\"frontend/scripts/audit-local-evidence.mjs\":70,\"frontend/scripts/check-integration.mjs\":50,\"frontend/scripts/design-review.mjs\":74,\"frontend/scripts/local-deliver.mjs\":59,\"frontend/scripts/local-setup.mjs\":89,\"frontend/scripts/measure-platform.mjs\":33,\"frontend/scripts/measure-submission.mjs\":33,\"frontend/scripts/platform-review.mjs\":26,\"frontend/scripts/prepare-webkit.sh\":51,\"frontend/scripts/record-release.mjs\":97,\"frontend/scripts/static-preview.mjs\":12,\"frontend/scripts/validate.mjs\":37,\"frontend/src/App.tsx\":46,\"frontend/src/components/ArtifactViewer.tsx\":27,\"frontend/src/components/FundingSheet.tsx\":6,\"frontend/src/components/Sheet.tsx\":28,\"frontend/src/components/VerifiedThumbnail.tsx\":12,\"frontend/src/components/WalletButton.tsx\":3,\"frontend/src/components/platform.tsx\":75,\"frontend/src/config.ts\":22,\"frontend/src/domain/adapter.ts\":72,\"frontend/src/domain/chainAdapter.ts\":470,\"frontend/src/domain/files.ts\":107,\"frontend/src/domain/fixtureAdapter.ts\":519,\"frontend/src/domain/fixtures.ts\":63,\"frontend/src/domain/liveAdapter.ts\":58,\"frontend/src/domain/publicMode.ts\":44,\"frontend/src/domain/sdk.ts\":11,\"frontend/src/domain/types.ts\":208,\"frontend/src/main.tsx\":24,\"frontend/src/preview/FilePreview.tsx\":114,\"frontend/src/preview/sanitize.ts\":77,\"frontend/src/styles.css\":259,\"frontend/src/ui/ErrorBoundary.tsx\":19,\"frontend/src/ui/LocalApp.tsx\":63,\"frontend/src/ui/ProjectList.tsx\":119,\"frontend/src/ui/ProposeForm.tsx\":219,\"frontend/src/ui/Showcase.tsx\":18,\"frontend/src/ui/SponsorPanel.tsx\":64,\"frontend/src/ui/Workspace.tsx\":146,\"frontend/src/ui/actionScope.ts\":18,\"frontend/src/ui/format.tsx\":70,\"frontend/src/ui/recovery.ts\":41,\"frontend/src/ui/snapshot.ts\":12,\"frontend/src/ui/verification.ts\":38,\"frontend/src/wallet/ConnectSheet.tsx\":98,\"frontend/src/wallet/icons.ts\":8,\"frontend/src/wallet/open-in.ts\":19,\"frontend/src/wallet/wagmi.ts\":13,\"frontend/tests/e2e/actions.ts\":56,\"frontend/tests/e2e/harness.ts\":34,\"frontend/tests/e2e/journey.spec.ts\":214,\"frontend/tests/e2e/layout.spec.ts\":65,\"frontend/tests/e2e/platform.spec.ts\":102,\"frontend/tests/e2e/revision.spec.ts\":258,\"frontend/tests/e2e/w1.spec.ts\":306,\"frontend/tests/e2e/wallet.spec.ts\":88,\"frontend/tests/fixtures/wide.png\":3,\"frontend/tests/integration/browser-chain.mjs\":701,\"frontend/tests/integration/local-command.mjs\":37,\"frontend/tests/integration/navigation-race.mjs\":32,\"frontend/tests/integration/platform-chain.mjs\":87,\"frontend/tests/integration/public-chain.mjs\":137,\"frontend/tests/run-browsers.mjs\":14,\"frontend/tests/unit/chain-provider.test.ts\":62,\"frontend/tests/unit/domain.test.ts\":120,\"frontend/tests/unit/multi-file.test.ts\":54,\"frontend/tests/unit/platform.test.tsx\":103,\"frontend/tests/unit/public-transport.test.ts\":290,\"frontend/tests/unit/reopened.test.ts\":111,\"frontend/tests/unit/security.test.tsx\":228,\"frontend/tests/unit/setup.ts\":1,\"frontend/tsconfig.json\":19,\"frontend/vite.config.ts\":10,\"frontend/vitest.config.ts\":11,\"package-lock.json\":127,\"package.json\":20,\"remappings.txt\":1,\"sdk/abi.mjs\":16,\"sdk/browser.mjs\":30,\"sdk/config.mjs\":91,\"sdk/core.mjs\":403,\"sdk/deployment.mjs\":56,\"sdk/files-browser.mjs\":173,\"sdk/files.mjs\":177,\"sdk/gates.mjs\":23,\"sdk/handoff.mjs\":81,\"sdk/index.mjs\":17,\"sdk/observation.mjs\":47,\"sdk/public-rpc.mjs\":106,\"sdk/public.mjs\":110,\"sdk/strict-json.mjs\":159,\"src/RelayBranch.sol\":309,\"src/RelayEncoder.sol\":205,\"src/RelayFactory.sol\":100,\"src/RelayTypes.sol\":78,\"src/RelayVerifier.sol\":84,\"src/interfaces/IIntake.sol\":20,\"src/libraries/Assets.sol\":141,\"src/libraries/ManifestJSON.sol\":645,\"src/libraries/Policy.sol\":51,\"src/libraries/StrictJSON.sol\":260,\"src/libraries/Text.sol\":175,\"test-sdk/browser-sdk.test.mjs\":178,\"test-sdk/deployment.test.mjs\":89,\"test-sdk/files.test.mjs\":58,\"test-sdk/mock-rpc.mjs\":14,\"test-sdk/multi-file.test.mjs\":62,\"test-sdk/network-address.test.mjs\":85,\"test-sdk/parity-vectors.mjs\":100,\"test-sdk/public-rpc.test.mjs\":153,\"test-sdk/public.test.mjs\":82,\"test-sdk/relay.test.mjs\":244,\"test-sdk/review-regressions.test.mjs\":94,\"test-sdk/transaction-metrics.test.mjs\":12,\"test/CrossLanguage.t.sol\":37,\"test/IntakeCompatibility.t.sol\":105,\"test/LaunchCompatibility.t.sol\":175,\"test/ManifestEnvelopeRegression.t.sol\":366,\"test/ManifestSegmentBudget.t.sol\":373,\"test/ManifestStringRegression.t.sol\":189,\"test/MetadataScannerDifferential.t.sol\":120,\"test/MultiFileResults.t.sol\":133,\"test/PublicResults.t.sol\":34,\"test/RelayHistory.t.sol\":233,\"test/RelayInvariant.t.sol\":151,\"test/RelayMappingRegression.t.sol\":187,\"test/RelayPayments.t.sol\":240,\"test/RelayProfiles.t.sol\":396,\"test/RelaySetup.sol\":137,\"test/StrictManifest.t.sol\":254,\"test/TestBase.sol\":100,\"test/adversarial/ContinuationSpec.t.sol\":338,\"test/adversarial/ManifestSpec.t.sol\":400,\"test/adversarial/PaymentSpec.t.sol\":376,\"test/adversarial/ProfileBoundarySpec.t.sol\":227,\"test/adversarial/README.md\":40,\"test/adversarial/SpecSupport.sol\":462,\"test/adversarial/StateMachineSpec.t.sol\":482,\"test/adversarial/check-inline-fixtures.py\":43,\"test/fixtures/FixtureData.sol\":54,\"test/fixtures/LiveResultFixture.sol\":14,\"test/fixtures/MultiFileResult.sol\":11,\"test/fixtures/PublicResults.sol\":29,\"test/fixtures/SdkGolden.sol\":13,\"test/fixtures/document-updated.md\":5,\"test/fixtures/document-updated.md.result.json\":1,\"test/fixtures/document.md\":3,\"test/fixtures/document.md.result.json\":1,\"test/fixtures/html-1.html\":1,\"test/fixtures/html-1.html.result.json\":1,\"test/fixtures/html-3.html\":1,\"test/fixtures/html-3.html.result.json\":1,\"test/fixtures/image-2.png\":3,\"test/fixtures/image-2.png.result.json\":1,\"test/fixtures/public/completed-0.json\":1,\"test/fixtures/public/completed-1.json\":1,\"test/fixtures/public/completed-2.json\":1,\"test/fixtures/public/completed-3.json\":1,\"test/fixtures/public/mutable-job-0.json\":1,\"test/fixtures/public/mutable-job-1.json\":1,\"test/fixtures/public/mutable-job-2.json\":1,\"test/fixtures/public/mutable-job-3.json\":1,\"test/fixtures/public/observed-multiple-files.json\":1,\"test/fixtures/public/observed-one-file.json\":1,\"test/fixtures/sdk-golden.json\":20,\"test/mocks/MockIntake.sol\":101,\"test/mocks/MockToken.sol\":63,\"tools/build-release.mjs\":9,\"tools/check-delivery.py\":57,\"tools/check-official-bodies.mjs\":42,\"tools/check-release.mjs\":47,\"tools/compilation-context.mjs\":26,\"tools/deployment-rehearsal.mjs\":78,\"tools/export-abi.mjs\":7,\"tools/generate-fixtures.py\":27,\"tools/generate-local-config.mjs\":35,\"tools/generate-sdk-abi.mjs\":25,\"tools/generate-sdk-fixtures.mjs\":26,\"tools/import-deployment.mjs\":59,\"tools/inspect-bytecode.mjs\":43,\"tools/local-integration.mjs\":278,\"tools/measure-binding.mjs\":89,\"tools/measure-release.mjs\":21,\"tools/measure-retained-binding.mjs\":98,\"tools/observe-ethereum.mjs\":16,\"tools/sdk-local-check.mjs\":159,\"tools/sdk-local-scenario.mjs\":107,\"tools/sync-release.mjs\":31,\"tools/transaction-metrics.mjs\":11,\"tools/validate-live.mjs\":23,\"tools/verify-history.py\":55,\"vendor/ethers/LICENSE.md\":21,\"vendor/ethers/PROVENANCE.md\":1,\"vendor/ethers/ethers.mjs\":26619,\"vendor/npm/PROVENANCE.json\":56,\"vendor/npm/adraffy-ens-normalize-1.11.1.tgz\":813,\"vendor/npm/aes-js-4.0.0-beta.5.tgz\":1433,\"vendor/npm/ethers-6.17.0.tgz\":10241,\"vendor/npm/noble-curves-1.2.0.tgz\":1096,\"vendor/npm/noble-hashes-1.3.2.tgz\":443,\"vendor/npm/tslib-2.7.0.tgz\":58,\"vendor/npm/types-node-22.7.5.tgz\":1658,\"vendor/npm/undici-types-6.19.8.tgz\":78,\"vendor/npm/ws-8.21.0.tgz\":142},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":7138,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/RelayBranch.sol:179: Reentrancy in RelayBranch._purchase(uint256,bytes32,bytes,uint256) (src/RelayBranch.sol#179-218):\n[medium/medium] divide-before-multiply at src/RelayEncoder.sol:79: RelayEncoder._validate(RelayTypes.Proposal,RelayTypes.Asset[]) (src/RelayEncoder.sol#79-153) performs a multiplication on the result of a division:\n[medium/medium] uninitialized-local at src/libraries/Assets.sol:129: Assets.replace(RelayTypes.Asset[],RelayTypes.Asset).j (src/libraries/Assets.sol#129) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/StrictJSON.sol:109: StrictJSON._object(StrictJSON.Parser,uint256).keys (src/libraries/StrictJSON.sol#109) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Assets.sol:11: Assets.validate(RelayTypes.Asset[]).last (src/libraries/Assets.sol#11) is a local variable never initialized\n[medium/medium] uninitialized-local at src/RelayEncoder.sol:128: RelayEncoder._validate(RelayTypes.Proposal,RelayTypes.Asset[]).last (src/RelayEncoder.sol#128) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Assets.sol:130: Assets.replace(RelayTypes.Asset[],RelayTypes.Asset).inserted (src/libraries/Assets.sol#130) is a local variable never initialized\n[medium/medium] uninitialized-local at src/RelayEncoder.sol:130: RelayEncoder._validate(RelayTypes.Proposal,RelayTypes.Asset[]).htmlBytes (src/RelayEncoder.sol#130) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Text.sol:145: Text.unhex32(string).v (src/libraries/Text.sol#145) is a local variable never initialized\n[medium/medium] uninitialized-local at src/RelayEncoder.sol:127: RelayEncoder._validate(RelayTypes.Proposal,RelayTypes.Asset[]).selectedTarget (src/RelayEncoder.sol#127) is a local variable never initialized\n[medium/medium] uninitialized-local at src/RelayVerifier.sol:36: RelayVerifier.verify(bytes,bytes32,RelayTypes.Proposal,RelayTypes.Asset[],address,uint64).a (src/RelayVerifier.sol#36) is a local variable never initialized\n[medium/medium] uninitialized-local at src/RelayEncoder.sol:131: RelayEncoder._validate(RelayTypes.Proposal,RelayTypes.Asset[]).embeddedBytes (src/RelayEncoder.sol#131) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Assets.sol:22: Assets.validate(RelayTypes.Asset[]).missing (src/libraries/Assets.sol#22) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Text.sol:19: Text.utf8(bytes).n (src/libraries/Text.sol#19) is a local variable never initialized\n[medium/medium] uninitialized-local at src/RelayEncoder.sol:129: RelayEncoder._validate(RelayTypes.Proposal,RelayTypes.Asset[]).imageBytes (src/RelayEncoder.sol#129) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Text.sol:20: Text.utf8(bytes).minimum (src/libraries/Text.sol#20) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/ManifestJSON.sol:65: ManifestJSON._value(ManifestJSON.Parser,uint256,uint8).at (src/libraries/ManifestJSON.sol#65) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Assets.sol:12: Assets.validate(RelayTypes.Asset[]).kinds (src/libraries/Assets.sol#12) is a local variable never initialized\n[medium/medium] uninitialized-local at src/RelayEncoder.sol:108: RelayEncoder._validate(RelayTypes.Proposal,RelayTypes.Asset[]).missing (src/RelayEncoder.sol#108) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/ManifestJSON.sol:113: ManifestJSON._object(ManifestJSON.Parser,uint256,uint8).count (src/libraries/ManifestJSON.sol#113) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Text.sol:142: Text.unhex32(string).offset (src/libraries/Text.sol#142) is a local variable never initialized\n[medium/medium] unused-return at src/RelayBranch.sol:132: RelayBranch.propose(RelayTypes.Proposal,RelayTypes.Asset[]) (src/RelayBranch.sol#132-144) ignores return value by (None,body) = encoder.encode(goal,direction,latestJobId,p,current) (src/RelayBranch.sol#139)\n[medium/high] write-after-write at src/libraries/ManifestJSON.sol:244: ManifestJSON._stringInto(ManifestJSON.Parser,bytes,uint256).status (src/libraries/ManifestJSON.sol#244) is written in both\n[low/medium] reentrancy-benign at src/RelayBranch.sol:179: Reentrancy in RelayBranch._purchase(uint256,bytes32,bytes,uint256) (src/RelayBranch.sol#179-218):\n[low/medium] reentrancy-events at src/RelayBranch.sol:179: Reentrancy in RelayBranch._purchase(uint256,bytes32,bytes,uint256) (src/RelayBranch.sol#179-218):","passed":true},{"durationMs":515,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/RelayBranch.sol:139: Reentrancy: State change after external call (2 places)\n[low] internal-function-used-once at src/libraries/Assets.sol:30: Internal Function Used Only Once (4 places)\n[low] literal-instead-of-constant at src/RelayEncoder.sol:39: Literal Instead of Constant (83 places)\n[low] require-revert-in-loop at src/RelayEncoder.sol:118: Loop Contains `require`/`revert` (15 places)\n[low] state-variable-could-be-immutable at src/RelayBranch.sol:22: State Variable Could Be Immutable (3 places)\n[low] unchecked-return at src/libraries/ManifestJSON.sol:596: Unchecked Return (5 places)\n[low] uninitialized-local-variable at src/RelayEncoder.sol:108: Uninitialized Local Variable (8 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b34fcc87d6604a30b899e86713dae18a241773857626b757f92b3280af738817","verifiedTreeHash":"af4d765cc3e758e5284d8950d4ced75ec79f6710","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":309272,"exitCode":0,"name":"build","output":"Compiling 50 files with Solc 0.8.26\nSolc 0.8.26 finished in 309.13s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> test/RelayProfiles.t.sol:331:13:\n    |\n331 |             bytes memory raw = _manifest(Text.hex32(keccak256(abi.encode(i))), Policy.kind(profile), 32);\n    |             ^^^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n   --> test/RelayProfiles.t.sol:339:9:\n    |\n339 |         bytes memory raw = _manifest(Text.hex32(keccak256(\"new job\")), T.Kind.Markdown, 42);\n    |         ^^^^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":49240,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/CrossLanguage.t.sol:CrossLanguageTest\n[PASS] test_sdkCalldataActuallyCreatesBranchWithoutPayment() (gas: 2871398)\n[PASS] test_sdkCanonicalWitnessMatchesSolidity() (gas: 724409)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 5.04ms (2.80ms CPU time)\n\nRan 1 test for test/PublicResults.t.sol:PublicResultsTest\n[PASS] test_exactAuthenticatedPublicZeroFileResultsNeverSettleOrRebuy() (gas: 20754650)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 32.72ms (29.98ms CPU time)\n\nRan 5 tests for test/IntakeCompatibility.t.sol:IntakeCompatibilityTest\n[PASS] test_currentCatalogShapeAndOutputNamespaceAreEncoded() (gas: 6964887)\n[PASS] test_legacyDescriptorRemainsExactAndMigrationRequiresExplicitCanonicalUpdate() (gas: 4645597)\n[PASS] test_legacyHTMLCannotCreateSecondHTMLSlotAndExplicitUpdateMigrates() (gas: 4979429)\n[PASS] test_namesRequireInitialLetterButHistoricalNamesRemainReadable() (gas: 3522397)\n[PASS] test_oldOutputNamespaceRejectedBeforePayment() (gas: 273419)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 54.04ms (52.15ms CPU time)\n\nRan 7 tests for test/LaunchCompatibility.t.sol:LaunchCompatibilityTest\n[PASS] test_badPolicyAndBadInputsFailBeforeCreateAndRegistration() (gas: 179829)\n[PASS] test_callbackUriAtLimitWithinOfficialStipendAndAboveStaysPending() (gas: 2261838)\n[PASS] test_constructorRejectsZeroAndDuplicateDependencies() (gas: 12577)\n[PASS] test_directChildrenAreCompleteIndependentPayers() (gas: 6867385)\n[PASS] test_launchAndRuntimeChildPassProtectedOpcodeRule() (gas: 21037341)\n[PASS] test_namedBatchBackwardReferencesThenRuntimeChild() (gas: 13446709)\n[PASS] test_staticFactoryConstructorAcceptsEmptyDependenciesWithoutCallsOrChildren() (gas: 53669)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 69.94ms (67.40ms CPU time)\n\nRan 13 tests for test/RelayMappingRegression.t.sol:RelayMappingRegressionTest\n[PASS] test_createRejectsExistingNameEvenWhenPathAndSlotDifferBeforePayment() (gas: 3406558)\n[PASS] test_createRejectsExistingPathEvenWhenNameAndSlotDifferBeforePayment() (gas: 3411086)\n[PASS] test_distLikeNamesAndNestedNonWebsiteDistDirectoryRemainAllowed() (gas: 1676948)\n[PASS] test_historicalForkKeepsSourceProvenanceAndCanUpdateInheritedSlot() (gas: 8347276)\n[PASS] test_legacyIndependentDescriptorsStayReadableButCollidingUpdateIsRejected() (gas: 3762551)\n[PASS] test_markdownAndImageCannotWriteAnyTopLevelDistDescendant() (gas: 746559)\n[PASS] test_namesCannotCollideAcrossDifferentAssetKinds() (gas: 3410046)\n[PASS] test_pathAncestorCannotReplaceAnExistingDirectoryWithFileBeforePayment() (gas: 5904524)\n[PASS] test_pathAncestorCollisionWithOtherSlotAlsoRejectsUpdates() (gas: 3542575)\n[PASS] test_pathCommonDirectoriesAndNonBoundaryPrefixesAreAllowed() (gas: 4452565)\n[PASS] test_pathDescendantCannotTreatAnExistingFileAsDirectoryBeforePayment() (gas: 3414696)\n[PASS] test_secondHtmlSlotRejectsFixedPathCollision() (gas: 6400755)\n[PASS] test_uniqueCreateAndUpdatePreserveOtherAssetProvenance() (gas: 14337237)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 249.34ms (244.65ms CPU time)\n\nRan 5 tests for test/ManifestRetainedTokens.t.sol:ManifestRetainedTokensTest\n[PASS] test_capIsTwiceTheValueBudget() (gas: 320)\n[PASS] test_twentyFileResultBindsAsCompleteBranchTransaction() (gas: 5657983)\n[PASS] test_twentyFileResultVerifiesUnderFiveKilobytes() (gas: 3059203)\n[PASS] test_valueBudgetRefusesBeforeRetainedTokenCap() (gas: 10253877)\n[PASS] test_workBudgetRefusesBeforeRetainedTokenCap() (gas: 162763191)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 315.11ms (310.19ms CPU time)\n\nRan 9 tests for test/RelayHistory.t.sol:RelayHistoryTest\n[PASS] test_badBindingPreservesResultThenCorrectWitnessWorksWithoutPurchase() (gas: 7183854)\n[PASS] test_childCannotBindParentsProjectAsOwn() (gas: 9814435)\n[PASS] test_forkCannotAuthenticateFakeParentLatestWitnessOrForgedProvenance() (gas: 7214918)\n[PASS] test_forkChosenHistoricalCheckpointStartsOwnProjectAndPayer() (gas: 18913620)\n[PASS] test_forkIsAllowedWhileParentPendingOrFrozen() (gas: 11955998)\n[PASS] test_htmlImageHtmlLatestJobAndOlderSelectedInputs() (gas: 28175488)\n[PASS] test_projectMismatchCannotOverwriteCheckpoint() (gas: 7664084)\n[PASS] test_removedInitializerCannotChangeAuthorityEvenForFactory() (gas: 139171)\n[PASS] test_reusedJobCannotCreateNewRevision() (gas: 6744066)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 425.16ms (406.65ms CPU time)\n\nRan 5 tests for test/MultiFileResults.t.sol:MultiFileResultsTest\n[PASS] test_changingEvenIgnoredFileBytesCannotBindOrBuyAgain() (gas: 5957634)\n[PASS] test_declaredOutputAtBeginningOrEndOfFourAndSeventeenFiles() (gas: 9654481)\n[PASS] test_duplicateOutputNamePathOrExactMatchIsAmbiguous() (gas: 6576373)\n[PASS] test_exactObservedTwoFileResultBindsDeclaredOutputAndForks() (gas: 6666204)\n[PASS] test_invalidExtraJSONAndRetainedBoundsStillReject() (gas: 2995033)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.14s (214.87ms CPU time)\n\nRan 15 tests for test/StrictManifest.t.sol:StrictManifestTest\n[PASS] testFuzz_asciiJSONQuoteDecodeRoundTrip(bytes32,uint8) (runs: 1000, μ: 265681, ~: 132373)\n[PASS] testFuzz_decodedDuplicateKeyAlwaysRejected(uint8) (runs: 1000, μ: 77948, ~: 77933)\n[PASS] test_actualFileHashesAndManifestKeccakAreDistinct() (gas: 667710)\n[PASS] test_boundedLargeManifestMeasurement() (gas: 5271789)\n[PASS] test_onlyDeclaredFilesNotSourceOrGitMetadataSupplyAcceptedFile() (gas: 4803737)\n[PASS] test_parserBoundsManifestStringDepthMembersAndTokens() (gas: 2643565)\n[PASS] test_rejectDuplicateKeysIncludingDecodedEscapesAtEveryDepth() (gas: 6934845)\n[PASS] test_rejectEmptyOrMalformedExtraFileEntries() (gas: 4561931)\n[PASS] test_rejectIncompleteWrongIdentityTypesAndWrongFileTypes() (gas: 15223173)\n[PASS] test_rejectInvalidUTF8UnicodeSurrogatesAndNoncharacters() (gas: 871715)\n[PASS] test_rejectPathsTraversalHiddenURLAbsoluteAndDecodedControl() (gas: 22727017)\n[PASS] test_rejectTrailingAndMalformedJSON() (gas: 1235180)\n[PASS] test_rejectZeroOversizedNonIntegerAndStringFileBytes() (gas: 17160761)\n[PASS] test_validUTF8EscapesAndSurrogatePairsDecodeExactly() (gas: 1814850)\n[PASS] test_whitespaceIsLegalButDigestIsOverExactRawBytes() (gas: 683309)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 2.03s (3.65s CPU time)\n\nRan 6 tests for test/MetadataScannerDifferential.t.sol:MetadataScannerDifferentialTest\n[PASS] testFuzz_ArbitraryRawString(bytes32,bytes32) (runs: 256, μ: 826280, ~: 824143)\n[PASS] testFuzz_RawUnicode(uint32) (runs: 256, μ: 828585, ~: 831760)\n[PASS] testFuzz_UnicodeEscape(uint16,uint16) (runs: 256, μ: 845840, ~: 846733)\n[PASS] test_ControlsInvalidHexAndSurrogates() (gas: 14067157)\n[PASS] test_MixedRawAndEscapedUnicode() (gas: 5030399)\n[PASS] test_RetainedASCIICopyAtWordBoundaries() (gas: 16028051)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.44s (2.21s CPU time)\n\nRan 5 tests for test/adversarial/ContinuationSpec.t.sol:ContinuationSpecTest\n[PASS] test_checkpointPreimageBindsChainFactoryBranchPolicyRevisionAndSource() (gas: 9536598)\n[PASS] test_currentProposalsSelectableInEitherOrderAndLosingSponsorPaysNothing() (gas: 9353782)\n[PASS] test_everyWitnessFieldAuthenticatedForSponsorBindAndHistoricalFork() (gas: 10395247)\n[PASS] test_fiveRootRoundsTwoSponsorsHistoricalForkAndTwoChildRounds() (gas: 46138388)\n[PASS] test_foreignFactoryAndUnregisteredLookalikeCannotForgeHistoricalFork() (gas: 6480335)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.50s (216.34ms CPU time)\n\nRan 14 tests for test/RelayProfiles.t.sol:RelayProfilesTest\n[PASS] test_capacityEndToEndSixteenAssetsThenUpdate() (gas: 95558802)\n[PASS] test_htmlImagesPerFileAggregateAndBase64OverheadBounds() (gas: 1375271)\n[PASS] test_imageReferencesAndMarkdownImageInputsDisabled() (gas: 3610153)\n[PASS] test_invalidTextAndCanonicalWitnessRejectBeforePayment() (gas: 346980)\n[PASS] test_jsonEscapingCannotInjectRuntimeFields() (gas: 1027576)\n[PASS] test_maximumCompleteBindingASCIIFitsGasBudget() (gas: 231067930)\n[PASS] test_maximumCompleteBindingEscapedUnicodeFitsGasBudget() (gas: 255432287)\n[PASS] test_maximumCompleteBindingWideObjectsFitsGasBudget() (gas: 260123606)\n[PASS] test_measureMaximumWitnessAndLargeManifestTogether() (gas: 14411156)\n[PASS] test_publishDisabledAndOutputMappingFixedBeforePayment() (gas: 360429)\n[PASS] test_requestBodyUTF8ByteLimitCheckedBeforePayment() (gas: 6269331)\n[PASS] test_reserveEachEnabledTypeAndExistingSlotsUpdatableAtCapacity() (gas: 4280279)\n[PASS] test_selectedInputsMustBeCurrentSortedUniqueAndWithinEight() (gas: 10931478)\n[PASS] test_updateTargetMandatoryCreateCannotOverwriteAndRenameDisabled() (gas: 4085820)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 2.66s (3.24s CPU time)\n\nRan 11 tests for test/adversarial/ManifestSpec.t.sol:ManifestSpecTest\n[PASS] testFuzz_nonWhitespaceTrailingByteAlwaysRejected(uint8) (runs: 1000, μ: 72226, ~: 72227)\n[PASS] testFuzz_unicodeScalarEscapesDecodeAndDuplicateKeysReject(uint32) (runs: 1000, μ: 243760, ~: 242436)\n[PASS] test_callbackDigestBindsWhitespaceAndKeyOrderOfOriginalBytes() (gas: 3788190)\n[PASS] test_exactDepthMemberKeyAndTokenBoundaries() (gas: 4652769)\n[PASS] test_exactManifestAndStringByteLimitsAcceptBoundaryRejectOneMore() (gas: 15517703)\n[PASS] test_fileSizeIntegerGrammarAndAllProfileDeclaredCaps() (gas: 27911654)\n[PASS] test_hashEncodingTypeWidthNonhexAndZeroAreCheckedForBothDigests() (gas: 103797692)\n[PASS] test_identityLengthDecodedFieldsAndEmptyAcceptedFiles() (gas: 9379375)\n[PASS] test_manifestRejectionsKeepRecordedDigestAndOldHistory() (gas: 114253200)\n[PASS] test_projectSwitchAndHistoricalJobReplayPreservePreviousCheckpoint() (gas: 20378139)\n[PASS] test_sourceAndLaterGitMetadataNeverReplaceAcceptedFilesDescriptor() (gas: 3867312)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 2.76s (3.15s CPU time)\n\nRan 14 tests for test/adversarial/PaymentSpec.t.sol:PaymentSpecTest\n[PASS] testFuzz_priceChangeCapAndDonationsConserveEveryWei(uint96,uint64) (runs: 1000, μ: 3011882, ~: 3012464)\n[PASS] testFuzz_unknownFailureFrozenDespiteNewProposalsAndTime(uint8) (runs: 1000, μ: 3334928, ~: 3334930)\n[PASS] test_continuationRetryRetainsParentAndFullSelectedSnapshot() (gas: 8456148)\n[PASS] test_exactWholeBalanceAndMaxFeeDoesNotOvercharge() (gas: 2250898)\n[PASS] test_insufficientApprovalAndBalanceRollbackBeforeAnyReceipt() (gas: 3490587)\n[PASS] test_intakeRevertPartialPullZeroIdAndClearFailureRollbackAllEffects() (gas: 7692767)\n[PASS] test_malformedResultIsRecordedWithoutParsingThenBadBindingPreservesIt() (gas: 2912546)\n[PASS] test_maximumCallbackURIWithinStipendAndOversizeFailureStaysPending() (gas: 6687223)\n[PASS] test_missingCallbackHasNoTimeoutButAuthenticLateCallbackStillWorks() (gas: 3447093)\n[PASS] test_reentrancyAtTransferApprovalAndIntakeCannotProposeOrBuyAgain() (gas: 13300793)\n[PASS] test_refusalCannotSubstituteProposalAndRetryRacesCostOnlyWinner() (gas: 6359579)\n[PASS] test_reusedIntakeRequestIdOnRetryCannotOverwriteAttemptOrDoubleCharge() (gas: 4586111)\n[PASS] test_spoofForeignCrossBranchAndReplayCallbacksCannotSettleOwnRequest() (gas: 8877537)\n[PASS] test_synchronousIntakeResultAndFailureCannotSettlePurchasingState() (gas: 4024590)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 2.76s (4.26s CPU time)\n\nRan 5 tests for test/adversarial/ProfileBoundarySpec.t.sol:ProfileBoundarySpecTest\n[PASS] testFuzz_htmlBase64RoundingAndOneByteOverTheKnownInputBudget(uint32) (runs: 1000, μ: 992665, ~: 992685)\n[PASS] test_realEightAssetWitnessExact16384ByteRequestAndOneByteOverRejectedBeforePayment() (gas: 139846114)\n[PASS] test_slotReservationInputCountAndFullCapacityUpdateBoundaries() (gas: 9075210)\n[PASS] test_unsafePathComponentsInvalidUtf8AndDisabledModesRejectWithoutSpending() (gas: 2664969)\n[PASS] test_utf8TextLimitsCountBytesAndOutputMappingLengthsAreBounded() (gas: 32437589)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.78s (3.46s CPU time)\n\nRan 21 tests for test/ManifestEnvelopeRegression.t.sol:ManifestEnvelopeRegressionTest\n[PASS] test_bind33ActualSourceDescriptorsWithoutAnotherPurchase() (gas: 10093781)\n[PASS] test_bind33StructuredSourceEntriesWithoutAnotherPurchase() (gas: 5858949)\n[PASS] test_bindLongMetadataOnTheAcceptedFileWithoutAnotherPurchase() (gas: 5170786)\n[PASS] test_bindMaximumEscapedKeyBytesWithFullWitness() (gas: 251614862)\n[PASS] test_bindMaximumIgnoredNumberWithFullWitness() (gas: 188514856)\n[PASS] test_bindMaximumMetadataComplexityWithFullWitness() (gas: 201270927)\n[PASS] test_bindMaximumMetadataValuesAndUnicodeWithFullWitness() (gas: 206065224)\n[PASS] test_bindMaximumRetainedEscapedSurrogatesWithFullWitness() (gas: 189280913)\n[PASS] test_bindMaximumRetainedEscapedUtf8WithFullWitness() (gas: 191862961)\n[PASS] test_bindMaximumRetainedRawUtf8FourByteWithFullWitness() (gas: 187691222)\n[PASS] test_bindMaximumRetainedRawUtf8ThreeByteWithFullWitness() (gas: 188692509)\n[PASS] test_bindMaximumRetainedRawUtf8TwoByteWithFullWitness() (gas: 189709163)\n[PASS] test_bindMaximumRetainedSimpleEscapesWithFullWitness() (gas: 193005724)\n[PASS] test_bindMaximumWhitespaceWithFullWitness() (gas: 178364384)\n[PASS] test_bindMetadataBeyond8192BytesWithoutAnotherPurchase() (gas: 9275071)\n[PASS] test_exactPreviouslyObservedIMDResultBindsWithoutReserialization() (gas: 3714901)\n[PASS] test_invalidIgnoredMetadataCannotHideBehindProjection() (gas: 6211022)\n[PASS] test_longIgnoredStringStillRejectsLateInvalidUtf8AndDuplicateKeys() (gas: 21150163)\n[PASS] test_manifestAggregateKeyBudgetAccepts2048Rejects2049() (gas: 4034429)\n[PASS] test_manifestValueBudgetAccepts512Rejects513() (gas: 6252178)\n[PASS] test_wrongHashStillRejectsProjectedManifest() (gas: 1320600)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 2.78s (8.31s CPU time)\n\nRan 4 tests for test/release/ExactGasRegression.t.sol:ExactGasRegressionTest\n[PASS] testFuzz_anyOriginalByteMutationKeepsResultAndHistory(uint16,uint8) (runs: 128, μ: 14171682, ~: 14171682)\n[PASS] test_exactOriginalBytesAndOriginalWitnessBindBelowTransactionCap() (gas: 36570627)\n[PASS] test_ignoredMetadataAndWhitespaceRemainBoundThenOriginalStillSucceeds() (gas: 37328555)\n[PASS] test_originalWitnessMutationCannotBeUsedForBindingOrHistoricalFork() (gas: 19101636)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 4.30s (3.49s CPU time)\n\nRan 13 tests for test/ManifestSegmentBudget.t.sol:ManifestSegmentBudgetTest\n[PASS] test_asciiPrefixBeforeEscapeOrScalarDecodesExactly() (gas: 3760346)\n[PASS] test_asciiPrefixKeysStillDetectDuplicates() (gas: 901235)\n[PASS] test_asciiPrefixStillCountsTowardRetainedLimit() (gas: 2879009)\n[PASS] test_auditAlternatingEscapeShapeIsRejectedByBudgetNotGas() (gas: 204603687)\n[PASS] test_bindAsciiPrefixThenRawScalarWithFullWitness() (gas: 205363732)\n[PASS] test_bindAsciiPrefixThenSimpleEscapeWithFullWitness() (gas: 205374591)\n[PASS] test_bindAsciiPrefixThenUnicodeEscapeWithFullWitness() (gas: 205372787)\n[PASS] test_bindBudgetedAlternatingEscapesWithFullWitness() (gas: 188942501)\n[PASS] test_bindMaximumBudgetedSegmentFlushesWithFullWitness() (gas: 204476258)\n[PASS] test_bindOriginalCGas01ShapeWithFullWitnessBelowCap() (gas: 206786141)\n[PASS] test_consecutiveSimpleEscapesAreChargedOnlyOnce() (gas: 32450836)\n[PASS] test_segmentFlushBudgetAcceptsBoundaryRejectsOneMore() (gas: 18016682)\n[PASS] test_unicodeEscapesAndIgnoredStringsAreNotCharged() (gas: 159188403)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 4.30s (7.14s CPU time)\n\nRan 13 tests for test/RelayPayments.t.sol:RelayPaymentsTest\n[PASS] testFuzz_exactDynamicFeeConservesBalances(uint96) (runs: 1000, μ: 2013471, ~: 2013496)\n[PASS] testFuzz_nonRefusalFailureAlwaysFreezes(uint8) (runs: 1000, μ: 2191654, ~: 2191655)\n[PASS] test_callbacksAuthenticateSenderOwnRequestAndSingleDelivery() (gas: 2258915)\n[PASS] test_creationAndProposalsDoNotPurchaseOrMoveAnchor() (gas: 3829545)\n[PASS] test_dynamicFeeBranchPayerExactBodyAndSelectors() (gas: 2485141)\n[PASS] test_feeOnTransferSenderTaxFalseAndPartialPullRevertAtomically() (gas: 3683362)\n[PASS] test_foreignIntakeRequestCannotSettleBranch() (gas: 2291558)\n[PASS] test_missingCallbackStaysPendingIndefinitely() (gas: 2122727)\n[PASS] test_noReturnTokenAndStickyAllowanceCleared() (gas: 2016329)\n[PASS] test_refusedOnlyExplicitIdenticalRetryWithNewReceipt() (gas: 5501222)\n[PASS] test_stipendCallbackOnlyRecordsAndBindingIsPermissionless() (gas: 3248579)\n[PASS] test_tokenReentrancyAndSynchronousCallbackAreRejected() (gas: 3417387)\n[PASS] test_zeroUnknownProposalFeeCapAndUnpricedRejectBeforeTransfer() (gas: 1663610)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 4.30s (7.01s CPU time)\n\nRan 7 tests for test/ManifestStringRegression.t.sol:ManifestStringRegressionTest\n[PASS] testFuzz_retainedArbitraryBytesMatchReference(bytes32,uint8) (runs: 1000, μ: 377812, ~: 377560)\n[PASS] testFuzz_retainedQuotedAsciiMatchesReference(bytes32,uint8) (runs: 1000, μ: 974590, ~: 771424)\n[PASS] testFuzz_validScalarRawAndEscapeMatchReference(uint32,uint8) (runs: 1000, μ: 1749078, ~: 1733247)\n[PASS] test_mixedRawEscapedScalarsAndSimpleEscapesDecodeExactly() (gas: 468790)\n[PASS] test_rawAndEscapedUnicodeKeysStillDetectDuplicates() (gas: 637558)\n[PASS] test_retainedDecodedByteLimitAccepts1024Rejects1025() (gas: 3573361)\n[PASS] test_retainedInvalidUnicodeAndEscapesReject() (gas: 8497400)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 4.30s (9.82s CPU time)\n\nRan 1 test for test/RelayInvariant.t.sol:RelayInvariantTest\n[PASS] invariant_conservationAndPermanentHistory() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| RelayHandler | bind         | 1358  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | fail         | 1347  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | propose      | 1372  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | recordResult | 1345  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | retry        | 1387  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | sponsor      | 1383  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 7.15s (7.14s CPU time)\n\nRan 2 tests for test/adversarial/StateMachineSpec.t.sol:StateMachineSpecTest\n[PASS] invariant_modelFeesReceiptsAssetsAndPermanentCheckpoints() (runs: 256, calls: 24576, reverts: 0)\n\n╭------------------+-----------------+-------+---------+----------╮\n| Contract         | Selector        | Calls | Reverts | Discards |\n+=================================================================+\n| SpecStateHandler | advanceTime     | 2453  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | bind            | 2390  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | donate          | 2424  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | fail            | 2446  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | forkHistory     | 2398  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | hostileCallback | 2430  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | propose         | 2485  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | purchase        | 2505  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | recordResult    | 2512  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | retry           | 2533  | 0       | 0        |\n╰------------------+-----------------+-------+---------+----------╯\n\n[PASS] test_modelExercisesRefusalRetryChildContinuationAndHistoricalFork() (gas: 26475558)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 36.93s (36.92s CPU time)\n\nRan 2 tests for test/release/PurchaseAtomicityInvariant.t.sol:PurchaseAtomicityInvariantTest\n[PASS] invariant_faultsNeverSpendDonationsOrRewriteReceipts() (runs: 256, calls: 24576, reverts: 0)\n\n╭--------------------------+---------------------+-------+---------+----------╮\n| Contract                 | Selector            | Calls | Reverts | Discards |\n+=============================================================================+\n| PurchaseAtomicityHandler | bind                | 4904  | 0       | 0        |\n|--------------------------+---------------------+-------+---------+----------|\n| PurchaseAtomicityHandler | crossBranchCallback | 4907  | 0       | 0        |\n|--------------------------+---------------------+-------+---------+----------|\n| PurchaseAtomicityHandler | donate              | 4881  | 0       | 0        |\n|--------------------------+---------------------+-------+---------+----------|\n| PurchaseAtomicityHandler | purchase            | 4896  | 0       | 0        |\n|--------------------------+---------------------+-------+---------+----------|\n| PurchaseAtomicityHandler | respond             | 4988  | 0       | 0        |\n╰--------------------------+---------------------+-------+---------+----------╯\n\n[PASS] test_allFaultsOnContinuationAndRetryThenRecovery() (gas: 82890191)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 49.06s (49.22s CPU time)\n\nRan 23 test suites in 49.06s (133.36s CPU time): 180 tests passed, 0 failed, 0 skipped (180 total tests)\n","passed":true},{"durationMs":346,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"RelayBranch.bind(bytes,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.onIntakeFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"RelayBranch.onIntakeResult(bytes32,bytes32,string)\",\"RelayBranch.propose((bytes32,uint8,bytes32,bytes32[],string,string,string,bool),(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.retry(uint256,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayBranch.sponsor(uint256,uint256,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[])\",\"RelayFactory.createProject(string)\",\"RelayFactory.fork(address,uint64,(bytes32,uint8,string,string,bytes32,string,uint32,bytes32,address,string,bytes32,uint64)[],string)\"],\"files\":{\".gitignore\":7,\"ADAPTATION.md\":147,\"DESIGN.md\":124,\"LICENSE\":21,\"README.md\":48,\"abi/IIntake.json\":82,\"abi/RelayBranch.json\":1455,\"abi/RelayEncoder.json\":353,\"abi/RelayFactory.json\":306,\"abi/RelayVerifier.json\":245,\"cli/relay.mjs\":88,\"config/production-gate.json\":89,\"config/production-gate.schema.json\":273,\"config/release.json\":369,\"dist/assets/dist-V2jKd6xN.js\":3,\"dist/assets/index-4UpPiOax.css\":1,\"dist/assets/index-CNVEwO4S.js\":128,\"dist/favicon.svg\":1,\"dist/index.html\":18,\"dist/local-config.json\":103,\"dist/og.png\":190,\"dist/og.svg\":1,\"docs/ACCEPTANCE.md\":5,\"docs/AGENT-GUIDE.md\":13,\"docs/BUILD.md\":51,\"docs/CLI.md\":29,\"docs/CONTRACTS.md\":33,\"docs/DESIGN.md\":5,\"docs/ENTRYPOINTS.md\":72,\"docs/FRONTEND.md\":5,\"docs/HANDOFF.md\":47,\"docs/LIMITS.md\":45,\"docs/LIVE-VALIDATION.md\":23,\"docs/OPERATIONS.md\":49,\"docs/PLATFORM-AUTHORING.md\":5,\"docs/PROTOCOL-OVERVIEW.md\":31,\"docs/RESOLVER-PROPOSAL.md\":9,\"docs/REVIEW.md\":28,\"docs/SDK-API.md\":23,\"docs/SDK-BROWSER.md\":9,\"docs/agent/SDK-CLI-A1.md\":5,\"docs/agent/sdk-cli-checks.md\":5,\"docs/frontend-README.md\":5,\"docs/history/README.md\":32,\"docs/history/a1-fixtures.tar.xz\":13,\"docs/history/accepted-platform-validation-index.json.xz\":38,\"docs/history/accepted-rc-raw-index.json.xz\":6,\"docs/history/accepted-rc-raw.tar.xz\":140,\"docs/history/fixtures-index.json\":72,\"docs/history/imported-index.json.xz\":190,\"docs/history/integration-predecessor.json\":71,\"docs/validation/boundary-revision/README.md\":111,\"docs/validation/boundary-revision/archive-index.json.xz\":60,\"docs/validation/boundary-revision/summary.json\":334,\"docs/validation/documentation-v1/README.md\":69,\"docs/validation/documentation-v1/archive-index.json\":42,\"docs/validation/documentation-v1/docs-hashes.sha256.json.xz\":15,\"docs/validation/documentation-v1/runtime-export.sha256.json.xz\":48,\"docs/validation/integration-v1/README.md\":38,\"docs/validation/integration-v1/archive-index.json\":268,\"docs/validation/launch-packaging-v1/README.md\":100,\"docs/validation/launch-packaging-v1/bytecode-inspection.json\":70,\"docs/validation/launch-packaging-v1/deployment-rehearsal.json\":293,\"docs/validation/launch-packaging-v1/metadata-binding.json\":179,\"docs/validation/launch-packaging-v1/retained-binding.json\":145,\"docs/validation/launch-packaging-v1/revision-1/bytecode-inspection.json\":70,\"docs/validation/launch-packaging-v1/revision-1/metadata-binding.json\":179,\"docs/validation/launch-packaging-v1/revision-1/retained-binding.json\":145,\"docs/validation/local-repair-v1/README.md\":66,\"docs/validation/local-repair-v1/archive-index.json.xz\":17,\"docs/validation/local-repair-v1/delivery-size.json\":40,\"docs/validation/local-repair-v1/evidence.tar.xz\":832,\"docs/validation/local-repair-v1/measurements.json\":287,\"docs/validation/local-repair-v1/source-manifest.json.xz\":58,\"docs/validation/multi-file-revision/README.md\":97,\"docs/validation/multi-file-revision/archive-index.json.xz\":44,\"docs/validation/multi-file-revision/summary.json\":213,\"docs/validation/public-ui-v1/raw/build.log\":12,\"docs/validation/rc-v1/README.md\":110,\"docs/validation/rc-v1/archive-index.json\":242,\"docs/validation/rc-v1/authenticated-results-index.json\":54,\"docs/validation/rc-v1/delivery-size.json\":40,\"docs/validation/rc-v1/initial-frontend-typecheck-failure.txt\":10,\"docs/validation/rc-v1/initial-gas-limit-metric-failure.txt\":31,\"docs/validation/rc-v1/initial-launch-test-failure.txt\":24,\"docs/validation/rc-v1/initial-name-validation-unit-failure.txt\":39,\"docs/validation/rc-v1/initial-public-browser-harness-failure.txt\":14,\"docs/validation/rc-v1/raw-result-test-compile-failure.txt\":8,\"docs/validation/rc-v1/rendered-review.json\":33,\"docs/validation/rc-v1/source-manifest.json.xz\":71,\"foundry.toml\":16,\"frontend/.gitignore\":6,\"frontend/.npmrc\":1,\"frontend/DESIGN.md\":5,\"frontend/README.md\":5,\"frontend/REVIEW.md\":5,\"frontend/docs/A1-HANDOFF.md\":5,\"frontend/docs/W1-README.md\":5,\"frontend/docs/licenses/Noto-Sans-OFL.txt\":92,\"frontend/docs/licenses/Noto-Sans-provenance.json\":9,\"frontend/docs/licenses/better-interface-LICENSE.txt\":220,\"frontend/docs/licenses/eth-frontend-ux-LICENSE.txt\":30,\"frontend/index.html\":16,\"frontend/package-lock.json\":2700,\"frontend/package.json\":45,\"frontend/playwright.config.ts\":28,\"frontend/public/favicon.svg\":1,\"frontend/public/local-config.json\":103,\"frontend/public/og.png\":190,\"frontend/public/og.svg\":1,\"frontend/scripts/audit-local-evidence.mjs\":70,\"frontend/scripts/check-integration.mjs\":50,\"frontend/scripts/design-review.mjs\":74,\"frontend/scripts/local-deliver.mjs\":59,\"frontend/scripts/local-setup.mjs\":89,\"frontend/scripts/measure-platform.mjs\":33,\"frontend/scripts/measure-submission.mjs\":33,\"frontend/scripts/platform-review.mjs\":26,\"frontend/scripts/prepare-webkit.sh\":51,\"frontend/scripts/record-release.mjs\":97,\"frontend/scripts/static-preview.mjs\":12,\"frontend/scripts/validate.mjs\":37,\"frontend/src/App.tsx\":46,\"frontend/src/components/ArtifactViewer.tsx\":27,\"frontend/src/components/FundingSheet.tsx\":6,\"frontend/src/components/Sheet.tsx\":28,\"frontend/src/components/VerifiedThumbnail.tsx\":12,\"frontend/src/components/WalletButton.tsx\":3,\"frontend/src/components/platform.tsx\":75,\"frontend/src/config.ts\":22,\"frontend/src/domain/adapter.ts\":72,\"frontend/src/domain/chainAdapter.ts\":470,\"frontend/src/domain/files.ts\":107,\"frontend/src/domain/fixtureAdapter.ts\":519,\"frontend/src/domain/fixtures.ts\":63,\"frontend/src/domain/liveAdapter.ts\":58,\"frontend/src/domain/publicMode.ts\":44,\"frontend/src/domain/sdk.ts\":11,\"frontend/src/domain/types.ts\":208,\"frontend/src/main.tsx\":24,\"frontend/src/preview/FilePreview.tsx\":114,\"frontend/src/preview/sanitize.ts\":77,\"frontend/src/styles.css\":259,\"frontend/src/ui/ErrorBoundary.tsx\":19,\"frontend/src/ui/LocalApp.tsx\":63,\"frontend/src/ui/ProjectList.tsx\":119,\"frontend/src/ui/ProposeForm.tsx\":219,\"frontend/src/ui/Showcase.tsx\":18,\"frontend/src/ui/SponsorPanel.tsx\":64,\"frontend/src/ui/Workspace.tsx\":146,\"frontend/src/ui/actionScope.ts\":18,\"frontend/src/ui/format.tsx\":70,\"frontend/src/ui/recovery.ts\":41,\"frontend/src/ui/snapshot.ts\":12,\"frontend/src/ui/verification.ts\":38,\"frontend/src/wallet/ConnectSheet.tsx\":98,\"frontend/src/wallet/icons.ts\":8,\"frontend/src/wallet/open-in.ts\":19,\"frontend/src/wallet/wagmi.ts\":13,\"frontend/tests/e2e/actions.ts\":56,\"frontend/tests/e2e/harness.ts\":34,\"frontend/tests/e2e/journey.spec.ts\":214,\"frontend/tests/e2e/layout.spec.ts\":65,\"frontend/tests/e2e/platform.spec.ts\":102,\"frontend/tests/e2e/revision.spec.ts\":258,\"frontend/tests/e2e/w1.spec.ts\":306,\"frontend/tests/e2e/wallet.spec.ts\":88,\"frontend/tests/fixtures/wide.png\":3,\"frontend/tests/integration/browser-chain.mjs\":701,\"frontend/tests/integration/local-command.mjs\":37,\"frontend/tests/integration/navigation-race.mjs\":32,\"frontend/tests/integration/platform-chain.mjs\":87,\"frontend/tests/integration/public-chain.mjs\":137,\"frontend/tests/run-browsers.mjs\":14,\"frontend/tests/unit/chain-provider.test.ts\":62,\"frontend/tests/unit/domain.test.ts\":120,\"frontend/tests/unit/multi-file.test.ts\":54,\"frontend/tests/unit/platform.test.tsx\":103,\"frontend/tests/unit/public-transport.test.ts\":290,\"frontend/tests/unit/reopened.test.ts\":111,\"frontend/tests/unit/security.test.tsx\":228,\"frontend/tests/unit/setup.ts\":1,\"frontend/tsconfig.json\":19,\"frontend/vite.config.ts\":10,\"frontend/vitest.config.ts\":11,\"package-lock.json\":127,\"package.json\":20,\"remappings.txt\":1,\"sdk/abi.mjs\":16,\"sdk/browser.mjs\":30,\"sdk/config.mjs\":91,\"sdk/core.mjs\":403,\"sdk/deployment.mjs\":56,\"sdk/files-browser.mjs\":173,\"sdk/files.mjs\":177,\"sdk/gates.mjs\":23,\"sdk/handoff.mjs\":81,\"sdk/index.mjs\":17,\"sdk/observation.mjs\":47,\"sdk/public-rpc.mjs\":106,\"sdk/public.mjs\":110,\"sdk/strict-json.mjs\":159,\"src/RelayBranch.sol\":309,\"src/RelayEncoder.sol\":205,\"src/RelayFactory.sol\":100,\"src/RelayTypes.sol\":78,\"src/RelayVerifier.sol\":84,\"src/interfaces/IIntake.sol\":20,\"src/libraries/Assets.sol\":141,\"src/libraries/ManifestJSON.sol\":648,\"src/libraries/Policy.sol\":51,\"src/libraries/StrictJSON.sol\":260,\"src/libraries/Text.sol\":175,\"test-sdk/browser-sdk.test.mjs\":178,\"test-sdk/deployment.test.mjs\":89,\"test-sdk/files.test.mjs\":58,\"test-sdk/mock-rpc.mjs\":14,\"test-sdk/multi-file.test.mjs\":62,\"test-sdk/network-address.test.mjs\":85,\"test-sdk/parity-vectors.mjs\":100,\"test-sdk/public-rpc.test.mjs\":153,\"test-sdk/public.test.mjs\":82,\"test-sdk/relay.test.mjs\":244,\"test-sdk/review-regressions.test.mjs\":113,\"test-sdk/transaction-metrics.test.mjs\":12,\"test/CrossLanguage.t.sol\":37,\"test/IntakeCompatibility.t.sol\":105,\"test/LaunchCompatibility.t.sol\":175,\"test/ManifestEnvelopeRegression.t.sol\":366,\"test/ManifestRetainedTokens.t.sol\":177,\"test/ManifestSegmentBudget.t.sol\":373,\"test/ManifestStringRegression.t.sol\":189,\"test/MetadataScannerDifferential.t.sol\":120,\"test/MultiFileResults.t.sol\":133,\"test/PublicResults.t.sol\":34,\"test/RelayHistory.t.sol\":233,\"test/RelayInvariant.t.sol\":151,\"test/RelayMappingRegression.t.sol\":187,\"test/RelayPayments.t.sol\":240,\"test/RelayProfiles.t.sol\":396,\"test/RelaySetup.sol\":137,\"test/StrictManifest.t.sol\":254,\"test/TestBase.sol\":100,\"test/adversarial/ContinuationSpec.t.sol\":338,\"test/adversarial/ManifestSpec.t.sol\":400,\"test/adversarial/PaymentSpec.t.sol\":376,\"test/adversarial/ProfileBoundarySpec.t.sol\":227,\"test/adversarial/README.md\":40,\"test/adversarial/SpecSupport.sol\":462,\"test/adversarial/StateMachineSpec.t.sol\":482,\"test/adversarial/check-inline-fixtures.py\":43,\"test/fixtures/FixtureData.sol\":54,\"test/fixtures/LiveResultFixture.sol\":14,\"test/fixtures/MultiFileResult.sol\":11,\"test/fixtures/PublicResults.sol\":29,\"test/fixtures/SdkGolden.sol\":13,\"test/fixtures/document-updated.md\":5,\"test/fixtures/document-updated.md.result.json\":1,\"test/fixtures/document.md\":3,\"test/fixtures/document.md.result.json\":1,\"test/fixtures/html-1.html\":1,\"test/fixtures/html-1.html.result.json\":1,\"test/fixtures/html-3.html\":1,\"test/fixtures/html-3.html.result.json\":1,\"test/fixtures/image-2.png\":3,\"test/fixtures/image-2.png.result.json\":1,\"test/fixtures/public/completed-0.json\":1,\"test/fixtures/public/completed-1.json\":1,\"test/fixtures/public/completed-2.json\":1,\"test/fixtures/public/completed-3.json\":1,\"test/fixtures/public/mutable-job-0.json\":1,\"test/fixtures/public/mutable-job-1.json\":1,\"test/fixtures/public/mutable-job-2.json\":1,\"test/fixtures/public/mutable-job-3.json\":1,\"test/fixtures/public/observed-multiple-files.json\":1,\"test/fixtures/public/observed-one-file.json\":1,\"test/fixtures/sdk-golden.json\":20,\"test/mocks/MockIntake.sol\":101,\"test/mocks/MockToken.sol\":63,\"test/release/ExactGasRegression.t.sol\":216,\"test/release/PurchaseAtomicityInvariant.t.sol\":389,\"test/release/README.md\":101,\"test/release/local-replay-evidence.json\":117,\"test/release/replay-exact-gas.mjs\":230,\"tools/build-release.mjs\":9,\"tools/check-delivery.py\":57,\"tools/check-official-bodies.mjs\":42,\"tools/check-release.mjs\":47,\"tools/compilation-context.mjs\":26,\"tools/deployment-rehearsal.mjs\":78,\"tools/export-abi.mjs\":7,\"tools/generate-fixtures.py\":27,\"tools/generate-local-config.mjs\":35,\"tools/generate-sdk-abi.mjs\":25,\"tools/generate-sdk-fixtures.mjs\":26,\"tools/import-deployment.mjs\":59,\"tools/inspect-bytecode.mjs\":43,\"tools/local-integration.mjs\":278,\"tools/measure-binding.mjs\":89,\"tools/measure-release.mjs\":21,\"tools/measure-retained-binding.mjs\":98,\"tools/observe-ethereum.mjs\":16,\"tools/sdk-local-check.mjs\":159,\"tools/sdk-local-scenario.mjs\":107,\"tools/sync-release.mjs\":31,\"tools/transaction-metrics.mjs\":11,\"tools/validate-live.mjs\":23,\"tools/verify-history.py\":55,\"vendor/ethers/LICENSE.md\":21,\"vendor/ethers/PROVENANCE.md\":1,\"vendor/ethers/ethers.mjs\":26619,\"vendor/npm/PROVENANCE.json\":56,\"vendor/npm/adraffy-ens-normalize-1.11.1.tgz\":813,\"vendor/npm/aes-js-4.0.0-beta.5.tgz\":1433,\"vendor/npm/ethers-6.17.0.tgz\":10241,\"vendor/npm/noble-curves-1.2.0.tgz\":1096,\"vendor/npm/noble-hashes-1.3.2.tgz\":443,\"vendor/npm/tslib-2.7.0.tgz\":58,\"vendor/npm/types-node-22.7.5.tgz\":1658,\"vendor/npm/undici-types-6.19.8.tgz\":78,\"vendor/npm/ws-8.21.0.tgz\":142},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b41a2b504d792e78f562f5f80ab3ee1221f5c771f3ba8c9796731261500ec226","verifiedTreeHash":"72d190720c13e32a63edf26887abafdf151623e5","verifierVersion":"0.1.0+560ab6a2"}]}