{
 "number": 10102,
 "input_hash": "d98b5fd2bf66a699",
 "model": "openrouter/google/gemini-3.8-flash",
 "batch": false,
 "created": "2026-09-17T21:15:34+00:00",
 "provider": "Google",
 "stop_reason": "end_turn",
 "usage": {
  "input_tokens": 87996,
  "cache_creation_input_tokens": 0,
  "cache_read_input_tokens": 0,
  "output_tokens": 18180
 },
 "cost_usd": 0.13417199999999999,
 "error": null,
 "result": {
  "display": {
   "goal": [
    "Enable building Bitcoin Core as separate node, wallet, and GUI processes communicating over IPC.",
    "Isolate components into dedicated processes to improve privilege separation and interface modularity."
   ],
   "reviewability": [
    "Reviewable now, but based on open PR #29409.",
    "Reviewers should inspect the base PR #29409 first to understand the Cap'n Proto chain interface wrapper."
   ],
   "agreement": [
    "Broad concept support for multiprocess separation from maintainers and contributors (laanwj, Sjors, hebasto, practicalswift, jamesob).",
    "Early concerns regarding Cap'n Proto adoption over JSON-RPC resolved with consensus that internal isolation is beneficial (gmaxwell, dcousens)."
   ],
   "categories": [
    {
     "name": "ipc",
     "why": [
      "P2 because it delivers the milestone implementation of process separation for Bitcoin Core.",
      "It unblocks independent wallet and GUI process connections via follow-up PRs #19460 and #19461."
     ]
    },
    {
     "name": "utils",
     "why": [
      "P3 because it fixes callback lifetime behavior in btcsignals to eagerly destroy disconnected slots.",
      "This aligns btcsignals with boost::signals2 semantics and prevents proxy object resource leaks across the node."
     ]
    },
    {
     "name": "rpc",
     "why": [
      "P4 because the changes to bitcoin-cli and RPC request headers are trivial glue for IPC logging and comments.",
      "It does not alter RPC method functionality, JSON schemas, or network transport behavior."
     ]
    }
   ]
  },
  "summary": "Adds an optional `--enable-multiprocess` build mode that splits Bitcoin Core into separate `bitcoin-node`, `bitcoin-wallet`, and `bitcoin-gui` executables communicating over IPC via Cap'n Proto and libmultiprocess. It introduces the Init IPC interface to spawn subprocesses across socket pairs, wraps the Node and Wallet interfaces, and updates `btcsignals` callback destruction semantics.",
  "problem": "Monolithic architecture links the node, wallet, and GUI into single processes, causing GUI hangs when long operations hold core locks, and limiting security boundaries between consensus validation and wallet key management.",
  "discussion": {
   "open_concerns": [],
   "resolved_concerns": [
    "Cap'n Proto serialization choice questioned in favor of JSON-RPC or P2P; resolved as Cap'n Proto is encapsulated internally and supports bidirectional asynchronous calls.",
    "Btcsignals callback destruction timing previously kept proxies alive indefinitely until next connection; resolved by implementing eager callback destruction on disconnect."
   ],
   "author_status": "Active; continuously rebasing and keeping stack updated across 100+ pushes."
  },
  "reviewability": {
   "state": "Ready",
   "label": "Review #29409 first",
   "reason": "The code and CI are clean and passing, but the branch is stacked on top of open PR #29409 ('multiprocess: Add capnp wrapper for Chain interface')."
  },
  "agreement": {
   "participants": [
    {
     "login": "jonasschnelli",
     "stance": "support",
     "note": "Conceptually in favor of process separation; asked about using existing RPC vs Cap'n Proto"
    },
    {
     "login": "gmaxwell",
     "stance": "objection",
     "note": "Expressed discomfort with Cap'n Proto dependency while supporting the architectural separation"
    },
    {
     "login": "dcousens",
     "stance": "objection",
     "note": "Concept ACK but preferred existing RPC over Cap'n Proto"
    },
    {
     "login": "laanwj",
     "stance": "support",
     "note": "Concept ACK, defended Cap'n Proto for internal isolation and reviewed IPC code"
    },
    {
     "login": "sipa",
     "stance": "question",
     "note": "Asked about architecture goals and acknowledged author explanation"
    },
    {
     "login": "Sjors",
     "stance": "support",
     "note": "Concept ACK, tested macOS build and GUI functionality"
    },
    {
     "login": "practicalswift",
     "stance": "objection",
     "note": "Found potential dead pointer in Cap'n Proto init code; also pointed out typos"
    },
    {
     "login": "leishman",
     "stance": "question",
     "note": "Asked about unused variables in base commit"
    },
    {
     "login": "fingera",
     "stance": "neutral",
     "note": "Left brief review comment"
    },
    {
     "login": "ismail120572",
     "stance": "neutral",
     "note": "Non-substantive comment"
    },
    {
     "login": "jb55",
     "stance": "neutral",
     "note": "Commented on thread"
    },
    {
     "login": "jgarzik",
     "stance": "support",
     "note": "Concept ACK"
    },
    {
     "login": "hebasto",
     "stance": "support",
     "note": "Concept ACK"
    },
    {
     "login": "JeremyRubin",
     "stance": "support",
     "note": "Suggested interface splitting structure"
    },
    {
     "login": "maflcko",
     "stance": "neutral",
     "note": "Maintenance and testing comments"
    },
    {
     "login": "promag",
     "stance": "support",
     "note": "Concept ACK"
    },
    {
     "login": "electorr",
     "stance": "objection",
     "note": "Concept NACK without rationale"
    },
    {
     "login": "fanquake",
     "stance": "neutral",
     "note": "Build and system maintenance comments"
    },
    {
     "login": "ariard",
     "stance": "neutral",
     "note": "Discussed process separation and interface boundary"
    },
    {
     "login": "achow101",
     "stance": "neutral",
     "note": "Reviewed wallet interactions and interface parameters"
    },
    {
     "login": "jonatack",
     "stance": "neutral",
     "note": "Thread comment"
    },
    {
     "login": "aureleoules",
     "stance": "neutral",
     "note": "Thread comment"
    },
    {
     "login": "jamesob",
     "stance": "support",
     "note": "Concept ACK"
    },
    {
     "login": "atangangabbieian4",
     "stance": "neutral",
     "note": "Non-substantive comment"
    },
    {
     "login": "willcl-ark",
     "stance": "neutral",
     "note": "Review comment"
    },
    {
     "login": "darosior",
     "stance": "neutral",
     "note": "Reported issue on thread"
    },
    {
     "login": "jimhashhq",
     "stance": "support",
     "note": "Tested multiprocess build on Linux and reported positive results"
    },
    {
     "login": "sarkrezahoseinjisus-tech",
     "stance": "neutral",
     "note": "Non-substantive quoted comment"
    },
    {
     "login": "ViniciusCestarii",
     "stance": "support",
     "note": "Contributed CI fix upstream in libmultiprocess"
    }
   ],
   "objections": [
    {
     "reviewer": "gmaxwell",
     "kind": "approach",
     "harm": "Adds Cap'n Proto dependency to the project",
     "blocking": false,
     "author_replied": true,
     "fix_pushed": false,
     "status": "resolved",
     "evidence": "2017-03-28: 'I\\'m really uncomfortable with using capn proto, but fine enough for some example testing stuff!'",
     "resolution_evidence": "2017-03-29: laanwj noted 'For this pull it\\'s fine to use whatever RPC mechanism you\\'re comfortable with' and discussion moved on",
     "sources": [
      "dossier"
     ]
    },
    {
     "reviewer": "dcousens",
     "kind": "approach",
     "harm": "Prefers reusing existing RPC instead of adding an external RPC/IPC framework",
     "blocking": false,
     "author_replied": true,
     "fix_pushed": false,
     "status": "resolved",
     "evidence": "2017-03-28: 'strong concept ACK, but if is feasible, would prefer usage of the existing RPC instead of capn\\'proto'",
     "resolution_evidence": "2017-03-28: author explained capnp provides bidirectional async calls without packing boilerplate and dcousens did not push back",
     "sources": [
      "dossier"
     ]
    },
    {
     "reviewer": "electorr",
     "kind": "approach",
     "harm": "Opposes the multiprocess concept",
     "blocking": false,
     "author_replied": false,
     "fix_pushed": false,
     "status": "resolved",
     "evidence": "2021-03-04: concept_nack recorded from electorr without concrete technical argument",
     "resolution_evidence": "2021-03-04: unexplained single comment from non-contributor remained inactive while project maintainers continued progress",
     "sources": [
      "dossier"
     ]
    },
    {
     "reviewer": "practicalswift",
     "kind": "correctness",
     "harm": "potential dead pointer or use-after-free for loop_ptr if socket disconnected immediately",
     "blocking": false,
     "author_replied": true,
     "fix_pushed": true,
     "status": "resolved",
     "evidence": "2018-09-04: \"Couldn't loop_ptr potentially be a dead pointer here?\"",
     "resolution_evidence": "2018-09-04: \"Good catch. It could happen if socket was immediately disconnected. Moved onDisconnect handler down to fix this.\"",
     "sources": [
      "thread"
     ]
    }
   ],
   "support": [
    {
     "reviewer": "laanwj",
     "reason": "Endorsed process separation between bitcoind and GUI, and approved Cap'n Proto for internal use",
     "substantive": true
    },
    {
     "reviewer": "Sjors",
     "reason": "Wanted independent GUI startup without waiting for sync and tested builds on macOS",
     "substantive": true
    },
    {
     "reviewer": "jimhashhq",
     "reason": "Confirmed successful build and interactive regtest runs on Linux",
     "substantive": true
    },
    {
     "reviewer": "jgarzik",
     "reason": "Concept ACK",
     "substantive": false
    },
    {
     "reviewer": "hebasto",
     "reason": "Concept ACK",
     "substantive": false
    },
    {
     "reviewer": "promag",
     "reason": "Concept ACK",
     "substantive": false
    },
    {
     "reviewer": "jamesob",
     "reason": "Concept ACK",
     "substantive": false
    },
    {
     "reviewer": "gmaxwell",
     "reason": "A fan of the general approach and thinks process separation should have been done a long time ago",
     "substantive": true
    },
    {
     "reviewer": "dcousens",
     "reason": "Strong concept ACK for process separation",
     "substantive": false
    },
    {
     "reviewer": "jonasschnelli",
     "reason": "Conceptually goes in the right direction",
     "substantive": false
    }
   ],
   "state": "Strong",
   "summary": "Strong concept ACK across multiple maintainers; early protocol objections resolved.",
   "reason": "Maintainers and contributors broadly support the multiprocess architecture. Early debates over serialization frameworks resolved with agreement that internal Cap'n Proto usage is acceptable.",
   "evidence": [
    "laanwj (2017-03-29): 'Concept ACK, nice... For this pull it's fine to use whatever RPC mechanism you're comfortable with.'",
    "Sjors (2018-08-11): 'Concept ACK, ultimately being able to leave bitcoin-node running while starting the GUI on demand... would be quite nice.'"
   ],
   "model_state": "Strong",
   "derivation": "substantive support, no open objection (laanwj, Sjors, jimhashhq, gmaxwell)",
   "corrections": [],
   "thread_read": {
    "state": "Strong",
    "derived": "Strong",
    "objections": [
     {
      "reviewer": "practicalswift",
      "kind": "correctness",
      "harm": "potential dead pointer or use-after-free for loop_ptr if socket disconnected immediately",
      "blocking": false,
      "author_replied": true,
      "fix_pushed": true,
      "status": "resolved",
      "evidence": "2018-09-04: \"Couldn't loop_ptr potentially be a dead pointer here?\"",
      "resolution_evidence": "2018-09-04: \"Good catch. It could happen if socket was immediately disconnected. Moved onDisconnect handler down to fix this.\""
     }
    ],
    "support": [
     {
      "reviewer": "laanwj",
      "reason": "Process isolation between GUI and bitcoind is valuable, and auto-generated IPC saves writing boilerplate",
      "substantive": true
     },
     {
      "reviewer": "Sjors",
      "reason": "Being able to leave bitcoin-node running while starting the GUI on demand without waiting for sync is useful",
      "substantive": true
     },
     {
      "reviewer": "gmaxwell",
      "reason": "A fan of the general approach and thinks process separation should have been done a long time ago",
      "substantive": true
     },
     {
      "reviewer": "dcousens",
      "reason": "Strong concept ACK for process separation",
      "substantive": false
     },
     {
      "reviewer": "jonasschnelli",
      "reason": "Conceptually goes in the right direction",
      "substantive": false
     },
     {
      "reviewer": "jimhashhq",
      "reason": "Finds multiprocess Bitcoin a well considered change",
      "substantive": true
     }
    ],
    "participants": [
     {
      "login": "jonasschnelli",
      "stance": "support",
      "note": "Conceptually in favor of process separation; asked about using existing RPC vs Cap'n Proto"
     },
     {
      "login": "gmaxwell",
      "stance": "support",
      "note": "Supports general approach of process separation, though uncomfortable with Cap'n Proto"
     },
     {
      "login": "dcousens",
      "stance": "support",
      "note": "Strong concept ACK, though preferred existing RPC over Cap'n Proto if feasible"
     },
     {
      "login": "laanwj",
      "stance": "support",
      "note": "Concept ACK; supported process isolation and auto-generated IPC over Cap'n Proto"
     },
     {
      "login": "sipa",
      "stance": "question",
      "note": "Asked what the benefit was of separating GUI and daemon if dependent; satisfied with author's explanation"
     },
     {
      "login": "Sjors",
      "stance": "support",
      "note": "Concept ACK; tested on macOS and provided bug reports and feedback"
     },
     {
      "login": "practicalswift",
      "stance": "objection",
      "note": "Found potential dead pointer in Cap'n Proto init code; also pointed out typos"
     },
     {
      "login": "leishman",
      "stance": "neutral",
      "note": "Minor inline comments on unused parameter and type signedness"
     },
     {
      "login": "fingera",
      "stance": "neutral",
      "note": "Reported a compilation error with GCC 7.3.0"
     },
     {
      "login": "ismail120572",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "jb55",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "jgarzik",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "hebasto",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "JeremyRubin",
      "stance": "neutral",
      "note": "Provided suggestions on structuring the API and commits"
     },
     {
      "login": "maflcko",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "promag",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "electorr",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "fanquake",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "ariard",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "achow101",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "jonatack",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "aureleoules",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "jamesob",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "atangangabbieian4",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "willcl-ark",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "darosior",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "jimhashhq",
      "stance": "support",
      "note": "Tested multiprocess build and reported findings on options and socket behavior"
     },
     {
      "login": "sarkrezahoseinjisus-tech",
      "stance": "neutral",
      "note": "Omitted comment"
     },
     {
      "login": "ViniciusCestarii",
      "stance": "neutral",
      "note": "Opened upstream libmultiprocess PR to fix CI whitespace"
     }
    ],
    "corrections": [],
    "summary": "Strong: broad concept support from multiple maintainers and contributors for process separation; minor technical questions and review comments resolved.",
    "usage": {
     "input_tokens": 27505,
     "cache_creation_input_tokens": 0,
     "cache_read_input_tokens": 0,
     "output_tokens": 7106
    }
   },
   "first_read": {
    "state": "Strong",
    "model_state": "Strong",
    "objections": [
     {
      "reviewer": "gmaxwell",
      "kind": "approach",
      "harm": "Adds Cap'n Proto dependency to the project",
      "blocking": false,
      "author_replied": true,
      "fix_pushed": false,
      "status": "resolved",
      "evidence": "2017-03-28: 'I\\'m really uncomfortable with using capn proto, but fine enough for some example testing stuff!'",
      "resolution_evidence": "2017-03-29: laanwj noted 'For this pull it\\'s fine to use whatever RPC mechanism you\\'re comfortable with' and discussion moved on"
     },
     {
      "reviewer": "dcousens",
      "kind": "approach",
      "harm": "Prefers reusing existing RPC instead of adding an external RPC/IPC framework",
      "blocking": false,
      "author_replied": true,
      "fix_pushed": false,
      "status": "resolved",
      "evidence": "2017-03-28: 'strong concept ACK, but if is feasible, would prefer usage of the existing RPC instead of capn\\'proto'",
      "resolution_evidence": "2017-03-28: author explained capnp provides bidirectional async calls without packing boilerplate and dcousens did not push back"
     },
     {
      "reviewer": "electorr",
      "kind": "approach",
      "harm": "Opposes the multiprocess concept",
      "blocking": false,
      "author_replied": false,
      "fix_pushed": false,
      "status": "resolved",
      "evidence": "2021-03-04: concept_nack recorded from electorr without concrete technical argument",
      "resolution_evidence": "2021-03-04: unexplained single comment from non-contributor remained inactive while project maintainers continued progress"
     }
    ],
    "support": [
     {
      "reviewer": "laanwj",
      "reason": "Endorsed process separation between bitcoind and GUI, and approved Cap'n Proto for internal use",
      "substantive": true
     },
     {
      "reviewer": "Sjors",
      "reason": "Wanted independent GUI startup without waiting for sync and tested builds on macOS",
      "substantive": true
     },
     {
      "reviewer": "jimhashhq",
      "reason": "Confirmed successful build and interactive regtest runs on Linux",
      "substantive": true
     },
     {
      "reviewer": "jgarzik",
      "reason": "Concept ACK",
      "substantive": false
     },
     {
      "reviewer": "hebasto",
      "reason": "Concept ACK",
      "substantive": false
     },
     {
      "reviewer": "promag",
      "reason": "Concept ACK",
      "substantive": false
     },
     {
      "reviewer": "jamesob",
      "reason": "Concept ACK",
      "substantive": false
     }
    ]
   }
  },
  "dependencies": {
   "depends_on": [
    29409
   ],
   "enables": [
    "#19460",
    "#19461",
    "Multiprocess Bitcoin node, wallet, and GUI executable targets"
   ]
  },
  "categories": [
   {
    "name": "build",
    "member": false,
    "evidence": "Build changes in CMakeLists.txt and CI scripts solely configure the IPC library and executables.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Build modifications strictly follow from adding the IPC component."
   },
   {
    "name": "docs",
    "member": false,
    "evidence": "Documentation updates in doc/multiprocess.md and doc/design/libraries.md document IPC functionality.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Documentation changes describe the multiprocess design introduced in this PR."
   },
   {
    "name": "ipc",
    "member": true,
    "evidence": "Implements the core process-separation mechanism and Cap'n Proto wrappers for Node and Wallet interfaces.",
    "band": "P2",
    "reason_tag": "new feature",
    "score": 0.7,
    "factors": {
     "security_stability": 2,
     "bug_severity": 0,
     "performance": 1,
     "user_value": 2,
     "leverage": 3
    },
    "rationale": "P2 because this is the milestone PR implementing the process-separation architecture for Bitcoin Core (tracking issue #28722). It provides the executables for running node, wallet, and GUI in separate processes and unblocks follow-up connection PRs #19460 and #19461."
   },
   {
    "name": "mempool",
    "member": false,
    "evidence": "Only adds a reminder comment to block_policy_estimator.h regarding IPC capnp structs.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Does not touch mempool or fee policy logic."
   },
   {
    "name": "p2p",
    "member": false,
    "evidence": "Only adds reminder comments to net headers regarding IPC capnp structs.",
    "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 P2P networking behavior."
   },
   {
    "name": "rpc",
    "member": true,
    "evidence": "Touches src/bitcoin-cli.cpp and src/rpc/request.h and carries the RPC/REST/ZMQ label.",
    "band": "P4",
    "reason_tag": "cleanup",
    "score": 0.1,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "P4 because the RPC changes are limited to passing a logging suffix in bitcoin-cli's MakeBasicInit call and adding a comment note in rpc/request.h. No RPC commands, schemas, or server mechanisms are modified."
   },
   {
    "name": "tests",
    "member": false,
    "evidence": "Test changes adapt functional test framework log handling and timeouts to multiprocess execution.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Changes to test helpers and timeout increases follow the main IPC feature."
   },
   {
    "name": "tools",
    "member": false,
    "evidence": "Only touches circular-dependencies.py for the ipc/ header module path.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Tool changes are purely mechanical path updates."
   },
   {
    "name": "utils",
    "member": true,
    "evidence": "Substantively improves src/util/btcsignals.h and src/util/result.h, including unit test coverage.",
    "band": "P3",
    "reason_tag": "bug fix",
    "score": 0.35,
    "factors": {
     "security_stability": 1,
     "bug_severity": 1,
     "performance": 0,
     "user_value": 0,
     "leverage": 1
    },
    "rationale": "P3 because commit d5c694a fixes callback destruction timing in btcsignals to destroy slots eagerly upon disconnect rather than leaking or deferring until the next connect call. This prevents unpredictable resource lifetime issues across general node signal callbacks."
   },
   {
    "name": "wallet",
    "member": false,
    "evidence": "Only updates WalletLoader::restoreWallet parameter ordering to satisfy libmultiprocess output parameter conventions and adds default constructor to CreatedTransactionResult.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Mechanical interface adjustments and test log assertions following from IPC integration."
   }
  ],
  "confidence": "high",
  "uncertainties": [],
  "needs": [],
  "card": "This PR adds the `--enable-multiprocess` build flag, allowing Bitcoin Core to run `bitcoin-node`, `bitcoin-wallet`, and `bitcoin-gui` as separate processes communicating over Cap'n Proto IPC. It addresses process isolation between consensus validation, wallet key handling, and the GUI interface, eliminating GUI thread lock contention and laying the groundwork for privilege separation. There is strong long-term maintainer support for the multiprocess initiative, though the PR is based on open base PR #29409, which should be reviewed first."
 },
 "raw_text": null,
 "prompt_hash": "c1bd47c5",
 "second_read_cost_usd": 0.04727625
}