{"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":"5a583a8e-18a9-4ba0-9415-8c83a1f0a8c1","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"8cfc4a86e74d7fb9d4819439daf6a42d72fb91675925cecccc73c493e400cd57","dependsOn":["build_contract_project","manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"c26edc76dc7a76e09a42c3634054429c1679c6e247747d647a03f77e5b332d7e","skillId":"adversarial-review","tools":[]},"key":"adversarial_review","kind":"code","role":"review","skillHash":"c26edc76dc7a76e09a42c3634054429c1679c6e247747d647a03f77e5b332d7e","skillId":"adversarial-review","state":"accepted"},{"acceptedSubmissionHash":"784cf2ac074d65fc9d762494b6b29692c7e8084d0960131d61a93f704e369d8d","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"0f3e7566c3ff8e87fc95936b79ba455be33eea683bb01a6834a4a4d43e58e1df","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"0f3e7566c3ff8e87fc95936b79ba455be33eea683bb01a6834a4a4d43e58e1df","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"2f41d3c7916b3515b285b3d5a0a57c7f944876c38a69f504716670f9607907cb","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"}],"objective":"Build a small key/value registry with two clearly distinct batch APIs: atomic batch reverts all writes on the first invalid operation; best-effort batch returns per-item outcomes and applies valid items sequentially. Limit each batch to 16 operations. Define add/update/remove semantics, nonzero keys/values and exact refusal order. Test a failure in the first/middle/last position, repeated keys within a batch and failed-operation state preservation against a naive model. Deliver a standalone Foundry project, meaningful tests, and a README with exact behavior and reproduction commands. Use Solidity 0.8.24 and no fetched test dependencies; builds and tests must work offline with the toolchain installed. Document assumptions and incomplete checks. Set deployment ON and deploy the tested contract to Sepolia (chain ID 11155111). Deliver the contract address, deployment transaction hash, explorer link and constructor arguments. Use documented demo parameters and test accounts; keep builds and unit tests reproducible offline. Do not deploy to mainnet or create a token.","parentJobId":null,"planHash":"490ec46dac56f8926933228739647cc8cdb3d9ea41c826c6e285ed41812db6ff","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"5a583a8e-18a9-4ba0-9415-8c83a1f0a8c1","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-208-build-small-key-value-registry"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51018","feedbackHash":"d239b1ec89cc9266bf2c9b970b26253020685b51801336b1eb8da2acf78868d4","nodeKey":"adversarial_review","submissionHash":"8cfc4a86e74d7fb9d4819439daf6a42d72fb91675925cecccc73c493e400cd57","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50959","feedbackHash":"61c5bf3bd327a737c5cc3d63b5e3f8ae9beddc080707cd2de6f57e06cecf9f21","nodeKey":"build_contract_project","submissionHash":"784cf2ac074d65fc9d762494b6b29692c7e8084d0960131d61a93f704e369d8d","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50959","feedbackHash":"5c1868d5e6fd02ab688416bf249ac193f9f800fee50fce935d047bb0f4e3627b","nodeKey":"manifest","submissionHash":"2f41d3c7916b3515b285b3d5a0a57c7f944876c38a69f504716670f9607907cb","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"dbc7bad5cbcf4eb4a531c30e5555ac48e82a752c7bef1429e16f8a9d09769474","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"bd9e3161edc93ec40712d93f78181b4a3740f86902a070eef42e5e12450e8b08","device":"468e82a89b9bfe18","findings":[],"hash":"2f41d3c7916b3515b285b3d5a0a57c7f944876c38a69f504716670f9607907cb","nodeId":"c01a43ec-4ee3-4e88-bbcf-dfeb09806a94","outcome":"completed","summary":"`launch.json` is written and is the only file changed. The other untracked entries in the status output are sandbox device nodes, not files I created.\n\n**What the manifest contains**\n\n- Kind `evm_project`, one application contract `KeyValueRegistry` with an empty constructor argument list, matching the accepted source where the constructor takes no parameters and `MAX_BATCH = 16` is a constant.\n- Standard Sepolia pool block: native ETH pairing, fee 3000, tick spacing 60, 1:1 sqrtPriceX96.\n- Notes describing the registry's behavior, compiler settings, the ABI export path and the deployment record template.\n\n**Checks run**\n\n- A schema check written from the LaunchManifest JSON Schema and its refinements passed. Names are unique, no forward references, notes are 2802 characters.\n- `forge build --offline` succeeded, `forge test --offline` passed 45 of 45 tests, `forge fmt --check` is clean.\n\n**One gap I could not close.** The accepted tree contains no launch token, because the original brief said not to create one and the builder followed that. The manifest schema still requires a token block, and this assignment may only touch launch.json. I filled the block with the placeholder identifier `LaunchToken`, 18 decimals, and stated plainly in the notes that no such contract exists in the tree. Attestation and the protected token and project floor tests will fail on the missing creation code until either a builder assignment adds a fixed-supply ERC-20 under that name, or the launch is admitted as a plain script deployment as the accepted README documents. That decision belongs to the reviewer, not to this seat.","treeHash":"73830742b3d1681624c0df0505de03baa7bd9228","usage":{"cachedInputTokens":328475,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":7129,"runtime":"claude","turns":8,"wallClockMs":159814}},{"artifacts":[],"attempt":3,"bundleHash":"765ea34d789c1f272d2e9d33e3e5b27bd5eaf9792f5453103807c135f1a26f88","device":"468e82a89b9bfe18","findings":[],"hash":"784cf2ac074d65fc9d762494b6b29692c7e8084d0960131d61a93f704e369d8d","nodeId":"5588aafd-69e1-4898-b6dd-462b61a69d8d","outcome":"completed","summary":"The deliverable is complete, verified offline, and committed on `main` as `c56704f`.\n\n**What was built**\n\n- `src/KeyValueRegistry.sol`: per-caller `bytes32 -> bytes32` namespaces with `add`, `update`, `remove`, plus `batchAtomic` (reverts with `AtomicBatchRejected(index, status)` on the first refused item, nothing kept) and `batchBestEffort` (applies valid items in order, returns one `Status` per item, emits `OperationSkipped` for refused ones). Batches take 1 to 16 operations. Refusal order per item is kind, then zero key, then zero value, then state (`KeyExists` / `KeyMissing`). No owner, no privileged role, no external calls, no ETH.\n- `script/Deploy.s.sol`: reads only `EXPECTED_CHAIN_ID` (31337, 11155111, or 0 for an offline dry run), refuses mainnet, one deployment between broadcast markers, `deploy(config)` callable from tests.\n- Tests, 45 passing: unit suite covering failure at first, middle and last position in both APIs, repeated keys in a batch, namespace isolation and the refusal order; differential fuzzing against an independently written array-backed `NaiveModel`; property tests that best-effort equals sequential singles and atomic is all-or-nothing; invariants on `size`; deploy-script tests including a forbidden-opcode scan.\n- `README.md` (exact behaviour, interface, reproduction commands, assumptions, incomplete checks), `REVIEW.md` (findings, disposition, re-run record), `docs/deployment.md` (deployment record with placeholders, constructor arguments: none), `docs/abi/KeyValueRegistry.json`. `forge-std` v1.16.2 is vendored as plain files under `lib/`.\n\n**Checks run offline**\n\n```\nforge build --offline                      Compiler run successful\nforge test --offline                       45 passed, 0 failed\nforge fmt --check                          clean\nEXPECTED_CHAIN_ID=0 forge script ... --offline   Script ran successfully\n```\n\nThe two protected floor test files were also compiled under this configuration in `test/scratch` to confirm the pin and remapping satisfy them.\n\n**Deliberate deviation from the task text.** The compiler is pinned to solc 0.8.26, not 0.8.24, with sources at `pragma solidity ^0.8.24`. Both earlier attempts failed on 0.8.24: the verifier's offline box has no 0.8.24 binary, and the protected floor tests carry an exact `pragma solidity 0.8.26`, so a 0.8.24 pin can never compile them. This is documented in the README and REVIEW.\n\n**Not done, and why**\n\n- No token was created, as the task instructs. The protected project floor test expects a token creation code in its environment; supplying one or launching as a contracts-only project is the manifest node's call.\n- The Sepolia address, transaction hash and explorer link cannot be produced from this seat, which holds no keys. The record in `docs/deployment.md` has the constructor arguments (none), compiler settings and a checklist for the network deployer to fill in.\n- The memory note about the solc pin could not be saved: the memory directory is write-denied by this session's sandbox.","treeHash":"4d136e6e759c00427c20cf2656fed99ed6b87389","usage":{"cachedInputTokens":1563984,"inputTokens":706,"model":"claude-fable-5-1","outputTokens":49761,"runtime":"claude","turns":23,"wallClockMs":576126}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"30a6c1a419ef4f9c","findings":[{"description":"The manifest's token block declares contract \"LaunchToken\" (18 decimals, symbol KVR). No source file defines it; src/ contains only KeyValueRegistry. The verifier resolves IMD_TOKEN_CREATION_CODE from the token contract named in the manifest, and Project.protected.t.sol reads that variable with vm.envBytes (not envOr), so its setUp fails before any project check executes. Token.protected.t.sol skips, which the verifier treats as 'asserted nothing'. The notes field already flags this as a blocking gap, but notes are explanatory text, not deployment authority, and the schema-valid manifest still points at a non-existent artifact. This is a scope conflict, not a code defect: the task brief says 'do not create a token' while the evm_project launch path requires one. Resolution needs a task-owner decision: (a) authorize a builder assignment to add a fixed-supply ERC-20 named LaunchToken (no constructor args, 18 decimals, exactly 10^27 minor units to msg.sender, no mint/admin path) and re-check the manifest against it, or (b) admit the registry as a plain contract deployment via script/Deploy.s.sol with EXPECTED_CHAIN_ID=11155111, bypassing the evm_project manifest path. Until one is chosen the launch cannot be attested or admitted.","line":4,"path":"launch.json","reproduction":"In the repo root: `forge inspect LaunchToken bytecode --offline` -> `Error: No contract found with the name LaunchToken`. Copy .imd/reads/protected/evm_project/*.sol into a scratch test dir and run `forge test --offline --match-path 'test/protected/*'` with IMD_PROJECT_FACTORY, IMD_PROJECT_CHAIN_ID=11155111, IMD_EXPECTED_SUPPLY, IMD_PROJECT_COUNT=1, IMD_PROJECT_CODE_0=<registry creation code>, IMD_PROJECT_SALT_0, IMD_PROJECT_ADDRESS_0, IMD_EXPECTED_TOKEN set and IMD_TOKEN_CREATION_CODE unset (there is no token to supply). Expected: floor exercises the registry. Actual: ProjectProtectedTest `[FAIL: vm.envBytes: environment variable \"IMD_TOKEN_CREATION_CODE\" not found] setUp()`; TokenProtectedTest `[SKIP: skipped] setUp()`; 0 passed.","severity":"medium","title":"launch.json names a launch token (LaunchToken) that does not exist in the tree, so attestation and the Project floor cannot run"},{"description":"The task requires delivering the deployed contract address, deployment transaction hash and explorer link for Sepolia (11155111). docs/deployment.md rows 12-15 contain '_to be filled by the deployer_' and '<contract-address>' / '<transaction-hash>' placeholders, and README.md lines 159-163 repeat the template. The contributor rules forbid accessing a wallet key or broadcasting from a contributor task, so the builder's choice to leave the record for the network deployer is the correct behaviour under those rules. It is recorded here so the acceptance item is not mistaken for done: the deployment has not happened, no address exists, and the record must be completed by the deployer after admission (which is itself blocked by the token gap above). Constructor arguments (none) and the deploy command are correctly documented; script/Deploy.s.sol refuses chain ids other than 31337/11155111 and performs exactly one deployment between broadcast markers, as verified by test/Deploy.t.sol.","line":12,"path":"docs/deployment.md","reproduction":"`grep -n 'to be filled' docs/deployment.md` -> lines 12 and 13. `grep -n 'contract-address\\|transaction-hash' docs/deployment.md README.md` -> placeholders at docs/deployment.md:14-15 and README.md:162-163. No 0x-prefixed 20-byte address or 32-byte tx hash appears anywhere in the tree. Expected per task: concrete address, tx hash and https://sepolia.etherscan.io/... links. Actual: template only.","severity":"low","title":"Sepolia deployment deliverables (address, transaction hash, explorer link) are unfilled placeholders"},{"description":"Two documentation statements no longer match what a reviewer observes. (1) README.md:121 says '45 tests in four suites'; forge 1.8.3 (the seat's installed version; README:107 says 1.7.x) reports 43 because the invariant suite is counted as one test with three invariants. (2) README.md:180-184 and REVIEW.md:11 justify the 0.8.26 pin partly by 'the offline verifier does not carry a 0.8.24 binary'. On this seat solc 0.8.24 is cached at ~/.local/share/svm/0.8.24/solc-0.8.24, so that half of the justification is not reproducible here. The pin is still required and correct: the protected floor tests carry an exact `pragma solidity 0.8.26` and would not compile under a 0.8.24 pin, and the source stays at the ^0.8.24 language level. Also, README.md:203 estimates 'about 0.9M gas for 16 fresh adds'; the measured in-call cost of batchAtomic with 16 fresh adds is 468,447 gas, so the estimate is conservative by roughly 2x. None of this affects behaviour; it is noted so the deployer/verifier does not treat the README figures as exact.","line":121,"path":"README.md","reproduction":"`forge test --offline 2>&1 | tail -1` -> '43 tests passed, 0 failed, 0 skipped (43 total tests)' vs README:121 '45 tests'. `ls ~/.local/share/svm/` -> 0.8.17 0.8.24 0.8.26 0.8.30 vs README:181 'does not carry a 0.8.24 binary'. Gas: a test calling `registry.batchAtomic(16 fresh adds)` with gasleft() before/after reports 468447 vs README:203 'about 0.9M'.","severity":"info","title":"README test count and compiler-availability justification are stale against the current toolchain"}],"hash":"8cfc4a86e74d7fb9d4819439daf6a42d72fb91675925cecccc73c493e400cd57","nodeId":"ccd3087d-61d7-464c-a959-38ffb77bbb09","outcome":"completed","summary":"The findings file is in place at the repo root and is excluded from the commit by the workspace's own exclude rule, so the tracked tree is untouched.\n\n**Result: no defect in the registry contract or its tests. Three non-code findings, ranked.**\n\nThe implementation in `src/KeyValueRegistry.sol` holds up under adversarial inputs. I checked the refusal order at every combination of bad kind, zero key, zero value and state, atomic rollback with failures at the first, middle and last position including an invalid kind after 15 valid writes, repeated keys in every order, dirty `uint8` calldata, the size counter against present keys, and namespace isolation. The differential fuzz against the naive model, the sequential-equivalence property and the invariant suite are real tests, not happy-path filler. The exported ABI matches the compiled artifact exactly. The protected floor tests compile under the pinned 0.8.26 configuration.\n\nFindings written to `.imd-findings.json`:\n\n- **Medium, launch.json.** The manifest names a token contract `LaunchToken` that does not exist in the tree. Attestation cannot resolve its creation code, and the Project floor fails in `setUp` on the missing environment variable while the Token floor skips. This is a scope conflict between the task brief, which forbids a token, and the launch path, which requires one. It needs a task-owner decision: authorize a token builder assignment, or admit the registry as a plain script deployment.\n- **Low, docs/deployment.md.** The address, transaction hash and explorer link the task asks for are placeholders. Leaving them unfilled is correct under the rule that contributors never broadcast, but the deployment has not happened and should not be read as delivered.\n- **Info, README.md.** The stated test count is 45 while forge 1.8.3 reports 43, the claim that no 0.8.24 binary exists offline is not true on this seat, and the gas estimate for 16 adds is about twice the measured cost. The 0.8.26 pin remains necessary because the protected tests carry an exact 0.8.26 pragma.\n\nVerification record: `forge build --offline` clean, `forge test --offline` 43 passed, `forge fmt --check` clean, plus seven extra edge probes run in a scratch copy outside the repo that all passed.","treeHash":null,"usage":{"cachedInputTokens":690389,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":16017,"runtime":"claude","turns":23,"wallClockMs":267661}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"02ae6543274731ab","findings":[],"hash":"caea377a7fa74c5b4dfc09d2a6e00419136029fe5275ccb6428f5a3897331005","nodeId":"5588aafd-69e1-4898-b6dd-462b61a69d8d","outcome":"failed","summary":"solc: solc is pinned to a path (./toolchain/solc-0.8.24-linux-amd64) rather than a version","treeHash":null,"usage":{"cachedInputTokens":1553024,"inputTokens":115638,"model":"gpt-6-astra","outputTokens":35402,"runtime":"codex","turns":13,"wallClockMs":1157129}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"693a98443cff7807","findings":[],"hash":"cf437aca8140be840b98cdfa64ca63fb42d8fa9267e495cc83b6483966702c88","nodeId":"5588aafd-69e1-4898-b6dd-462b61a69d8d","outcome":"failed","summary":"the local build failed, so this was not submitted:\nforge build exited with 1:\nError: can't install missing solc 0.8.24 in offline mode","treeHash":null,"usage":{"cachedInputTokens":1662720,"inputTokens":127341,"model":"gpt-6-astra","outputTokens":39765,"runtime":"codex","turns":13,"wallClockMs":1298167}}],"verification":[{"checks":[{"durationMs":1385,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.32s\nCompiler run successful!\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Invariant.t.sol:66:23\n   │\n66 │                 kind: uint8(r % 4),\n   │                       ━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint8' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/ModelEquivalence.t.sol:41:23\n   │\n41 │                 kind: uint8(r % 4), // 0..2 valid, 3 invalid\n   │                       ━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint8' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\n","passed":true},{"durationMs":464,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/Deploy.t.sol:DeployTest\n[PASS] test_deploy_onLocalChainWithExplicitId() (gas: 567609)\n[PASS] test_deploy_onSepoliaWhenChainMatches() (gas: 613463)\n[PASS] test_deploy_refusesChainMismatch() (gas: 9255)\n[PASS] test_deploy_refusesMainnetAndOtherChains() (gas: 12287)\n[PASS] test_deploy_zeroMeansLocalDryRun() (gas: 563999)\n[PASS] test_deployedRuntimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 1315163)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.51ms (2.80ms CPU time)\n\nRan 32 tests for test/KeyValueRegistry.t.sol:KeyValueRegistryTest\n[PASS] testFuzz_atomicRejectsAtExactPosition(uint8,uint8) (runs: 256, μ: 213327, ~: 151913)\n[PASS] testFuzz_singleOpsRoundTrip(bytes32,bytes32,bytes32) (runs: 256, μ: 90964, ~: 90908)\n[PASS] test_add_refusesExistingKey() (gas: 63491)\n[PASS] test_add_refusesZeroKey() (gas: 11932)\n[PASS] test_add_refusesZeroValue() (gas: 11995)\n[PASS] test_add_storesValueAndCounts() (gas: 64655)\n[PASS] test_atomic_allValidAppliesEverythingInOrder() (gas: 78633)\n[PASS] test_atomic_failureAtFirstPositionKeepsNothing() (gas: 80207)\n[PASS] test_atomic_failureAtLastPositionKeepsNothing() (gas: 107466)\n[PASS] test_atomic_failureAtMiddlePositionKeepsNothing() (gas: 103842)\n[PASS] test_batch_emptyReverts() (gas: 15113)\n[PASS] test_batch_seventeenReverts() (gas: 34649)\n[PASS] test_batch_sixteenIsAccepted() (gas: 910859)\n[PASS] test_bestEffort_allInvalidChangesNothingAndDoesNotRevert() (gas: 30084)\n[PASS] test_bestEffort_failureAtFirstPositionAppliesTheRest() (gas: 110690)\n[PASS] test_bestEffort_failureAtLastPositionAppliesTheRest() (gas: 110690)\n[PASS] test_bestEffort_failureAtMiddlePositionAppliesTheRest() (gas: 130669)\n[PASS] test_check_agreesWithBestEffortStatuses() (gas: 73254)\n[PASS] test_namespaces_areIsolatedPerCaller() (gas: 122358)\n[PASS] test_refusalOrder_kindBeforeKeyBeforeValueBeforeState() (gas: 82524)\n[PASS] test_remove_deletesAndCounts() (gas: 51186)\n[PASS] test_remove_ignoresValueField() (gas: 49118)\n[PASS] test_remove_refusesMissingKey() (gas: 14325)\n[PASS] test_remove_refusesZeroKey() (gas: 11860)\n[PASS] test_repeatedKey_addRemoveAddWithinOneBatch() (gas: 84077)\n[PASS] test_repeatedKey_addThenUpdateSucceedsInBothApis() (gas: 133670)\n[PASS] test_repeatedKey_addTwice_atomicRevertsAtSecond() (gas: 69122)\n[PASS] test_repeatedKey_addTwice_bestEffortKeepsFirst() (gas: 95565)\n[PASS] test_repeatedKey_removeTwice_bestEffortReportsSecondMissing() (gas: 55044)\n[PASS] test_update_refusesMissingKey() (gas: 14305)\n[PASS] test_update_refusesZeroValue() (gas: 61981)\n[PASS] test_update_replacesValue() (gas: 67988)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 16.23ms (31.81ms CPU time)\n\nRan 4 tests for test/ModelEquivalence.t.sol:ModelEquivalenceTest\n[PASS] testFuzz_atomicIsAllOrNothingRelativeToBestEffort(uint256) (runs: 256, μ: 208037, ~: 210031)\n[PASS] testFuzz_atomicMatchesNaiveModel(uint256,uint8) (runs: 256, μ: 295609, ~: 237875)\n[PASS] testFuzz_bestEffortEqualsSequentialSingles(uint256) (runs: 256, μ: 308574, ~: 274740)\n[PASS] testFuzz_bestEffortMatchesNaiveModel(uint256,uint8) (runs: 256, μ: 353731, ~: 323573)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 52.83ms (162.48ms CPU time)\n\nRan 3 tests for test/Invariant.t.sol:RegistryInvariantTest\n[PASS] invariant_otherNamespacesUntouched() (runs: 64, calls: 2048, reverts: 0)\n\n╭-----------------+------------+-------+---------+----------╮\n| Contract        | Selector   | Calls | Reverts | Discards |\n+===========================================================+\n| RegistryHandler | atomic     | 672   | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| RegistryHandler | bestEffort | 671   | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| RegistryHandler | single     | 705   | 0       | 0        |\n╰-----------------+------------+-------+---------+----------╯\n\n[PASS] invariant_sizeEqualsNumberOfPresentKeys() (runs: 64, calls: 2048, reverts: 0)\n\n╭-----------------+------------+-------+---------+----------╮\n| Contract        | Selector   | Calls | Reverts | Discards |\n+===========================================================+\n| RegistryHandler | atomic     | 672   | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| RegistryHandler | bestEffort | 671   | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| RegistryHandler | single     | 705   | 0       | 0        |\n╰-----------------+------------+-------+---------+----------╯\n\n[PASS] invariant_zeroKeyIsNeverPresent() (runs: 64, calls: 2048, reverts: 0)\n\n╭-----------------+------------+-------+---------+----------╮\n| Contract        | Selector   | Calls | Reverts | Discards |\n+===========================================================+\n| RegistryHandler | atomic     | 672   | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| RegistryHandler | bestEffort | 671   | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| RegistryHandler | single     | 705   | 0       | 0        |\n╰-----------------+------------+-------+---------+----------╯\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 391.07ms (845.65ms CPU time)\n\nRan 4 test suites in 391.98ms (462.64ms CPU time): 45 tests passed, 0 failed, 0 skipped (45 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"2f41d3c7916b3515b285b3d5a0a57c7f944876c38a69f504716670f9607907cb","verifiedTreeHash":"73830742b3d1681624c0df0505de03baa7bd9228","verifierVersion":"0.1.0+bb39ded9"},{"checks":[{"durationMs":3522,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.30s\nCompiler run successful!\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Invariant.t.sol:66:23\n   │\n66 │                 kind: uint8(r % 4),\n   │                       ━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint8' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/ModelEquivalence.t.sol:41:23\n   │\n41 │                 kind: uint8(r % 4), // 0..2 valid, 3 invalid\n   │                       ━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint8' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\n","passed":true},{"durationMs":1174,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/KeyValueRegistry.t.sol:KeyValueRegistryTest\n[PASS] testFuzz_atomicRejectsAtExactPosition(uint8,uint8) (runs: 256, μ: 260345, ~: 205487)\n[PASS] testFuzz_singleOpsRoundTrip(bytes32,bytes32,bytes32) (runs: 256, μ: 90969, ~: 90908)\n[PASS] test_add_refusesExistingKey() (gas: 63491)\n[PASS] test_add_refusesZeroKey() (gas: 11932)\n[PASS] test_add_refusesZeroValue() (gas: 11995)\n[PASS] test_add_storesValueAndCounts() (gas: 64655)\n[PASS] test_atomic_allValidAppliesEverythingInOrder() (gas: 78633)\n[PASS] test_atomic_failureAtFirstPositionKeepsNothing() (gas: 80207)\n[PASS] test_atomic_failureAtLastPositionKeepsNothing() (gas: 107466)\n[PASS] test_atomic_failureAtMiddlePositionKeepsNothing() (gas: 103842)\n[PASS] test_batch_emptyReverts() (gas: 15113)\n[PASS] test_batch_seventeenReverts() (gas: 34649)\n[PASS] test_batch_sixteenIsAccepted() (gas: 910859)\n[PASS] test_bestEffort_allInvalidChangesNothingAndDoesNotRevert() (gas: 30084)\n[PASS] test_bestEffort_failureAtFirstPositionAppliesTheRest() (gas: 110690)\n[PASS] test_bestEffort_failureAtLastPositionAppliesTheRest() (gas: 110690)\n[PASS] test_bestEffort_failureAtMiddlePositionAppliesTheRest() (gas: 130669)\n[PASS] test_check_agreesWithBestEffortStatuses() (gas: 73254)\n[PASS] test_namespaces_areIsolatedPerCaller() (gas: 122358)\n[PASS] test_refusalOrder_kindBeforeKeyBeforeValueBeforeState() (gas: 82524)\n[PASS] test_remove_deletesAndCounts() (gas: 51186)\n[PASS] test_remove_ignoresValueField() (gas: 49118)\n[PASS] test_remove_refusesMissingKey() (gas: 14325)\n[PASS] test_remove_refusesZeroKey() (gas: 11860)\n[PASS] test_repeatedKey_addRemoveAddWithinOneBatch() (gas: 84077)\n[PASS] test_repeatedKey_addThenUpdateSucceedsInBothApis() (gas: 133670)\n[PASS] test_repeatedKey_addTwice_atomicRevertsAtSecond() (gas: 69122)\n[PASS] test_repeatedKey_addTwice_bestEffortKeepsFirst() (gas: 95565)\n[PASS] test_repeatedKey_removeTwice_bestEffortReportsSecondMissing() (gas: 55044)\n[PASS] test_update_refusesMissingKey() (gas: 14305)\n[PASS] test_update_refusesZeroValue() (gas: 61981)\n[PASS] test_update_replacesValue() (gas: 67988)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 54.45ms (119.31ms CPU time)\n\nRan 6 tests for test/Deploy.t.sol:DeployTest\n[PASS] test_deploy_onLocalChainWithExplicitId() (gas: 567609)\n[PASS] test_deploy_onSepoliaWhenChainMatches() (gas: 613463)\n[PASS] test_deploy_refusesChainMismatch() (gas: 9255)\n[PASS] test_deploy_refusesMainnetAndOtherChains() (gas: 12287)\n[PASS] test_deploy_zeroMeansLocalDryRun() (gas: 563999)\n[PASS] test_deployedRuntimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 1315163)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 131.86ms (4.21ms CPU time)\n\nRan 4 tests for test/ModelEquivalence.t.sol:ModelEquivalenceTest\n[PASS] testFuzz_atomicIsAllOrNothingRelativeToBestEffort(uint256) (runs: 256, μ: 212002, ~: 213683)\n[PASS] testFuzz_atomicMatchesNaiveModel(uint256,uint8) (runs: 256, μ: 331347, ~: 297776)\n[PASS] testFuzz_bestEffortEqualsSequentialSingles(uint256) (runs: 256, μ: 306041, ~: 266189)\n[PASS] testFuzz_bestEffortMatchesNaiveModel(uint256,uint8) (runs: 256, μ: 384641, ~: 366702)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 133.53ms (447.52ms CPU time)\n\nRan 3 tests for test/Invariant.t.sol:RegistryInvariantTest\n[PASS] invariant_otherNamespacesUntouched() (runs: 64, calls: 2048, reverts: 0)\n\n╭-----------------+------------+-------+---------+----------╮\n| Contract        | Selector   | Calls | Reverts | Discards |\n+===========================================================+\n| RegistryHandler | atomic     | 667   | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| RegistryHandler | bestEffort | 676   | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| RegistryHandler | single     | 705   | 0       | 0        |\n╰-----------------+------------+-------+---------+----------╯\n\n[PASS] invariant_sizeEqualsNumberOfPresentKeys() (runs: 64, calls: 2048, reverts: 0)\n\n╭-----------------+------------+-------+---------+----------╮\n| Contract        | Selector   | Calls | Reverts | Discards |\n+===========================================================+\n| RegistryHandler | atomic     | 667   | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| RegistryHandler | bestEffort | 676   | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| RegistryHandler | single     | 705   | 0       | 0        |\n╰-----------------+------------+-------+---------+----------╯\n\n[PASS] invariant_zeroKeyIsNeverPresent() (runs: 64, calls: 2048, reverts: 0)\n\n╭-----------------+------------+-------+---------+----------╮\n| Contract        | Selector   | Calls | Reverts | Discards |\n+===========================================================+\n| RegistryHandler | atomic     | 667   | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| RegistryHandler | bestEffort | 676   | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| RegistryHandler | single     | 705   | 0       | 0        |\n╰-----------------+------------+-------+---------+----------╯\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 962.66ms (2.09s CPU time)\n\nRan 4 test suites in 966.96ms (1.28s CPU time): 45 tests passed, 0 failed, 0 skipped (45 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"784cf2ac074d65fc9d762494b6b29692c7e8084d0960131d61a93f704e369d8d","verifiedTreeHash":"4d136e6e759c00427c20cf2656fed99ed6b87389","verifierVersion":"0.1.0+bb39ded9"}]}