{
  "schemaVersion": 1,
  "scope": "V3 contract-source loop inventory. This is a release gate, not a proxy storage-layout check.",
  "loops": [
    {
      "file": "v3-src/contracts/governance/MultisigGovernanceV3.sol",
      "line": 169,
      "statement": "for (uint256 i; i < _canonicalPolicyTargets.length; ++i) {",
      "status": "bounded",
      "bound": "Constructor rejects canonical target arrays above 32 and requires one codehash per target."
    },
    {
      "file": "v3-src/contracts/disputes/DisputeRegistryV3.sol",
      "line": 259,
      "statement": "for (uint256 i; i < eligibleCount; ++i) {",
      "status": "bounded",
      "bound": "eligibleCount is capped by MAX_ADJUDICATORS (32). Module is also retired from the supported Base closure."
    },
    {
      "file": "v3-src/contracts/governance/MultisigGovernanceV3.sol",
      "line": 184,
      "statement": "for (uint256 i; i < _guardianPauseTargets.length; ++i) {",
      "status": "bounded",
      "bound": "Signer and guardian arrays are constructor/self-call validated against MAX_SIGNERS or MAX_GUARDIAN_PAUSE_TARGETS (32)."
    },
    {
      "file": "v3-src/contracts/governance/MultisigGovernanceV3.sol",
      "line": 540,
      "statement": "for (uint256 i; i < count; ++i) {",
      "status": "bounded",
      "bound": "Signer and guardian arrays are constructor/self-call validated against MAX_SIGNERS or MAX_GUARDIAN_PAUSE_TARGETS (32)."
    },
    {
      "file": "v3-src/contracts/governance/MultisigGovernanceV3.sol",
      "line": 545,
      "statement": "for (uint256 j; j < i; ++j) {",
      "status": "bounded",
      "bound": "Signer and guardian arrays are constructor/self-call validated against MAX_SIGNERS or MAX_GUARDIAN_PAUSE_TARGETS (32)."
    },
    {
      "file": "v3-src/contracts/governance/MultisigGovernanceV3.sol",
      "line": 766,
      "statement": "for (uint256 i; i < candidateSigners.length; ++i) {",
      "status": "bounded",
      "bound": "Signer and guardian arrays are constructor/self-call validated against MAX_SIGNERS or MAX_GUARDIAN_PAUSE_TARGETS (32)."
    },
    {
      "file": "v3-src/contracts/governance/MultisigGovernanceV3.sol",
      "line": 771,
      "statement": "for (uint256 j; j < i; ++j) {",
      "status": "bounded",
      "bound": "Signer and guardian arrays are constructor/self-call validated against MAX_SIGNERS or MAX_GUARDIAN_PAUSE_TARGETS (32)."
    },
    {
      "file": "v3-src/contracts/governance/MultisigGovernanceV3.sol",
      "line": 779,
      "statement": "for (uint256 i; i < newSigners.length; ++i) {",
      "status": "bounded",
      "bound": "Signer and guardian arrays are constructor/self-call validated against MAX_SIGNERS or MAX_GUARDIAN_PAUSE_TARGETS (32)."
    },
    {
      "file": "v3-src/contracts/governance/MultisigGovernanceV3.sol",
      "line": 787,
      "statement": "for (uint256 i; i < signerCount; ++i) {",
      "status": "bounded",
      "bound": "Signer and guardian arrays are constructor/self-call validated against MAX_SIGNERS or MAX_GUARDIAN_PAUSE_TARGETS (32)."
    },
    {
      "file": "v3-src/contracts/mandate/MandateRegistryV3.sol",
      "line": 411,
      "statement": "for (uint256 i = 1; i < m.allowedContracts.length; ++i) {",
      "status": "bounded",
      "bound": "Mandate arrays are validated before registration against their explicit MAX_* limit (32); sortedness loops start at index 1."
    },
    {
      "file": "v3-src/contracts/mandate/MandateRegistryV3.sol",
      "line": 414,
      "statement": "for (uint256 i = 1; i < m.allowedSelectors.length; ++i) {",
      "status": "bounded",
      "bound": "Mandate arrays are validated before registration against their explicit MAX_* limit (32); sortedness loops start at index 1."
    },
    {
      "file": "v3-src/contracts/mandate/MandateRegistryV3.sol",
      "line": 455,
      "statement": "for (uint256 i; i < m.prohibitedActions.length; ++i) {",
      "status": "bounded",
      "bound": "Mandate arrays are validated before registration against their explicit MAX_* limit (32); sortedness loops start at index 1."
    },
    {
      "file": "v3-src/contracts/mandate/MandateRegistryV3.sol",
      "line": 458,
      "statement": "for (uint256 i; i < m.allowedActions.length; ++i) {",
      "status": "bounded",
      "bound": "Mandate arrays are validated before registration against their explicit MAX_* limit (32); sortedness loops start at index 1."
    },
    {
      "file": "v3-src/contracts/mandate/MandateRegistryV3.sol",
      "line": 465,
      "statement": "for (uint256 i; i < m.allowedContracts.length; ++i) {",
      "status": "bounded",
      "bound": "Mandate arrays are validated before registration against their explicit MAX_* limit (32); sortedness loops start at index 1."
    },
    {
      "file": "v3-src/contracts/mandate/MandateRegistryV3.sol",
      "line": 472,
      "statement": "for (uint256 i; i < m.allowedSelectors.length; ++i) {",
      "status": "bounded",
      "bound": "Mandate arrays are validated before registration against their explicit MAX_* limit (32); sortedness loops start at index 1."
    },
    {
      "file": "v3-src/contracts/pilot/BasePilotAccessControllerV3.sol",
      "line": 280,
      "statement": "for (uint256 i; i < _guardianCoveredPositions.length; ++i) {",
      "status": "bounded",
      "bound": "Only registration appends and rejects the MAX_GUARDIAN_COVERED_POSITIONS (32) limit."
    },
    {
      "file": "v3-src/contracts/reputation/StreetCredV3.sol",
      "line": 112,
      "statement": "for (uint256 i = startIdx; i < n; ++i) {",
      "status": "bounded",
      "bound": "lookback is rejected above MAX_RECOMPUTE_LOOKBACK (128) before iteration."
    }
  ]
}
