{
 "number": 17783,
 "input_hash": "752d1385a475e193",
 "model": "openrouter/google/gemini-3.8-flash",
 "batch": false,
 "created": "2026-09-17T15:47:53+00:00",
 "provider": "Google",
 "stop_reason": "end_turn",
 "usage": {
  "input_tokens": 30965,
  "cache_creation_input_tokens": 0,
  "cache_read_input_tokens": 0,
  "output_tokens": 2770
 },
 "cost_usd": 0.03361125,
 "error": null,
 "result": {
  "display": {
   "goal": [
    "Prevent bugs caused by calling IsArgSet on list options",
    "Ensure negated list settings are not mistaken for enabled options"
   ],
   "reviewability": [
    "Stacked on open PRs #16545 and #17580",
    "Best reviewed after earlier base changes land"
   ],
   "agreement": [
    "Concept approval without detailed review (promag)"
   ],
   "categories": [
    {
     "name": "utils",
     "why": [
      "P3 because it eliminates a recurring ArgsManager footgun where negated list options evaluate to true under IsArgSet",
      "Hardens internal configuration parsing against regressions previously seen in RPC whitelist and network options"
     ]
    }
   ]
  },
  "summary": "This pull request disallows calling ArgsManager::IsArgSet() on arguments flagged with ALLOW_LIST, raising a logic error instead. It fixes call sites across the codebase to use GetArgs().empty() checks and normalizes -noonlynet handling.",
  "problem": "When an ALLOW_LIST option is negated (such as -norpcwhitelist), IsArgSet() returns true because the option was present on the command line, but GetArgs() returns an empty list. Call sites that check IsArgSet() can mistakenly treat the option as enabled with empty configuration, leading to subtle configuration and security bugs.",
  "discussion": {
   "open_concerns": [],
   "resolved_concerns": [],
   "author_status": "active, periodically rebasing stack on main"
  },
  "reviewability": {
   "state": "Ready",
   "label": "Review #16545 first",
   "reason": "This PR is stacked on top of unmerged PRs #16545 and #17580, which introduce the type flags and ALLOW_LIST enforcement. The base PRs should be reviewed first."
  },
  "agreement": {
   "state": "Positive",
   "summary": "Concept ACK from promag with no objections raised",
   "reason": "The PR has had concept approval since 2019 without any objections, but has seen minimal reviewer engagement while waiting on its base PRs.",
   "evidence": [
    "promag gave a Concept ACK in December 2019"
   ]
  },
  "dependencies": {
   "depends_on": [
    16545,
    17580
   ],
   "enables": []
  },
  "categories": [
   {
    "name": "build",
    "member": false,
    "evidence": "Touches .github/workflows/ci.yml only for a temporary fetch-depth increase needed for stacked commits.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Not a build system change; the CI workflow tweak is temporary stack metadata."
   },
   {
    "name": "tests",
    "member": false,
    "evidence": "Updates tests and fuzzing harnesses to accommodate the new ArgsManager validation rules.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Test updates are mechanical adaptations following the core ArgsManager refactoring."
   },
   {
    "name": "utils",
    "member": true,
    "evidence": "Modifies ArgsManager parsing and validation in src/common/args.cpp and src/common/args.h.",
    "band": "P3",
    "reason_tag": "bug fix",
    "score": 0.35,
    "factors": {
     "security_stability": 1,
     "bug_severity": 1,
     "performance": 0,
     "user_value": 0,
     "leverage": 1
    },
    "rationale": "P3 because it addresses an internal hazard in shared argument parsing where IsArgSet on list options returns true even when empty. Multiple bugs caused by this pattern were previously fixed in #30529, so disallowing the pattern systematically prevents recurring configuration errors."
   },
   {
    "name": "validation",
    "member": false,
    "evidence": "Touches chainparamsbase.cpp to update argument registration flags for -testactivationheight and -vbparams.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Changes to chainparams options registration are mechanical flag annotations without consensus or chainstate logic alterations."
   },
   {
    "name": "wallet",
    "member": false,
    "evidence": "Touches src/wallet/init.cpp solely to annotate -wallet with ALLOW_LIST.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "A one-line flag addition in wallet initialization does not constitute substantive wallet maintenance work."
   }
  ],
  "confidence": "high",
  "uncertainties": [],
  "needs": [],
  "card": "This PR disallows calling ArgsManager::IsArgSet() on ALLOW_LIST options, throwing a logic error when attempted. It prevents bugs where a negated list option causes IsArgSet() to return true even though GetArgs() is empty, misleading callers into treating the setting as enabled. It is an internal cleanup that closes a bug hazard previously hit in RPC and network settings. The PR is stacked on top of open PRs #16545 and #17580, and has received concept support without detailed review."
 },
 "raw_text": null
}