{
 "number": 17493,
 "input_hash": "c58c9f265a947f82",
 "model": "openrouter/google/gemini-3.8-flash",
 "batch": false,
 "created": "2026-09-17T16:16:04+00:00",
 "provider": "Google",
 "stop_reason": "end_turn",
 "usage": {
  "input_tokens": 28628,
  "cache_creation_input_tokens": 0,
  "cache_read_input_tokens": 0,
  "output_tokens": 3159
 },
 "cost_usd": 0.03331725,
 "error": null,
 "result": {
  "display": {
   "goal": [
    "Prevent silent misconfiguration by failing startup when a single-value setting is assigned multiple times in the same config section."
   ],
   "reviewability": [
    "Stacked on #16545 and #17580, which should be reviewed first."
   ],
   "agreement": [
    "Concept ACK from JeremyRubin.",
    "ajtowns initially gave a weak concept NACK over breaking existing working configs on upgrade, but accepted that release notes are the appropriate solution (ajtowns)."
   ],
   "categories": [
    {
     "name": "utils",
     "why": [
      "P3 because it eliminates silent option overrides in configuration files, catching unintended settings bugs on startup.",
      "It also helps unblock #17581 to remove confusing reverse-precedence config merging logic."
     ]
    }
   ]
  },
  "summary": "This PR causes `ArgsManager` to return an init error on startup when non-list settings (`ALLOW_ANY` without `ALLOW_LIST`) are assigned multiple times within the same section of a configuration file. It adds unit tests checking that ambiguous multi-assignments fail and includes release notes for the behavior change.",
  "problem": "Currently, assigning multiple values to a single-value setting in a configuration file silently ignores all but one assignment (often subject to non-intuitive reverse-precedence rules). This can lead node operators to believe a setting is active when it is being silently discarded.",
  "discussion": {
   "open_concerns": [],
   "resolved_concerns": [
    "ajtowns raised concern that nodes with existing duplicate config lines might fail to restart on upgrade; ajtowns subsequently agreed that warnings in logs are ineffective and release notes are the standard way to communicate upgrade breakage."
   ],
   "author_status": "Active; regularly rebasing the PR on top of base PR updates."
  },
  "reviewability": {
   "state": "Ready",
   "label": "Review #16545 first",
   "reason": "The PR is stacked on top of #16545 and #17580, with only two distinct commits of its own."
  },
  "agreement": {
   "state": "Positive",
   "summary": "Positive; ajtowns raised concern over breaking existing configs on upgrade but conceded release notes are sufficient.",
   "reason": "JeremyRubin Concept ACKed the change. ajtowns expressed concern that it could break existing configurations on restart, but acknowledged that errors with release notes are better than ignored log warnings.",
   "evidence": [
    "JeremyRubin: 'Concept ACK. Curious if you think this has a high likelihood of breaking a lot of configs in the wild -- but I suppose it's worth it...'",
    "ajtowns: 'Weak concept NACK on this... potential to cause systems to not restart correctly...'",
    "ajtowns follow-up: 'But yeah, I agree a warning everyone will miss isn't that helpful... really that's what release notes and being careful about upgrades are for.'"
   ]
  },
  "dependencies": {
   "depends_on": [
    16545,
    17580
   ],
   "enables": [
    "#17581"
   ]
  },
  "categories": [
   {
    "name": "build",
    "member": false,
    "evidence": "CI workflow modification is an ephemeral adjustment to git fetch depth for base PR 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."
   },
   {
    "name": "docs",
    "member": false,
    "evidence": "Includes a release note file and comment docs accompanying an argument parsing behavior change.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Release notes and code comments accompany code changes and do not constitute a standalone docs PR."
   },
   {
    "name": "tests",
    "member": false,
    "evidence": "Adds unit tests covering `ArgsManager` configuration parsing, but does not modify test framework infrastructure.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Tests verify utility parsing logic rather than general testing infrastructure."
   },
   {
    "name": "utils",
    "member": true,
    "evidence": "Directly modifies `ArgsManager` in `src/common/args.{h,cpp}` and `src/common/config.cpp`.",
    "band": "P3",
    "reason_tag": "user request",
    "score": 0.4,
    "factors": {
     "security_stability": 1,
     "bug_severity": 1,
     "performance": 0,
     "user_value": 2,
     "leverage": 2
    },
    "rationale": "Improves configuration parsing reliability by throwing an explicit error when single-value settings are defined multiple times, preventing silently ignored settings. It also unblocks removing confusing reverse-precedence logic in #17581."
   },
   {
    "name": "validation",
    "member": false,
    "evidence": "Touches `src/chainparamsbase.cpp` solely to mark list arguments 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": "Does not change consensus or validation rules."
   },
   {
    "name": "wallet",
    "member": false,
    "evidence": "Mechanical edit in `src/wallet/init.cpp` adding `ALLOW_LIST` to `-wallet` argument.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "A mechanical flag addition to `-wallet` registration does not make this a wallet PR."
   }
  ],
  "confidence": "high",
  "uncertainties": [],
  "needs": [],
  "card": "This PR modifies configuration file parsing to raise a startup error if a single-value setting is assigned multiple times within the same config section, rather than silently ignoring duplicate values. This prevents operator errors and unintended behavior from silently ignored options, while paving the way to clean up reverse-precedence config merging logic in #17581. Concept ACKed by JeremyRubin, with initial upgrade-breakage concerns by ajtowns resolved in favor of release note documentation. The PR is stacked on top of open PRs #16545 and #17580, which should be reviewed first."
 },
 "raw_text": null
}