{
 "number": 36325,
 "input_hash": "66e6a737a64a1afa",
 "model": "ledger",
 "prompt_hash": null,
 "created": "2026-10-30T01:14:24+00:00",
 "result": {
  "summary": "Adds a standalone Python multisig setup wizard in contrib/multisig and an accompanying functional test. The utility orchestrates the end-to-end setup flow for k-of-n descriptor wallets across coordinators and participants using existing RPCs. It supports BIP 87 key generation, cosigner key validation, and descriptor assembly for both P2WSH sortedmulti and Taproot MuSig2 with sortedmulti_a.",
  "problem": "Setting up multisig descriptor wallets across participants currently requires manual key derivation, descriptor construction, and multiple RPC workarounds, such as substituting private keys to bypass importdescriptors restrictions and wrapping keys in pkh() expressions to validate them. Bitcoin Core lacks high-level tooling or structured RPC workflows to coordinate multisig key collection, descriptor verification, and import.",
  "card": "This pull request adds a Python multisig setup utility to contrib/multisig alongside functional test coverage. It guides coordinators and cosigners through wallet creation, BIP 87 key generation, cosigner key collection, descriptor assembly, verification, and descriptor import for both P2WSH and Taproot multisig schemes. Setting up multisig descriptor wallets currently requires manual descriptor assembly and awkward RPC workarounds for key validation and import. The author presents the tool as a working prototype for tracking issue #35645 to help shape downstream RPC and wallet improvements. It is self-contained in contrib and functional tests, carrying no external PR dependencies.",
  "evidence": [
   "Part of tracking issue #35645 (Multisig Wizard tracking issue) and references discussions on #36143.",
   "PR description notes the tool is intended to demonstrate the setup flow 'so that RPC and interface work is shaped by what that flow actually needs' (author claim)."
  ],
  "scope_notes": "Self-contained script in contrib/multisig with functional test coverage; does not modify any C++ node or wallet source files.",
  "changed_since_previous": "",
  "thread": {
   "last_event_at": "2026-10-29T05:37:14Z",
   "events": 11,
   "head_sha": "2803e1518bb22394a80bac94e2435bb3982d0cde",
   "schema_floor": 2,
   "schema": 2
  },
  "waiting_on": [
   {
    "at": "2026-10-23",
    "id": "c:6373344413",
    "on": "author",
    "url": "https://github.com/bitcoin/bitcoin/pull/36325#issuecomment-6373344413",
    "what": "respond to pseudoramdom's Concept NACK concerns regarding maintenance and safety in contrib/"
   },
   {
    "at": "2026-10-29",
    "id": "c:6488924478",
    "on": "author",
    "url": "https://github.com/bitcoin/bitcoin/pull/36325#issuecomment-6488924478",
    "what": "address BenWestgate's suggestions and review findings on timestamp handling and backup docs"
   }
  ],
  "risk": {
   "level": "low",
   "touches": [
    "tooling",
    "tests"
   ],
   "why": "Mistakes are confined to an external contrib helper script and a functional test, with no impact on consensus, wallet internals, or release binaries."
  },
  "discussion": {
   "author_status": "last statement processed 2026-10-29",
   "open_concerns": [
    "kevkevinpal: adding the script introduces an ongoing maintenance burden for maintainers for a tool that will be obsolete once GUI/wallet work is done",
    "pseudoramdom: reviewing and maintaining temporary workarounds that will be superseded by core wallet changes diverts resources from implementing the backend items",
    "pseudoramdom: placing the script in contrib/ makes it look like a recommended tool, risking user funds and proving difficult to undo",
    "BenWestgate: reduce the script size as much as possible (e.g. 100-300 lines) to minimize review time and encourage review",
    "BenWestgate: modularize the script so each workaround can be deleted and replaced with a new RPC as it lands",
    "BenWestgate: using \"now\" as the timestamp in import_descriptor sets the wallet birth time to genesis on an offline node, causing backup restoration on a pruned node to fail",
    "BenWestgate: document the requirement to back up both the key wallet and the descriptor after import_descriptor"
   ],
   "resolved_concerns": [
    "sedited: keep the wizard as an external script rather than adding it to the repository (answered by rxbryan 2026-09-26)",
    "BenWestgate: whether the author is willing to maintain the script, including bug fixes, until RPCs obsolete it (answered by rxbryan 2026-10-05)"
   ]
  },
  "reviewability": {
   "state": "Ready",
   "label": "Ready",
   "reason": "Nothing known that would invalidate a review now."
  },
  "agreement": {
   "state": "Blocked",
   "summary": "Blocked: objection that needs a change, nobody has replied (pseudoramdom, BenWestgate)",
   "reason": "Added BenWestgate's Tested ACK and two new items from c:6488924478 regarding timestamp handling on offline nodes and documenting the backup requirement.",
   "evidence": [
    "kevkevinpal (objection, maintenance, must be changed, answered): adding the script introduces an ongoing maintenance burden for maintainers for a tool that will be obsolete once GUI/wallet work is done",
    "pseudoramdom (objection, maintenance, must be changed, open): reviewing and maintaining temporary workarounds that will be superseded by core wallet changes diverts resources from implementing the backend items",
    "pseudoramdom (objection, safety, must be changed, open): placing the script in contrib/ makes it look like a recommended tool, risking user funds and proving difficult to undo",
    "BenWestgate (suggestion, scope, must be answered, open): reduce the script size as much as possible (e.g. 100-300 lines) to minimize review time and encourage review",
    "BenWestgate (suggestion, approach, must be answered, open): modularize the script so each workaround can be deleted and replaced with a new RPC as it lands",
    "BenWestgate (objection, correctness, must be changed, open): using \"now\" as the timestamp in import_descriptor sets the wallet birth time to genesis on an offline node, causing backup restoration on a pruned node to fail",
    "BenWestgate (suggestion, safety, must be answered, open): document the requirement to back up both the key wallet and the descriptor after import_descriptor",
    "BenWestgate: Concept ACK \u2014 Core having user unfriendly multisig has been exploited by scammers to promote alternative multisig wallets with substantially less scrutiny than this repository",
    "BenWestgate: Tested ACK \u2014 ran all wizard steps on an offline node for 2-of-3 wsh(sortedmulti), created PSBT on restored online watch-only coordinator, signed offline, and verified acceptance via testmempoolaccept"
   ],
   "objections": [
    {
     "reviewer": "sedited",
     "association": "MEMBER",
     "type": "suggestion",
     "kind": "scope",
     "harm": "",
     "request": "keep the wizard as an external script rather than adding it to the repository",
     "question": "",
     "text": "keep the wizard as an external script rather than adding it to the repository",
     "clears_with": "answer",
     "blocking": false,
     "status": "answered",
     "status_note": "the author explained the intent as a CLI counterpart to the GUI wizard; BenWestgate argued repo inclusion counters scammers pushing less-reviewed alternatives",
     "cleared": true,
     "author_replied": true,
     "others_replied": true,
     "fix_pushed": false,
     "replies": [
      "c:5844636792",
      "r:5359830788"
     ],
     "evidence": "2026-09-25: 'Do we need this in the repository? Seems fine to me if it were just an external script.'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36325#issuecomment-5828804605",
     "id": "c:5828804605",
     "at": "2026-09-25",
     "status_at": "2026-09-26",
     "status_by": "rxbryan",
     "resolution_evidence": "2026-09-26: rxbryan: 'Aside from being a demonstration of the multisig setup flow, the utility is intended to become a command-line equivalent'",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "kevkevinpal",
     "association": "CONTRIBUTOR",
     "type": "objection",
     "kind": "maintenance",
     "harm": "adding the script introduces an ongoing maintenance burden for maintainers for a tool that will be obsolete once GUI/wallet work is done",
     "request": "",
     "question": "",
     "text": "adding the script introduces an ongoing maintenance burden for maintainers for a tool that will be obsolete once GUI/wallet work is done",
     "clears_with": "change",
     "blocking": true,
     "status": "answered",
     "status_note": "author committed to maintaining the script until RPCs obsolete it; BenWestgate argued it serves as a functional checklist",
     "cleared": false,
     "author_replied": true,
     "others_replied": true,
     "fix_pushed": false,
     "replies": [
      "c:6002949265",
      "c:5985919355"
     ],
     "evidence": "2026-10-03: 'It is just another piece of code the Bitcoin Core maintainers will need to worry about forever.'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36325#issuecomment-5971349539",
     "id": "c:5971349539",
     "at": "2026-10-03",
     "status_at": "2026-10-05",
     "status_by": "rxbryan",
     "resolution_evidence": "2026-10-05: rxbryan: 'Yes. I'll maintain it, we have enough test cases to force a maintenance contract on whoever modifies code touching it.'",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "BenWestgate",
     "association": "CONTRIBUTOR",
     "type": "question",
     "kind": "maintenance",
     "harm": "",
     "request": "",
     "question": "whether the author is willing to maintain the script, including bug fixes, until RPCs obsolete it",
     "text": "whether the author is willing to maintain the script, including bug fixes, until RPCs obsolete it",
     "clears_with": "answer",
     "blocking": false,
     "status": "answered",
     "status_note": "author confirmed they will maintain the script",
     "cleared": true,
     "author_replied": true,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [
      "c:6002949265"
     ],
     "evidence": "2026-10-05: 'are you willing to maintain this script (including bug fixing) until the RPC obsoletes it?'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36325#issuecomment-5985919355",
     "id": "c:5985919355",
     "at": "2026-10-05",
     "status_at": "2026-10-05",
     "status_by": "rxbryan",
     "resolution_evidence": "2026-10-05: rxbryan: 'Yes. I'll maintain it, we have enough test cases to force a maintenance contract on whoever modifies code touching it.'",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "pseudoramdom",
     "association": "MEMBER",
     "type": "objection",
     "kind": "maintenance",
     "harm": "reviewing and maintaining temporary workarounds that will be superseded by core wallet changes diverts resources from implementing the backend items",
     "request": "",
     "question": "",
     "text": "reviewing and maintaining temporary workarounds that will be superseded by core wallet changes diverts resources from implementing the backend items",
     "clears_with": "change",
     "blocking": true,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-23: 'Merging this would mean reviewing ~700 lines (script and functional test) whose job is to work around things we plan to fix. We'd then have to review again each time one of those fixes lands and remov'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36325#issuecomment-6373344413",
     "id": "c:6373344413",
     "at": "2026-10-23",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "pseudoramdom",
     "association": "MEMBER",
     "type": "objection",
     "kind": "safety",
     "harm": "placing the script in contrib/ makes it look like a recommended tool, risking user funds and proving difficult to undo",
     "request": "",
     "question": "",
     "text": "placing the script in contrib/ makes it look like a recommended tool, risking user funds and proving difficult to undo",
     "clears_with": "change",
     "blocking": true,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-23: 'Also putting a script in `contrib/` makes it look like a recommended tool and that's hard to undo once people use it with real funds.'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36325#issuecomment-6373344413",
     "id": "c:6373344413#2",
     "at": "2026-10-23",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "BenWestgate",
     "association": "CONTRIBUTOR",
     "type": "suggestion",
     "kind": "scope",
     "harm": "",
     "request": "reduce the script size as much as possible (e.g. 100-300 lines) to minimize review time and encourage review",
     "question": "",
     "text": "reduce the script size as much as possible (e.g. 100-300 lines) to minimize review time and encourage review",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-23: 'What's the absolute smallest it could be made to maximize the number of people willing to review it and minimize the time it takes them?'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36325#issuecomment-6374070423",
     "id": "c:6374070423",
     "at": "2026-10-23",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "BenWestgate",
     "association": "CONTRIBUTOR",
     "type": "suggestion",
     "kind": "approach",
     "harm": "",
     "request": "modularize the script so each workaround can be deleted and replaced with a new RPC as it lands",
     "question": "",
     "text": "modularize the script so each workaround can be deleted and replaced with a new RPC as it lands",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-23: 'Could you modularize it so that each time one of our workarounds lands, we just delete a function or module and replace it with the new RPC?'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36325#issuecomment-6374070423",
     "id": "c:6374070423#2",
     "at": "2026-10-23",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "BenWestgate",
     "association": "CONTRIBUTOR",
     "type": "objection",
     "kind": "correctness",
     "harm": "using \"now\" as the timestamp in import_descriptor sets the wallet birth time to genesis on an offline node, causing backup restoration on a pruned node to fail",
     "request": "",
     "question": "",
     "text": "using \"now\" as the timestamp in import_descriptor sets the wallet birth time to genesis on an offline node, causing backup restoration on a pruned node to fail",
     "clears_with": "change",
     "blocking": true,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-29: 'In `importdescriptors`, \"now\" means the best block's time. An offline node has only the genesis block, so the wallet's birth time is genesis. Restoring that wallet's backup on a pruned online node then fails with `Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex`.'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36325#issuecomment-6488924478",
     "id": "c:6488924478",
     "at": "2026-10-29",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "BenWestgate",
     "association": "CONTRIBUTOR",
     "type": "suggestion",
     "kind": "safety",
     "harm": "",
     "request": "document the requirement to back up both the key wallet and the descriptor after import_descriptor",
     "question": "",
     "text": "document the requirement to back up both the key wallet and the descriptor after import_descriptor",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-29: 'After `import_descriptor`, each participant has to back up their key wallet and the descriptor. A key wallet alone can't rebuild the multisig. The wizard's docstrings don't mention this. It may belong in the README rather than the code.'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36325#issuecomment-6488924478",
     "id": "c:6488924478#2",
     "at": "2026-10-29",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    }
   ],
   "support": [
    {
     "reviewer": "BenWestgate",
     "reason": "Core having user unfriendly multisig has been exploited by scammers to promote alternative multisig wallets with substantially less scrutiny than this repository",
     "substantive": true,
     "verdict": "Concept ACK",
     "id": "r:5359830788",
     "url": "https://github.com/bitcoin/bitcoin/pull/36325#pullrequestreview-5359830788",
     "at": "2026-09-30",
     "association": "CONTRIBUTOR",
     "evidence": "none",
     "areas": []
    },
    {
     "reviewer": "BenWestgate",
     "reason": "ran all wizard steps on an offline node for 2-of-3 wsh(sortedmulti), created PSBT on restored online watch-only coordinator, signed offline, and verified acceptance via testmempoolaccept",
     "substantive": true,
     "verdict": "Tested ACK",
     "id": "c:6488924478",
     "url": "https://github.com/bitcoin/bitcoin/pull/36325#issuecomment-6488924478",
     "at": "2026-10-29",
     "association": "CONTRIBUTOR",
     "evidence": "both",
     "areas": [
      "import_descriptor"
     ]
    }
   ],
   "participants": [
    {
     "login": "sedited",
     "stance": "question",
     "note": "asked whether the wizard belongs in the repository or should be an external script",
     "association": "MEMBER",
     "comments": 1,
     "first": "2026-09-25",
     "last": "2026-09-25"
    },
    {
     "login": "BenWestgate",
     "stance": "support",
     "note": "Concept ACK and Tested ACK; tested offline multisig setup, argued repo inclusion protects users, raised review nits on timestamp handling and backups",
     "association": "CONTRIBUTOR",
     "comments": 6,
     "first": "2026-09-29",
     "last": "2026-10-29"
    },
    {
     "login": "kevkevinpal",
     "stance": "objection",
     "note": "objected to merging the script due to the maintenance burden of keeping it in the repo when it will become obsolete",
     "association": "CONTRIBUTOR",
     "comments": 1,
     "first": "2026-10-03",
     "last": "2026-10-03"
    },
    {
     "login": "pseudoramdom",
     "stance": "objection",
     "note": "leaning Concept NACK due to review/maintenance overhead of temporary workarounds and risk of users trusting contrib with real funds",
     "association": "MEMBER",
     "comments": 1,
     "first": "2026-10-23",
     "last": "2026-10-23"
    }
   ],
   "derivation": "objection that needs a change, nobody has replied (pseudoramdom, BenWestgate)",
   "model_state": null,
   "corrections": [],
   "notes": "Added BenWestgate's Tested ACK and two new items from c:6488924478 regarding timestamp handling on offline nodes and documenting the backup requirement."
  },
  "dependencies": {
   "depends_on": [],
   "enables": [
    "#35645"
   ]
  },
  "categories": [
   {
    "name": "tests",
    "member": false,
    "evidence": "Adding a test for a new tool in test/functional/ and registering it in test_runner.py merely follows from the added contrib script, with no changes to test framework infrastructure.",
    "band": "Unranked",
    "reason_tag": "test coverage",
    "score": 0.0,
    "factors": {
     "bug_severity": 0,
     "leverage": 1,
     "performance": 0,
     "security_stability": 0,
     "user_value": 2
    },
    "rationale": "Does not touch test framework machinery."
   },
   {
    "name": "tools",
    "member": true,
    "evidence": "Matches the 'Scripts and tools' label and adds a standalone utility script under contrib/multisig/.",
    "band": "P3",
    "reason_tag": "new feature",
    "score": 0.35,
    "factors": {
     "bug_severity": 0,
     "leverage": 1,
     "performance": 0,
     "security_stability": 0,
     "user_value": 2
    },
    "rationale": "Adds a standalone CLI wizard to coordinate multisig descriptor wallet setup across participants using existing RPCs. While it addresses a well-known user pain point regarding manual multisig construction and directly touches keys and descriptors, as a contrib helper intended largely to prototype and guide upcoming core wallet RPC workflows (#35645), review is worthwhile but reasonably deferrable."
   }
  ],
  "confidence": "high",
  "uncertainties": [],
  "needs": []
 },
 "cost_usd": 0.0,
 "source": {
  "record": "2026-10-30T01:14:24+00:00",
  "code": "2026-09-25T01:29:58+00:00",
  "judgments": 2
 }
}