{
 "number": 36494,
 "input_hash": "f0856fa572fffc81",
 "model": "ledger",
 "prompt_hash": null,
 "created": "2026-10-30T01:14:08+00:00",
 "result": {
  "summary": "Validates the options object in the sendall RPC using strict type checking, rejecting unknown keys and verifying expected types. It runs the check before fee arguments are merged into options, superseding PreventOutdatedOptions.",
  "problem": "sendall silently ignored unrecognized keys in its options parameter. Callers making typos could trigger unintended behavior, such as spending every wallet UTXO instead of a specified subset if inputs is misspelled as input, or immediately broadcasting a transaction if add_to_wallet or psbt is misspelled.",
  "card": "Reject unrecognized or mistyped keys in the options dictionary of the sendall RPC rather than silently ignoring them. Today, a typo such as input instead of inputs causes the wallet to spend all available UTXOs rather than the intended selection, while typos in psbt or add_to_wallet can lead to unintended transaction broadcasts. This change brings sendall in line with strict option parsing already used in RPCs like send and fundrawtransaction.",
  "evidence": [
   "PR description: 'sendall silently ignores unknown keys in its options object, including misspelled ones: input instead of inputs spends all available UTXOs rather than the given ones, and a misspelled add_to_wallet or psbt can broadcast a transaction the caller asked not to broadcast.'",
   "Commit message: 'The options are checked before the fee arguments are merged into them, so that a misspelled estimate_mode is reported as an unexpected key. The check also rejects the outdated camelCase names, so sendall no longer needs PreventOutdatedOptions.'"
  ],
  "scope_notes": "",
  "changed_since_previous": "Retained the solving_data option in the allowed options list instead of removing it.",
  "thread": {
   "last_event_at": "2026-10-29T05:41:32Z",
   "events": 19,
   "head_sha": "702ec9d40f84dfd0ca9bf73e37052c36f3802702",
   "schema_floor": 2,
   "schema": 2
  },
  "waiting_on": [
   {
    "at": null,
    "id": "",
    "on": "nothing",
    "url": null,
    "what": "nothing pending"
   }
  ],
  "risk": {
   "level": "medium",
   "touches": [
    "rpc_api",
    "wallet"
   ],
   "why": "Any valid sendall option mistakenly omitted from the schema would cause RPC calls using that option to unexpectedly fail."
  },
  "discussion": {
   "author_status": "last statement processed 2026-10-29",
   "open_concerns": [
    "kevkevinpal: Add a release note for rejecting unknown options in sendall",
    "vicjuma: Simplify release note phrasing to unknown or unsupported options"
   ],
   "resolved_concerns": [
    "polespinasa: Removing solving_data is an undocumented breaking change that violates the deprecation process (fixed by thomasbuilds 2026-10-16)",
    "maflcko: Whether PreventOutdatedOptions call can be removed now, and what about send (accepted by maflcko 2026-10-16)",
    "maflcko: Remove dummy tests that do not check if options are honoured to avoid false sense of coverage (fixed by maflcko 2026-10-16)",
    "maflcko: Make the invalid options test smaller (fixed by maflcko 2026-10-16)"
   ]
  },
  "reviewability": {
   "state": "Ready",
   "label": "Ready",
   "reason": "Nothing known that would invalidate a review now."
  },
  "agreement": {
   "state": "Mild",
   "summary": "Mild: NACK from polespinasa not withdrawn (Removing solving_data is an undocumented breaking change that violates the deprecation process)",
   "reason": "Added Tested ACK from Zippo76 with functional testing on macOS/regtest and code review.",
   "evidence": [
    "kevkevinpal (suggestion, maintenance, must be answered, open): Add a release note for rejecting unknown options in sendall",
    "vicjuma (suggestion, style, must be answered, open): Simplify release note phrasing to unknown or unsupported options",
    "vicjuma: Concept ACK",
    "maflcko: ACK \u2014 only change is slimming down the test",
    "maflcko: ACK \u2014 makes sense to reject unknown fields explicitly instead of silently ignoring them",
    "Zippo76: Tested ACK \u2014 The new case in wallet_sendall.py fails on master, where the unknown option is ignored and the call reaches coin selection; it passes with this PR. Manually checked options={\"add_to_wllt\": false} in regtest: on master, the transaction was accepted into the mempool. With this PR, the same call return"
   ],
   "objections": [
    {
     "reviewer": "kevkevinpal",
     "association": "CONTRIBUTOR",
     "type": "suggestion",
     "kind": "maintenance",
     "harm": "",
     "request": "Add a release note for rejecting unknown options in sendall",
     "question": "",
     "text": "Add a release note for rejecting unknown options in sendall",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-10: 'This should have a release note if `sendall` now rejects unknown options'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36494#issuecomment-6100093019",
     "id": "c:6100093019",
     "at": "2026-10-10",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "vicjuma",
     "association": "CONTRIBUTOR",
     "type": "suggestion",
     "kind": "style",
     "harm": "",
     "request": "Simplify release note phrasing to unknown or unsupported options",
     "question": "",
     "text": "Simplify release note phrasing to unknown or unsupported options",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-14: 'Minor nit: `unknown` (or `unsupported`) options seem enough, probably?'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36494#discussion_r4272001980",
     "id": "rc:4272001980",
     "at": "2026-10-14",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "polespinasa",
     "association": "MEMBER",
     "type": "objection",
     "kind": "interface",
     "harm": "Removing solving_data is an undocumented breaking change that violates the deprecation process",
     "request": "",
     "question": "",
     "text": "Removing solving_data is an undocumented breaking change that violates the deprecation process",
     "clears_with": "change",
     "blocking": true,
     "status": "fixed",
     "status_note": "dropped solving_data removal in a push",
     "cleared": true,
     "author_replied": true,
     "others_replied": false,
     "fix_pushed": true,
     "replies": [
      "c:6212219945"
     ],
     "evidence": "2026-10-15: 'NACK on removing `solving_data`. Although it is not used it is a breaking change that should be documented and follow the deprecation process.'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36494#pullrequestreview-5529096215",
     "id": "r:5529096215",
     "at": "2026-10-15",
     "status_at": "2026-10-16",
     "status_by": "thomasbuilds",
     "resolution_evidence": "2026-10-16: thomasbuilds: 'dropped the `solving_data` removal.'",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "maflcko",
     "association": "MEMBER",
     "type": "question",
     "kind": "maintenance",
     "harm": "",
     "request": "",
     "question": "Whether PreventOutdatedOptions call can be removed now, and what about send",
     "text": "Whether PreventOutdatedOptions call can be removed now, and what about send",
     "clears_with": "answer",
     "blocking": false,
     "status": "accepted",
     "status_note": "author removed the call from sendall and explained send; reviewer accepted leaving send as-is",
     "cleared": true,
     "author_replied": true,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [
      "rc:4294588799",
      "rc:4295266843"
     ],
     "evidence": "2026-10-16: 'This call can be removed now? Also, what about `send`?'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36494#discussion_r4293083196",
     "id": "rc:4293083196",
     "at": "2026-10-16",
     "status_at": "2026-10-16",
     "status_by": "maflcko",
     "resolution_evidence": "2026-10-16: maflcko: 'seems fine to leave as-is for now.'",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "maflcko",
     "association": "MEMBER",
     "type": "suggestion",
     "kind": "maintenance",
     "harm": "",
     "request": "Remove dummy tests that do not check if options are honoured to avoid false sense of coverage",
     "question": "",
     "text": "Remove dummy tests that do not check if options are honoured to avoid false sense of coverage",
     "clears_with": "answer",
     "blocking": false,
     "status": "fixed",
     "status_note": "author slimmed down the test suite and reviewer approved",
     "cleared": true,
     "author_replied": true,
     "others_replied": false,
     "fix_pushed": true,
     "replies": [
      "rc:4295632431"
     ],
     "evidence": "2026-10-16: 'It would be better to remove them to avoid a false sense of coverage.'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36494#discussion_r4295470874",
     "id": "rc:4295470874",
     "at": "2026-10-16",
     "status_at": "2026-10-16",
     "status_by": "maflcko",
     "resolution_evidence": "2026-10-16: maflcko: 'only change is slimming down the test'",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "maflcko",
     "association": "MEMBER",
     "type": "suggestion",
     "kind": "maintenance",
     "harm": "",
     "request": "Make the invalid options test smaller",
     "question": "",
     "text": "Make the invalid options test smaller",
     "clears_with": "answer",
     "blocking": false,
     "status": "fixed",
     "status_note": "author applied suggested diff and reviewer confirmed",
     "cleared": true,
     "author_replied": true,
     "others_replied": false,
     "fix_pushed": true,
     "replies": [
      "rc:4295632431"
     ],
     "evidence": "2026-10-16: 'not sure about such a large test. This can be made smaller:'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36494#discussion_r4295504344",
     "id": "rc:4295504344",
     "at": "2026-10-16",
     "status_at": "2026-10-16",
     "status_by": "maflcko",
     "resolution_evidence": "2026-10-16: maflcko: 'only change is slimming down the test'",
     "pin": null,
     "from_schema": 2
    }
   ],
   "support": [
    {
     "reviewer": "vicjuma",
     "reason": "",
     "substantive": false,
     "verdict": "Concept ACK",
     "id": "r:5518448164",
     "url": "https://github.com/bitcoin/bitcoin/pull/36494#pullrequestreview-5518448164",
     "at": "2026-10-14",
     "association": "CONTRIBUTOR",
     "evidence": "none",
     "areas": []
    },
    {
     "reviewer": "maflcko",
     "reason": "only change is slimming down the test",
     "substantive": false,
     "verdict": "ACK",
     "id": "c:6217508907",
     "url": "https://github.com/bitcoin/bitcoin/pull/36494#issuecomment-6217508907",
     "at": "2026-10-16",
     "association": "MEMBER",
     "evidence": "read",
     "areas": []
    },
    {
     "reviewer": "maflcko",
     "reason": "makes sense to reject unknown fields explicitly instead of silently ignoring them",
     "substantive": true,
     "verdict": "ACK",
     "id": "r:5548828363",
     "url": "https://github.com/bitcoin/bitcoin/pull/36494#pullrequestreview-5548828363",
     "at": "2026-10-16",
     "association": "MEMBER",
     "evidence": "read",
     "areas": []
    },
    {
     "reviewer": "Zippo76",
     "reason": "The new case in wallet_sendall.py fails on master, where the unknown option is ignored and the call reaches coin selection; it passes with this PR. Manually checked options={\"add_to_wllt\": false} in regtest: on master, the transaction was accepted into the mempool. With this PR, the same call return",
     "substantive": true,
     "verdict": "Tested ACK",
     "id": "c:6488985127",
     "url": "https://github.com/bitcoin/bitcoin/pull/36494#issuecomment-6488985127",
     "at": "2026-10-29",
     "association": "NONE",
     "evidence": "both",
     "areas": [
      "wallet_sendall.py"
     ]
    }
   ],
   "participants": [
    {
     "login": "kevkevinpal",
     "stance": "neutral",
     "note": "suggested adding a release note",
     "association": "CONTRIBUTOR",
     "comments": 1,
     "first": "2026-10-10",
     "last": "2026-10-10"
    },
    {
     "login": "Conradgabe",
     "stance": "support",
     "note": "Concept ACK without rationale",
     "association": "NONE",
     "comments": 1,
     "first": "2026-10-13",
     "last": "2026-10-13"
    },
    {
     "login": "vicjuma",
     "stance": "support",
     "note": "Concept ACK, tested the change, and suggested a nit on the release note wording",
     "association": "CONTRIBUTOR",
     "comments": 3,
     "first": "2026-10-14",
     "last": "2026-10-14"
    },
    {
     "login": "polespinasa",
     "stance": "objection",
     "note": "Concept ACK on options check, but NACK on removing solving_data without deprecation",
     "association": "MEMBER",
     "comments": 1,
     "first": "2026-10-15",
     "last": "2026-10-15"
    },
    {
     "login": "maflcko",
     "stance": "support",
     "note": "ACKed rejecting unknown options; suggested removing redundant check and slimming test",
     "association": "MEMBER",
     "comments": 8,
     "first": "2026-10-16",
     "last": "2026-10-16"
    },
    {
     "login": "Zippo76",
     "stance": "support",
     "note": "Tested ACK; verified test and manual regtest behavior, reviewed diff logic",
     "association": "NONE",
     "comments": 1,
     "first": "2026-10-29",
     "last": "2026-10-29"
    }
   ],
   "derivation": "NACK from polespinasa not withdrawn (Removing solving_data is an undocumented breaking change that violates the deprecation process)",
   "model_state": null,
   "corrections": [],
   "notes": "Added Tested ACK from Zippo76 with functional testing on macOS/regtest and code review."
  },
  "dependencies": {
   "depends_on": [],
   "enables": []
  },
  "categories": [
   {
    "name": "docs",
    "member": false,
    "evidence": "Touches only a release note accompanying a wallet RPC change.",
    "band": "Unranked",
    "reason_tag": "cleanup",
    "score": 0.0,
    "factors": {
     "bug_severity": 2,
     "leverage": 0,
     "performance": 0,
     "security_stability": 1,
     "user_value": 2
    },
    "rationale": "Documentation is not the primary change; the release note merely follows the wallet code change."
   },
   {
    "name": "rpc",
    "member": false,
    "evidence": "Wallet RPC changes belong to wallet first unless modifying the underlying RPC machinery.",
    "band": "Unranked",
    "reason_tag": "bug fix",
    "score": 0.0,
    "factors": {
     "bug_severity": 2,
     "leverage": 0,
     "performance": 0,
     "security_stability": 1,
     "user_value": 2
    },
    "rationale": "The change modifies option validation for sendall, which is a wallet RPC rather than RPC framework machinery."
   },
   {
    "name": "wallet",
    "member": true,
    "evidence": "Has Wallet label and modifies src/wallet/rpc/spend.cpp.",
    "band": "P2",
    "reason_tag": "fund safety",
    "score": 0.65,
    "factors": {
     "bug_severity": 2,
     "leverage": 0,
     "performance": 0,
     "security_stability": 1,
     "user_value": 2
    },
    "rationale": "Prevents silent execution of unintended spends and broadcasts when option keys are misspelled in sendall. As noted in the PR description, a typo like 'input' instead of 'inputs' causes the wallet to spend all available UTXOs rather than the intended selection, while misspelling 'add_to_wallet' or 'psbt' can cause unexpected transaction broadcast."
   }
  ],
  "confidence": "high",
  "uncertainties": [],
  "needs": []
 },
 "cost_usd": 0.0,
 "source": {
  "record": "2026-10-30T01:14:08+00:00",
  "code": "2026-10-18T01:16:54+00:00",
  "judgments": 3
 }
}