{
 "number": 17581,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/17581",
 "title": "refactor: Remove settings merge reverse precedence code",
 "author": "ryanofsky",
 "author_association": "MEMBER",
 "created_at": "2019-11-24T20:17:13Z",
 "updated_at": "2026-09-13T15:46:44Z",
 "age_days": 2488,
 "draft": true,
 "labels": [
  "Refactoring"
 ],
 "milestone": null,
 "base": "master",
 "head_sha": "8c7c3625f5b315499fba58d5d53cc00a705e7e5f",
 "head_ref": "pr/wdrev",
 "head_repo": "ryanofsky/bitcoin",
 "head_history": [
  {
   "t": "2019-12-20T16:21:33Z",
   "sha": "2dab31be621f4c5405d02442310336675b89b23e"
  },
  {
   "t": "2020-09-28T13:12:09Z",
   "sha": "6285d00931e96f30450bd446857117231ac78c49"
  },
  {
   "t": "2021-04-13T12:34:54Z",
   "sha": "a9bc4b2151397ee0fbfe08221e8269463a84d56f"
  },
  {
   "t": "2021-04-14T13:13:13Z",
   "sha": "58efdc25a20e194849882b79ecb81de018b38a68"
  },
  {
   "t": "2021-06-17T22:40:03Z",
   "sha": "4b35d9dd2f2d74315f23ecd43290a7254bec9ed9"
  },
  {
   "t": "2021-12-30T21:27:41Z",
   "sha": "3376e470a0930a58f236da561c00f6017b8a4634"
  },
  {
   "t": "2022-09-27T19:31:53Z",
   "sha": "9f9c3777808922df55ac1928ee8df3589d10162b"
  },
  {
   "t": "2023-02-15T03:39:40Z",
   "sha": "a057e0c38f2d56219568bc6f4ff9e972cdb339c0"
  },
  {
   "t": "2023-05-03T22:14:24Z",
   "sha": "55b31d8a921e45cba9884a7da08b3aea6a88598b"
  },
  {
   "t": "2024-07-19T23:07:42Z",
   "sha": "67c9fe77ebd7043b643869e602b5e4c04d26edae"
  },
  {
   "t": "2024-08-06T16:44:28Z",
   "sha": "137738c91aabf3a3fc2410144b3382d2c5cdb6b5"
  },
  {
   "t": "2024-12-06T19:02:45Z",
   "sha": "c0de9eb67eaadb93ef6cc9c96cc8e4f5323c7aca"
  },
  {
   "t": "2025-03-12T18:22:50Z",
   "sha": "77131ff8020c540a3c4dd6ab56fb7c5d59228a3a"
  },
  {
   "t": "2025-08-04T17:51:55Z",
   "sha": "eb89b174b1fe2fe4adbd52fed3f7cddc16bd0c36"
  },
  {
   "t": "2025-12-12T12:19:03Z",
   "sha": "1c22b5f6110c1827513b45a2e9f44bad181d7aaf"
  },
  {
   "t": "2025-12-16T02:10:22Z",
   "sha": "cf96858dfbfa708c46179503ad45ab8c96714bf2"
  },
  {
   "t": "2026-01-18T23:10:14Z",
   "sha": "f50e5fe9bedcb6f4a204d9e46812d506ae1f3533"
  },
  {
   "t": "2026-04-01T21:50:14Z",
   "sha": "6fdf27b5779334f241400a8b2ed8899bb1d5926e"
  },
  {
   "t": "2026-06-08T18:44:52Z",
   "sha": "ed2fd0a6321d876d0226daf7623c5bc7993aa807"
  },
  {
   "t": "2026-06-24T15:29:29Z",
   "sha": "7a1537ee0740c069418f380cfb6430424e58ebea"
  },
  {
   "t": "2026-08-17T16:55:57Z",
   "sha": "8c7c3625f5b315499fba58d5d53cc00a705e7e5f"
  }
 ],
 "additions": 1200,
 "deletions": 223,
 "changed_files": 18,
 "commit_count": 19,
 "size_bucket": "XL",
 "mergeable_state": "clean",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {},
   "conflicts": [
    {
     "number": 35940,
     "title": "net: allow selecting BIP152 high-bandwidth peers with `-addnode`",
     "author": "w0xlt"
    },
    {
     "number": 35387,
     "title": "logging: make trace logging easily usable",
     "author": "ryanofsky"
    },
    {
     "number": 35322,
     "title": "logging: streamline Logger state and drop redundant methods",
     "author": "ryanofsky"
    },
    {
     "number": 35037,
     "title": "ipc: support per-address max-connections options on -ipcbind",
     "author": "enirox001"
    },
    {
     "number": 35027,
     "title": "net: add -outboundbind option for outgoing source address",
     "author": "8144225309"
    },
    {
     "number": 34038,
     "title": "logging: replace -loglevel with -trace, expose trace logging via RPC",
     "author": "ajtowns"
    },
    {
     "number": 16545,
     "title": "refactor: Implement missing error checking for ArgsManager flags",
     "author": "ryanofsky"
    }
   ]
  }
 },
 "acks_parsed": {},
 "acks_tally": {
  "ack": 0,
  "stale_ack": 0,
  "concept_ack": 0,
  "approach_ack": 0,
  "nack": 0,
  "concept_nack": 0,
  "approach_nack": 0
 },
 "reviews": {
  "approved": 0,
  "changes_requested": 0,
  "distinct_reviewers": []
 },
 "signals": {
  "needs_rebase": false,
  "ci_failed": false,
  "mergeable_state": "clean",
  "last_author_activity": "2026-08-17T16:55:57Z",
  "last_reviewer_activity": null,
  "last_reviewer": null,
  "author_silent_days": 30,
  "waiting_on_author_days": 0,
  "days_since_update": 4
 },
 "refs": {
  "mentioned": [
   16545,
   17493,
   17508,
   17580,
   35441
  ],
  "depends_on": [
   16545
  ],
  "fixes": [],
  "linked_issues": [],
  "references": [
   {
    "number": 16545,
    "type": "pull",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "refactor: Implement missing error checking for ArgsManager flags"
   },
   {
    "number": 17580,
    "type": "pull",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "refactor: Add ALLOW_LIST flags and enforce usage in CheckArgFlags"
   },
   {
    "number": 17493,
    "type": "pull",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "util: Forbid ambiguous multiple assignments in config file"
   },
   {
    "number": 17508,
    "type": "issue",
    "state": "closed",
    "merged": false,
    "merged_at": null,
    "title": "Simpler settings interpretation"
   },
   {
    "number": 35441,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-06-15",
    "title": "ci: inline runner selection"
   }
  ],
  "conflicts": [
   35940,
   35387,
   35322,
   35037,
   35027,
   34038,
   16545
  ]
 },
 "stack": {
  "shares_commits_with": [
   17493,
   17580,
   17783
  ],
  "based_on": [],
  "base_for": []
 },
 "review_paths": [],
 "body": "**This is based on #16545 + #17580 + #17493.** The non-base commits are:\n\n- [`2ac63340d75` refactor: Remove settings merge reverse precedence code](https://github.com/bitcoin/bitcoin/pull/17581/commits/2ac63340d75d1cd687bd2ea9859d1318c2c63882)\n\n---\n\nThis has no effect on behavior because as of https://github.com/bitcoin/bitcoin/pull/17493 it's not possible to specify multiple values for single value settings in the config file.\n\nThis change implements one of the settings simplifications listed in #17508",
 "commits": [
  {
   "sha": "94300ae454e49d97415848fa144ff19893f53ac1",
   "date": "2026-07-13T20:29:09Z",
   "message": "common: Grammar / formatting tweaks\n\nImplement cleanup suggestions from l0rinc:\n\nhttps://github.com/bitcoin/bitcoin/pull/16545#discussion_r1773221823\nhttps://github.com/bitcoin/bitcoin/pull/16545#discussion_r1773291395\nhttps://github.com/bitcoin/bitcoin/pull/16545#discussion_r1775897382"
  },
  {
   "sha": "92cb734d5a4ed825669f796943229d80a71f7060",
   "date": "2026-07-13T20:29:09Z",
   "message": "doc: Add detailed ArgsManager type flag documention\n\nThis commit just adds documentation for the type flags. The flags are actually\nimplemented in the following two commits."
  },
  {
   "sha": "1500c5801cbb0db12634dd99905845711ffcb8a2",
   "date": "2026-07-13T20:29:09Z",
   "message": "common: Implement ArgsManager flags to parse and validate settings on startup\n\nThis commit implements support for new ALLOW_BOOL, ALLOW_INT, ALLOW_STRING, and\nALLOW_LIST flags by validating settings with these flags earlier on startup and\nproviding detailed error messages to users.\n\nThe new flags implement stricter error checking than ALLOW_ANY. For example, a\ndouble negated option like -nosetting=0 is treated like an error instead of\ntrue, and an unrecognized bool value like -setting=true is treated like an\nerror instead of false. And if a non-list setting is assigned multiple times in\nthe same section of a configuration file, the later assignments trigger errors\ninstead of being silently ignored.\n\nThe new flags also provide type information that allows ArgsManager\nGetSettings() and GetSettingsList() methods to return typed integer and boolean\nvalues instead of unparsed strings.\n\nThe changes in this commit have no effect on current application behavior\nbecause the new flags are only used in unit tests. The existing ALLOW_ANY\nchecks in the argsman_tests/CheckValueTest confirm that no behavior is changing\nfor current settings, which use ALLOW_ANY."
  },
  {
   "sha": "481099679b368be6c707ec536613f356b3543331",
   "date": "2026-07-13T20:29:09Z",
   "message": "common: Update ArgManager GetArg helper methods to work better with ALLOW flags\n\nUpdate GetArg, GetArgs, GetBoolArg, and GetIntArg helper methods to work\nconveniently with ALLOW_BOOL, ALLOW_INT, and ALLOW_STRING flags.\n\nThe GetArg methods are convenience wrappers around the GetSetting method. The\nGetSetting method returns the originally parsed settings values in their\ndeclared bool/int/string types, while the GetArg wrappers provide extra\ntype-coercion and default-value fallback features as additional conveniences\nfor callers.\n\nThis commit makes two changes to GetArg, GetArgs, GetBoolArg, and GetIntArg\nhelper methods when BOOL/INT/STRING flags are used:\n\n1. GetArg methods will now raise errors if they are called with inconsistent\n   flags. For example, GetArgs will raise a logic_error if it is called on a\n   non-LIST setting, GetIntArg will raise a logic_error if it is called\n   on a non-INT setting.\n\n2. GetArg methods will now avoid various type coersion footguns when they are\n   called on new BOOL/INT/STRING settings. Existing ALLOW_ANY settings are\n   unaffected. For example, negated settings will return \"\" empty strings\n   instead of \"0\" strings (in the past the \"0\" strings caused strangeness like\n   \"-nowallet\" options creating wallet files named \"0\"). The new behaviors are\n   fully specified and checked by the `CheckValueTest` unit test.\n\nThe ergonomics of the GetArg helper methods are subjective and the behaviors\nthey implement can be nitpicked and debated endlessly. But behavior of these\nhelper methods does not dictate application behavior, and they can be bypassed\nby calling GetSetting and GetSettingList methods instead. If it's necessary,\nbehavior of these helper methods can also be changed again in the future.\n\nThe changes have no effect on current application behavior because the new\nflags are only used in unit tests. The `setting_args` unit test and ALLOW_ANY\nchecks in the `CheckValueTest` unit test are unchanged and confirm that\n`GetArg` methods behave the same as before for ALLOW_ANY flags (returning the\nsame values and throwing the same exceptions)."
  },
  {
   "sha": "dadfea2ac55a036ab7aa93c6ad14d1f736c8872c",
   "date": "2026-07-13T20:29:09Z",
   "message": "test: Add tests to demonstrate usage of ArgsManager flags\n\nCo-authored-by: Hodlinator <172445034+hodlinator@users.noreply.github.com>"
  },
  {
   "sha": "abe4b1d8974f5171a5e15e2cc5cae2a2144bbb2c",
   "date": "2026-07-13T20:29:09Z",
   "message": "test: Add test for settings.json parsing with type flags\n\nThe type flags aren't currently used to validate or convert settings in the\nsettings.json file, but they should be in the future. Add test to check current\nbehavior that can be extended when flags are applied.\n\nCo-authored-by: Hodlinator <172445034+hodlinator@users.noreply.github.com>"
  },
  {
   "sha": "d134020611f17b6a26809fa31bac88d5a087ea61",
   "date": "2026-08-14T20:01:12Z",
   "message": "Merge branch 'pr/argcheck' into pr/wdlist"
  },
  {
   "sha": "671e54779624f80c7a0e5cb8e913bee2e3966c38",
   "date": "2026-08-14T20:01:12Z",
   "message": "common: Add support for combining ArgsManager flags\n\nLet ALLOW_STRING and ALLOW_INT flags be combined with ALLOW_BOOL so string and\nint options can be specified without explicit values. This is useful for\nimperative settings that trigger new behavior when specified and can accept\noptional string or integer values, but do not require them. (For examples, see\nthe example_options unit test modified in this commit.)"
  },
  {
   "sha": "44e71c8b9f9d688310f660dcb2a37bb55777825e",
   "date": "2026-08-14T20:01:12Z",
   "message": "scripted-diff: Add ALLOW_LIST flag to arguments retrieved with GetArgs\n\nThis change has no effect on behavior, and is basically just a documentation\nchange at this point. The ALLOW_LIST flag is currently ignored unless\nALLOW_BOOL, ALLOW_INT, or ALLOW_STRING flags are also present, and these flags\nare not used yet.\n\n-BEGIN VERIFY SCRIPT-\nfor f in `git grep -n 'GetArgs(' | grep -v _tests | sed -n 's/.*GetArgs(\"\\([^\"]\\+\\)\".*/\\1/p' | sort -u`; do\n   git grep -l -- \"$f\" | xargs sed -i \"/AddArg(\\\"$f[=\\\"]/ s/ArgsManager::ALLOW_ANY/& | ArgsManager::ALLOW_LIST/g\"\ndone\n-END VERIFY SCRIPT-"
  },
  {
   "sha": "bd820336f0b4da310e1921af3da24dac446537ae",
   "date": "2026-08-14T20:01:12Z",
   "message": "refactor: Fix more ALLOW_LIST arguments\n\n- Remove ALLOW_LIST flag from bitcoin-wallet -wallet and -debug arguments. They\n  are list arguments for bitcoind, but single arguments for bitcoin-wallet.\n\n- Add ALLOW_LIST flag to -includeconf arg (missed by scripted diff since it's\n  not accessed through GetArgs)\n\n- Add ALLOW_LIST flag to -proxy, -debug, -loglevel, -whitebind, and -whitelist\n  args (missed by scripted diff due to line breaks in AddArgs calls)\n\n- Add ALLOW_LIST flag to -zmq args (missed by scripted diff due to programmatic\n  GetArgs calls)\n\nThis change has no effect on behavior, and is basically just a documentation\nchange at this point. The ALLOW_LIST flag is currently ignored unless\nALLOW_BOOL, ALLOW_INT, or ALLOW_STRING flags are also present, and these flags\nare not used yet."
  },
  {
   "sha": "b314c7e7de54565649fa24b517f51bfa0f9b723e",
   "date": "2026-08-14T20:01:12Z",
   "message": "Always reject empty -blockfilterindex=\"\" arguments\n\nPrevious behavior was inconsistent: if -blockfilterindex or\n-blockfilterindex=\"\" arguments were specified they would normally enable all\nblock filter indexes, but could also trigger \"Unknown -blockfilterindex value\"\nerrors if followed by later -blockfilterindex arguments.\n\nIt was confusing that the same -blockfilterindex options could sometime trigger\nerrors and sometimes not depending on option position. It was also confusing\nthat an empty -blockfilterindex=\"\" setting could enable all indexes even though\nindexes are disabled by default.\n\nNew behavior is more straightforward:\n\n- -blockfilterindex and -blockfilterindex=1 always enable indexes\n- -noblockfilterindex and -blockfilterindex=0 always disable indexes\n- -blockfilterindex=\"\" is always an unknown value error\n\nThe meaning of these options no longer changes based on option position."
  },
  {
   "sha": "bf58582fd49f0edc9aef6f49117a4d40ea14ea19",
   "date": "2026-08-14T20:01:12Z",
   "message": "refactor: Stop calling GetArg/IsArgSet on ALLOW_LIST options\n\nUpcoming commits will make it an error to call GetArg and IsArgSet methods on\nlist options since these usages are error prone. For example GetArg will return\nlast command line value but first config value in the list, and IsArgSet will\nreturn true even if the list is empty if the list was negated.\n\nThis change is just a refactoring replacing problematic ArgsManager calls with\nequivalent calls to avoid changing any behavior. Current behavior could\nprobably be improved in these cases, but this change should make new problems\nless likely to be introduced."
  },
  {
   "sha": "581eaaf10fc8ce584332fdcc5f04c245f3df7ed2",
   "date": "2026-08-14T20:01:12Z",
   "message": "refactor: Always enforce ALLOW_LIST in CheckArgFlags\n\nPrevent GetArg() from being called on ALLOW_LIST arguments, and GetArgs() from\nbeing called on non-list arguments.\n\nThis checking was previously skipped unless typed INT/BOOL/STRING flags were\npresent, but now it's always done.\n\nThis change has no effect on external behavior. It is just supposed to enforce\ninternal consistency and prevent bugs caused by using the wrong GetArg method\nto retrieve settings."
  },
  {
   "sha": "bf61922ae3951787d2a708d4318951c52d4b93dd",
   "date": "2026-08-14T20:01:12Z",
   "message": "Merge branch 'pr/wdlist' into pr/wdmult"
  },
  {
   "sha": "b46958a1ac3ab702ac7a654d0e915e4b7ff0022b",
   "date": "2026-08-14T20:01:12Z",
   "message": "util: Forbid ambiguous multiple assignments in config file\n\nEnable error \"Multiple values specified for -setting in same section of config\nfile.\", for ALLOW_ANY settings that don't specify ALLOW_LIST.\n\nInstead of silently ignoring settings, this change makes it an error to provide\nan ambiguous config file that provides assigns multiple values to a\nsingle-value setting. Change include release notes."
  },
  {
   "sha": "bdde19f29edb4c18459b0512ef75c819ec5fe877",
   "date": "2026-08-14T20:01:12Z",
   "message": "test: Extend util_ArgsMerge test to check for \"Multiple values specified\" errors\n\nAlso skip calling TestArgString in these cases since exact behavior retrieving\nvalues is irrelevant when parsing values fails.\n\nAlso s/TestArgString/GetArg/ to be more efficient and direct, now that it's no\nlonger necessary to call with separation of ALLOW_LIST and non ALLOW_LIST\ncases."
  },
  {
   "sha": "1bcd9f73108f8da37e13b0eecf596867e2b8423a",
   "date": "2026-08-14T20:01:12Z",
   "message": "Merge branch 'pr/wdmult' into pr/wdrev"
  },
  {
   "sha": "4a28b43b1c2d919f3561d2c0ece4db6ec9a041dc",
   "date": "2026-08-14T20:01:12Z",
   "message": "refactor: Remove settings merge reverse precedence code\n\nThis commit has no effect on behavior because as of\nhttps://github.com/bitcoin/bitcoin/pull/17493 it's not possible to specify\nmultiple values for single value settings in the config file."
  },
  {
   "sha": "8c7c3625f5b315499fba58d5d53cc00a705e7e5f",
   "date": "2026-08-14T20:01:12Z",
   "message": "test-each-commit: Increase fetch depth\n\nNeeded due to base PR, can be dropped before merge"
  }
 ],
 "timeline": [
  {
   "t": "2019-12-20T16:21:33Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "2dab31be621f4c5405d02442310336675b89b23e"
  },
  {
   "t": "2020-09-28T13:12:09Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "6285d00931e96f30450bd446857117231ac78c49"
  },
  {
   "t": "2021-04-13T12:34:54Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "a9bc4b2151397ee0fbfe08221e8269463a84d56f"
  },
  {
   "t": "2021-04-14T13:13:13Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "58efdc25a20e194849882b79ecb81de018b38a68"
  },
  {
   "t": "2021-06-17T22:40:03Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "4b35d9dd2f2d74315f23ecd43290a7254bec9ed9"
  },
  {
   "t": "2021-12-30T21:27:41Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "3376e470a0930a58f236da561c00f6017b8a4634"
  },
  {
   "t": "2022-09-27T19:31:53Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "9f9c3777808922df55ac1928ee8df3589d10162b"
  },
  {
   "t": "2023-02-15T03:39:40Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "a057e0c38f2d56219568bc6f4ff9e972cdb339c0"
  },
  {
   "t": "2023-05-03T22:14:24Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "55b31d8a921e45cba9884a7da08b3aea6a88598b"
  },
  {
   "t": "2024-07-19T23:07:42Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "67c9fe77ebd7043b643869e602b5e4c04d26edae"
  },
  {
   "t": "2024-08-06T16:44:28Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "137738c91aabf3a3fc2410144b3382d2c5cdb6b5"
  },
  {
   "t": "2024-12-06T19:02:45Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "c0de9eb67eaadb93ef6cc9c96cc8e4f5323c7aca"
  },
  {
   "t": "2025-03-12T18:22:50Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "77131ff8020c540a3c4dd6ab56fb7c5d59228a3a"
  },
  {
   "t": "2025-08-04T17:51:55Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "eb89b174b1fe2fe4adbd52fed3f7cddc16bd0c36"
  },
  {
   "t": "2025-12-12T12:19:03Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "1c22b5f6110c1827513b45a2e9f44bad181d7aaf"
  },
  {
   "t": "2025-12-16T02:10:22Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "cf96858dfbfa708c46179503ad45ab8c96714bf2"
  },
  {
   "t": "2026-01-18T23:10:14Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "f50e5fe9bedcb6f4a204d9e46812d506ae1f3533"
  },
  {
   "t": "2026-01-18T23:11:55Z",
   "kind": "comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "text": "Rebased eb89b174b1fe2fe4adbd52fed3f7cddc16bd0c36 -> 1c22b5f6110c1827513b45a2e9f44bad181d7aaf ([`pr/wdrev.16`](https://github.com/ryanofsky/bitcoin/commits/pr/wdrev.16) -> [`pr/wdrev.17`](https://github.com/ryanofsky/bitcoin/commits/pr/wdrev.17), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdrev.16-rebase..pr/wdrev.17)) on top of #17493 pr/wdmult.18\n\nRebased 1c22b5f6110c1827513b45a2e9f44bad181d7aaf -> cf96858dfbfa708c46179503ad45ab8c96714bf2 ([`pr/wdrev.17`](https://github.com/ryanofsky/bitcoin/commits/pr/wdrev.17) -> [`pr/wdrev.18`](https://github.com/ryanofsky/bitcoin/commits/pr/wdrev.18), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdrev.17-rebase..pr/wdrev.18)) on top of #17493 pr/wdmult.19\n\nRebased cf96858dfbfa708c46179503ad45ab8c96714bf2 -> f50e5fe9bedcb6f4a204d9e46812d506ae1f3533 ([`pr/wdrev.18`](https://github.com/ryanofsky/bitcoin/commits/pr/wdrev.18) -> [`pr/wdrev.19`](https://github.com/ryanofsky/bitcoin/commits/pr/wdrev.19), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdrev.18-rebase..pr/wdrev.19)) on top of #17493 pr/wdmult.20\n\nRebased f50e5fe9bedcb6f4a204d9e46812d506ae1f3533 -> 6fdf27b5779334f241400a8b2ed8899bb1d5926e ([`pr/wdrev.19`](https://github.com/ryanofsky/bitcoin/commits/pr/wdrev.19) -> [`pr/wdrev.20`](https://github.com/ryanofsky/bitcoin/commits/pr/wdrev.20), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdrev.19-rebase..pr/wdrev.20)) on top of pr/wdmult.21\n\nRebased 6fdf27b5779334f241400a8b2ed8899bb1d5926e -> 10a53c3d30d2e52afb431ffe43c863b89a140e0d ([`pr/wdrev.20`](https://github.com/ryanofsky/bitcoin/commits/pr/wdrev.20) -> [`pr/wdrev.21`](https://github.com/ryanofsky/bitcoin/commits/pr/wdrev.21), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdrev.20-rebase..pr/wdrev.21)) on top of #17493 pr/wdmult.22 with no changes\n\nRebased 10a53c3d30d2e52afb431ffe43c863b89a140e0d -> 2ac63340d75d1cd687bd2ea9859d1318c2c63882 ([`pr/wdrev.21`](https://github.com/ryanofsky/bitcoin/commits/pr/wdrev.21) -> [`pr/wdrev.22`](https://github.com/ryanofsky/bitcoin/commits/pr/wdrev.22), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdrev.21-rebase..pr/wdrev.22)) due to conflict with #35441\n\nRebased 2ac63340d75d1cd687bd2ea9859d1318c2c63882 -> 4a28b43b1c2d919f3561d2c0ece4db6ec9a041dc ([`pr/wdrev.22`](https://github.com/ryanofsky/bitcoin/commits/pr/wdrev.22) -> [`pr/wdrev.23`](https://github.com/ryanofsky/bitcoin/commits/pr/wdrev.23), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdrev.22-rebase..pr/wdrev.23)) on top of #17493 pr/wdmult.24 with no changes"
  },
  {
   "t": "2026-04-01T21:50:14Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "6fdf27b5779334f241400a8b2ed8899bb1d5926e"
  },
  {
   "t": "2026-06-08T18:44:52Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "ed2fd0a6321d876d0226daf7623c5bc7993aa807"
  },
  {
   "t": "2026-06-24T15:29:29Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "7a1537ee0740c069418f380cfb6430424e58ebea"
  },
  {
   "t": "2026-08-17T16:55:57Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "8c7c3625f5b315499fba58d5d53cc00a705e7e5f"
  }
 ],
 "labels_log": [
  {
   "t": "2019-11-24T20:44:15Z",
   "action": "labeled",
   "label": "Refactoring",
   "who": "fanquake"
  },
  {
   "t": "2019-12-19T20:15:31Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2019-12-20T16:53:41Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-01-30T22:50:40Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-09-28T15:17:30Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-09-29T07:59:50Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-04-13T14:25:50Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-04-15T04:01:28Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-06-18T00:05:23Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-08-22T01:58:51Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-12-30T21:32:51Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-02-09T23:11:28Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-09-27T20:38:26Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-11-15T21:17:13Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-02-15T04:23:42Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-03-20T18:46:35Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-03T23:17:16Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-09T16:37:44Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-20T00:28:29Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-08-05T01:42:07Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-08-06T18:00:20Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-08-07T22:12:27Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-12-06T19:21:50Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-12-14T01:18:04Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-12T18:28:03Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-14T01:36:06Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-06-11T07:00:57Z",
   "action": "unlabeled",
   "label": "Refactoring",
   "who": "maflcko"
  },
  {
   "t": "2025-06-11T07:00:57Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "maflcko"
  },
  {
   "t": "2025-06-11T07:00:59Z",
   "action": "labeled",
   "label": "Refactoring",
   "who": "DrahtBot"
  },
  {
   "t": "2025-06-11T07:01:06Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "maflcko"
  },
  {
   "t": "2025-08-04T18:12:27Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-11-21T23:34:30Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-12T13:18:45Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-12T18:13:30Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-19T00:28:31Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-27T13:51:37Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-04-01T22:52:09Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-03T22:30:22Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-08T19:48:00Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-15T21:42:56Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-24T16:05:46Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-04T20:50:51Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-17T18:49:48Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  }
 ],
 "state_log": [
  {
   "t": "2023-04-25T16:16:21Z",
   "kind": "convert_to_draft",
   "who": "achow101"
  }
 ],
 "text_chars": 12391,
 "text_tokens_estimate": 3097,
 "changed_paths": [
  ".github/workflows/ci.yml",
  "doc/release-notes-17493.md",
  "src/chainparamsbase.cpp",
  "src/common/args.cpp",
  "src/common/args.h",
  "src/common/config.cpp",
  "src/common/settings.cpp",
  "src/init.cpp",
  "src/init/common.cpp",
  "src/test/argsman_tests.cpp",
  "src/test/fuzz/system.cpp",
  "src/test/getarg_tests.cpp",
  "src/test/logging_tests.cpp",
  "src/test/settings_tests.cpp",
  "src/test/util/common.h",
  "src/wallet/init.cpp",
  "test/functional/feature_config_args.py",
  "test/lint/check-doc.py"
 ],
 "files": [
  {
   "path": ".github/workflows/ci.yml",
   "add": 1,
   "del": 1
  },
  {
   "path": "doc/release-notes-17493.md",
   "add": 8,
   "del": 0
  },
  {
   "path": "src/chainparamsbase.cpp",
   "add": 4,
   "del": 4
  },
  {
   "path": "src/common/args.cpp",
   "add": 158,
   "del": 49
  },
  {
   "path": "src/common/args.h",
   "add": 162,
   "del": 21
  },
  {
   "path": "src/common/config.cpp",
   "add": 7,
   "del": 1
  },
  {
   "path": "src/common/settings.cpp",
   "add": 1,
   "del": 10
  },
  {
   "path": "src/init.cpp",
   "add": 44,
   "del": 36
  },
  {
   "path": "src/init/common.cpp",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/test/argsman_tests.cpp",
   "add": 690,
   "del": 72
  },
  {
   "path": "src/test/fuzz/system.cpp",
   "add": 47,
   "del": 7
  },
  {
   "path": "src/test/getarg_tests.cpp",
   "add": 61,
   "del": 3
  },
  {
   "path": "src/test/logging_tests.cpp",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/test/settings_tests.cpp",
   "add": 2,
   "del": 9
  },
  {
   "path": "src/test/util/common.h",
   "add": 4,
   "del": 0
  },
  {
   "path": "src/wallet/init.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/feature_config_args.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/lint/check-doc.py",
   "add": 3,
   "del": 2
  }
 ],
 "test_lines": 908,
 "git": {
  "head": "8c7c3625f5b315499fba58d5d53cc00a705e7e5f",
  "head_matches_backup": true,
  "base": "683e05a265c86fee6075ccd81828b19e0d8e131a",
  "commits": [
   {
    "sha": "94300ae454",
    "subject": "common: Grammar / formatting tweaks",
    "files": 2,
    "add": 4,
    "del": 4
   },
   {
    "sha": "92cb734d5a",
    "subject": "doc: Add detailed ArgsManager type flag documention",
    "files": 2,
    "add": 137,
    "del": 18
   },
   {
    "sha": "1500c5801c",
    "subject": "common: Implement ArgsManager flags to parse and validate settings on startup",
    "files": 5,
    "add": 194,
    "del": 16
   },
   {
    "sha": "481099679b",
    "subject": "common: Update ArgManager GetArg helper methods to work better with ALLOW flags",
    "files": 4,
    "add": 174,
    "del": 80
   },
   {
    "sha": "dadfea2ac5",
    "subject": "test: Add tests to demonstrate usage of ArgsManager flags",
    "files": 2,
    "add": 312,
    "del": 0
   },
   {
    "sha": "abe4b1d897",
    "subject": "test: Add test for settings.json parsing with type flags",
    "files": 1,
    "add": 61,
    "del": 3
   },
   {
    "sha": "d134020611",
    "subject": "Merge branch 'pr/argcheck' into pr/wdlist",
    "files": 9,
    "add": 851,
    "del": 90
   },
   {
    "sha": "671e547796",
    "subject": "common: Add support for combining ArgsManager flags",
    "files": 4,
    "add": 138,
    "del": 20
   },
   {
    "sha": "44e71c8b9f",
    "subject": "scripted-diff: Add ALLOW_LIST flag to arguments retrieved with GetArgs",
    "files": 6,
    "add": 27,
    "del": 27
   },
   {
    "sha": "bd820336f0",
    "subject": "refactor: Fix more ALLOW_LIST arguments",
    "files": 3,
    "add": 13,
    "del": 13
   },
   {
    "sha": "b314c7e7de",
    "subject": "Always reject empty -blockfilterindex=\"\" arguments",
    "files": 1,
    "add": 8,
    "del": 7
   },
   {
    "sha": "bf58582fd4",
    "subject": "refactor: Stop calling GetArg/IsArgSet on ALLOW_LIST options",
    "files": 1,
    "add": 11,
    "del": 4
   },
   {
    "sha": "581eaaf10f",
    "subject": "refactor: Always enforce ALLOW_LIST in CheckArgFlags",
    "files": 3,
    "add": 121,
    "del": 61
   },
   {
    "sha": "bf61922ae3",
    "subject": "Merge branch 'pr/wdlist' into pr/wdmult",
    "files": 14,
    "add": 1143,
    "del": 196
   },
   {
    "sha": "b46958a1ac",
    "subject": "util: Forbid ambiguous multiple assignments in config file",
    "files": 3,
    "add": 15,
    "del": 5
   },
   {
    "sha": "bdde19f29e",
    "subject": "test: Extend util_ArgsMerge test to check for \"Multiple values specified\" errors",
    "files": 1,
    "add": 42,
    "del": 6
   },
   {
    "sha": "1bcd9f7310",
    "subject": "Merge branch 'pr/wdmult' into pr/wdrev",
    "files": 15,
    "add": 1195,
    "del": 202
   },
   {
    "sha": "4a28b43b1c",
    "subject": "refactor: Remove settings merge reverse precedence code",
    "files": 3,
    "add": 6,
    "del": 22
   },
   {
    "sha": "8c7c3625f5",
    "subject": "test-each-commit: Increase fetch depth",
    "files": 1,
    "add": 1,
    "del": 1
   }
  ],
  "patch_truncated": true
 },
 "input_hash": "244839cf38e459dc",
 "extracted_at": "2026-09-17T16:15:31+00:00"
}