{"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":"395064a3-ae28-4477-89c2-9435e70bb7e8","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"8f9c0e1c2f0454193456ce22208b5f67a87d36328c67437544376137933a4d53","dependsOn":[],"execution":{"network":false,"optionalTools":["browser"],"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":"05045d40931b0922b4d574f11bb572dfc8c8f4e7bd2332b63bbb4a4b72634952","dependsOn":["adapt_contract_project","integrate_project","build_website"],"execution":{"network":false,"optionalTools":["browser"],"profile":"foundry","requires":[],"skillHash":"6b037a7b6601e883cf8a906c1520c0624817d42d8310b65c2f43679204608af3","skillId":"adversarial-review","tools":[]},"key":"adversarial_review","kind":"code","role":"review","skillHash":"6b037a7b6601e883cf8a906c1520c0624817d42d8310b65c2f43679204608af3","skillId":"adversarial-review","state":"accepted"},{"acceptedSubmissionHash":"a2fd774d4c012128af58797f0fb347d9a4148b37850e3ea882a1d475126ad3ec","dependsOn":["integrate_project"],"execution":{"mustProduce":["dist/index.html"],"network":true,"optionalTools":["browser"],"profile":"none","requires":["network"],"skillHash":"a60bc8b42446c13d993341179fe13c712a5addb118fc532fb2d15e71f912efc8","skillId":"build-website","tools":[]},"key":"build_website","kind":"code","role":"implement","skillHash":"a60bc8b42446c13d993341179fe13c712a5addb118fc532fb2d15e71f912efc8","skillId":"build-website","state":"accepted"},{"acceptedSubmissionHash":"59d3a80281c1957274a054b9566578fe21e18a110f77d087b7f2026893493fbb","dependsOn":["adapt_contract_project","integrate_project","build_website","write_readme_and_docs"],"execution":{"network":true,"optionalTools":["browser"],"profile":"none","requires":["network"],"skillHash":"fd33b6741366d364a55a4c0ba2bc4f5d329cec0b62f27a83289dc5b30ab03575","skillId":"design-critic","tools":[]},"key":"design_critic","kind":"code","role":"review","skillHash":"fd33b6741366d364a55a4c0ba2bc4f5d329cec0b62f27a83289dc5b30ab03575","skillId":"design-critic","state":"accepted"},{"acceptedSubmissionHash":"47604a21a2f2f084da0c88fcb45a32b12343defcef5665bed65b49053637ea56","dependsOn":["adapt_contract_project"],"execution":{"network":true,"optionalTools":["browser"],"profile":"none","requires":["network"],"skillHash":"9efd723ed31bbb0747bce27bea59184a0681c23fb933fb2cc1d560029c52df8c","skillId":"integrate-project","tools":[]},"key":"integrate_project","kind":"code","role":"integrate","skillHash":"9efd723ed31bbb0747bce27bea59184a0681c23fb933fb2cc1d560029c52df8c","skillId":"integrate-project","state":"accepted"},{"acceptedSubmissionHash":"c26f8cf30463d23282fe2ef2af079e80cdd80f0fc084c9da1cf9ec29bd306191","dependsOn":["adversarial_review"],"execution":{"network":false,"optionalTools":["browser"],"profile":"none","requires":[],"skillHash":"7e3e9a90f2342f72573636f539f0a3a3016b9f8bf53c7b77a17dc4608a09d0b2","skillId":"write-readme-and-docs","tools":[]},"key":"write_readme_and_docs","kind":"code","role":"implement","skillHash":"7e3e9a90f2342f72573636f539f0a3a3016b9f8bf53c7b77a17dc4608a09d0b2","skillId":"write-readme-and-docs","state":"accepted"}],"objective":"Prepare STEPS (Stepstoke) RELEASE-CANDIDATE-V1 for a later Ethereum mainnet evm_contracts launch. This is DEVELOPMENT ONLY: deliver reviewed source and static export, no public-chain signing/broadcast/deployment/spending, hosting, paid IMD calls, extra orders or secrets. Disposable local test transactions are allowed. Official X: https://x.com/stepstoke; do not post. All UI, current build/operation/Agent docs and instructions in English.\n\nUse the exact imported repository/commit. Preserve the existing Open Workshop design and six operations: create, propose, explicitly fund, inspect outputs/history, continue, historical fork. Core changes are now expressly permitted ONLY for launch compatibility, reproduced security/compatibility defects, public SDK/CLI/configuration and their tests. This supersedes earlier byte-identical-core/local-only restrictions for these purposes. Preserve payment, callback, checkpoint and lineage semantics. No project token, pool, new hook, owner/admin, upgrade, pause, treasury, voting, score, autosign/autospend/retry or new asset types. Keep per-round site publication and image edits off; publishing the platform later is distinct.\n\nCurrent blockers: Factory uses Clones, forbidden by evm_contracts policy; SDK/chain adapter accept only chain31337/loopback; public adapter is disabled; original-result/files and tx recovery are local-only. Fix actual implementation, not config booleans or mock output. Ethereum chain1 is the sole target. Verify current official Intake/IMD actions, callbacks, limits and read endpoints; no implicit chain switch. Sepolia cannot execute the required Intake job actions.\n\nPreserve branch-as-payer, proposal/approval/purchase separation, exact maxFee and allowance, stale-anchor checks, authenticated callback identity, raw-byte binding, independent child project, selected-vs-latest/origin distinction. Missing callback stays pending; status1 only allows explicit separately funded identical retry; status2/unknown freezes; invalid binding must not rebuy. File/Git/HTTP observations cannot settle state. No fabricated success or admin recovery.\n\nBrand artwork/slogan is a separate undelivered order, not an input. Use confirmed STEPS/Stepstoke names and X, retain current visual system; no new logo design. Preserve historical/authenticated content and technical identifiers. Do not fetch an unpinned future project head.\n\nDeliver ADAPTATION.md, synchronized contracts/ABI/SDK/CLI/config/frontend, dry-run tools, public static export, exact-source raw tests, measured sizes/gas, production-gate schema, English runbook and open risks. No launch.json: only the later platform manifest stage writes it. Preserve foundry.toml/remappings/lib/root dependency files; do not bypass policy by editing verifier configuration. Current source is near the8MiB delivery limit: measure early/final, exclude caches; retain historical evidence by byte-recoverable archive or verified immutable predecessor path/hash references, never erase current failures/tests. Keep productionDeployment:null,liveCompatibility:NOT_RUN,productionReady:false for this undeployed candidate. Local fixtures, free checks and static receipts do not prove live readiness.","parentJobId":null,"planHash":"0c871dd17e1f63f106c2438bc58e509df66f1423c926c616e3944b808d8f1db4","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"395064a3-ae28-4477-89c2-9435e70bb7e8","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2393-prepare-steps-stepstoke-release-candidat"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51328","feedbackHash":"e24fd1d9b3e398d6ac13f16899178c8cbda413c1b57964be65150368ffc5fc25","nodeKey":"adapt_contract_project","submissionHash":"8f9c0e1c2f0454193456ce22208b5f67a87d36328c67437544376137933a4d53","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51084","feedbackHash":"6293618e6c1c9fe531a81140b466e9d1603dda5b977cb8d262f6842e3bbfc2aa","nodeKey":"adversarial_review","submissionHash":"3ac83739bf1a8a13de7c49d70e4200d3a3046c071f33beddfd5c028654f214d9","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51425","feedbackHash":"4a928683fe940dae142ac6972f22c1907085398ddfe853d6716f42e03046655d","nodeKey":"adversarial_review","submissionHash":"7a949405649fd8ba9de6d286c4cc89ef3bb2c0aac5e18a658ada8c340f44d442","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52019","feedbackHash":"5f71f1fc44ce0d0a2c4b9abccf63fb51180a2578dd37aefb5ba9df1e03eccbc4","nodeKey":"adversarial_review","submissionHash":"05045d40931b0922b4d574f11bb572dfc8c8f4e7bd2332b63bbb4a4b72634952","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52713","feedbackHash":"0020819bc9ce0e6a84aeedc20c6d075a3b7f5667846a3ceecae057b6c3438e94","nodeKey":"build_website","submissionHash":"8ef76bcb6a2961f15cacd89fe475eb4fccfb0d5a3aa7476ba449b72b284aea4d","tag1":"verification:structural","tag2":"acceptance-v2","value":1},{"agentId":"52714","feedbackHash":"eba34bd1e7942bd44e5fa9888f3277cde2c73dfc4fe0d6156289141fb8438ef4","nodeKey":"build_website","submissionHash":"a2fd774d4c012128af58797f0fb347d9a4148b37850e3ea882a1d475126ad3ec","tag1":"verification:structural","tag2":"acceptance-v2","value":1},{"agentId":"51216","feedbackHash":"f28895b2ae49371d0589fffcd8b29a64c59ff7fcb01162399af91920d8f216eb","nodeKey":"build_website","submissionHash":"0381b8cc931da28e0cc24de253e11c14f01286d532bb1027915ff5df862d2c51","tag1":"verification:structural","tag2":"acceptance-v2","value":1},{"agentId":"51283","feedbackHash":"95228d4228948e7befffe732e6d12f1bf7c5b26c6ea4975dbf4f4b267021f9ea","nodeKey":"design_critic","submissionHash":"59d3a80281c1957274a054b9566578fe21e18a110f77d087b7f2026893493fbb","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51136","feedbackHash":"0057a624b02e8eba95477fb66a17d1799b6c1a99281e46d13ed46eeed2755c65","nodeKey":"design_critic","submissionHash":"8fd243fafe7b6fb034e039d56e61d111ae1207e78939b38bc0991d3070b7c043","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51358","feedbackHash":"25d8bdf513cf3f293b477747c33f121d804e0c064c84191cf35492079e9d1390","nodeKey":"integrate_project","submissionHash":"47604a21a2f2f084da0c88fcb45a32b12343defcef5665bed65b49053637ea56","tag1":"verification:structural","tag2":"acceptance-v2","value":1},{"agentId":"51152","feedbackHash":"4498460087512fb674270d6caf0fee308449b269d48374bae6af6da86e23e3b2","nodeKey":"write_readme_and_docs","submissionHash":"b96490fa1186039cbfb69b78a9f6999253e896b99a897701d337d232597c8aeb","tag1":"verification:structural","tag2":"acceptance-v2","value":1},{"agentId":"51213","feedbackHash":"c7b9f8ce67f8faa8278ea0862c745058655d450fc2248ca82ed368b9be115a38","nodeKey":"write_readme_and_docs","submissionHash":"c26f8cf30463d23282fe2ef2af079e80cdd80f0fc084c9da1cf9ec29bd306191","tag1":"verification:structural","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"45e8865ebe92351e8566294e06c3af66390629ca9c68001f6ff30e1e30de4389","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"143c1c9abea8eb84a848997b7b3f953106e64f4eed127f0f75bcbaf98ce8f85a","device":"fa2b7fcb5f53535a","findings":[],"hash":"0381b8cc931da28e0cc24de253e11c14f01286d532bb1027915ff5df862d2c51","nodeId":"0b18ed11-5213-4bae-987a-437ff16f4892","outcome":"completed","summary":"","treeHash":"cc9d904e6f6802b46e9976bc5cb3637299d6f748","usage":{"cachedInputTokens":6382952,"inputTokens":104,"model":"claude-opus-5-5","outputTokens":46178,"runtime":"claude","turns":53,"wallClockMs":1835667}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"be3be4cc237417f9","findings":[{"citation":"resolved","description":"Prior finding 1f5b6152 / 7e400eac stays settled. The originally attached proof file is no longer shipped in .imd/reads, so the repair was re-verified through the exact-source regression that encodes the same input: test/MultiFileResults.t.sol replays the captured two-file envelope (25,123-byte declared output, extra entry ignored) and binds, forks the result, places the declared descriptor first and last among 4 and 17 entries, and rejects ambiguous (name-only or path-only collision, second exact match) and malformed extra entries. _declaredFile (lines 65-74) requires every entry to be an object and exactly one entry matching both name and path; the whole raw document remains keccak-bound and capped at MAX_MANIFEST (line 25). Full Foundry suite after a clean build: 143 passed, 0 failed. SDK suite: 71 passed, 0 failed. No defect; informational record only.","line":35,"path":"src/RelayVerifier.sol","reproduction":"forge test --match-path test/MultiFileResults.t.sol -> 5 passed. forge test -> 143 passed, 0 failed (18 suites). node --test test-sdk/*.test.mjs -> 71 passed, 0 failed.","severity":"info","snippet":"        uint256 file = _declaredFile(t, files, proposal.outputName, proposal.outputPath);","title":"SETTLED (fixed, re-confirmed): multi-file result binding admits the unique declared output"},{"citation":"resolved","description":"Prior advisory 6afb2158 re-run on the current code and confirmed to behave exactly as the brief requires: after an authenticated status 1 failure, sponsor() of any other proposal reverts Busy, retry() pulls the full price again for the byte-identical body, a second status 1 returns the branch to Refused, and a status 2 freezes the branch so retry() also reverts Busy. The author's dispute is accepted: the brief forbids any alternate-body, timeout, refund or admin exit. docs/REVIEW.md line 19 warns operators to stop funding a known deterministic refusal. Documented launch risk, no code change requested.","line":173,"path":"src/RelayBranch.sol","reproduction":"Scratch test (run, then removed because the release checker refuses scratch Solidity as a compilation input): propose(id=1), propose(id=2), sponsor(1, 10e18, []) -> req; as WRITER MockIntake.fail(req, 1, 'body_refused') -> phase Refused; sponsor(2, 10e18, []) reverts Busy; retry(10e18, []) returns a new requestId and sponsor balance drops by exactly 0.5e18; fail(req2, 1, ...) -> Refused again; retry -> req3; fail(req3, 2, 'failed') -> phase Frozen; retry reverts Busy. Observed: all assertions pass (expected per brief).","severity":"info","snippet":"        if (phase != T.Phase.Refused) revert Busy();","title":"OPEN RISK (accepted, not a defect): Refused phase exits only via identical paid retry; deterministic refusal charges repeatedly"},{"citation":"resolved","description":"Prior advisory 70bb78b4 re-run on the current code. Values match the live intake-client table (Intake 0xa43e...DE82, IMD 0xD34a...63B7, job.open@job-1 / job.continue@job-1). When priceOf returns 0, _purchase reverts FeeExceeded at RelayBranch.sol line 187 before any token transfer, so no funds are lost, but no entry point can change action, intake or asset; existing branches become permanently unpurchasable and only a separately reviewed redeploy helps. The author's dispute is accepted: the brief forbids owner/admin or configuration authority, so the intake-client reference's owner-settable guidance cannot be followed. docs/REVIEW.md line 23 records the catalog-migration risk. Documented launch risk, no code change requested.","line":10,"path":"src/libraries/Policy.sol","reproduction":"Scratch test (run, then removed): propose(id=1); MockIntake.setPrice(Policy.OPEN, 0); sponsor(1, 10e18, []) reverts FeeExceeded; sponsor IMD balance unchanged; phase stays Ready. Observed: passes (expected per brief).","severity":"info","snippet":"    bytes32 internal constant OPEN = bytes32(\"job.open@job-1\");","title":"OPEN RISK (accepted, not a defect): Intake, IMD and action ids are compile-time constants; a catalog version change strands every branch"}],"hash":"05045d40931b0922b4d574f11bb572dfc8c8f4e7bd2332b63bbb4a4b72634952","nodeId":"36491792-2c27-432b-9efb-86703f44a00e","outcome":"completed","summary":"The findings file is valid, the working tree is clean apart from the untracked report, and all three quoted snippets match their lines.\n\n**Outcome: no new defects. All three prior findings are settled.**\n\n- **Multi-file result binding (previously high, fixed):** Re-confirmed. The original proof file is no longer shipped, so I relied on the exact-source regression in `test/MultiFileResults.t.sol`, which replays the same captured two-file envelope and the ambiguity cases. It passes, as does the full suite after a clean build (143 Foundry tests, 71 SDK tests, zero failures).\n- **Refused phase exits only via identical paid retry (open risk):** Re-ran the reproduction on current code. Another proposal reverts Busy, retry charges the full price again, status 2 freezes with no exit. This is the brief's required behavior and REVIEW.md carries the operator warning. Recorded as an accepted launch risk, no code change.\n- **Compile-time Intake/IMD/action constants (open risk):** Re-ran. An unpriced action reverts FeeExceeded before any token moves, and no entry point can retarget a branch. The brief forbids configuration authority, so the author's dispute stands. Recorded as an accepted launch risk.\n\n**Independent cross-checks performed**\n\n- Read-only release checker after a clean full build: ABI and frozen source and runtime hashes match `config/release.json`. The Encoder creation hash matches ADAPTATION.md.\n- Tracked delivery bytes equal the recorded delivery-size evidence exactly, under the 8 MiB limit.\n- No handoff file or launch.json exists. The production gate still reads productionDeployment null, liveCompatibility NOT_RUN, productionReady false.\n- Static-analysis leads (reentrancy in purchase, divide-before-multiply, uninitialized locals) do not reproduce: the reentrancy guard, Purchasing phase and callback identity checks block the first, and the rest are intended formulas or zero-initialised defaults.\n\n**Coverage:** all eight state-changing entry points are marked holds, plus two invariant rows. The scratch test I used was removed afterward because the release checker refuses scratch Solidity as a compilation input, and the tree is unchanged.\n\n**Still open for launch, unchanged from prior rounds:** live compatibility is NOT_RUN. Local fixtures and free checks prove nothing about real chain-1 behavior, so the candidate remains undeployable until the live gates in REVIEW.md and LIMITS.md are closed.","treeHash":null,"usage":{"cachedInputTokens":652685,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":12926,"runtime":"claude","turns":24,"wallClockMs":1277210}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7c0191a32541eb74","findings":[{"citation":"resolved","description":"Re-ran the previously attached proof (.imd/reads/proofs/Proof_1f5b61528a4c.t.sol, copied unchanged to test/scratch/) against the revised source: it failed with Policy.Invalid() on the previous round and now PASSES (test_declaredOutputBindsWhenPlaneListsAnExtraFile, gas 16355002). RelayVerifier._declaredFile iterates every entry of `files`, requires each to be an object, admits exactly one entry whose name AND path both equal the proposal's outputName/outputPath, and reverts Invalid on a name-only or path-only collision or a second exact match. The whole raw document is still keccak-bound (line 25) and size-capped; extra entries are ignored, not stripped. sdk/core.mjs verifyManifest applies the same rule (declared output required when files.length != 1, ambiguity rejected) and frontend/src/domain/chainAdapter.ts now reads the bound attempt's stored proposal before parsing history. test/MultiFileResults.t.sol (5 tests: exact captured two-file bytes bind and fork, declared output first/last among 4 and 17 files, duplicate/ambiguous rejection, malformed extra metadata rejection, tampering of an ignored entry cannot bind or rebuy) passes; the full suite passes 143/143 with 0 failures. This entry is informational only: it records the fix verification, not a defect. No new defect was found; the invalid-binding no-rebuy semantics, MAX_MANIFEST cap and lack of any administrative or separately funded exit from ResultRecorded are unchanged and are the brief's stated semantics.","line":35,"path":"src/RelayVerifier.sol","reproduction":"forge test --match-path test/scratch/Proof_1f5b61528a4c.t.sol (copy of the attached proof): expected PASS after the repair; actual PASS. Full suite: forge test → 143 passed, 0 failed.","severity":"info","snippet":"        uint256 file = _declaredFile(t, files, proposal.outputName, proposal.outputPath);","title":"SETTLED (fixed): multi-file result binding — prior high finding 1f5b6152 confirmed repaired"},{"citation":"resolved","description":"Prior advisory 44034ec8 restated for the record. The author's dispute is accepted: the brief requires that status 1 allow only an explicit, separately funded, byte-identical retry and forbids new recovery/admin semantics. The code implements exactly that. The consequence remains: a body the plane refuses deterministically (content screen, withdrawn catalog profile) can never be replaced by another proposal on that branch, and each retry spends 0.5 IMD for the same refusal. docs/REVIEW.md now warns operators to stop funding after a repeated refusal. Documented launch risk; no code change requested.","line":173,"path":"src/RelayBranch.sol","reproduction":"propose(id=1); sponsor(1, maxFee, witness); as Policy.INTAKE call onIntakeFailure(requestId, 1, 'body_refused', 0, 0, ''). Then sponsor(2, ...) reverts Busy; retry(maxFee, witness) pulls the price again and the same refusal returns the branch to Refused. Expected per brief: exactly this behaviour.","severity":"info","snippet":"        if (phase != T.Phase.Refused) revert Busy();","title":"OPEN RISK (not a defect): Refused phase exits only via identical paid retry; deterministic refusal charges repeatedly"},{"citation":"resolved","description":"Prior advisory abd4e698 restated for the record. The author's dispute is accepted: the brief forbids any owner/admin or configuration authority, so the intake-client reference's 'owner-settable' guidance cannot be followed without violating the brief. Values match the live table (Intake 0xa43e…DE82, IMD 0xD34a…63B7, job.open@job-1, job.continue@job-1 on chain 1). If job-1 stops being priced, priceOf returns 0 and sponsor/retry revert FeeExceeded before any transfer, so no funds are lost but every existing branch and its lineage becomes permanently unpurchasable; only a separately reviewed redeploy with new branches helps. docs/REVIEW.md records this. Documented launch risk; no code change requested.","line":10,"path":"src/libraries/Policy.sol","reproduction":"With Intake.priceOf(bytes32('job.open@job-1'), IMD) == 0 (mock or future mainnet state): sponsor(1, 10e18, witness) reverts FeeExceeded at RelayBranch.sol:187; no entry point can change action, intake or asset.","severity":"info","snippet":"    bytes32 internal constant OPEN = bytes32(\"job.open@job-1\");","title":"OPEN RISK (not a defect): Intake, IMD and action ids are compile-time constants; a catalog version change strands every branch"}],"hash":"3ac83739bf1a8a13de7c49d70e4200d3a3046c071f33beddfd5c028654f214d9","nodeId":"36491792-2c27-432b-9efb-86703f44a00e","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written at the repository root. The working tree is otherwise untouched.\n\n**Outcome: the prior high finding is fixed, and no new defect was found.**\n\n- **Multi-file result binding (previously high) is confirmed repaired.** I copied the attached proof unchanged under test/scratch and ran it on the revised code. It failed with Invalid last round and now passes. RelayVerifier now walks every entry of the files array, admits exactly one entry whose name and path both match the proposal, and rejects name-only or path-only collisions and duplicates. The whole raw document is still hash-bound and size-capped. The SDK applies the same rule and refuses to guess on a multi-file result without the proposal, and the chain adapter now passes the stored proposal. The new MultiFileResults suite covers the captured two-file result, 4 and 17 file orderings, ambiguity and ignored-entry tampering.\n- **Full suite cross-check.** All 143 project tests pass with 0 failures.\n- **Two prior advisories stay as documented open risks, not defects.** The author's disputes hold. The Refused phase allowing only an identical paid retry, and the compiled-in Intake, IMD and action ids, are both the brief's stated semantics with no admin authority permitted. Both are recorded in REVIEW.md and kept in the findings file as info entries with reproductions.\n- **Static-analysis leads.** The reentrancy warning on the purchase path is a false positive. The guard flag is set during the Intake call and both callbacks revert while it is set, which the existing PaymentSpec reentrancy test exercises. The uninitialized-local warnings are zero-default loop variables and not defects.\n- **Coverage.** All 8 state-changing entry points are recorded as holds, plus the production-gate invariant. The gate file still reads productionDeployment null, liveCompatibility NOT_RUN and productionReady false, with no launch.json in the tree.\n\nLocal replay and API preflight are what this evidence proves. No real-chain proof exists, and the findings file makes no public-readiness claim.","treeHash":null,"usage":{"cachedInputTokens":322992,"inputTokens":162,"model":"claude-fable-5-1","outputTokens":8706,"runtime":"claude","turns":16,"wallClockMs":506764}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0bd6e7ef3fc9345a","findings":[],"hash":"450d58308a87ab6f14e8cad406d918398733eb953d5362d4f05b813b6117c322","nodeId":"d8374a46-2d08-4569-b939-7431d17d6b08","outcome":"failed","summary":"could not restore accepted work: accepted work conflicts with a dependency that changed the same files after it was accepted: Command failed: git -c user.name=IdentityMD Worker -c user.email=worker@identitymd.invalid merge --no-edit -m imd: reapply this node's accepted work 76bff54531114f4060f960f4ce6d3268b72c3a76\n","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"codex","turns":0,"wallClockMs":3513}},{"artifacts":[],"attempt":1,"bundleHash":"eff82d77f48dc69d57e231af0786d05b7ed57fea7324c9f25e15564d5658b53f","device":"0e53ef0bd01824cb","findings":[],"hash":"47604a21a2f2f084da0c88fcb45a32b12343defcef5665bed65b49053637ea56","nodeId":"52d0d049-af45-4316-9d86-66159c4f5163","outcome":"completed","summary":"Integrated the RC-V1 SDK, CLI, deployment handoff verification, bounded observers, recovery flows and static export while preserving all six operations.\n\nChecks passed: 138 Solidity tests, 62 SDK tests, 44 frontend tests, 72 static-browser cases and 16 local-chain browser cases. Delivery: 8,303,832 bytes, below 8 MiB.\n\nEvidence and limitations: [integration report](docs/validation/integration-v1/README.md).\n\nNo public deployment or paid jobs occurred. Missing official handoff, artifact CORS failures and live validation remain open; production readiness stays false.","treeHash":"07845e947020d4c16051465fe920fe53f735db07","usage":{"cachedInputTokens":14581632,"inputTokens":552630,"model":"gpt-6.1-sol","outputTokens":76568,"runtime":"codex","turns":12,"wallClockMs":2199190}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b5ff2623f878600d","findings":[{"citation":"resolved","description":"Now: the unchanged keyboard case presses Tab after document load without waiting for React to render the skip link. The current fixture matrix still fails intermittently even though the rendered skip link works.\nChange to: add await expect(page.getByRole(\"button\", { name: \"Connect wallet\", exact: true })).toBeVisible() immediately after goto, before the first Tab; retain every existing skip-link, focus-ring, trap and focus-return assertion.\nWhy: the brief requires the existing browser matrix to pass with its safety assertions preserved; document load alone does not establish application readiness.","line":287,"path":"frontend/tests/e2e/w1.spec.ts","reproduction":"390×844, Chromium mobile, unchanged committed export. In a disposable exact-source copy run playwright test --project=chromium-desktop --project=chromium-mobile --project=chromium-narrow with the configured two workers. Result: 107 passed, 1 failed; chromium-mobile w1.spec.ts:289 timed out after 15000 ms with Skip to main content inactive. The author’s isolated reproduction also ran: nine unchanged desktop repeats and nine mobile repeats passed, demonstrating intermittency rather than a product focus failure. Independently repeated the exact goto → Tab sequence in 40 fresh Pixel 7 contexts at 390×844, with a keydown listener recording DOM state: 3/40 failed. In those three Tab events at 212.2/264.7/303.9 ms, .skip was absent, button count was 0 and the body contained only an empty #root; after the header rendered, focus remained on body. Expected: the test waits for the rendered application before exercising first-Tab focus. In a separate disposable test copy, adding only the proposed readiness assertion made all nine mobile repeats pass with the original remaining assertions. Repeating the instrumented sequence with that wait yielded 0/40 failures, versus 3/40 without it. The reviewed repository remains unchanged.","severity":"medium","snippet":"  await page.goto(\"./\");\n  await page.keyboard.press(\"Tab\");\n  await expect(page.getByRole(\"link\", { name: \"Skip to main content\" })).toBeFocused();","title":"bug: the first-Tab regression still races the initial React render"}],"hash":"59d3a80281c1957274a054b9566578fe21e18a110f77d087b7f2026893493fbb","nodeId":"9604f1c9-28c5-435a-a93e-2eef0023a336","outcome":"completed","summary":"| Area | Count |\n|---|---:|\n| Requirement groups | 55 met · 1 missing · 0 faked · 2 after review · 1 needs requester |\n| Previous findings | 4 fixed · 1 persists |\n| Broken product features reproduced | 0 |\n| Product/main action on first screen at 390 | Yes |\n| taste@1 | 16/16 passed |\n| Copy findings | 0 |\n| Share card | Present |\n\nThe RPC read boundary, clean-build fingerprint, original/replacement hash projection, and replacement confirmation handling are fixed.\n\n**Medium bug persists:** the first-Tab test can run before React renders. The Chromium matrix reproduced its 15-second focus timeout; instrumented mobile runs caught Tab reaching an empty `#root` in 3/40 sessions. Adding only the proposed readiness wait in a disposable copy produced 0/40 failures.\n\n[`.imd-findings.json`](/home/worker/.identitymd-2/work/395064a3-ae28-4477-89c2-9435e70bb7e8/9604f1c9-28c5-435a-a93e-2eef0023a336/.imd-findings.json) contains that finding and coverage for all eight contract entry points. Implementation and export files are unchanged.\n\nValidation passed: clean compilation/release verification, 143 contract tests, 71 SDK tests, 100 frontend unit tests, typecheck/build, 64 actual-contract browser journeys, and 11 public-adapter checks. Fixture runs remain intermittent: Chromium passed 107/108; WebKit passed 71/72 in the isolated matrix, with its timed-out journey passing separately in 27.9 seconds.\n\nThe visual idea remains an ordered project sequence leading into the selected output and its next action.\n\nThe requirement ledger below concerns candidate delivery; production gates remain open.\n\n| # | Requirement | Verdict and evidence |\n|---:|---|---|\n| 1 | “Use the exact imported repository/commit” | **Met** — commit `b7747bf`; unchanged working source and frozen compiler inputs. |\n| 2 | “DEVELOPMENT ONLY… reviewed source and static export” | **Met** — tracked source and root `dist/`. |\n| 3 | No public signing, broadcasting, deployment, spending, hosting, paid calls, extra orders or secrets | **Met** — review execution used disposable local transactions; candidate records remain undeployed. |\n| 4 | Current UI, build, operation and Agent instructions in English | **Met** — frontend and current `README.md`/`docs/` instructions. |\n| 5 | Confirmed official X; do not post | **Met** — `frontend/src/App.tsx` links to `https://x.com/stepstoke`; no posting performed. |\n| 6 | Preserve Open Workshop and all six operations | **Met** — workspace/components and 64 actual-contract journeys. |\n| 7 | Limit core changes to permitted compatibility/security/public tooling purposes | **Met** — `ADAPTATION.md` and reviewed changes. |\n| 8 | Preserve payment, callback, checkpoint and lineage semantics | **Met** — contracts and passing payment/history/invariant tests. |\n| 9 | No token, pool, hook, admin, upgrade, pause, treasury, voting, score, automatic spending/retry or new asset types | **Met** — application source and compiled ABIs. |\n| 10 | Keep per-round publication and image edits off | **Met** — `RelayEncoder.sol` and fixed profiles. |\n| 11 | Replace forbidden Clones in actual implementation | **Met** — `RelayFactory.sol` directly constructs complete Branch instances; opcode checks pass. |\n| 12 | Public SDK/adapter, original results/files and transaction recovery | **Met** — `sdk/` and `frontend/src/domain/chainAdapter.ts`; public rehearsal passes. |\n| 13 | Ethereum chain 1 only; no implicit switch; no Sepolia substitution | **Met** — public configuration and deployment verification. |\n| 14 | Verify official Intake/IMD actions, callbacks, limits and read endpoints | **Met for candidate evidence** — `docs/LIVE-VALIDATION.md`, protocol references and recorded free checks; live execution remains unproved. |\n| 15 | Branch-as-payer; proposal/approval/purchase separation | **Met** — `RelayBranch.sol`, `FundingSheet.tsx`, payment journeys. |\n| 16 | Exact maxFee/allowance and stale-anchor checks | **Met** — purchase preparation and contract regressions. |\n| 17 | Auth","treeHash":null,"usage":{"cachedInputTokens":13721856,"inputTokens":230614,"model":"gpt-6.1-sol","outputTokens":46918,"runtime":"codex","turns":15,"wallClockMs":1318928}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bcb8a3f211778fd6","findings":[{"citation":"resolved","description":"RelayVerifier.verify accepts only a result document whose `files` array holds exactly one object. The repository's own captured public IMD result test/fixtures/public/observed-multiple-files.json (2 files: artifacts/r5-report.md and artifacts/r5-data.json) and docs/REVIEW.md (real HTTP results with 2/4/17 files) show the live plane lists every produced artifact, not only the declared output. Once RelayBranch.onIntakeResult records such a result, phase is ResultRecorded; bind reverts Policy.Invalid for the exact raw bytes, and no other entry point (sponsor, retry) is reachable from ResultRecorded. The branch is bricked forever, the 0.5 IMD is spent, and every historical fork of it is impossible beyond the last accepted revision. The same permanent stop happens for a result whose raw bytes exceed Policy.MAX_MANIFEST (32768) or whose `files[0].name/path` differ from the proposal. The one-output rule is a documented deliberate choice, so the repair is a scope decision: either accept the declared output among extra entries (ignoring, not stripping, the rest), or give ResultRecorded a separately funded exit; the current code offers neither. Until one is chosen and re-tested against real multi-file results this is a release blocker. Proof note: the repository has no forge-std in lib/ and remappings.txt only maps OpenZeppelin, so the proof declares a minimal Vm interface inline instead of importing forge-std/Test.sol; run: forge test --match-path test/scratch/MultiFileResultProof.t.sol (fails now with Invalid()).","line":37,"path":"src/RelayVerifier.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\ninterface Vm { function etch(address, bytes calldata) external; function prank(address) external; }\nabstract contract Test { Vm internal constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n    function assertEq(uint256 a, uint256 b) internal pure { require(a == b, \"assertEq\"); } }\nimport {RelayFactory} from \"src/RelayFactory.sol\";\nimport {RelayBranch} from \"src/RelayBranch.sol\";\nimport {RelayEncoder} from \"src/RelayEncoder.sol\";\nimport {RelayVerifier} from \"src/RelayVerifier.sol\";\nimport {RelayTypes as T} from \"src/RelayTypes.sol\";\nimport {Policy} from \"src/libraries/Policy.sol\";\nimport {IIntake} from \"src/interfaces/IIntake.sol\";\n\ncontract ProofToken {\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n    function mint(address to, uint256 v) external { balanceOf[to] += v; }\n    function approve(address s, uint256 v) external returns (bool) { allowance[msg.sender][s] = v; return true; }\n    function transfer(address to, uint256 v) external returns (bool) {\n        balanceOf[msg.sender] -= v; balanceOf[to] += v; return true;\n    }\n    function transferFrom(address f, address to, uint256 v) external returns (bool) {\n        allowance[f][msg.sender] -= v; balanceOf[f] -= v; balanceOf[to] += v; return true;\n    }\n}\n\ncontract ProofIntake is IIntake {\n    uint256 public count;\n    function priceOf(bytes32, address) external pure returns (uint256) { return 0.5 ether; }\n    function requestWithFailure(bytes32, bytes calldata body, Callback calldata, bytes4, address asset, uint256 amount)\n        external payable returns (bytes32 id)\n    {\n        require(body.length != 0 && amount == 0.5 ether);\n        ProofToken(asset).transferFrom(msg.sender, address(0xC0FE), amount);\n        id = keccak256(abi.encode(address(this), ++count, msg.sender));\n    }\n}\n\n/// A real plane result that lists the declared output plus one extra produced file\n/// (shape of test/fixtures/public/observed-multiple-files.json) must not brick the branch.\ncontract MultiFileResultProof is Test {\n    address constant SPONSOR = address(0xB0B);\n\n    function test_declaredOutputBindsWhenPlaneListsAnExtraFile() public {\n        vm.etch(Policy.IMD, address(new ProofToken()).code);\n        vm.etch(Policy.INTAKE, address(new ProofIntake()).code);\n        ProofToken token = ProofToken(Policy.IMD);\n        RelayFactory factory = new RelayFactory(new RelayEncoder(), new RelayVerifier());\n        RelayBranch branch = factory.createProject(\"Maintain a public relay project.\");\n        token.mint(SPONSOR, 10 ether);\n        vm.prank(SPONSOR);\n        token.approve(address(branch), 10 ether);\n\n        T.Proposal memory p;\n        p.anchor = branch.anchor();\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        T.Asset[] memory none = new T.Asset[](0);\n        uint256 id = branch.propose(p, none);\n        vm.prank(SPONSOR);\n        bytes32 request = branch.sponsor(id, 10 ether, none);\n\n        bytes memory raw = bytes(\n            '{\"jobId\":\"26dd9a07-601b-53bb-b203-cb1ed36889fa\",\"projectId\":\"8e9b7a0c-734a-53f5-b219-5c7746b04229\",\"state\":\"completed\",\"launch\":null,\"delivery\":{\"repoUrl\":\"https://example.invalid/x\",\"commit\":\"abc\"},\"source\":[],\"files\":[{\"name\":\"main\",\"path\":\"artifacts/main.md\",\"hash\":\"f32b9679cf9534a4ba9966948ce4a7900b9e0c84af7bdfeeca432bd06bbace0c\",\"mediaType\":\"text/markdown\",\"bytes\":183,\"submissionHash\":\"7487f2ea3e1407724d71e7109d677762b84d239fba2170216c66366a1b279f5a\"},{\"name\":\"data\",\"path\":\"artifacts/data.json\",\"hash\":\"a32b9679cf9534a4ba9966948ce4a7900b9e0c84af7bdfeeca432bd06bbace0c\",\"mediaType\":\"application/json\",\"bytes\":40,\"submissionHash\":\"7487f2ea3e1407724d71e7109d677762b84d239fba2170216c66366a1b279f5a\"}]}'\n        );\n        vm.prank(Policy.INTAKE);\n        branch.onIntakeResult(request, keccak256(raw), \"ipfs://fixture/result.json\");\n        assertEq(uint256(branch.phase()), uint256(T.Phase.ResultRecorded));\n\n        // Expected: the exact raw bytes bind the declared output (extra file ignored, never stripped).\n        // Actual on current code: Policy.Invalid at RelayVerifier.sol:37 and the branch is stuck forever.\n        branch.bind(raw, none);\n        assertEq(uint256(branch.phase()), uint256(T.Phase.Ready));\n        assertEq(branch.revision(), 1);\n    }\n}","reproduction":"1) factory.createProject(goal); propose(MarkdownCreate, target=0x..01, outputName=main, outputPath=artifacts/main.md); sponsor(1, 10e18, []). 2) As Policy.INTAKE call onIntakeResult(requestId, keccak256(raw), uri) where raw is a completed manifest with files=[{name:main,path:artifacts/main.md,...},{name:data,path:artifacts/data.json,...}] (shape of test/fixtures/public/observed-multiple-files.json). Expected: bind(raw, []) accepts the declared output or some funded path exists to continue. Actual: bind reverts Policy.Invalid at RelayVerifier.sol:37, phase stays ResultRecorded, sponsor/retry revert Busy forever.","severity":"high","snippet":"        if (file >= t[files].end || t[file].kind != J.Type.Object || t[file].end != t[files].end) {","title":"Any real result whose files array has more than one entry can never bind, permanently freezing the branch after the fee is spent"},{"citation":"resolved","description":"Status 1 moves the branch to Refused and only retry() with the byte-identical body is allowed. If the plane refuses deterministically (body_refused from the content screen on proposal text, or a profile the catalog no longer sells), every retry spends another 0.5 IMD and is refused again; no different proposal can ever be sponsored on that branch. This matches the brief's stated semantics (status 1 permits only an identical separately funded retry) and is reported as a scope observation and open risk, not a code defect.","line":173,"path":"src/RelayBranch.sol","reproduction":"propose(id=1) with text the plane's screen refuses; sponsor(1,...); intake calls onIntakeFailure(requestId, 1, 'body_refused'). Expected per brief: Refused. Observed: sponsor(2,...) reverts Busy forever; retry(...) re-spends the price for the same refusal.","severity":"info","snippet":"        if (phase != T.Phase.Refused) revert Busy();","title":"Refused phase has no exit other than an identical paid retry, so a deterministically refused body locks the branch"},{"citation":"resolved","description":"The intake-client reference states the intake, asset and action ids must be constructor input or owner-settable so a new version (job-2) or moved price never needs a redeploy. The brief forbids any owner/admin, so the authors compiled them in. Consequence: when job.open@job-1 stops being priced, priceOf returns 0, sponsor reverts FeeExceeded, and every existing branch (and its lineage) becomes permanently unpurchasable; only a full redeploy of Encoder/Verifier/Factory with new branches helps. Values match the live table (Intake 0xa43e…de82, IMD 0xd34a…63b7, both action ids). Documented as an open risk / scope question, not a defect.","line":8,"path":"src/libraries/Policy.sol","reproduction":"On a fork where Intake.priceOf(job.open@job-1, IMD) == 0: sponsor(1, 10e18, []) reverts FeeExceeded; no entry point can change the action, intake or asset.","severity":"info","snippet":"    address internal constant INTAKE = 0xa43e6F75ee006411F79Ac1C84120606C2330DE82;","title":"Intake, IMD and action ids are compiled-in constants; a job-2 catalog version or Intake move strands every branch"}],"hash":"7a949405649fd8ba9de6d286c4cc89ef3bb2c0aac5e18a658ada8c340f44d442","nodeId":"36491792-2c27-432b-9efb-86703f44a00e","outcome":"completed","summary":"Review complete. The findings and coverage record are in `.imd-findings.json` at the repository root. No source, test, or configuration files were changed; the only scratch file is `test/scratch/MultiFileResultProof.t.sol`, which is disposable.\n\n**What I checked**\n\n- Build and the full suite pass (138 tests, 17 suites). Runtime sizes are under EIP-170 and no proxy, Clones, DELEGATECALL or SELFDESTRUCT remains in the launch contracts.\n- Traced all eight state-changing entry points on RelayBranch and RelayFactory: payer binding, exact pull and forward with zero residual allowance, one active request per branch, stale-anchor and witness checks, authenticated callback identity, raw-byte binding, independent child project on fork, and historical fork excluding later files.\n- Checked Policy constants against the live Intake table, the SDK and CLI chain gating, the handoff and release address sources, and the production gate values, which remain undeployed and not ready as required.\n- Reproduced the static-analysis leads. The reentrancy and uninitialized-local reports do not yield defects.\n\n**Findings, ranked**\n\n1. **High, release blocker.** The verifier accepts a result only when its `files` array has exactly one entry. The repository's own captured public result with two files, and its review notes citing real results with 2, 4 and 17 files, show the live plane lists every produced artifact. After the authenticated callback records such a result the branch sits in ResultRecorded forever, with sponsor and retry both reverting and the fee spent. The attached proof test fails on current code with `Invalid()`. The one-output rule is a deliberate design choice, so the repair is a scope decision between accepting the declared output among extra entries or giving ResultRecorded a separately funded exit.\n2. **Info, scope observation.** The Refused phase has no exit except an identical paid retry, so a deterministically refused body locks the branch. This matches the brief's stated semantics.\n3. **Info, scope observation.** Intake, IMD and action ids are compiled-in constants with no owner. A catalog version change or Intake move strands every existing branch and requires a full redeploy.\n\n**Proof caveat**\n\nThe repository contains no forge-std in `lib/`, so the proof declares a minimal cheatcode interface inline rather than importing `forge-std/Test.sol`. It runs with:\n\n```\nforge test --match-path test/scratch/MultiFileResultProof.t.sol\n```\n\n**Not performed**\n\nNo live chain, API preflight or paid job was run. The compatibility of real result documents with the verifier was established from the repository's captured fixtures and review notes, not from a fresh fetch.","treeHash":null,"usage":{"cachedInputTokens":1057541,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":22898,"runtime":"claude","turns":27,"wallClockMs":621510}},{"artifacts":[],"attempt":1,"bundleHash":"a8b82626278c6f536f8526db9a24bcf12ff94dbd9d45e1a115bca6f3252e43c3","device":"027fa8eee8653e6f","findings":[],"hash":"8ef76bcb6a2961f15cacd89fe475eb4fccfb0d5a3aa7476ba449b72b284aea4d","nodeId":"0b18ed11-5213-4bae-987a-437ff16f4892","outcome":"completed","summary":"Fixed multi-file binding in the verifier, SDK and website while preserving full-byte authentication and one accepted output.\n\nPassed: 146 contract tests, 71 SDK tests, 83 frontend units, 180 browser cases and 64 local contract journeys. Build and typecheck passed.\n\nAll findings are answered in `.imd-responses.json`. Payload: **8,339,389 bytes**, within 8 MiB. Candidate remains undeployed and not production ready.","treeHash":"f11f2395e4356178197bab17af145afdb0c07821","usage":{"cachedInputTokens":19466368,"inputTokens":210744,"model":"gpt-6.1-sol","outputTokens":105488,"runtime":"codex","turns":12,"wallClockMs":2866960}},{"artifacts":[],"attempt":1,"bundleHash":"f0e4320ccfb54d241653027090aa0f9c00bde0f5e34b46bdc25662c2468cd1be","device":"fc6af3255ecf3684","findings":[],"hash":"8f9c0e1c2f0454193456ce22208b5f67a87d36328c67437544376137933a4d53","nodeId":"89142d05-27de-46fe-9f69-96374384acd1","outcome":"completed","summary":"Delivered [ADAPTATION.md](ADAPTATION.md), synchronized contracts/SDK/CLI/frontend, [static export](dist/index.html), and [validation evidence](docs/validation/rc-v1/README.md).\n\nPassed: `forge build`, 138 Foundry tests, 52 SDK tests, 44 UI tests and 72 Chromium tests. Payload: **8,251,949 bytes**, below 8 MiB. Protected files remain unchanged.\n\n**Undeployed; productionReady:false.** Security review, real-result compatibility and service policy/gas gates remain open. WebKit lacked system libraries; standalone Python schema validation lacked `jsonschema`.","treeHash":"9f097e31e36f7fe5eff71fc8d10dae7bcc58aa32","usage":{"cachedInputTokens":25658624,"inputTokens":740384,"model":"gpt-6-astra","outputTokens":146971,"runtime":"codex","turns":17,"wallClockMs":4997885}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ca0f4e05e864c332","findings":[{"citation":"resolved","description":"Now: verify() checks the RPC chain once, but subsequent public reads never recheck eth_chainId or revoke the verified flag. An RPC that changes to another chain can return a successful project list while capabilities.read stays true and the UI still labels it Ethereum. Writes separately reverify; this finding concerns the required public read boundary.\nChange to: revalidate the configured chain/deployment at public read boundaries, invalidate the verified state and associated caches on mismatch, and display the deployment-unavailable state until verification succeeds again.\nWhy: the brief explicitly requires an invalid RPC chain/deployment to disable that deployment and permits wallet-independent reads only when verified.","line":110,"path":"frontend/src/domain/chainAdapter.ts","reproduction":"Width 390 or 1440; mocked public transport. Construct the chain-1 ChainAdapter, complete verify(), then change the transport eth_chainId response from 0x1 to 0x7a69 while returning the valid ABI encoding of branchCount() = 0 to eth_call. Call listBranches(). Expected: wrong-chain rejection, read capability disabled and deployment unavailable. Actual: resolves [] and capabilities.read remains true; the recorded method list is only [\"eth_call\"], with no eth_chainId request. The same issue applies to existing-state reads because checkBranch checks registration/code/getters without checking the chain. Reproduced in a disposable Vitest regression against the unmodified adapter. Confirmed again in Chromium at 1280px with the existing public-chain integration: deployed and verified the actual candidate contracts on a disposable chain 1 through the real handoff/importer and intercepted HTTPS RPC, opened its accepted Round 1 output, changed that node to chain 31337 using anvil_setChainId, and clicked Refresh chain state. The accepted output remained displayed, no Ethereum deployment unavailable heading appeared, and all refresh RPC calls omitted eth_chainId. No public transactions were sent.","severity":"high","snippet":"  async listBranches() {\n    const count = Number(await this.factoryRead(\"branchCount\"));","title":"bug: a verified public adapter keeps reading after its RPC changes chain"},{"citation":"resolved","description":"Now: a Purchased event from a successful same-call replacement has the original account/nonce, so this condition discards the original journal row. The UI receives only the replacement hash, marks Purchase Confirmed, and labels that replacement hash Original transaction; it never identifies the replacement relationship in the affected attempt. The original survives only in the separate raw journal disclosure.\nChange to: correlate the original journal hash with the mined replacement, retain both hashes and their explicit replacement state in the returned attempt, and label each accurately in transaction details. Preserve one authenticated attempt and the existing no-repurchase checks.\nWhy: the brief requires pending/confirmed/replaced/unknown states to be shown accurately with original hashes.","line":203,"path":"frontend/src/domain/chainAdapter.ts","reproduction":"Width 390 or 1440; after an explicitly approved purchase is submitted with nonce 7 and original hash 0x00000000000000000000000000000000000000000000000000000000000000a1, replace it with the same sponsor/to/calldata/nonce transaction mined as 0x00000000000000000000000000000000000000000000000000000000000000b2. Keep the original SUBMITTED journal row and return the authenticated Purchased attempt for the replacement. Refresh/getSponsorships. Expected: one attempt identifying original a1, replacement b2 and replacement outcome. Actual: one Confirmed attempt whose txHash is b2; a1 is absent from the entire returned attempt list. Workspace.tsx:117 calls that b2 hash Original transaction. Reproduced with the unchanged getSponsorships method and mocked on-chain attempt/log/transaction responses; a regression asserting original a1 remains in the UI projection fails.","severity":"medium","snippet":"      if (rows.some(r => r.txHash === j.hash || (eq(r.sponsor, j.account) && r.nonce === j.nonce))) continue;","title":"bug: successful replacements lose their original transaction identity in attempt status"},{"citation":"resolved","description":"Now: finding a different-call replacement in a recent block immediately returns REPLACED_OTHER, which FINALLY_FAILED treats as final. Neither its receipt nor the 12-confirmation/canonical-block observation is checked. The same adapter therefore reports a one-confirmation cancellation as finally failed and unresolvedPurchase allows another paid preparation, while observeTransaction still calls that cancellation MINED_UNFINALIZED.\nChange to: observe every discovered replacement with the same canonical receipt and confirmation policy before classifying it as finally failed. Keep an unfinalized, reorged or unavailable replacement unresolved and retain the original hash.\nWhy: the requested replacement/reorg/confirmation handling and retry-journal distinction must not turn an unfinalized replacement into a final failed row; a reorg can restore the original submitted transaction.","line":298,"path":"frontend/src/domain/chainAdapter.ts","reproduction":"Width 390 or 1440; mocked chain-1 transport. Journal an original retry hash a1 at account nonce 7. Return null for its receipt and transaction, mined and pending account nonces 8, head block 200, and a same-account nonce-7 cancellation b2 (to the account itself, input 0x) in canonical block 200. Give b2 a status-1 receipt in that block. Actual: reconcileJournal returns REPLACED_OTHER, FINALLY_FAILED includes that value, and unresolvedPurchase resolves without blocking. In the identical transport, observeTransaction(b2) returns MINED_UNFINALIZED with confirmations:1 and required:12. Expected: unresolved status and blocked preparation until the replacement meets the same confirmation policy. An unchanged-adapter Vitest regression reproduces this discrepancy.","severity":"medium","snippet":"        if (!eq(replacement.to ?? \"\", j.to) || !eq(replacement.input, j.data)) return \"REPLACED_OTHER\";","title":"bug: an unconfirmed cancellation is treated as a final replaced purchase"},{"citation":"resolved","description":"Now: page.goto waits for document load, but createRoot renders the application asynchronously. This test can press Tab before the skip link exists, then wait 15 seconds for focus that was never given to that link. The required unchanged fixture matrix therefore fails despite the rendered page supporting first-Tab focus.\nChange to: await a visible application control, such as the header Connect wallet button, before the first Tab. Keep the skip-link, focus-ring, focus-trap and focus-return assertions intact.\nWhy: the brief requires the existing browser cases to pass while preserving their safety assertions; a readiness race makes that check unreliable.","line":286,"path":"frontend/tests/e2e/w1.spec.ts","reproduction":"Width 1440 x 900, Chromium desktop. Run the existing Playwright case with --project=chromium-desktop -g \"keyboard: skip link\" against the unchanged committed export. It failed in the full matrix and in two isolated reruns (full Chromium and its matching headless shell): Skip to main content was inactive after the 15000ms assertion timeout. A separate browser check that waits for the rendered header focuses the skip link on the first Tab. In a disposable copy, adding only await expect(page.getByRole(\"button\", { name: \"Connect wallet\", exact: true })).toBeVisible() after goto makes the unchanged remaining assertions pass in 2.7 seconds. No product-source repair or weakened assertion is needed.","severity":"medium","snippet":"  await page.goto(\"./\");\n  await page.keyboard.press(\"Tab\");","title":"bug: the first-Tab regression runs before the application is ready"},{"citation":"resolved","description":"Now: a fresh complete forge build produces a 12,020-byte RelayEncoder runtime with hash 0xae8388a986e56b5f750aa15b291cbd9402166f1315c71ce9704dca7c7f28ddc6, while the delivered SDK/frontend verifier requires the 11,498-byte fingerprint here. check-release rejects the clean build and the verified deployment/local-setup path cannot accept its Encoder. Incremental compilation can preserve the smaller matching artifact, which masks the failure in otherwise passing local/browser runs. The current documentation discloses this failure; it remains an implementation delivery blocker.\nChange to: establish the intended reproducible clean compilation context, regenerate and synchronize its contract fingerprints/creation hashes/immutable metadata and dependent public SDK/frontend export, then rerun release verification, deployment rehearsal and affected tests. Preserve strict verification and protected build configuration.\nWhy: the brief expressly requires synchronized contracts/ABI/SDK/CLI/config/frontend and actual launch compatibility, not a candidate that only verifies when it inherits a particular compiler cache.","line":226,"path":"config/release.json","reproduction":"Width independent; clean repository copy with no out/ or cache/, unmodified foundry.toml/remappings/libraries and solc 0.8.26. Run forge build --offline, then node tools/check-release.mjs. The build compiles 45 files successfully; the release checker exits 1 with RelayEncoder runtime validation drift: fresh 12020 bytes/hash ae8388a9…7f28ddc6 versus frozen 11498/hash 245ee3b1…91d66a4. Fresh Encoder initcode is 12046 bytes. In contrast, compiling Encoder alone and then incrementally compiling the remaining files retains the 11498-byte artifact and check-release passes. Both contexts were reproduced from the unchanged imported source, with no settings/config changes.","severity":"high","snippet":"      \"bytes\": 11498,\n      \"normalizedKeccak\": \"0x245ee3b1a84cc9e989b5ef162f7b4904a800dac79f93afa547e4de25691d66a4\",","title":"bug: a clean full build is rejected by the frozen Encoder fingerprint"}],"hash":"8fd243fafe7b6fb034e039d56e61d111ae1207e78939b38bc0991d3070b7c043","nodeId":"9604f1c9-28c5-435a-a93e-2eef0023a336","outcome":"completed","summary":"| Area | Result |\n|---|---|\n| Requirements | 101 met · 5 missing · 0 faked · 4 after review · 1 needs requester |\n| Broken features | 4, plus 1 test defect |\n| First screen at 390 | Product and main action visible |\n| taste@1 | 16/16 landing; 16/16 workspace |\n| Copy findings | 0 |\n| Share card | Present |\n\n**Revision required:** 5 findings—2 high and 3 medium.\n\n- **High:** clean builds fail frozen Encoder verification; verified reads continue after the RPC changes chain.\n- **Medium:** replacement status loses the original hash, treats unconfirmed cancellation as final, and the first-Tab test races application readiness.\n\n[Review JSON](/root/.identitymd/work/395064a3-ae28-4477-89c2-9435e70bb7e8/9604f1c9-28c5-435a-a93e-2eef0023a336/.imd-findings.json) contains all 111 requirement assessments, reproductions, exact source snippets, and 8/8 entry-point coverage.\n\nValidation: 143 contract, 71 SDK, 83 frontend unit, and 64 local browser journeys passed. Unchanged fixture cases passed 178/180. Clean release verification and deployment rehearsal failed.\n\nImplementation files remain unchanged.","treeHash":null,"usage":{"cachedInputTokens":12301184,"inputTokens":218316,"model":"gpt-6.1-sol","outputTokens":60540,"runtime":"codex","turns":13,"wallClockMs":1781494}},{"artifacts":[],"attempt":1,"bundleHash":"628588632ebe199e6928afd48cce434fcb8a99eb6b633ecc1e0000351808c762","device":"74568cca2ef24e2f","findings":[],"hash":"a2fd774d4c012128af58797f0fb347d9a4148b37850e3ea882a1d475126ad3ec","nodeId":"0b18ed11-5213-4bae-987a-437ff16f4892","outcome":"completed","summary":"Fixed both blockers and the replacement bugs, rebuilt `dist/`, and answered all eight findings.\n\nBuild/typecheck passed, plus 143 contract, 71 SDK, 100 frontend unit, 180 fixture, 64 local journey and 11 local public-adapter checks. [Validation evidence](docs/validation/boundary-revision/README.md).\n\nBundle: **8,276,274 bytes**, below 8 MiB. Candidate remains undeployed with `productionReady:false`.","treeHash":"72fc116b3670869011a99029ff8b3b3274137cc7","usage":{"cachedInputTokens":34647424,"inputTokens":439420,"model":"gpt-6.1-sol","outputTokens":191626,"runtime":"codex","turns":20,"wallClockMs":5667223}},{"artifacts":[],"attempt":1,"bundleHash":"d8d9a9d5b2038d6f81055eaad05fcabea259a1efc564cea0c9ef7d5675daff30","device":"0b3b16f4e82a0732","findings":[],"hash":"b96490fa1186039cbfb69b78a9f6999253e896b99a897701d337d232597c8aeb","nodeId":"d8374a46-2d08-4569-b939-7431d17d6b08","outcome":"completed","summary":"Completed README and docs covering workflows, all 50 contract entry points, SDK/CLI, recovery limits, launch handoff and staged acceptance.\n\nChecks: 143 contract tests and 71 SDK tests passed. **Release/deployment checks failed:** Encoder builds to 12,020 bytes; frozen config expects 11,498. Recorded as a blocker; runtime/config unchanged.\n\nFinal bundle: **8,278,514 bytes**, below 8 MiB. Hash inventories and recoverable evidence verified. No deployment, hosting or payments occurred.","treeHash":"d24f08ab8524aa465da4b3ac11da54fc9c7550a6","usage":{"cachedInputTokens":3115520,"inputTokens":129117,"model":null,"outputTokens":25191,"runtime":"codex","turns":6,"wallClockMs":652640}},{"artifacts":[],"attempt":1,"bundleHash":"64df8a2f6923b2be9a00fd83ec5fcf71f70f0cc862a0c5f1aac274b2acdbd581","device":"0cd01c5082189cbf","findings":[],"hash":"c26f8cf30463d23282fe2ef2af079e80cdd80f0fc084c9da1cf9ec29bd306191","nodeId":"d8374a46-2d08-4569-b939-7431d17d6b08","outcome":"completed","summary":"Updated the [README](/root/.identitymd/work/395064a3-ae28-4477-89c2-9435e70bb7e8/d8374a46-2d08-4569-b939-7431d17d6b08/README.md) and operator docs. The new [entry-point inventory](/root/.identitymd/work/395064a3-ae28-4477-89c2-9435e70bb7e8/d8374a46-2d08-4569-b939-7431d17d6b08/docs/ENTRYPOINTS.md) covers contract functions, CLI commands and pages; the [handoff guide](/root/.identitymd/work/395064a3-ae28-4477-89c2-9435e70bb7e8/d8374a46-2d08-4569-b939-7431d17d6b08/docs/HANDOFF.md) separates this undeployed candidate from a later pilot and live validation.\n\nFresh checks passed: clean build, 143 contract tests, 71 SDK tests, disposable local rehearsals, historical-byte verification and delivery integrity. Raw logs, receipts, hashes and measurements are in the [documentation evidence](/root/.identitymd/work/395064a3-ae28-4477-89c2-9435e70bb7e8/d8374a46-2d08-4569-b939-7431d17d6b08/docs/validation/documentation-v1/README.md). The final bundle is **8,382,101 / 8,388,608 bytes**.\n\nLive compatibility remains **NOT_RUN**. No runtime or configuration was changed, and no deployment, payment, hosting or order was triggered. Independent security review, launch-service acceptance and paid profile validation remain open.","treeHash":"05a2b561cc81c966b88f2caf3ceea3a2ca8bae78","usage":{"cachedInputTokens":7825536,"inputTokens":186002,"model":"gpt-6-sol","outputTokens":35860,"runtime":"codex","turns":8,"wallClockMs":692577}}],"verification":[{"checks":[],"detail":"paths and tree verified; no suite was run for this kind of work","evaluation":"structural","profile":"none","status":"accepted","submissionHash":"0381b8cc931da28e0cc24de253e11c14f01286d532bb1027915ff5df862d2c51","verifiedTreeHash":"cc9d904e6f6802b46e9976bc5cb3637299d6f748","verifierVersion":"0.1.0+560ab6a2"},{"checks":[],"detail":"paths and tree verified; no suite was run for this kind of work","evaluation":"structural","profile":"none","status":"accepted","submissionHash":"47604a21a2f2f084da0c88fcb45a32b12343defcef5665bed65b49053637ea56","verifiedTreeHash":"07845e947020d4c16051465fe920fe53f735db07","verifierVersion":"0.1.0+560ab6a2"},{"checks":[],"detail":"paths and tree verified; no suite was run for this kind of work","evaluation":"structural","profile":"none","status":"accepted","submissionHash":"8ef76bcb6a2961f15cacd89fe475eb4fccfb0d5a3aa7476ba449b72b284aea4d","verifiedTreeHash":"f11f2395e4356178197bab17af145afdb0c07821","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":256891,"exitCode":0,"name":"build","output":"Compiling 43 files with Solc 0.8.26\nSolc 0.8.26 finished in 256.75s\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":35532,"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: 501530)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 13.93ms (5.85ms CPU time)\n\nRan 1 test for test/PublicResults.t.sol:PublicResultsTest\n[PASS] test_exactAuthenticatedPublicZeroFileResultsNeverSettleOrRebuy() (gas: 19887834)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 23.22ms (20.71ms CPU time)\n\nRan 5 tests for test/IntakeCompatibility.t.sol:IntakeCompatibilityTest\n[PASS] test_currentCatalogShapeAndOutputNamespaceAreEncoded() (gas: 6964887)\n[PASS] test_legacyDescriptorRemainsExactAndMigrationRequiresExplicitCanonicalUpdate() (gas: 4422718)\n[PASS] test_legacyHTMLCannotCreateSecondHTMLSlotAndExplicitUpdateMigrates() (gas: 4756550)\n[PASS] test_namesRequireInitialLetterButHistoricalNamesRemainReadable() (gas: 3299518)\n[PASS] test_oldOutputNamespaceRejectedBeforePayment() (gas: 273419)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 53.20ms (67.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: 20986503)\n[PASS] test_namedBatchBackwardReferencesThenRuntimeChild() (gas: 13535676)\n[PASS] test_staticFactoryConstructorAcceptsEmptyDependenciesWithoutCallsOrChildren() (gas: 53669)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 94.25ms (93.97ms CPU time)\n\nRan 9 tests for test/RelayHistory.t.sol:RelayHistoryTest\n[PASS] test_badBindingPreservesResultThenCorrectWitnessWorksWithoutPurchase() (gas: 6737812)\n[PASS] test_childCannotBindParentsProjectAsOwn() (gas: 9368352)\n[PASS] test_forkCannotAuthenticateFakeParentLatestWitnessOrForgedProvenance() (gas: 6768835)\n[PASS] test_forkChosenHistoricalCheckpointStartsOwnProjectAndPayer() (gas: 18243901)\n[PASS] test_forkIsAllowedWhileParentPendingOrFrozen() (gas: 11733119)\n[PASS] test_htmlImageHtmlLatestJobAndOlderSelectedInputs() (gas: 27055478)\n[PASS] test_projectMismatchCannotOverwriteCheckpoint() (gas: 7218026)\n[PASS] test_removedInitializerCannotChangeAuthorityEvenForFactory() (gas: 139171)\n[PASS] test_reusedJobCannotCreateNewRevision() (gas: 6297983)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 609.79ms (202.27ms CPU time)\n\nRan 5 tests for test/adversarial/ContinuationSpec.t.sol:ContinuationSpecTest\n[PASS] test_checkpointPreimageBindsChainFactoryBranchPolicyRevisionAndSource() (gas: 9313787)\n[PASS] test_currentProposalsSelectableInEitherOrderAndLosingSponsorPaysNothing() (gas: 9130983)\n[PASS] test_everyWitnessFieldAuthenticatedForSponsorBindAndHistoricalFork() (gas: 9949312)\n[PASS] test_fiveRootRoundsTwoSponsorsHistoricalForkAndTwoChildRounds() (gas: 44570299)\n[PASS] test_foreignFactoryAndUnregisteredLookalikeCannotForgeHistoricalFork() (gas: 6257524)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 681.51ms (256.74ms CPU time)\n\nRan 14 tests for test/RelayProfiles.t.sol:RelayProfilesTest\n[PASS] test_capacityEndToEndSixteenAssetsThenUpdate() (gas: 91668121)\n[PASS] test_htmlImagesPerFileAggregateAndBase64OverheadBounds() (gas: 1375271)\n[PASS] test_imageReferencesAndMarkdownImageInputsDisabled() (gas: 3387274)\n[PASS] test_invalidTextAndCanonicalWitnessRejectBeforePayment() (gas: 346980)\n[PASS] test_jsonEscapingCannotInjectRuntimeFields() (gas: 1027576)\n[PASS] test_maximumCompleteBindingASCIIFitsGasBudget() (gas: 227144957)\n[PASS] test_maximumCompleteBindingEscapedUnicodeFitsGasBudget() (gas: 253095874)\n[PASS] test_maximumCompleteBindingWideObjectsFitsGasBudget() (gas: 256201593)\n[PASS] test_measureMaximumWitnessAndLargeManifestTogether() (gas: 14171947)\n[PASS] test_publishDisabledAndOutputMappingFixedBeforePayment() (gas: 360429)\n[PASS] test_requestBodyUTF8ByteLimitCheckedBeforePayment() (gas: 6269331)\n[PASS] test_reserveEachEnabledTypeAndExistingSlotsUpdatableAtCapacity() (gas: 4280279)\n[PASS] test_selectedInputsMustBeCurrentSortedUniqueAndWithinEight() (gas: 10484939)\n[PASS] test_updateTargetMandatoryCreateCannotOverwriteAndRenameDisabled() (gas: 3862941)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 1.58s (3.16s CPU time)\n\nRan 13 tests for test/RelayMappingRegression.t.sol:RelayMappingRegressionTest\n[PASS] test_createRejectsExistingNameEvenWhenPathAndSlotDifferBeforePayment() (gas: 3183679)\n[PASS] test_createRejectsExistingPathEvenWhenNameAndSlotDifferBeforePayment() (gas: 3188207)\n[PASS] test_distLikeNamesAndNestedNonWebsiteDistDirectoryRemainAllowed() (gas: 1676948)\n[PASS] test_historicalForkKeepsSourceProvenanceAndCanUpdateInheritedSlot() (gas: 8124397)\n[PASS] test_legacyIndependentDescriptorsStayReadableButCollidingUpdateIsRejected() (gas: 3539672)\n[PASS] test_markdownAndImageCannotWriteAnyTopLevelDistDescendant() (gas: 746559)\n[PASS] test_namesCannotCollideAcrossDifferentAssetKinds() (gas: 3187167)\n[PASS] test_pathAncestorCannotReplaceAnExistingDirectoryWithFileBeforePayment() (gas: 5681645)\n[PASS] test_pathAncestorCollisionWithOtherSlotAlsoRejectsUpdates() (gas: 3319696)\n[PASS] test_pathCommonDirectoriesAndNonBoundaryPrefixesAreAllowed() (gas: 4229686)\n[PASS] test_pathDescendantCannotTreatAnExistingFileAsDirectoryBeforePayment() (gas: 3191817)\n[PASS] test_secondHtmlSlotRejectsFixedPathCollision() (gas: 6177827)\n[PASS] test_uniqueCreateAndUpdatePreserveOtherAssetProvenance() (gas: 13666749)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 1.59s (176.21ms CPU time)\n\nRan 15 tests for test/ManifestEnvelopeRegression.t.sol:ManifestEnvelopeRegressionTest\n[PASS] test_bind33ActualSourceDescriptorsWithoutAnotherPurchase() (gas: 9864219)\n[PASS] test_bind33StructuredSourceEntriesWithoutAnotherPurchase() (gas: 5631437)\n[PASS] test_bindLongMetadataOnTheAcceptedFileWithoutAnotherPurchase() (gas: 4942831)\n[PASS] test_bindMaximumEscapedKeyBytesWithFullWitness() (gas: 249930932)\n[PASS] test_bindMaximumIgnoredNumberWithFullWitness() (gas: 183750614)\n[PASS] test_bindMaximumMetadataComplexityWithFullWitness() (gas: 196891793)\n[PASS] test_bindMaximumMetadataValuesAndUnicodeWithFullWitness() (gas: 202349479)\n[PASS] test_bindMaximumWhitespaceWithFullWitness() (gas: 175277470)\n[PASS] test_bindMetadataBeyond8192BytesWithoutAnotherPurchase() (gas: 9044444)\n[PASS] test_exactPreviouslyObservedIMDResultBindsWithoutReserialization() (gas: 3487312)\n[PASS] test_invalidIgnoredMetadataCannotHideBehindProjection() (gas: 4481149)\n[PASS] test_longIgnoredStringStillRejectsLateInvalidUtf8AndDuplicateKeys() (gas: 20272118)\n[PASS] test_manifestAggregateKeyBudgetAccepts2048Rejects2049() (gas: 3584775)\n[PASS] test_manifestValueBudgetAccepts512Rejects513() (gas: 5801736)\n[PASS] test_wrongHashStillRejectsProjectedManifest() (gas: 1320499)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 1.67s (4.18s CPU time)\n\nRan 6 tests for test/MetadataScannerDifferential.t.sol:MetadataScannerDifferentialTest\n[PASS] testFuzz_ArbitraryRawString(bytes32,bytes32) (runs: 256, μ: 397514, ~: 394058)\n[PASS] testFuzz_RawUnicode(uint32) (runs: 256, μ: 397348, ~: 401471)\n[PASS] testFuzz_UnicodeEscape(uint16,uint16) (runs: 256, μ: 415212, ~: 415703)\n[PASS] test_ControlsInvalidHexAndSurrogates() (gas: 6737042)\n[PASS] test_MixedRawAndEscapedUnicode() (gas: 2463481)\n[PASS] test_RetainedASCIICopyAtWordBoundaries() (gas: 10836839)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.66s (3.66s 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, μ: 243863, ~: 242596)\n[PASS] test_callbackDigestBindsWhitespaceAndKeyOrderOfOriginalBytes() (gas: 3565461)\n[PASS] test_exactDepthMemberKeyAndTokenBoundaries() (gas: 4652769)\n[PASS] test_exactManifestAndStringByteLimitsAcceptBoundaryRejectOneMore() (gas: 15282764)\n[PASS] test_fileSizeIntegerGrammarAndAllProfileDeclaredCaps() (gas: 23919046)\n[PASS] test_hashEncodingTypeWidthNonhexAndZeroAreCheckedForBothDigests() (gas: 99356052)\n[PASS] test_identityLengthDecodedFieldsAndEmptyAcceptedFiles() (gas: 8543239)\n[PASS] test_manifestRejectionsKeepRecordedDigestAndOldHistory() (gas: 110341298)\n[PASS] test_projectSwitchAndHistoricalJobReplayPreservePreviousCheckpoint() (gas: 19263145)\n[PASS] test_sourceAndLaterGitMetadataNeverReplaceAcceptedFilesDescriptor() (gas: 3644506)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 1.84s (2.67s CPU time)\n\nRan 5 tests for test/adversarial/ProfileBoundarySpec.t.sol:ProfileBoundarySpecTest\n[PASS] testFuzz_htmlBase64RoundingAndOneByteOverTheKnownInputBudget(uint32) (runs: 1000, μ: 992649, ~: 992685)\n[PASS] test_realEightAssetWitnessExact16384ByteRequestAndOneByteOverRejectedBeforePayment() (gas: 138037045)\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.84s (2.64s CPU time)\n\nRan 14 tests for test/adversarial/PaymentSpec.t.sol:PaymentSpecTest\n[PASS] testFuzz_priceChangeCapAndDonationsConserveEveryWei(uint96,uint64) (runs: 1000, μ: 3011839, ~: 3012368)\n[PASS] testFuzz_unknownFailureFrozenDespiteNewProposalsAndTime(uint8) (runs: 1000, μ: 3334928, ~: 3334930)\n[PASS] test_continuationRetryRetainsParentAndFullSelectedSnapshot() (gas: 8233337)\n[PASS] test_exactWholeBalanceAndMaxFeeDoesNotOvercharge() (gas: 2250898)\n[PASS] test_insufficientApprovalAndBalanceRollbackBeforeAnyReceipt() (gas: 3490587)\n[PASS] test_intakeRevertPartialPullZeroIdAndClearFailureRollbackAllEffects() (gas: 7692767)\n[PASS] test_malformedResultIsRecordedWithoutParsingThenBadBindingPreservesIt() (gas: 2697722)\n[PASS] test_maximumCallbackURIWithinStipendAndOversizeFailureStaysPending() (gas: 6464412)\n[PASS] test_missingCallbackHasNoTimeoutButAuthenticLateCallbackStillWorks() (gas: 3224282)\n[PASS] test_reentrancyAtTransferApprovalAndIntakeCannotProposeOrBuyAgain() (gas: 13300793)\n[PASS] test_refusalCannotSubstituteProposalAndRetryRacesCostOnlyWinner() (gas: 6136768)\n[PASS] test_reusedIntakeRequestIdOnRetryCannotOverwriteAttemptOrDoubleCharge() (gas: 4586111)\n[PASS] test_spoofForeignCrossBranchAndReplayCallbacksCannotSettleOwnRequest() (gas: 8654726)\n[PASS] test_synchronousIntakeResultAndFailureCannotSettlePurchasingState() (gas: 4024590)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 1.84s (3.01s CPU time)\n\nRan 15 tests for test/StrictManifest.t.sol:StrictManifestTest\n[PASS] testFuzz_asciiJSONQuoteDecodeRoundTrip(bytes32,uint8) (runs: 1000, μ: 262291, ~: 141744)\n[PASS] testFuzz_decodedDuplicateKeyAlwaysRejected(uint8) (runs: 1000, μ: 77971, ~: 77955)\n[PASS] test_actualFileHashesAndManifestKeccakAreDistinct() (gas: 444865)\n[PASS] test_boundedLargeManifestMeasurement() (gas: 5046204)\n[PASS] test_onlyDeclaredFilesNotSourceOrGitMetadataSupplyAcceptedFile() (gas: 4148913)\n[PASS] test_parserBoundsManifestStringDepthMembersAndTokens() (gas: 2643587)\n[PASS] test_rejectDuplicateKeysIncludingDecodedEscapesAtEveryDepth() (gas: 5856502)\n[PASS] test_rejectEmptyAndMultipleFilesEvenIfOneMatches() (gas: 3905234)\n[PASS] test_rejectIncompleteWrongIdentityTypesAndWrongFileTypes() (gas: 13243534)\n[PASS] test_rejectInvalidUTF8UnicodeSurrogatesAndNoncharacters() (gas: 871737)\n[PASS] test_rejectPathsTraversalHiddenURLAbsoluteAndDecodedControl() (gas: 20592452)\n[PASS] test_rejectTrailingAndMalformedJSON() (gas: 1235180)\n[PASS] test_rejectZeroOversizedNonIntegerAndStringFileBytes() (gas: 15383349)\n[PASS] test_validUTF8EscapesAndSurrogatePairsDecodeExactly() (gas: 1596924)\n[PASS] test_whitespaceIsLegalButDigestIsOverExactRawBytes() (gas: 460505)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 1.84s (2.40s CPU time)\n\nRan 13 tests for test/RelayPayments.t.sol:RelayPaymentsTest\n[PASS] testFuzz_exactDynamicFeeConservesBalances(uint96) (runs: 1000, μ: 2013453, ~: 2013424)\n[PASS] testFuzz_nonRefusalFailureAlwaysFreezes(uint8) (runs: 1000, μ: 2191654, ~: 2191655)\n[PASS] test_callbacksAuthenticateSenderOwnRequestAndSingleDelivery() (gas: 2258915)\n[PASS] test_creationAndProposalsDoNotPurchaseOrMoveAnchor() (gas: 3606666)\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: 5278343)\n[PASS] test_stipendCallbackOnlyRecordsAndBindingIsPermissionless() (gas: 3025700)\n[PASS] test_tokenReentrancyAndSynchronousCallbackAreRejected() (gas: 3194508)\n[PASS] test_zeroUnknownProposalFeeCapAndUnpricedRejectBeforeTransfer() (gas: 1663610)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 1.84s (3.25s 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         | 1399  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | fail         | 1387  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | propose      | 1360  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | recordResult | 1309  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | retry        | 1315  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| RelayHandler | sponsor      | 1422  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.38s (6.37s 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     | 2417  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | bind            | 2484  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | donate          | 2481  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | fail            | 2397  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | forkHistory     | 2440  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | hostileCallback | 2531  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | propose         | 2544  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | purchase        | 2371  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | recordResult    | 2497  | 0       | 0        |\n|------------------+-----------------+-------+---------+----------|\n| SpecStateHandler | retry           | 2414  | 0       | 0        |\n╰------------------+-----------------+-------+---------+----------╯\n\n[PASS] test_modelExercisesRefusalRetryChildContinuationAndHistoricalFork() (gas: 26027525)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 35.36s (35.35s CPU time)\n\nRan 17 test suites in 35.36s (58.90s CPU time): 138 tests passed, 0 failed, 0 skipped (138 total tests)\n","passed":true},{"durationMs":312,"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\":4,\"ADAPTATION.md\":49,\"DESIGN.md\":93,\"LICENSE\":21,\"README.md\":28,\"abi/IIntake.json\":82,\"abi/RelayBranch.json\":1455,\"abi/RelayEncoder.json\":353,\"abi/RelayFactory.json\":306,\"abi/RelayVerifier.json\":245,\"cli/relay.mjs\":84,\"config/production-gate.json\":56,\"config/production-gate.schema.json\":19,\"config/release.json\":228,\"dist/assets/dist-8fI56cCs.js\":3,\"dist/assets/index-4UpPiOax.css\":1,\"dist/assets/index-DHjyFzFG.js\":127,\"dist/ethereum-config.json\":8,\"dist/favicon.svg\":1,\"dist/index.html\":18,\"dist/local-config.json\":101,\"dist/og.png\":190,\"dist/og.svg\":1,\"docs/ACCEPTANCE.md\":5,\"docs/AGENT-GUIDE.md\":13,\"docs/BUILD.md\":47,\"docs/CLI.md\":15,\"docs/CONTRACTS.md\":31,\"docs/DESIGN.md\":5,\"docs/FRONTEND.md\":5,\"docs/HANDOFF.md\":5,\"docs/LIMITS.md\":34,\"docs/LIVE-VALIDATION.md\":5,\"docs/OPERATIONS.md\":41,\"docs/PLATFORM-AUTHORING.md\":5,\"docs/PROTOCOL-OVERVIEW.md\":31,\"docs/REVIEW.md\":27,\"docs/SDK-BROWSER.md\":5,\"docs/agent/SDK-CLI-A1.md\":5,\"docs/agent/sdk-cli-checks.md\":5,\"docs/frontend-README.md\":5,\"docs/history/README.md\":19,\"docs/history/a1-fixtures.tar.xz\":13,\"docs/history/fixtures-index.json\":72,\"docs/history/imported-evidence-text.tar.xz\":741,\"docs/history/imported-index.json.xz\":190,\"docs/validation/rc-v1/README.md\":102,\"docs/validation/rc-v1/archive-index.json\":242,\"docs/validation/rc-v1/authenticated-results-index.json\":54,\"docs/validation/rc-v1/current-evidence.tar.xz\":784,\"docs/validation/rc-v1/delivery-size.json\":40,\"docs/validation/rc-v1/desktop.webp\":114,\"docs/validation/rc-v1/ethereum-read-evidence.json\":555,\"docs/validation/rc-v1/initial-brand-e2e-failure.txt\":199,\"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/measurements.json\":872,\"docs/validation/rc-v1/mobile-320.webp\":214,\"docs/validation/rc-v1/official-capabilities.json\":1,\"docs/validation/rc-v1/pre-final-input-name-tests.txt\":236,\"docs/validation/rc-v1/public-multiple-file-observations.json\":34,\"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\":1,\"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/ethereum-config.json\":8,\"frontend/public/favicon.svg\":1,\"frontend/public/local-config.json\":101,\"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\":40,\"frontend/src/components/ArtifactViewer.tsx\":27,\"frontend/src/components/FundingSheet.tsx\":6,\"frontend/src/components/Sheet.tsx\":26,\"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\":63,\"frontend/src/domain/chainAdapter.ts\":394,\"frontend/src/domain/files.ts\":107,\"frontend/src/domain/fixtureAdapter.ts\":518,\"frontend/src/domain/fixtures.ts\":63,\"frontend/src/domain/liveAdapter.ts\":58,\"frontend/src/domain/sdk.ts\":8,\"frontend/src/domain/types.ts\":206,\"frontend/src/main.tsx\":24,\"frontend/src/preview/FilePreview.tsx\":78,\"frontend/src/preview/sanitize.ts\":77,\"frontend/src/styles.css\":259,\"frontend/src/ui/ErrorBoundary.tsx\":19,\"frontend/src/ui/LocalApp.tsx\":50,\"frontend/src/ui/ProjectList.tsx\":119,\"frontend/src/ui/ProposeForm.tsx\":219,\"frontend/src/ui/Showcase.tsx\":17,\"frontend/src/ui/SponsorPanel.tsx\":64,\"frontend/src/ui/Workspace.tsx\":142,\"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\":43,\"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\":73,\"frontend/tests/e2e/revision.spec.ts\":250,\"frontend/tests/e2e/w1.spec.ts\":301,\"frontend/tests/e2e/wallet.spec.ts\":88,\"frontend/tests/fixtures/wide.png\":3,\"frontend/tests/integration/browser-chain.mjs\":684,\"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\":71,\"frontend/tests/run-browsers.mjs\":14,\"frontend/tests/unit/chain-provider.test.ts\":61,\"frontend/tests/unit/domain.test.ts\":120,\"frontend/tests/unit/platform.test.tsx\":88,\"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\":25,\"sdk/config.mjs\":82,\"sdk/core.mjs\":383,\"sdk/files-browser.mjs\":173,\"sdk/files.mjs\":171,\"sdk/index.mjs\":12,\"sdk/public.mjs\":71,\"sdk/strict-json.mjs\":147,\"src/RelayBranch.sol\":309,\"src/RelayEncoder.sol\":205,\"src/RelayFactory.sol\":100,\"src/RelayTypes.sol\":78,\"src/RelayVerifier.sol\":69,\"src/interfaces/IIntake.sol\":20,\"src/libraries/Assets.sol\":141,\"src/libraries/ManifestJSON.sol\":510,\"src/libraries/Policy.sol\":51,\"src/libraries/StrictJSON.sol\":260,\"src/libraries/Text.sol\":175,\"test-sdk/browser-sdk.test.mjs\":178,\"test-sdk/files.test.mjs\":58,\"test-sdk/mock-rpc.mjs\":14,\"test-sdk/network-address.test.mjs\":85,\"test-sdk/parity-vectors.mjs\":100,\"test-sdk/public.test.mjs\":78,\"test-sdk/relay.test.mjs\":244,\"test-sdk/review-regressions.test.mjs\":67,\"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\":288,\"test/MetadataScannerDifferential.t.sol\":120,\"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/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/check-delivery.py\":46,\"tools/check-official-bodies.mjs\":41,\"tools/check-release.mjs\":20,\"tools/deployment-rehearsal.mjs\":60,\"tools/export-abi.mjs\":7,\"tools/generate-fixtures.py\":27,\"tools/generate-local-config.mjs\":33,\"tools/generate-sdk-abi.mjs\":25,\"tools/generate-sdk-fixtures.mjs\":26,\"tools/inspect-bytecode.mjs\":43,\"tools/local-integration.mjs\":278,\"tools/measure-binding.mjs\":89,\"tools/measure-release.mjs\":21,\"tools/observe-ethereum.mjs\":17,\"tools/sdk-local-check.mjs\":159,\"tools/sdk-local-scenario.mjs\":107,\"tools/sync-release.mjs\":24,\"tools/transaction-metrics.mjs\":11,\"tools/validate-live.mjs\":23,\"tools/verify-history.py\":15,\"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":20551,"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:40: RelayVerifier.verify(bytes,bytes32,RelayTypes.Proposal,RelayTypes.Asset[],address,uint64).a (src/RelayVerifier.sol#40) 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:63: ManifestJSON._value(ManifestJSON.Parser,uint256,uint8).at (src/libraries/ManifestJSON.sol#63) 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:111: ManifestJSON._object(ManifestJSON.Parser,uint256,uint8).count (src/libraries/ManifestJSON.sol#111) 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[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":1217,"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 (111 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:461: Unchecked Return (5 places)\n[low] uninitialized-local-variable at src/RelayEncoder.sol:108: Uninitialized Local Variable (3 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"8f9c0e1c2f0454193456ce22208b5f67a87d36328c67437544376137933a4d53","verifiedTreeHash":"9f097e31e36f7fe5eff71fc8d10dae7bcc58aa32","verifierVersion":"0.1.0+560ab6a2"},{"checks":[],"detail":"paths and tree verified; no suite was run for this kind of work","evaluation":"structural","profile":"none","status":"accepted","submissionHash":"a2fd774d4c012128af58797f0fb347d9a4148b37850e3ea882a1d475126ad3ec","verifiedTreeHash":"72fc116b3670869011a99029ff8b3b3274137cc7","verifierVersion":"0.1.0+560ab6a2"},{"checks":[],"detail":"paths and tree verified; no suite was run for this kind of work","evaluation":"structural","profile":"none","status":"accepted","submissionHash":"b96490fa1186039cbfb69b78a9f6999253e896b99a897701d337d232597c8aeb","verifiedTreeHash":"d24f08ab8524aa465da4b3ac11da54fc9c7550a6","verifierVersion":"0.1.0+560ab6a2"},{"checks":[],"detail":"paths and tree verified; no suite was run for this kind of work","evaluation":"structural","profile":"none","status":"accepted","submissionHash":"c26f8cf30463d23282fe2ef2af079e80cdd80f0fc084c9da1cf9ec29bd306191","verifiedTreeHash":"05a2b561cc81c966b88f2caf3ceea3a2ca8bae78","verifierVersion":"0.1.0+560ab6a2"}]}