{"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":"77fe0357-33ad-4bcd-9e13-2c20d18db5ac","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"ae7d3e847db372bbd155ff7184aff044b46abc2981c7f2256bde06232744c8f7","dependsOn":["build_contract_project","write_foundry_tests"],"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":"cd9240290c0244f0e63f317f9aae11cfd12a7da47d1eed6c3489f92d39f16272","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"05780a306ede918810f88244fc909edff3450dcf1f55ebd0358c0490374657d3","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"ff1fad07fad3b8e08a71e9c5201fd632e161ed8163eb407676ea8b0bedbe179e","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"ff1fad07fad3b8e08a71e9c5201fd632e161ed8163eb407676ea8b0bedbe179e","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Build a minimal ERC-8004-style ('Trustless Agents') registry trio in one Foundry project (Solidity 0.8.26, OpenZeppelin ERC721), with independent tests and a review. ERC-8004 is a draft whose details have changed between revisions, so implement exactly the shapes below, not a particular draft. Local only: do not deploy. No contract holds ETH or has an owner, admin, pause or upgrade path; reads that name an agent id that was never registered revert.\n\n1. AgentIdentityRegistry (src/AgentIdentityRegistry.sol) is an ERC-721 'Agent Identity' / 'AGENT'. register(string agentURI) mints the next id (from 1) to msg.sender, stores agentURI (1-512 bytes) and emits Registered(agentId, owner, agentURI); tokenURI(id) returns it. setAgentURI(id, uri) is allowed for the owner, its approved address or an operator (OpenZeppelin _isAuthorized) and emits AgentURIUpdated(id, uri). Identity follows the token: after a transfer only the new owner and its approvals control the agent (per-token approval clears on transfer as ERC-721 requires). No burn.\n2. AgentReputationRegistry (src/AgentReputationRegistry.sol), constructor(address identityRegistry) (non-zero). giveFeedback(uint256 agentId, bytes32 jobId, uint8 score, bytes32 tag1, bytes32 tag2, string evidenceURI, bytes32 evidenceHash): score 0-100; evidenceURI 0-512 bytes, and empty only together with evidenceHash == 0; one entry per (agentId, client = msg.sender, jobId), a second reverts DuplicateFeedback; any address _isAuthorized for the agent at call time reverts SelfFeedback. revokeFeedback(agentId, jobId) by that client marks the entry revoked once (kept in storage, excluded from summaries; a second revoke reverts). Views: feedback(agentId, client, jobId), feedbackCount(agentId) (all entries ever), summary(agentId) returning (count of non-revoked, sum of their scores, floor average, 0 when count is 0). Events FeedbackGiven(agentId, client, jobId, score, tag1, tag2, evidenceURI, evidenceHash) and FeedbackRevoked(agentId, client, jobId).\n3. AgentValidationRegistry (src/AgentValidationRegistry.sol), constructor(address identityRegistry). requestValidation(uint256 agentId, address validator, string requestURI, bytes32 requestHash) by an address authorized for the agent; validator and requestHash non-zero; returns requestId = keccak256(abi.encode(agentId, requestHash)), and a duplicate requestId reverts (ids are per agent, so nobody can squat another agent's hash). submitResponse(bytes32 requestId, uint8 response, string responseURI, bytes32 responseHash) only by the named validator, response 0-100, only while Pending. States: None -> Pending -> Responded, nothing else. A request made by a previous owner stays valid after the agent is transferred (it belongs to the agent id). Events ValidationRequested and ValidationResponded; view request(requestId) returns the full record. Lists are read from events; no on-chain enumeration beyond the counters.\n\nAcceptance: after transferFrom and safeTransferFrom the new owner can setAgentURI and the old owner and its old approved address cannot; duplicate feedback per (agent, client, job) reverts while the same client can rate another job; the owner, its approved address and an operator cannot self-rate, and neither can a new owner after a transfer; a revoked entry drops out of summary; only the named validator responds, once.","parentJobId":null,"planHash":"65b72c28192289ee361ed5eb13eb22fb49bec748310492fb9ad86b0994500614","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"77fe0357-33ad-4bcd-9e13-2c20d18db5ac","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-279-build-minimal-erc-8004-style-trustless"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51028","feedbackHash":"545c2f4eec99359c05b6ea4e479f16a62eebe47b6a01bcfbaf3d127dd632a4d3","nodeKey":"adversarial_review","submissionHash":"ae7d3e847db372bbd155ff7184aff044b46abc2981c7f2256bde06232744c8f7","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50952","feedbackHash":"077f0f60d3b4b3471e2f8fa83669cae1e35d80dbec92bd4f42bda6a7c029726e","nodeKey":"build_contract_project","submissionHash":"cd9240290c0244f0e63f317f9aae11cfd12a7da47d1eed6c3489f92d39f16272","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51011","feedbackHash":"9321f6346080b37d1b2b440516ad51ae218c3fc20f56526b8774065bc7218d75","nodeKey":"write_foundry_tests","submissionHash":"05780a306ede918810f88244fc909edff3450dcf1f55ebd0358c0490374657d3","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"0ad081190f0b56c339b90a5803139d1436c6eee296894ff34a0991305f25b379","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"0501a37992aefe45d431e9dfb93479c51339989c208965032884c432bde95fca","device":"20c10dbba93106ff","findings":[{"description":"The requested exact validation shape imposes no length limit on requestURI or responseURI. Its only input constraints are authorization, nonzero validator/requestHash, response 0-100, uniqueness, and Pending state. _checkURI adds a 512-byte restriction to both requestValidation and submitResponse. Unlike the explicit identity and reputation URI bounds, this restriction is absent from the assignment and rejects otherwise valid validation inputs. The pre-existing tests expecting InvalidURI for these calls encode the extra restriction; the independent suite does not assert it as correct. No implementation files were changed.","line":151,"path":"src/AgentValidationRegistry.sol","reproduction":"Deploy AgentIdentityRegistry I and AgentValidationRegistry V(address(I)). As address 0xA11CE, call I.register(\"a\") to obtain agent 1. Let U be a string of exactly 513 ASCII 'a' bytes and H = bytes32(uint256(1)). (1) As 0xA11CE call V.requestValidation(1, address(0xDA7A), U, H). Expected: Pending record at keccak256(abi.encode(uint256(1), H)) storing U. Actual: InvalidURI(513). (2) As 0xA11CE create the same request with requestURI = \"\", then as 0xDA7A call V.submitResponse(requestId, 50, U, bytes32(0)). Expected: Responded record with response 50 and responseURI U. Actual: InvalidURI(513), leaving the request Pending. Both success-expecting reproductions were run locally and failed with InvalidURI(513). A self-contained reproducer is included in test/independent/REVIEW.md.","severity":"low","title":"Validation requests and responses reject URIs above an unspecified 512-byte cap"}],"hash":"05780a306ede918810f88244fc909edff3450dcf1f55ebd0358c0490374657d3","nodeId":"46823e50-0896-4e2b-9fc6-7d1ac79d04df","outcome":"completed","summary":"Added 32 independent checks covering acceptance cases, failures, fuzzed scores/averages, and handler-based ledger invariants.\n\n`forge build` succeeded; `forge test`: **128 passed, 0 failed**.\n\nReported one low-severity defect: validation rejects 513-byte URIs despite no specified cap. Details are in `.imd-findings.json`; review and reproductions are in `test/independent/REVIEW.md`.","treeHash":"1f9c2d4b474935675d17fd6f2b852e53e0805b5f","usage":{"cachedInputTokens":596864,"inputTokens":61372,"model":"gpt-6-astra","outputTokens":20759,"runtime":"codex","turns":5,"wallClockMs":673019}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3a271480f26269e3","findings":[{"description":"Both requestValidation and submitResponse call _checkURI, which rejects strings longer than 512 bytes. The requested design explicitly limits identity and reputation URIs, but imposes no such limit on validation requestURI or responseURI. Consequently, an authorized requester cannot submit an otherwise valid request with a 513-byte URI, and the named validator cannot record an otherwise valid response with one. This is an input-compatibility defect, not an authorization bypass. The existing test_Request_RevertsOnOversizedURI and test_Respond_RevertsOnOversizedURI tests assert this extra restriction instead of detecting the mismatch.","line":151,"path":"src/AgentValidationRegistry.sol","reproduction":"Deploy AgentIdentityRegistry and AgentValidationRegistry(address(identity)) locally. Let Alice register(\"ipfs://agent\"), producing agentId 1. Set validator = 0x000000000000000000000000000000000000DA7A, h = keccak256(bytes(\"request\")), and uri513 to exactly 513 ASCII 'a' bytes. (1) As Alice, call requestValidation(1, validator, uri513, h). Expected: return keccak256(abi.encode(uint256(1), h)) and store a Pending request containing uri513. Actual: InvalidURI(513), with no request created. (2) As Alice, call requestValidation(1, validator, \"ipfs://request\", h), then as validator call submitResponse(theReturnedId, 50, uri513, keccak256(bytes(\"response\"))). Expected: store the response and transition Pending to Responded. Actual: InvalidURI(513), leaving the request Pending. Both 513-byte reverts were independently confirmed from the existing tests' execution traces using: forge test --offline --out /tmp/imd-review-ffc1d264/out --cache-path /tmp/imd-review-ffc1d264/cache --match-contract '^AgentValidationRegistryTest$' --match-test 'test_(Request|Respond)_RevertsOnOversizedURI' -vvvv. Those tests pass because they expect the nonconforming reverts.","severity":"low","title":"Unspecified validation URI cap rejects otherwise valid requests and responses"}],"hash":"ae7d3e847db372bbd155ff7184aff044b46abc2981c7f2256bde06232744c8f7","nodeId":"ffc1d264-4353-4843-8a68-568d491aab0f","outcome":"completed","summary":"Wrote one **low-severity** finding to [.imd-findings.json](/root/.identitymd/work/77fe0357-33ad-4bcd-9e13-2c20d18db5ac/ffc1d264-4353-4843-8a68-568d491aab0f/.imd-findings.json): validation rejects 513-byte request and response URIs despite no specified cap. Confirmed both reverts with Foundry traces.\n\nNo authorization bypass or cross-party record overwrite was substantiated. Second-wallet self-rating remains a Sybil limitation. Implementation and tests are unchanged.","treeHash":null,"usage":{"cachedInputTokens":337536,"inputTokens":52186,"model":"gpt-6-astra","outputTokens":3828,"runtime":"codex","turns":4,"wallClockMs":151415}},{"artifacts":[],"attempt":1,"bundleHash":"0cb641a7bb1c14404d079458f7cfbd71081c5d2c95c3f76af824b6c449b9fad0","device":"ce6eaff570c608ab","findings":[],"hash":"cd9240290c0244f0e63f317f9aae11cfd12a7da47d1eed6c3489f92d39f16272","nodeId":"e6c81e61-7e70-44e7-8f5d-7f0d5f63ba73","outcome":"completed","summary":"The work is complete and committed on `main` as commit `12820a1`. A fresh clone of that commit builds, passes all tests, and passes the format check with no network.\n\n**What was built**\n\n- `src/AgentIdentityRegistry.sol`: ERC-721 \"Agent Identity\" (AGENT) on OpenZeppelin v5.4.0. Sequential ids from 1, URI 1-512 bytes, `setAgentURI` gated by OpenZeppelin's `_isAuthorized`. Plain `_mint` so registration has no external call. No burn, no owner.\n- `src/AgentReputationRegistry.sol`: one entry per (agent, client, job), `SelfFeedback` for any address authorized at call time, single revoke that keeps the record but drops it from an O(1) running summary. All views revert for unregistered agents.\n- `src/AgentValidationRegistry.sol`: agent-scoped request ids, named-validator-only response, strict None to Pending to Responded, requests survive transfers. Only per-agent counters on chain.\n- `script/Deploy.s.sol`: pure `deployAll()` tested directly; `run()` reads nothing from the environment.\n- Vendored OpenZeppelin v5.4.0 and forge-std v1.11.0 under `lib/` as ordinary tracked files. Nested git metadata was stripped and `git submodule status` reports nothing.\n\n**Verification**\n\n| Check | Result |\n| --- | --- |\n| `forge build` (solc 0.8.26, no lint warnings) | pass |\n| `forge test` | 94 passed, 0 failed |\n| `forge fmt --check` | pass |\n| Fresh clone, `--offline` build and test | pass |\n\nTests cover every acceptance item: control moves on `transferFrom` and `safeTransferFrom` and old owner plus old approved address lose it, duplicate feedback reverts while a second job works, owner, approved, operator, and post-transfer new owner all hit `SelfFeedback`, a revoked entry leaves the summary, and only the named validator responds once. Fuzz tests plus a handler-based invariant suite with `fail_on_revert` check the summary accounting, the validation state machine and counters, and that no contract holds ETH.\n\n**Documentation**\n\n- `README.md`: layout, toolchain, behaviour summary.\n- `docs/DESIGN.md`: design choices, trust assumptions, the single deployment parameter, operational responsibilities, known limitations.\n- `docs/REVIEW.md`: attacker-question review with a conformance table, two recorded observations (self-named validators permitted, revoked slot stays blocked), and an explicit list of untested edges.\n\n**Open items for whoever picks this up**\n\n- Sybil resistance is out of scope by specification. `SelfFeedback` is point-in-time, so consumers of `summary` need their own weighting.\n- Self-named validators and uncancellable pending requests are as specified, not defects.\n- This is a self-review. An independent adversarial review is still needed before anything relies on these registries.","treeHash":"8c21cdaaded233eab6acaea4ee91c091c0373a97","usage":{"cachedInputTokens":2481102,"inputTokens":1410,"model":"claude-fable-5-1","outputTokens":57285,"runtime":"claude","turns":45,"wallClockMs":1019160}}],"verification":[{"checks":[{"durationMs":3223,"exitCode":0,"name":"build","output":"Compiling 50 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.15s\nCompiler run successful!\nwarning: unknown id: 'unsafe-oz-erc721-mint'\n   ╭▸ src/AgentIdentityRegistry.sol:27:9\n   │\n27 │         // forge-lint: disable-next-line(unsafe-oz-erc721-mint)\n   ╰╴        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nwarning: unknown id: 'unused-return'\n    ╭▸ src/AgentReputationRegistry.sol:140:9\n    │\n140 │         // forge-lint: disable-next-line(unused-return)\n    ╰╴        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Deploy.t.sol:44:40\n   │\n44 │         reputation.giveFeedback(agent, bytes32(\"job\"), 100, 0, 0, \"\", 0);\n   │                                        ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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/Deploy.t.sol:46:40\n   │\n46 │         reputation.giveFeedback(agent, bytes32(\"job\"), 75, 0, 0, \"ipfs://e\", keccak256(\"e\"));\n   │                                        ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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: unknown id: 'unused-return'\n    ╭▸ src/AgentValidationRegistry.sol:145:9\n    │\n145 │         // forge-lint: disable-next-line(unused-return)\n    ╰╴        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Deploy.t.sol:71:40\n   │\n71 │         reputation.giveFeedback(agent, bytes32(\"job-2\"), 100, 0, 0, \"\", 0);\n   │                                        ━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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/Deploy.t.sol:73:40\n   │\n73 │         reputation.giveFeedback(agent, bytes32(\"job-2\"), 25, 0, 0, \"\", 0);\n   │                                        ━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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[incorrect-shift]: the order of args in a shift operation is incorrect\n    ╭▸ test/AgentReputationRegistry.t.sol:385:31\n    │\n385 │             if (revokeMask & (1 << i) != 0) {\n    │                               ━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#incorrect-shift\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/invariant/Registries.invariant.t.sol:38:33\n   │\n38 │             actors.push(address(uint160(0xA000 + k)));\n   │                                 ━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint160' 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/AgentReputationRegistry.t.sol:23:38\n   │\n23 │     bytes32 internal constant TAG1 = bytes32(\"quality\");\n   │                                      ━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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/AgentReputationRegistry.t.sol:24:38\n   │\n24 │     bytes32 internal constant TAG2 = bytes32(\"speed\");\n   │                                      ━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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/AgentReputationRegistry.t.sol:382:38\n    │\n382 │             address client = address(uint160(0x1000 + i));\n    │                                      ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' 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":1697,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/Deploy.t.sol:DeployTest\n[PASS] test_DeployAll_WiresRegistries() (gas: 30885)\n[PASS] test_EndToEnd_RegisterRateValidateTransfer() (gas: 528012)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 968.29µs (253.42µs CPU time)\n\nRan 9 tests for test/independent/IdentityAcceptance.t.sol:IndependentIdentityAcceptanceTest\n[PASS] testFuzz_URIByteBoundariesAndFailedRegistrationDoesNotConsumeId(uint16) (runs: 256, μ: 358028, ~: 303303)\n[PASS] test_ReceiverCallbackSeesNewOwnerAndClearedApproval() (gas: 794654)\n[PASS] test_RegistrationSequenceMetadataAndEvent() (gas: 110437)\n[PASS] test_RejectingReceiverRollsBackCrossRegistryWritesAndApprovalClear() (gas: 811488)\n[PASS] test_RevokingApprovalsImmediatelyRemovesURIControl() (gas: 64114)\n[PASS] test_SafeTransferFromMovesAllControl() (gas: 189190)\n[PASS] test_SafeTransferFromWithDataMovesAllControl() (gas: 189446)\n[PASS] test_TransferFromMovesAllControl() (gas: 186306)\n[PASS] test_URILimitsCountUTF8Bytes() (gas: 485016)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 16.59ms (19.41ms CPU time)\n\nRan 4 tests for test/independent/RegistryBoundaries.t.sol:IndependentRegistryBoundariesTest\n[PASS] testFuzz_UnregisteredAgentReadsAndWritesRevert(uint256) (runs: 256, μ: 99663, ~: 99672)\n[PASS] test_AllRegistriesRejectOrdinaryEtherTransfers() (gas: 40128)\n[PASS] test_UnregisteredZeroAndNextIdReadsRevert() (gas: 241097)\n[PASS] test_ZeroRegistryConstructorsRevert() (gas: 69811)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 20.32ms (20.15ms CPU time)\n\nRan 7 tests for test/independent/ValidationAcceptance.t.sol:IndependentValidationAcceptanceTest\n[PASS] testFuzz_RequestIdIsAgentScopedAndCannotBeSquatted(bytes32) (runs: 256, μ: 331068, ~: 331068)\n[PASS] testFuzz_ResponseRangeAndRetryAfterInvalidScore(uint8) (runs: 256, μ: 182776, ~: 180393)\n[PASS] test_ApprovedAndOperatorRequestsSurviveSafeTransferFrom() (gas: 665751)\n[PASS] test_ApprovedAndOperatorRequestsSurviveTransferFrom() (gas: 662868)\n[PASS] test_OnlyNamedValidatorRespondsOnceWithFullRecordsAndEvents() (gas: 376455)\n[PASS] test_UnknownRequestCannotBeReadOrAnswered() (gas: 48235)\n[PASS] test_ZeroValidatorAndZeroHashDoNotReserveARequest() (gas: 144769)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 26.74ms (51.20ms CPU time)\n\nRan 28 tests for test/AgentValidationRegistry.t.sol:AgentValidationRegistryTest\n[PASS] testFuzz_RequestId_IsAgentScoped(uint256,uint256,bytes32) (runs: 256, μ: 9834, ~: 9834)\n[PASS] testFuzz_Respond_OnlyNamedValidator(address,uint8) (runs: 256, μ: 162096, ~: 162221)\n[PASS] test_Constructor_RevertsOnZeroRegistry() (gas: 36493)\n[PASS] test_Constructor_StoresRegistry() (gas: 8573)\n[PASS] test_Counters_RevertOnUnregisteredAgent() (gas: 21732)\n[PASS] test_RejectsPlainEther() (gas: 17323)\n[PASS] test_Request_ByApprovedAndOperator() (gas: 360382)\n[PASS] test_Request_ByOwner_StoresRecordAndEmits() (gas: 183505)\n[PASS] test_Request_EmptyURIAllowed() (gas: 148413)\n[PASS] test_Request_OldOwnerCannotRequestAfterTransfer() (gas: 227767)\n[PASS] test_Request_RevertsForUnauthorizedCaller() (gas: 26874)\n[PASS] test_Request_RevertsForUnregisteredAgent() (gas: 19615)\n[PASS] test_Request_RevertsForValidatorItselfWhenNotAuthorized() (gas: 24950)\n[PASS] test_Request_RevertsOnDuplicateId() (gas: 178085)\n[PASS] test_Request_RevertsOnDuplicateIdAfterResponse() (gas: 236793)\n[PASS] test_Request_RevertsOnOversizedURI() (gas: 86364)\n[PASS] test_Request_RevertsOnZeroHash() (gas: 15773)\n[PASS] test_Request_RevertsOnZeroValidator() (gas: 13746)\n[PASS] test_Request_SameHashDifferentAgentsGetDifferentIds() (gas: 401651)\n[PASS] test_Request_ViewRevertsOnUnknownId() (gas: 28328)\n[PASS] test_Respond_BoundaryValuesAndEmptyURI() (gas: 335239)\n[PASS] test_Respond_ByValidator_StoresAndEmits() (gas: 249305)\n[PASS] test_Respond_RequestSurvivesAgentTransfer() (gas: 282751)\n[PASS] test_Respond_RevertsForNonValidator() (gas: 188173)\n[PASS] test_Respond_RevertsOnOversizedURI() (gas: 231488)\n[PASS] test_Respond_RevertsOnResponseAbove100() (gas: 161365)\n[PASS] test_Respond_RevertsOnSecondResponse() (gas: 243623)\n[PASS] test_Respond_RevertsOnUnknownRequest() (gas: 14271)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 27.30ms (31.66ms CPU time)\n\nRan 34 tests for test/AgentReputationRegistry.t.sol:AgentReputationRegistryTest\n[PASS] testFuzz_GiveFeedback_ScoreBounds(uint8) (runs: 256, μ: 98213, ~: 126047)\n[PASS] testFuzz_SummaryMatchesRecomputation(uint8[8],uint8) (runs: 256, μ: 445310, ~: 443342)\n[PASS] test_Constructor_RevertsOnZeroRegistry() (gas: 36439)\n[PASS] test_Constructor_StoresRegistry() (gas: 9287)\n[PASS] test_GiveFeedback_BoundaryScoresAccepted() (gas: 172867)\n[PASS] test_GiveFeedback_EmptyURIWithZeroHashAllowed() (gas: 131196)\n[PASS] test_GiveFeedback_MaxLengthURIAllowed() (gas: 603218)\n[PASS] test_GiveFeedback_RevertsOnDuplicate() (gas: 173184)\n[PASS] test_GiveFeedback_RevertsOnDuplicateEvenAfterRevoke() (gas: 104050)\n[PASS] test_GiveFeedback_RevertsOnEmptyURIWithHash() (gas: 13717)\n[PASS] test_GiveFeedback_RevertsOnOversizedURI() (gas: 84371)\n[PASS] test_GiveFeedback_RevertsOnScoreAbove100() (gas: 13994)\n[PASS] test_GiveFeedback_RevertsOnUnregisteredAgent() (gas: 17367)\n[PASS] test_GiveFeedback_SameClientDifferentJobs() (gas: 171015)\n[PASS] test_GiveFeedback_SameJobDifferentClientsAndAgents() (gas: 372129)\n[PASS] test_GiveFeedback_StoresEntryEmitsAndUpdatesSummary() (gas: 222625)\n[PASS] test_GiveFeedback_URIWithZeroHashAllowed() (gas: 152619)\n[PASS] test_OldOwnerCanRateAfterTransfer() (gas: 162519)\n[PASS] test_RejectsPlainEther() (gas: 17345)\n[PASS] test_Revoke_DropsEntryFromSummaryButKeepsIt() (gas: 269455)\n[PASS] test_Revoke_LastEntryYieldsZeroSummary() (gas: 104065)\n[PASS] test_Revoke_OnlyAuthorReverts_OthersCannotRevoke() (gas: 145066)\n[PASS] test_Revoke_SecondRevokeReverts() (gas: 102261)\n[PASS] test_Revoke_UnknownEntryReverts() (gas: 16130)\n[PASS] test_Revoke_UnregisteredAgentReverts() (gas: 13891)\n[PASS] test_Revoke_WorksAfterAgentTransfer() (gas: 135307)\n[PASS] test_SelfFeedback_ApprovedReverts() (gas: 52994)\n[PASS] test_SelfFeedback_NewOwnerAndItsApprovalsRevertAfterTransfer() (gas: 121584)\n[PASS] test_SelfFeedback_OperatorOfOtherOwnerCanRate() (gas: 157852)\n[PASS] test_SelfFeedback_OperatorReverts() (gas: 50263)\n[PASS] test_SelfFeedback_OwnerReverts() (gas: 20229)\n[PASS] test_Summary_FloorAverage() (gas: 172879)\n[PASS] test_Views_RegisteredAgentWithoutFeedbackReturnsZeros() (gas: 39591)\n[PASS] test_Views_RevertOnUnregisteredAgent() (gas: 33697)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 27.33ms (54.27ms CPU time)\n\nRan 9 tests for test/independent/ReputationAcceptance.t.sol:IndependentReputationAcceptanceTest\n[PASS] testFuzz_AverageAfterEveryWriteAndArbitrarilyOrderedRevocations(uint8[16],uint16,uint8) (runs: 256, μ: 852127, ~: 844991)\n[PASS] testFuzz_ScoresAcceptExactlyZeroThroughOneHundred(uint8) (runs: 256, μ: 113519, ~: 107578)\n[PASS] test_DuplicateCannotOverwriteLiveOrRevokedEntryButOtherKeysWork() (gas: 360093)\n[PASS] test_EvidenceBoundariesAndRejectedWritesDoNotReserveKeys() (gas: 785920)\n[PASS] test_FeedbackEventAndFullRecordSurviveRevocation() (gas: 190638)\n[PASS] test_OnlyClientRevokesOnceAndFailuresPreserveSummary() (gas: 161702)\n[PASS] test_OwnerApprovedAndOperatorCannotSelfRate() (gas: 207117)\n[PASS] test_SafeTransferFromChangesSelfFeedbackEligibility() (gas: 369621)\n[PASS] test_TransferFromChangesSelfFeedbackEligibility() (gas: 369282)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 766.68ms (68.78ms CPU time)\n\nRan 29 tests for test/AgentIdentityRegistry.t.sol:AgentIdentityRegistryTest\n[PASS] testFuzz_Register_AnyValidURI(bytes) (runs: 256, μ: 136067, ~: 131370)\n[PASS] testFuzz_SetAgentURI_OnlyAuthorized(address) (runs: 256, μ: 113597, ~: 113597)\n[PASS] test_IsAuthorized_ZeroAddressNeverAuthorized() (gas: 116536)\n[PASS] test_NameSymbolAndInterfaces() (gas: 25542)\n[PASS] test_NoBurnFunctionExposed() (gas: 108010)\n[PASS] test_NoOwnerOrPauseSurface() (gas: 7105)\n[PASS] test_Reads_RevertOnUnregisteredId() (gas: 133412)\n[PASS] test_Register_AcceptsMaxLengthURI() (gas: 539106)\n[PASS] test_Register_ContractWithoutReceiverCanRegister() (gas: 228365)\n[PASS] test_Register_MintsSequentialIdsFromOne() (gas: 196169)\n[PASS] test_Register_RevertsOnEmptyURI() (gas: 11623)\n[PASS] test_Register_RevertsOnOversizedURI() (gas: 82002)\n[PASS] test_Register_SameAddressCanRegisterManyAgents() (gas: 159887)\n[PASS] test_RejectsPlainEther() (gas: 17743)\n[PASS] test_SafeTransferFrom_NewOwnerControls_OldOwnerAndApprovedDoNot() (gas: 159849)\n[PASS] test_SafeTransferFrom_ToContractReceiver() (gas: 223092)\n[PASS] test_SetAgentURI_ByApproved() (gas: 144302)\n[PASS] test_SetAgentURI_ByOperator() (gas: 141556)\n[PASS] test_SetAgentURI_ByOwner() (gas: 116265)\n[PASS] test_SetAgentURI_RevertsAfterApprovalRevoked() (gas: 138029)\n[PASS] test_SetAgentURI_RevertsForApprovedOfOtherToken() (gas: 193582)\n[PASS] test_SetAgentURI_RevertsForStranger() (gas: 118317)\n[PASS] test_SetAgentURI_RevertsOnEmptyOrOversizedURI() (gas: 180239)\n[PASS] test_SetAgentURI_RevertsOnUnregisteredId() (gas: 14063)\n[PASS] test_TransferFrom_NewOwnerControls_OldOwnerAndApprovedDoNot() (gas: 156999)\n[PASS] test_Transfer_ByApprovedMovesControl() (gas: 159635)\n[PASS] test_Transfer_NewOwnersExistingOperatorGainsControl() (gas: 153240)\n[PASS] test_Transfer_OldOwnersOperatorLosesControlOfTransferredToken() (gas: 154486)\n[PASS] test_Transfer_URIIsPreserved() (gas: 120270)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 766.73ms (37.22ms CPU time)\n\nRan 3 tests for test/invariant/Registries.invariant.t.sol:RegistriesInvariantTest\n[PASS] invariant_IdentityIsConsistent() (runs: 32, calls: 2048, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| RegistriesHandler | approveSomeone | 329   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | give           | 322   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | requestVal     | 327   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | respond        | 360   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | revoke         | 352   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | transfer       | 358   | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\n[PASS] invariant_SummaryMatchesGhost() (runs: 32, calls: 2048, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| RegistriesHandler | approveSomeone | 329   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | give           | 322   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | requestVal     | 327   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | respond        | 360   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | revoke         | 352   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | transfer       | 358   | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\n[PASS] invariant_ValidationCountersAndStates() (runs: 32, calls: 2048, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| RegistriesHandler | approveSomeone | 329   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | give           | 322   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | requestVal     | 327   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | respond        | 360   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | revoke         | 352   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | transfer       | 358   | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 766.70ms (1.41s CPU time)\n\nRan 3 tests for test/independent/ReputationLedger.invariant.t.sol:IndependentReputationInvariantTest\n[PASS] invariant_AuthorizationMatchesIndependentOwnershipModel() (runs: 32, calls: 2048, reverts: 0)\n\n╭------------------------------+---------------+-------+---------+----------╮\n| Contract                     | Selector      | Calls | Reverts | Discards |\n+===========================================================================+\n| IndependentReputationHandler | approve       | 289   | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| IndependentReputationHandler | give          | 306   | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| IndependentReputationHandler | registerAgent | 301   | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| IndependentReputationHandler | revoke        | 281   | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| IndependentReputationHandler | revokeKnown   | 300   | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| IndependentReputationHandler | setOperator   | 295   | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| IndependentReputationHandler | transfer      | 276   | 0       | 0        |\n╰------------------------------+---------------+-------+---------+----------╯\n\n[PASS] invariant_SummariesEqualGivenMinusRevokedAndIndependentLedger() (runs: 32, calls: 2048, reverts: 0)\n\n╭------------------------------+---------------+-------+---------+----------╮\n| Contract                     | Selector      | Calls | Reverts | Discards |\n+===========================================================================+\n| IndependentReputationHandler | approve       | 289   | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| IndependentReputationHandler | give          | 306   | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| IndependentReputationHandler | registerAgent | 301   | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| IndependentReputationHandler | revoke        | 281   | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| IndependentReputationHandler | revokeKnown   | 300   | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| IndependentReputationHandler | setOperator   | 295   | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| IndependentReputationHandler | transfer      | 276   | 0       | 0        |\n╰------------------------------+---------------+-------+---------+----------╯\n\n[PASS] test_HandlerExercisesDuplicateRevocationAndAuthorizationTransitions() (gas: 1402479)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.61s (2.79s CPU time)\n\nRan 10 test suites in 1.62s (4.03s CPU time): 128 tests passed, 0 failed, 0 skipped (128 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"05780a306ede918810f88244fc909edff3450dcf1f55ebd0358c0490374657d3","verifiedTreeHash":"1f9c2d4b474935675d17fd6f2b852e53e0805b5f","verifierVersion":"0.1.0+ff982c0f"},{"checks":[{"durationMs":2183,"exitCode":0,"name":"build","output":"Compiling 44 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.10s\nCompiler run successful!\nwarning: unknown id: 'unused-return'\n    ╭▸ src/AgentValidationRegistry.sol:145:9\n    │\n145 │         // forge-lint: disable-next-line(unused-return)\n    ╰╴        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nwarning: unknown id: 'unsafe-oz-erc721-mint'\n   ╭▸ src/AgentIdentityRegistry.sol:27:9\n   │\n27 │         // forge-lint: disable-next-line(unsafe-oz-erc721-mint)\n   ╰╴        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Deploy.t.sol:44:40\n   │\n44 │         reputation.giveFeedback(agent, bytes32(\"job\"), 100, 0, 0, \"\", 0);\n   │                                        ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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/Deploy.t.sol:46:40\n   │\n46 │         reputation.giveFeedback(agent, bytes32(\"job\"), 75, 0, 0, \"ipfs://e\", keccak256(\"e\"));\n   │                                        ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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/Deploy.t.sol:71:40\n   │\n71 │         reputation.giveFeedback(agent, bytes32(\"job-2\"), 100, 0, 0, \"\", 0);\n   │                                        ━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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/Deploy.t.sol:73:40\n   │\n73 │         reputation.giveFeedback(agent, bytes32(\"job-2\"), 25, 0, 0, \"\", 0);\n   │                                        ━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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: unknown id: 'unused-return'\n    ╭▸ src/AgentReputationRegistry.sol:140:9\n    │\n140 │         // forge-lint: disable-next-line(unused-return)\n    ╰╴        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nwarning[incorrect-shift]: the order of args in a shift operation is incorrect\n    ╭▸ test/AgentReputationRegistry.t.sol:385:31\n    │\n385 │             if (revokeMask & (1 << i) != 0) {\n    │                               ━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#incorrect-shift\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/invariant/Registries.invariant.t.sol:38:33\n   │\n38 │             actors.push(address(uint160(0xA000 + k)));\n   │                                 ━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint160' 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/AgentReputationRegistry.t.sol:23:38\n   │\n23 │     bytes32 internal constant TAG1 = bytes32(\"quality\");\n   │                                      ━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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/AgentReputationRegistry.t.sol:24:38\n   │\n24 │     bytes32 internal constant TAG2 = bytes32(\"speed\");\n   │                                      ━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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/AgentReputationRegistry.t.sol:382:38\n    │\n382 │             address client = address(uint160(0x1000 + i));\n    │                                      ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' 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":790,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/Deploy.t.sol:DeployTest\n[PASS] test_DeployAll_WiresRegistries() (gas: 30885)\n[PASS] test_EndToEnd_RegisterRateValidateTransfer() (gas: 528012)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.51ms (720.38µs CPU time)\n\nRan 34 tests for test/AgentReputationRegistry.t.sol:AgentReputationRegistryTest\n[PASS] testFuzz_GiveFeedback_ScoreBounds(uint8) (runs: 256, μ: 99932, ~: 126047)\n[PASS] testFuzz_SummaryMatchesRecomputation(uint8[8],uint8) (runs: 256, μ: 442629, ~: 443342)\n[PASS] test_Constructor_RevertsOnZeroRegistry() (gas: 36439)\n[PASS] test_Constructor_StoresRegistry() (gas: 9287)\n[PASS] test_GiveFeedback_BoundaryScoresAccepted() (gas: 172867)\n[PASS] test_GiveFeedback_EmptyURIWithZeroHashAllowed() (gas: 131196)\n[PASS] test_GiveFeedback_MaxLengthURIAllowed() (gas: 603218)\n[PASS] test_GiveFeedback_RevertsOnDuplicate() (gas: 173184)\n[PASS] test_GiveFeedback_RevertsOnDuplicateEvenAfterRevoke() (gas: 104050)\n[PASS] test_GiveFeedback_RevertsOnEmptyURIWithHash() (gas: 13717)\n[PASS] test_GiveFeedback_RevertsOnOversizedURI() (gas: 84371)\n[PASS] test_GiveFeedback_RevertsOnScoreAbove100() (gas: 13994)\n[PASS] test_GiveFeedback_RevertsOnUnregisteredAgent() (gas: 17367)\n[PASS] test_GiveFeedback_SameClientDifferentJobs() (gas: 171015)\n[PASS] test_GiveFeedback_SameJobDifferentClientsAndAgents() (gas: 372129)\n[PASS] test_GiveFeedback_StoresEntryEmitsAndUpdatesSummary() (gas: 222625)\n[PASS] test_GiveFeedback_URIWithZeroHashAllowed() (gas: 152619)\n[PASS] test_OldOwnerCanRateAfterTransfer() (gas: 162519)\n[PASS] test_RejectsPlainEther() (gas: 17345)\n[PASS] test_Revoke_DropsEntryFromSummaryButKeepsIt() (gas: 269455)\n[PASS] test_Revoke_LastEntryYieldsZeroSummary() (gas: 104065)\n[PASS] test_Revoke_OnlyAuthorReverts_OthersCannotRevoke() (gas: 145066)\n[PASS] test_Revoke_SecondRevokeReverts() (gas: 102261)\n[PASS] test_Revoke_UnknownEntryReverts() (gas: 16130)\n[PASS] test_Revoke_UnregisteredAgentReverts() (gas: 13891)\n[PASS] test_Revoke_WorksAfterAgentTransfer() (gas: 135307)\n[PASS] test_SelfFeedback_ApprovedReverts() (gas: 52994)\n[PASS] test_SelfFeedback_NewOwnerAndItsApprovalsRevertAfterTransfer() (gas: 121584)\n[PASS] test_SelfFeedback_OperatorOfOtherOwnerCanRate() (gas: 157852)\n[PASS] test_SelfFeedback_OperatorReverts() (gas: 50263)\n[PASS] test_SelfFeedback_OwnerReverts() (gas: 20229)\n[PASS] test_Summary_FloorAverage() (gas: 172879)\n[PASS] test_Views_RegisteredAgentWithoutFeedbackReturnsZeros() (gas: 39591)\n[PASS] test_Views_RevertOnUnregisteredAgent() (gas: 33697)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 23.48ms (48.64ms CPU time)\n\nRan 28 tests for test/AgentValidationRegistry.t.sol:AgentValidationRegistryTest\n[PASS] testFuzz_RequestId_IsAgentScoped(uint256,uint256,bytes32) (runs: 256, μ: 9834, ~: 9834)\n[PASS] testFuzz_Respond_OnlyNamedValidator(address,uint8) (runs: 256, μ: 162110, ~: 162221)\n[PASS] test_Constructor_RevertsOnZeroRegistry() (gas: 36493)\n[PASS] test_Constructor_StoresRegistry() (gas: 8573)\n[PASS] test_Counters_RevertOnUnregisteredAgent() (gas: 21732)\n[PASS] test_RejectsPlainEther() (gas: 17323)\n[PASS] test_Request_ByApprovedAndOperator() (gas: 360382)\n[PASS] test_Request_ByOwner_StoresRecordAndEmits() (gas: 183505)\n[PASS] test_Request_EmptyURIAllowed() (gas: 148413)\n[PASS] test_Request_OldOwnerCannotRequestAfterTransfer() (gas: 227767)\n[PASS] test_Request_RevertsForUnauthorizedCaller() (gas: 26874)\n[PASS] test_Request_RevertsForUnregisteredAgent() (gas: 19615)\n[PASS] test_Request_RevertsForValidatorItselfWhenNotAuthorized() (gas: 24950)\n[PASS] test_Request_RevertsOnDuplicateId() (gas: 178085)\n[PASS] test_Request_RevertsOnDuplicateIdAfterResponse() (gas: 236793)\n[PASS] test_Request_RevertsOnOversizedURI() (gas: 86364)\n[PASS] test_Request_RevertsOnZeroHash() (gas: 15773)\n[PASS] test_Request_RevertsOnZeroValidator() (gas: 13746)\n[PASS] test_Request_SameHashDifferentAgentsGetDifferentIds() (gas: 401651)\n[PASS] test_Request_ViewRevertsOnUnknownId() (gas: 28328)\n[PASS] test_Respond_BoundaryValuesAndEmptyURI() (gas: 335239)\n[PASS] test_Respond_ByValidator_StoresAndEmits() (gas: 249305)\n[PASS] test_Respond_RequestSurvivesAgentTransfer() (gas: 282751)\n[PASS] test_Respond_RevertsForNonValidator() (gas: 188173)\n[PASS] test_Respond_RevertsOnOversizedURI() (gas: 231488)\n[PASS] test_Respond_RevertsOnResponseAbove100() (gas: 161365)\n[PASS] test_Respond_RevertsOnSecondResponse() (gas: 243623)\n[PASS] test_Respond_RevertsOnUnknownRequest() (gas: 14271)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 702.81ms (22.90ms CPU time)\n\nRan 29 tests for test/AgentIdentityRegistry.t.sol:AgentIdentityRegistryTest\n[PASS] testFuzz_Register_AnyValidURI(bytes) (runs: 256, μ: 141862, ~: 131370)\n[PASS] testFuzz_SetAgentURI_OnlyAuthorized(address) (runs: 256, μ: 113597, ~: 113597)\n[PASS] test_IsAuthorized_ZeroAddressNeverAuthorized() (gas: 116536)\n[PASS] test_NameSymbolAndInterfaces() (gas: 25542)\n[PASS] test_NoBurnFunctionExposed() (gas: 108010)\n[PASS] test_NoOwnerOrPauseSurface() (gas: 7105)\n[PASS] test_Reads_RevertOnUnregisteredId() (gas: 133412)\n[PASS] test_Register_AcceptsMaxLengthURI() (gas: 539106)\n[PASS] test_Register_ContractWithoutReceiverCanRegister() (gas: 228365)\n[PASS] test_Register_MintsSequentialIdsFromOne() (gas: 196169)\n[PASS] test_Register_RevertsOnEmptyURI() (gas: 11623)\n[PASS] test_Register_RevertsOnOversizedURI() (gas: 82002)\n[PASS] test_Register_SameAddressCanRegisterManyAgents() (gas: 159887)\n[PASS] test_RejectsPlainEther() (gas: 17743)\n[PASS] test_SafeTransferFrom_NewOwnerControls_OldOwnerAndApprovedDoNot() (gas: 159849)\n[PASS] test_SafeTransferFrom_ToContractReceiver() (gas: 223092)\n[PASS] test_SetAgentURI_ByApproved() (gas: 144302)\n[PASS] test_SetAgentURI_ByOperator() (gas: 141556)\n[PASS] test_SetAgentURI_ByOwner() (gas: 116265)\n[PASS] test_SetAgentURI_RevertsAfterApprovalRevoked() (gas: 138029)\n[PASS] test_SetAgentURI_RevertsForApprovedOfOtherToken() (gas: 193582)\n[PASS] test_SetAgentURI_RevertsForStranger() (gas: 118317)\n[PASS] test_SetAgentURI_RevertsOnEmptyOrOversizedURI() (gas: 180239)\n[PASS] test_SetAgentURI_RevertsOnUnregisteredId() (gas: 14063)\n[PASS] test_TransferFrom_NewOwnerControls_OldOwnerAndApprovedDoNot() (gas: 156999)\n[PASS] test_Transfer_ByApprovedMovesControl() (gas: 159635)\n[PASS] test_Transfer_NewOwnersExistingOperatorGainsControl() (gas: 153240)\n[PASS] test_Transfer_OldOwnersOperatorLosesControlOfTransferredToken() (gas: 154486)\n[PASS] test_Transfer_URIIsPreserved() (gas: 120270)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 702.83ms (48.90ms CPU time)\n\nRan 3 tests for test/invariant/Registries.invariant.t.sol:RegistriesInvariantTest\n[PASS] invariant_IdentityIsConsistent() (runs: 32, calls: 2048, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| RegistriesHandler | approveSomeone | 334   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | give           | 362   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | requestVal     | 352   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | respond        | 302   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | revoke         | 334   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | transfer       | 364   | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\n[PASS] invariant_SummaryMatchesGhost() (runs: 32, calls: 2048, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| RegistriesHandler | approveSomeone | 334   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | give           | 362   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | requestVal     | 352   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | respond        | 302   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | revoke         | 334   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | transfer       | 364   | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\n[PASS] invariant_ValidationCountersAndStates() (runs: 32, calls: 2048, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| RegistriesHandler | approveSomeone | 334   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | give           | 362   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | requestVal     | 352   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | respond        | 302   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | revoke         | 334   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| RegistriesHandler | transfer       | 364   | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 702.83ms (1.39s CPU time)\n\nRan 5 test suites in 703.82ms (2.13s CPU time): 96 tests passed, 0 failed, 0 skipped (96 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"cd9240290c0244f0e63f317f9aae11cfd12a7da47d1eed6c3489f92d39f16272","verifiedTreeHash":"8c21cdaaded233eab6acaea4ee91c091c0373a97","verifierVersion":"0.1.0+ff982c0f"}]}