{
 "number": 36489,
 "input_hash": "5b90ecf983e2154c",
 "model": "ledger",
 "prompt_hash": null,
 "created": "2026-10-27T01:27:36+00:00",
 "result": {
  "summary": "Adds snake_case aliases for options in the `fundrawtransaction` and `walletcreatefundedpsbt` RPCs, updating the RPC schema, client conversions, and documentation. Introduces explicit validation that throws an RPC error if both camelCase and snake_case variants of an option are provided simultaneously, and fixes a bug where `subtract_fee_from_outputs` was silently ignored by the server.",
  "problem": "Wallet funding RPCs handle option names inconsistently across interfaces. The RPC server accepted some snake_case options that `bitcoin-cli` rejected, `subtract_fee_from_outputs` was ignored entirely in favor of only the camelCase variant, and supplying both variants caused one to be silently ignored without warning.",
  "card": "This PR adds missing snake_case aliases (`change_address`, `change_position`, `lock_unspents`, and `subtract_fee_from_outputs`) to the RPC schema, `bitcoin-cli` client table, and documentation for `fundrawtransaction` and `walletcreatefundedpsbt`. It fixes a bug where `subtract_fee_from_outputs` was previously ignored by the server, and errors out when callers pass both camelCase and snake_case versions of an option instead of silently ignoring one.",
  "evidence": [
   "Commit message fac8ef10f4 and PR description note that 'subtract_fee_from_outputs' was silently ignored by the server, reported by stutxo in PR #35317.",
   "Diff in src/wallet/rpc/spend.cpp confirms `options[\"subtractFeeFromOutputs\"]` was previously accessed directly without checking the snake_case option, whereas `change_address` and `change_position` had ad-hoc checks."
  ],
  "scope_notes": "",
  "changed_since_previous": "Diff and tests are now present; the change implements a helper `GetOptionWithAlias` to reject conflicting aliases and exercises snake_case options in functional tests.",
  "thread": {
   "last_event_at": "2026-10-26T09:13:12Z",
   "events": 12,
   "head_sha": "faeb073ca68348bc663c80b3f2b70d7014466b07",
   "schema_floor": 2,
   "schema": 2
  },
  "waiting_on": [
   {
    "at": "2026-10-26",
    "id": "c:6412371025",
    "on": "reviewer",
    "url": "https://github.com/bitcoin/bitcoin/pull/36489#issuecomment-6412371025",
    "what": "fametrano to follow up on author reply regarding schema rejection of deprecated aliases"
   },
   {
    "at": "2026-10-25",
    "id": "c:6394537752",
    "on": "author",
    "url": "https://github.com/bitcoin/bitcoin/pull/36489#issuecomment-6394537752",
    "what": "response to fametrano's suggestion on leftover camelCase names in user text"
   }
  ],
  "risk": {
   "level": "medium",
   "touches": [
    "rpc_api",
    "wallet"
   ],
   "why": "Mistakes in parsing or validating wallet funding RPC parameters could cause transaction creation to fail or select the wrong change outputs or fee subtraction rules."
  },
  "discussion": {
   "author_status": "last statement processed 2026-10-26",
   "open_concerns": [
    "fametrano: The schema now rejects camelCase options that the server still accepts, breaking clients that validate against the schema",
    "fametrano: Update remaining camelCase names in help text and error messages"
   ],
   "resolved_concerns": [
    "kevkevinpal: Why is there no snake_case alias for includeWatching? (accepted by kevkevinpal 2026-10-10)",
    "kevkevinpal: Mention in the release notes that providing both camelCase and snake_case options will now throw an error (answered by maflcko 2026-10-12)"
   ]
  },
  "reviewability": {
   "state": "Ready",
   "label": "Ready",
   "reason": "Nothing known that would invalidate a review now."
  },
  "agreement": {
   "state": "Mild",
   "summary": "Mild: objection that needs a change was answered, no reply from the objector (fametrano: The schema now rejects camelCase options that the server still accepts, breaking clients that validate against the schem)",
   "reason": "The author responded to fametrano's objection regarding the schema rejecting camelCase aliases, explaining it is intentional pre-existing behavior that should be handled in a separate PR if changed. fametrano's suggestion regarding remaining camelCase strings in help/error text remains unaddressed.",
   "evidence": [
    "fametrano (objection, interface, must be changed, answered): The schema now rejects camelCase options that the server still accepts, breaking clients that validate against the schema",
    "fametrano (suggestion, interface, must be answered, open): Update remaining camelCase names in help text and error messages",
    "psychemist: Concept ACK",
    "kevkevinpal: Concept ACK",
    "Conradgabe: Tested ACK \u2014 reproduced all 3 issues on master and verified the fixes on regtest"
   ],
   "objections": [
    {
     "reviewer": "kevkevinpal",
     "association": "CONTRIBUTOR",
     "type": "question",
     "kind": "interface",
     "harm": "",
     "request": "",
     "question": "Why is there no snake_case alias for includeWatching?",
     "text": "Why is there no snake_case alias for includeWatching?",
     "clears_with": "answer",
     "blocking": false,
     "status": "accepted",
     "status_note": "withdrawn by reviewer after noticing includeWatching is deprecated",
     "cleared": true,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-10: 'is there any reason why we don't have a snake_case for `includeWatching`?'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36489#discussion_r4237783105",
     "id": "rc:4237783105",
     "at": "2026-10-10",
     "status_at": "2026-10-10",
     "status_by": "kevkevinpal",
     "resolution_evidence": "2026-10-10: kevkevinpal: 'Never mind I see `includeWatching` is marked deprecated'",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "kevkevinpal",
     "association": "CONTRIBUTOR",
     "type": "suggestion",
     "kind": "maintenance",
     "harm": "",
     "request": "Mention in the release notes that providing both camelCase and snake_case options will now throw an error",
     "question": "",
     "text": "Mention in the release notes that providing both camelCase and snake_case options will now throw an error",
     "clears_with": "answer",
     "blocking": false,
     "status": "answered",
     "status_note": "author declined, saying release notes should not be bloated with expected behavior",
     "cleared": true,
     "author_replied": true,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [
      "rc:4245248551"
     ],
     "evidence": "2026-10-10: 'Should we add in the release note that sending both camelCase and snake_case will now throw an error?'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36489#discussion_r4237859410",
     "id": "rc:4237859410",
     "at": "2026-10-10",
     "status_at": "2026-10-12",
     "status_by": "maflcko",
     "resolution_evidence": "2026-10-12: maflcko: 'I think that should be the obvious and expected behavior. No need to bloat the release notes with stuff that no user sho'",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "fametrano",
     "association": "NONE",
     "type": "objection",
     "kind": "interface",
     "harm": "The schema now rejects camelCase options that the server still accepts, breaking clients that validate against the schema",
     "request": "",
     "question": "",
     "text": "The schema now rejects camelCase options that the server still accepts, breaking clients that validate against the schema",
     "clears_with": "change",
     "blocking": true,
     "status": "answered",
     "status_note": "author replied that schema rejection of deprecated aliases is intentional and existing behavior",
     "cleared": false,
     "author_replied": true,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [
      "c:6412371025"
     ],
     "evidence": "2026-10-25: 'The schema now rejects `changeAddress`, `changePosition`, `lockUnspents` and `subtractFeeFromOutputs`, which the server still accepts.'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36489#issuecomment-6394537752",
     "id": "c:6394537752",
     "at": "2026-10-25",
     "status_at": "2026-10-26",
     "status_by": "maflcko",
     "resolution_evidence": "2026-10-26: maflcko: 'Yes, I presume the schema rejecting the deprecated alias is intentional. This is the behavior before and after this pull request.'",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "fametrano",
     "association": "NONE",
     "type": "suggestion",
     "kind": "interface",
     "harm": "",
     "request": "Update remaining camelCase names in help text and error messages",
     "question": "",
     "text": "Update remaining camelCase names in help text and error messages",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-25: 'Two camelCase names remain in text a user reads. The `change_type` help still says \"Only valid if changeAddress is not specified\", and an out-of-range position still fails with \"changePosition out of '",
     "url": "https://github.com/bitcoin/bitcoin/pull/36489#issuecomment-6394537752",
     "id": "c:6394537752#2",
     "at": "2026-10-25",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    }
   ],
   "support": [
    {
     "reviewer": "psychemist",
     "reason": "",
     "substantive": false,
     "verdict": "Concept ACK",
     "id": "c:6084746784",
     "url": "https://github.com/bitcoin/bitcoin/pull/36489#issuecomment-6084746784",
     "at": "2026-10-09",
     "association": "NONE",
     "evidence": "none",
     "areas": []
    },
    {
     "reviewer": "kevkevinpal",
     "reason": "",
     "substantive": false,
     "verdict": "Concept ACK",
     "id": "c:6098272996",
     "url": "https://github.com/bitcoin/bitcoin/pull/36489#issuecomment-6098272996",
     "at": "2026-10-10",
     "association": "CONTRIBUTOR",
     "evidence": "none",
     "areas": []
    },
    {
     "reviewer": "Conradgabe",
     "reason": "reproduced all 3 issues on master and verified the fixes on regtest",
     "substantive": true,
     "verdict": "Tested ACK",
     "id": "c:6121356827",
     "url": "https://github.com/bitcoin/bitcoin/pull/36489#issuecomment-6121356827",
     "at": "2026-10-12",
     "association": "NONE",
     "evidence": "tested",
     "areas": []
    }
   ],
   "participants": [
    {
     "login": "psychemist",
     "stance": "support",
     "note": "Concept ACK",
     "association": "NONE",
     "comments": 1,
     "first": "2026-10-09",
     "last": "2026-10-09"
    },
    {
     "login": "kevkevinpal",
     "stance": "support",
     "note": "Concept ACK; asked about includeWatching and suggested a release note update",
     "association": "CONTRIBUTOR",
     "comments": 6,
     "first": "2026-10-10",
     "last": "2026-10-10"
    },
    {
     "login": "Conradgabe",
     "stance": "support",
     "note": "Tested ACK verifying fixes on regtest after reproducing issues on master",
     "association": "NONE",
     "comments": 1,
     "first": "2026-10-12",
     "last": "2026-10-12"
    },
    {
     "login": "fametrano",
     "stance": "objection",
     "note": "objected that the schema rejects camelCase options that the server still accepts, and pointed out leftover camelCase strings in help and error text",
     "association": "NONE",
     "comments": 1,
     "first": "2026-10-25",
     "last": "2026-10-25"
    }
   ],
   "derivation": "objection that needs a change was answered, no reply from the objector (fametrano: The schema now rejects camelCase options that the server still accepts, breaking clients that validate against the schem)",
   "model_state": null,
   "corrections": [],
   "notes": "The author responded to fametrano's objection regarding the schema rejecting camelCase aliases, explaining it is intentional pre-existing behavior that should be handled in a separate PR if changed. fametrano's suggestion regarding remaining camelCase strings in help/error text remains unaddressed."
  },
  "dependencies": {
   "depends_on": [],
   "enables": []
  },
  "categories": [
   {
    "name": "docs",
    "member": false,
    "evidence": "Touches only doc/release-notes-36489.md as a release note accompanying code changes.",
    "band": "Unranked",
    "reason_tag": "cleanup",
    "score": 0.0,
    "factors": {
     "bug_severity": 1,
     "leverage": 0,
     "performance": 0,
     "security_stability": 0,
     "user_value": 1
    },
    "rationale": "Release notes that accompany code changes belong to the area being changed, not docs."
   },
   {
    "name": "rpc",
    "member": false,
    "evidence": "Changes wallet RPC options in src/wallet/rpc/spend.cpp and adds convert table entries in src/rpc/client.cpp.",
    "band": "Unranked",
    "reason_tag": "bug fix",
    "score": 0.0,
    "factors": {
     "bug_severity": 1,
     "leverage": 0,
     "performance": 0,
     "security_stability": 0,
     "user_value": 1
    },
    "rationale": "Wallet RPC changes belong to wallet first, and the accompanying table additions in client.cpp are mechanical follow-ups rather than changes to RPC machinery."
   },
   {
    "name": "wallet",
    "member": true,
    "evidence": "Labeled Wallet and modifies wallet funding RPC option parsing in src/wallet/rpc/spend.cpp.",
    "band": "P3",
    "reason_tag": "bug fix",
    "score": 0.4,
    "factors": {
     "bug_severity": 1,
     "leverage": 0,
     "performance": 0,
     "security_stability": 0,
     "user_value": 1
    },
    "rationale": "Fixes a bug where subtract_fee_from_outputs was silently ignored by the server and adds snake_case alias consistency across wallet funding commands. The improvements prevent unexpected fee deduction behavior and mutual option collisions, but are reasonably deferrable."
   }
  ],
  "confidence": "high",
  "uncertainties": [],
  "needs": []
 },
 "cost_usd": 0.0,
 "source": {
  "record": "2026-10-27T01:27:36+00:00",
  "code": "2026-10-11T01:23:35+00:00",
  "judgments": 3
 }
}