{
 "number": 19461,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/19461",
 "title": "multiprocess: Add bitcoin-gui -ipcconnect option",
 "author": "ryanofsky",
 "author_association": "MEMBER",
 "created_at": "2020-07-07T19:00:11Z",
 "updated_at": "2026-09-13T15:33:44Z",
 "age_days": 2262,
 "draft": true,
 "labels": [
  "GUI",
  "Utils/log/libs"
 ],
 "milestone": null,
 "base": "master",
 "head_sha": "80bebc16242e10de0499b5adbf5edf58dad0bbb7",
 "head_ref": "pr/ipc-gui",
 "head_repo": "ryanofsky/bitcoin",
 "head_history": [
  {
   "t": "2020-07-14T14:13:17Z",
   "sha": "4041990fcba01a5c6eb22b827b2220f2bd8ee666"
  },
  {
   "t": "2020-07-14T18:29:01Z",
   "sha": "0714770d6bf52fbf46a50aff298df8ffdf4eb3ff"
  },
  {
   "t": "2020-08-28T11:26:14Z",
   "sha": "878e11049c97564f81018381b88bf314ce4c4f01"
  },
  {
   "t": "2020-09-28T12:44:56Z",
   "sha": "5c05c38c1a6185ee18eaf74948cf28fd1560abf4"
  },
  {
   "t": "2020-10-02T13:38:54Z",
   "sha": "2b9fbc08cc9f27dd092798b75afa1e2318e749c9"
  },
  {
   "t": "2020-11-25T16:42:27Z",
   "sha": "6f39b4689aea86283b43add4bdebda11dee4d73e"
  },
  {
   "t": "2020-12-12T00:16:38Z",
   "sha": "e2e2a06bf91cc321eb7e6cab2c19cfc4984dfe1c"
  },
  {
   "t": "2021-02-04T04:20:57Z",
   "sha": "137225d7ba437d7d14e122a3eb35512ef8648041"
  },
  {
   "t": "2021-02-22T02:28:23Z",
   "sha": "871891d38cb3a4b73fa2016de70990f221662d90"
  },
  {
   "t": "2021-03-10T03:48:20Z",
   "sha": "4b045d994b82bb24d0cab1efd5488575b9e7851d"
  },
  {
   "t": "2021-04-11T20:04:56Z",
   "sha": "7cb12b4bc81c7e8978830e427f9d36b8590d9848"
  },
  {
   "t": "2021-06-02T07:13:40Z",
   "sha": "e7dfe88e2ab772c4eed939dd5bda53c42827cac8"
  },
  {
   "t": "2021-06-18T17:48:56Z",
   "sha": "4dc8af0440073813101b85360482713c7abc6949"
  },
  {
   "t": "2021-08-18T14:12:10Z",
   "sha": "c997272eb0a6c805f098c920d8210221f770672f"
  },
  {
   "t": "2021-10-06T18:40:50Z",
   "sha": "e23cf8171fdd6e1187731dd2393fcd64469ffd80"
  },
  {
   "t": "2021-11-01T14:52:23Z",
   "sha": "f2f33658dddd45477e43bcad749833f6fd336bb2"
  },
  {
   "t": "2022-01-13T21:14:14Z",
   "sha": "f8d4a15805296edb365602a37875637610fe77c7"
  },
  {
   "t": "2022-09-27T01:40:29Z",
   "sha": "38859c192d21b09ed933399cbfd053f2306feaf7"
  },
  {
   "t": "2023-02-11T00:01:57Z",
   "sha": "be331f5748ff875a7691a921caa4bd009549c683"
  },
  {
   "t": "2023-03-01T04:26:50Z",
   "sha": "9936174c9f3f72cee25ead72359ed95600560a6b"
  },
  {
   "t": "2023-05-03T21:34:07Z",
   "sha": "d50bb2707b55210027455b8f494370dcf98922ae"
  },
  {
   "t": "2023-05-04T12:35:20Z",
   "sha": "5f91aa3d8b47cee97e625c3b5689a37dbd941eff"
  },
  {
   "t": "2024-07-26T19:54:44Z",
   "sha": "359a59bb70abc823eddd3c403e80e82bd03d9174"
  },
  {
   "t": "2024-09-19T11:08:33Z",
   "sha": "ae16815f5f50e14efb6b733bcb3d57c89fd7de07"
  },
  {
   "t": "2024-09-26T14:08:40Z",
   "sha": "06b970bc63e3811e7d2aac8c856847b7db6ddc53"
  },
  {
   "t": "2024-12-06T19:26:54Z",
   "sha": "34b714020e887e1f37dd153791ee318c53946e18"
  },
  {
   "t": "2025-03-18T15:18:35Z",
   "sha": "a20cf1d38217c407d1e7efada1790b39179e9f4e"
  },
  {
   "t": "2025-03-19T17:18:01Z",
   "sha": "9706a5c58b4e7c4a570500f053d5a948d144cb30"
  },
  {
   "t": "2025-03-25T18:48:20Z",
   "sha": "dbced82bbafd8e4cc62dc5d91a6531736dff2caf"
  },
  {
   "t": "2025-10-15T00:41:21Z",
   "sha": "f956e90fbdeff8c184ea2e6fb9362b2d3f12f30f"
  },
  {
   "t": "2025-10-22T09:29:05Z",
   "sha": "6bab3c091b6e9f8a90255066e7fb7f063eede5bc"
  },
  {
   "t": "2025-11-20T18:51:29Z",
   "sha": "8e4ceb66a97fa14afc932d12f944662638ed87af"
  },
  {
   "t": "2025-12-12T12:18:27Z",
   "sha": "1b7e9b30bdb3db31ee94ed500c7437eaba817581"
  },
  {
   "t": "2025-12-16T02:09:56Z",
   "sha": "7f80749c5140dea02c411931e5df165b4cf7aec5"
  },
  {
   "t": "2026-01-07T18:26:32Z",
   "sha": "86eb826842691ed52057a1aada702a5c1eb7c262"
  },
  {
   "t": "2026-04-01T21:44:19Z",
   "sha": "93a1d8e9fb0adb578656a42b30aeb821ba193f34"
  },
  {
   "t": "2026-07-14T19:33:31Z",
   "sha": "bb4f280f34902a41846463fdc41721c8f7382c79"
  },
  {
   "t": "2026-08-18T18:21:54Z",
   "sha": "8596dcc0155d4fa65132a99437301de8ec12088b"
  },
  {
   "t": "2026-09-09T02:52:20Z",
   "sha": "80bebc16242e10de0499b5adbf5edf58dad0bbb7"
  }
 ],
 "additions": 4047,
 "deletions": 567,
 "changed_files": 142,
 "commit_count": 27,
 "size_bucket": "XL",
 "mergeable_state": "clean",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {
    "concept_ack": [
     {
      "login": "laanwj",
      "url": "https://github.com/bitcoin/bitcoin/pull/19461#issuecomment-656256059"
     },
     {
      "login": "meshcollider",
      "url": "https://github.com/bitcoin/bitcoin/pull/19461#issuecomment-690680816"
     }
    ]
   },
   "conflicts": [
    {
     "number": 36188,
     "title": "crypto: plug hardware optimized SHA256 into libsecp256k1's context",
     "author": "furszy"
    },
    {
     "number": 36167,
     "title": "[RFC] Enable `-Wunused`",
     "author": "fanquake"
    },
    {
     "number": 36097,
     "title": "mining: replace interrupt methods with cancellation arguments",
     "author": "xyzconstant"
    },
    {
     "number": 35932,
     "title": "ipc: make ipc::disconnectIncoming wait for in-progress calls to complete",
     "author": "ryanofsky"
    },
    {
     "number": 35911,
     "title": "Warn on and add missing [[noreturn]]",
     "author": "fanquake"
    },
    {
     "number": 35511,
     "title": "RFC: consensus: Make `CAmount` a class",
     "author": "hodlinator"
    },
    {
     "number": 34603,
     "title": "wallet: Fix detection of symlinks on Windows",
     "author": "achow101"
    },
    {
     "number": 32387,
     "title": "ipc: add windows support",
     "author": "ryanofsky"
    },
    {
     "number": 31672,
     "title": "rpc: add cpu_load to getpeerinfo",
     "author": "vasild"
    },
    {
     "number": 31507,
     "title": "build: Use clang-cl to build on Windows natively",
     "author": "hebasto"
    },
    {
     "number": 30342,
     "title": "kernel, logging: Pass Logger instances to kernel objects",
     "author": "ryanofsky"
    },
    {
     "number": 29700,
     "title": "kernel, refactor: return error status on all fatal errors",
     "author": "ryanofsky"
    },
    {
     "number": 27052,
     "title": "test: rpc: add last block announcement time to getpeerinfo result",
     "author": "LarryRuane"
    },
    {
     "number": 26022,
     "title": "Add util::ResultPtr class",
     "author": "ryanofsky"
    },
    {
     "number": 25665,
     "title": "refactor: Add util::Result failure types and ability to merge result values",
     "author": "ryanofsky"
    }
   ]
  }
 },
 "acks_parsed": {
  "laanwj": {
   "kind": "concept_ack",
   "hash": null,
   "t": "2020-07-09T17:30:19Z",
   "stale": false
  },
  "meshcollider": {
   "kind": "concept_ack",
   "hash": null,
   "t": "2020-09-10T19:50:04Z",
   "stale": false
  }
 },
 "acks_tally": {
  "ack": 0,
  "stale_ack": 0,
  "concept_ack": 2,
  "approach_ack": 0,
  "nack": 0,
  "concept_nack": 0,
  "approach_nack": 0
 },
 "reviews": {
  "approved": 1,
  "changes_requested": 0,
  "distinct_reviewers": [
   "ClaraBara22",
   "Sjors",
   "jimhashhq",
   "laanwj",
   "maflcko",
   "meshcollider"
  ]
 },
 "signals": {
  "needs_rebase": false,
  "ci_failed": false,
  "mergeable_state": "clean",
  "last_author_activity": "2026-09-09T02:52:20Z",
  "last_reviewer_activity": "2025-04-08T14:36:16Z",
  "last_reviewer": "jimhashhq",
  "author_silent_days": 8,
  "waiting_on_author_days": 0,
  "days_since_update": 4
 },
 "refs": {
  "mentioned": [
   10102,
   19460,
   29409,
   35084,
   36176
  ],
  "depends_on": [
   29409
  ],
  "fixes": [],
  "linked_issues": [],
  "references": [
   {
    "number": 29409,
    "type": "pull",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "multiprocess: Add capnp wrapper for Chain interface"
   },
   {
    "number": 10102,
    "type": "pull",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "Multiprocess bitcoin"
   },
   {
    "number": 19460,
    "type": "pull",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "multiprocess: Add bitcoin-wallet -ipcconnect option"
   },
   {
    "number": 35084,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-07-29",
    "title": "ipc: Add nonunix platform support"
   },
   {
    "number": 36176,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-09-07",
    "title": "wallet: avoid a crash when creating a wallet with -nosettings"
   }
  ],
  "conflicts": [
   36188,
   36167,
   36097,
   35932,
   35911,
   35511,
   34603,
   32387,
   31672,
   31507,
   30342,
   29700,
   27052,
   26022,
   25665
  ]
 },
 "stack": {
  "shares_commits_with": [
   10102,
   19460,
   29409
  ],
  "based_on": [
   10102,
   19460,
   29409
  ],
  "base_for": []
 },
 "review_paths": [
  "src/bitcoin-wallet.cpp"
 ],
 "body": "**This is based on #29409 + #10102 + # + #19460.** The non-base commits are:\n\n- [`80bebc16242` multiprocess: Add bitcoin-gui -ipcconnect option](https://github.com/bitcoin/bitcoin/pull/19461/commits/80bebc16242e10de0499b5adbf5edf58dad0bbb7)\n\n---\n\nBuilding on #10102, this adds an `-ipcconnect` option to `bitcoin-gui` that connects the GUI to an existing `bitcoin-node` process already running in the background instead of spawning a new `bitcoin-node` process. This allows the GUI to be started and stopped independently of the node. By default with this change, `bitcoin-gui` will check if a `<datadir>/sockets/node.sock` socket exists and try to connect to that. If that doesn't work, it will spawn a new node process and start up the same way it did before this PR.\n\nThe default `bitcoin-gui` connect option is `-ipcconnect=auto`, which tries to connect if possible as described above, and spawns a new `bitcoin-node` process if not possible. Other supported options are `-noipcconnect` to never connect to an existing node and always spawn a new one, `-ipcconnect` to require a connection and fail if it can't be established, and `-ipcconnect=unix:<socket>` to require a connection and use a custom socket path.\n\nWith this PR, basic functionality works and gui instances can connect and disconnect from a running node. But there are rough edges: If a gui process doesn't shut down cleanly, the node can see unhandled IpcExceptions, and if node command line options are passed to `bitcoin-gui` and `bitcoin-gui` connects to an exiting bitcoin-node process instead of spawning a new one, the node options will be silently ignored.\n\nThese changes require multiprocess support and this PR has no effect unless bitcoin is configured with `--enable-multiprocess` as described in [doc/multiprocess.md](https://github.com/bitcoin/bitcoin/blob/master/doc/multiprocess.md)\n\n---\n\nThis PR is part of the [process separation project](https://github.com/bitcoin/bitcoin/issues/28722).",
 "commits": [
  {
   "sha": "ae6b583256cd0972a09f38ecf65d0005dbd34028",
   "date": "2026-09-08T08:13:51Z",
   "message": "Add capnp serialization code for bitcoin types\n\n- Add capnp ToBlob, ToArray, Wrap, Serialize, and Unserialize helper functions\n- Add support for std::chrono::seconds capnp serialization\n- Add support for util::Result and util::Expected capnp serialization"
  },
  {
   "sha": "4466e5ce9b7652f8af32dd70d89124be67626240",
   "date": "2026-09-08T08:13:51Z",
   "message": "Add capnp wrapper for Handler interface"
  },
  {
   "sha": "7b997424a951e7421a8d44d8f9ba3733eeff9ec6",
   "date": "2026-09-08T08:13:51Z",
   "message": "Add capnp wrapper for Chain interface"
  },
  {
   "sha": "c2dfc0c57f3a9d54aca0783cd9fc236c4b84c330",
   "date": "2026-09-08T08:13:51Z",
   "message": "multiprocess: Expose Chain interface\n\nExpose Chain interface to external processes spawning or connecting to\nbitcoin-node."
  },
  {
   "sha": "d9cfcf89bb58e83ff9620e7cfaf896a5275dc217",
   "date": "2026-09-08T08:13:51Z",
   "message": "build: suppress -Wc++23-lambda-attributes in warn_interface\n\nLambda [[noreturn]] attributes before the parameter list are a C++23\nextension intentionally used in C++20 builds (needed for compatibility\nwith -Wmissing-noreturn). Suppress the extension warning rather than\nremoving the attributes or working around them.\n\nUses the existing IF_CHECK_PASSED idiom so GCC, which silently ignores\nunknown -Wno-* flags, is unaffected.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>"
  },
  {
   "sha": "bc86e9270e6dd853e378326c11ac4a068190057d",
   "date": "2026-09-08T08:13:51Z",
   "message": "Merge branch 'pr/ipc-chain' into pr/ipc"
  },
  {
   "sha": "c0ae4dfa0048cc576ec4b112dd0275e2683f52d7",
   "date": "2026-09-08T08:13:51Z",
   "message": "test: Increase feature_block.py and feature_taproot.py timeouts\n\nNeeded because BlockConnected notifications are a lot slower with the wallet\nrunning in separate process."
  },
  {
   "sha": "f274686c60e783be469823bcaf32acee221def7b",
   "date": "2026-09-08T08:13:51Z",
   "message": "test: Fix multiprocess test for unclean shutdown on kill"
  },
  {
   "sha": "32937a817c00b419b965adc173d85fe48cfa109c",
   "date": "2026-09-08T08:13:51Z",
   "message": "util: Add util::Result workaround to be compatible with libmultiprocess\n\nMake default constructor more generic so it doesn't only work with void types."
  },
  {
   "sha": "12ae360d84d8fe4adadd51e7f6a6a89d7183ed7e",
   "date": "2026-09-08T08:13:51Z",
   "message": "test: characterize btcsignals callback destruction timing\n\nAdd tests pinning down when a callback object (and any state it owns)\nis destroyed. Currently disconnect() only disables the callback: the\nobject stays alive until a later connect() call on the same signal\ngarbage collects it and every connection handle referencing it has been\nreleased; with no connection handle held it lives until the signal\nitself is destroyed.\n\nThis differs from boost::signals2, which btcsignals aims to be\napi-compatible with: there, disconnecting destroys the slot's function\nobject as soon as no emission is using it.\n\nNo behavior change; these tests document the status quo so the next\ncommit changing the destruction timing has a clear before/after diff.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>"
  },
  {
   "sha": "d5c694aeb15b8d02d594239fe0bf0db21bea5015",
   "date": "2026-09-08T08:13:51Z",
   "message": "btcsignals: destroy callbacks eagerly on disconnect\n\nPreviously a disconnected callback and any state it owned could stay\nalive indefinitely: destruction required both a later connect() call on\nthe same signal to garbage collect it and release of every connection\nhandle referencing it. That made destruction timing unpredictable for\ncallbacks that own resources whose release has side effects, and it\ndiverges from boost::signals2, which destroys a disconnected slot's\nfunction object as soon as no emission is running it. (The concrete\nfallout was in multiprocess bitcoin-gui, where node notification\ncallbacks own IPC proxy objects: their deferred destruction kept\nbitcoin-node from exiting and hung interface_gui.py until timeout.)\n\nMake disconnect() destroy the callback, deferring only while a\nconcurrent emission is mid-call into it, matching boost::signals2\nsemantics. The previous commit's characterization tests are updated;\ntheir diff shows the ownership change.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>"
  },
  {
   "sha": "66821528e4ec431d38451c4c2dcdda2c19779d51",
   "date": "2026-09-08T08:13:51Z",
   "message": "btcsignals: fall back to atomic_load/store without __cpp_lib_atomic_shared_ptr\n\nstd::atomic<shared_ptr<T>> is a C++20 library feature, but library\nimplementations are not required to ship all C++20 features at once;\n__cpp_lib_atomic_shared_ptr is the feature-test macro that indicates its\npresence. Without it, the generic std::atomic<T> requires trivially copyable\nT \u2014 shared_ptr is not, causing build failures on macOS (Xcode 16.2),\nFreeBSD 15.1, and the MSan/TSan custom libc++ builds in CI.\n\nFall back to the C++14 atomic_load/atomic_store free functions, which are\nspecifically overloaded for shared_ptr. The fallback is intended to be\ntemporary: those functions are deprecated in C++20 and will eventually be\nremoved, so the #else branch can be dropped once all CI platforms carry the\nC++20 specialization.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>"
  },
  {
   "sha": "8fc97929d966468e77c8a57e5fc286375d1b5f66",
   "date": "2026-09-08T08:13:51Z",
   "message": "multiprocess: Add capnp serialization code for bitcoin types"
  },
  {
   "sha": "897a9c3b3e3c3a170b14c1a7863915037a019424",
   "date": "2026-09-08T08:13:51Z",
   "message": "interfaces, refactor: Change WalletLoader::restoreWallet parameter order\n\nLibmultiprocess requires output parameters to be ordered after input parameter,\nso move warnings parameter last. Problematic order was introduced in\n4ec2d18a0734f44c0a74f05b59ad1269d323dfdb from\nhttps://github.com/bitcoin-core/gui/pull/877"
  },
  {
   "sha": "d5bfd35ca8e24ffd3b8fd0c939e6d65754676453",
   "date": "2026-09-08T08:13:51Z",
   "message": "multiprocess: Add capnp wrapper for Wallet interface"
  },
  {
   "sha": "99442afacb28a2f580a3bfd67fd4fae6b4a20841",
   "date": "2026-09-08T08:13:51Z",
   "message": "multiprocess: Add capnp wrapper for Node interface"
  },
  {
   "sha": "8eb998f88fffd66a2aaec8492d49743b7d8fbb88",
   "date": "2026-09-08T08:13:51Z",
   "message": "multiprocess: Make bitcoin-gui spawn a bitcoin-node process\n\nSpawn node subprocess instead of running node code internally"
  },
  {
   "sha": "48ca9f18b126b6609bcaf35617fcccaa98313540",
   "date": "2026-09-08T08:13:51Z",
   "message": "multiprocess: Make bitcoin-node spawn a bitcoin-wallet process\n\nSpawn wallet subprocess instead of running wallet code internally"
  },
  {
   "sha": "8f40dedc6d6473ef74aa1a4eafa0a5f25c5f1e42",
   "date": "2026-09-08T08:13:51Z",
   "message": "multiprocess: Add debug.log .wallet/.gui suffixes\n\nAdd .wallet/.gui suffixes to log files created by bitcoin-gui and\nbitcoin-wallet processes so they don't clash with bitcoin-node log file."
  },
  {
   "sha": "c941fc462b51d1dfbadb87217d4951dfa909f93e",
   "date": "2026-09-08T08:13:51Z",
   "message": "doc: Multiprocess misc doc and comment updates"
  },
  {
   "sha": "13e14ac99559c61b7ebe305f579a86ab222ab0db",
   "date": "2026-09-08T08:13:51Z",
   "message": "combine_logs: Handle multiprocess wallet log files"
  },
  {
   "sha": "d00ce388b39a620c3e8b52f64029d2c407a2de0f",
   "date": "2026-09-08T08:13:51Z",
   "message": "Merge branch 'pr/ipc' into pr/ipc-connect"
  },
  {
   "sha": "4c842beaae2e97d7934800c8433da9632b21c0ff",
   "date": "2026-09-08T08:13:51Z",
   "message": "Squashed 'src/ipc/libmultiprocess/' changes from e8de5c7b68e..4d454a81da6\n\n4d454a81da6 Merge bitcoin-core/libmultiprocess#358: refactor: Enable readability-container-contains\ndba99582b32 Merge bitcoin-core/libmultiprocess#357: doc: Update Cap'n Proto version to match minimum\n00923922ac3 Merge bitcoin-core/libmultiprocess#356: ci: Remove hard-coded -j4 from sanitize config\nfa101113b50 refactor: Enable readability-container-contains\n81f824b025f doc: Update Cap'n Proto version to match minimum\nfa30e2093c7 ci: Remove hard-coded -j4 from sanitize config\nf2e8df82ede Merge bitcoin-core/libmultiprocess#350: cmake: add type-unordered-set.h and version.h to public headers\n0e146c0468d Merge bitcoin-core/libmultiprocess#349: type-context: fix async disconnect race condition found by antithesis\n49f95e26326 Merge bitcoin-core/libmultiprocess#212: ci: add newdeps job testing newer versions of cmake and capnproto\n914dc839f27 proxy: fix data race between server request threads and disconnect handling\n275c8eefdfb Merge bitcoin-core/libmultiprocess#345: Remove trailing whitespace and Add -Wtrailing-whitespace to default ci config\ncd7162fb832 Merge bitcoin-core/libmultiprocess#304: proxy: fix BuildList to use non-const iteration for interface types\n9b136782af1 ci: Add -Wtrailing-whitespace to default config\n2f4be9ec6ea refactor: Remove trailing whitespace\n2448d282ccd cmake: add type-unordered-set.h and version.h to public headers\nb3fc922ee4a ci: add newdeps job testing newest versions of cmake and capnproto\n390b5f901f1 Merge bitcoin-core/libmultiprocess#344: test: listen_tests and connect_tests follow-ups\nd6f8588d1ab proxy: fix BuildList to use non-const iteration for interface types\ne18ca520f45 Merge bitcoin-core/libmultiprocess#343: test: fix race in connect_tests disconnect-deferred-failure test\nc39c7850c66 doc: note construct() call in valid init interface test\nb9c36c61751 test: close sockets unconditionally and check errors with KJ_SYSCALL\n7eb741e6359 test: drop unnecessary KJ_EXPECT(true)\n113f1d4d287 test: join server thread unconditionally in connect tests\n44bc4630bc1 test: drop mp:: prefixes in connect tests\n038d33eb31e test: share DefaultLogHandler between test files\nb54a1633085 test: drop TestSetup socket members in connect tests\n70467c5a727 test: add m_ prefix to TestSetup members in connect tests\ncc260f2526f test: replace capnp fix link with upstream PR\n137a6e4e039 test: fix race in connect_tests disconnect-deferred-failure test\n8dab0d4bdeb Merge bitcoin-core/libmultiprocess#341: ci: add -Wextra-semi to llvm config\nb3b134eed8b ci: add -Wextra-semi to llvm config\nbdd0cd69418 Merge bitcoin-core/libmultiprocess#339: refactor: add `[[noreturn]]` attributes\na779a09764c ci: add -Wmissing-noreturn\n636aaff576b refactor: add missing [[noreturn]] attributes\ncc11c2b1b41 Merge bitcoin-core/libmultiprocess#338: test: check ReadList return value\n2d6e863c77a Merge bitcoin-core/libmultiprocess#334: ci: Set CMAKE_BUILD_PARALLEL_LEVEL to enable parallelism by default\nd4d10ff98ab Merge bitcoin-core/libmultiprocess#332: ci: add -Wextra-semi to default config\nb540e70f25f Merge bitcoin-core/libmultiprocess#324: proxy: Name threads spawned by the event loop\ne5e367e785c Merge bitcoin-core/libmultiprocess#312: util: report back child errors to parent and throw\n2220df68c91 Merge bitcoin-core/libmultiprocess#298: Fix error handling when creating clients (`mp::ConnectStream`)\n51defb79ef7 Merge bitcoin-core/libmultiprocess#340: ci: Update `capnproto` prerequisites on NetBSD\n7e94790b08a ci: Update `capnproto` prerequisites on NetBSD\n9f25ffca5b0 test: Cover OS thread names for worker, pool, and async threads\n648a18589c4 proxy: Name threads spawned by the event loop\n49834b2609e ci: add -Wextra-semi to default config\nfae9a637e35 example: Remove unused kj/async.h include\nbb473690c97 Fix error handling when creating clients\n44d191420c6 Add test coverage for ConnectStream\n231361ae5af Correct stale UnixListener doc comment\n060c1a50d03 Extract `UnixListener` class to a dedicated file\n62f25af06c3 test: check ReadList return value\nce51d737255 ci: Set CMAKE_BUILD_PARALLEL_LEVEL to enable parallism in build jobs by default\n67302cd132a Merge bitcoin-core/libmultiprocess#331: Remove code for Cap'n Proto versions before 0.9\nf13c64ab54e Merge bitcoin-core/libmultiprocess#330: ci: Compile with minimum supported g++ in olddeps\n8e026f66252 Merge bitcoin-core/libmultiprocess#327: build: avoid unnecessary capnp-rpc dependency for mpgen\ne5206e9eb5b Merge bitcoin-core/libmultiprocess#325: cmake: Remove `QUIET` option from `find_package(CapnProto ...)`\n879efea2bc7 Merge bitcoin-core/libmultiprocess#321: ci: Roll NetBSD releases to 11.0, drop 9.4\nabf127a3141 Merge bitcoin-core/libmultiprocess#317: ipc: Fix mpgen capnp tool path for vcpkg/Windows builds\nc437d7f107e Merge bitcoin-core/libmultiprocess#310: test: cover immediate client disconnects for `ListenConnections`\n31bff8a673f Merge bitcoin-core/libmultiprocess#307: refactor: memcpy -> std::ranges::copy\nf355108b0a0 Merge bitcoin-core/libmultiprocess#303: type-chrono: Add CustomBuildField/CustomReadField overloads for std::chrono::time_point\n2d678177c14 Merge bitcoin-core/libmultiprocess#296: ci: Bump channel to nixos-26.05\n3f05b11624c util: kill and reap child on SpawnProcess error\n4a56c1837a7 util: report back child error to parent and throw\na9e70dbe775 ci: Add NetBSD release 11.0\n2d33b14fb0e ci: Switch to default compiler on NetBSD 9.4\n36f74002775 ci: Drop NetBSD release 9.4\nbd508311b56 refactor: Drop stray semicolons after function definitions\n788f17a8509 Remove code for Cap'n Proto versions before 0.9\n7402affd0ce ci: Pin oldeps config to older nixpkgs channel to compile older cmake with older gcc\nedf63435624 ci: Compile with minimum supported g++-11 in olddeps\nfa47449afe1 cmake: avoid unnecessary capnp-rpc dependency for mpgen\na494b764de5 cmake: Remove `QUIET` option from `find_package(CapnProto ...)`\n26452e02d75 refactor: memcpy -> std::ranges::copy\ne1dcc6eb182 Merge bitcoin-core/libmultiprocess#316: cmake: Fix stale codegen when mpgen binary changes\n7a72df02e2d type-chrono: Add CustomBuildField/CustomReadField overloads for std::chrono::time_point\n45b685c3f58 type-number, type-chrono: Fix static assert signed/unsigned comparisons\n45f6255975d type-number: exclude bool from the integral overload\n8d6d4649482 Merge bitcoin-core/libmultiprocess#315: Fix startup race in example\na6fc80d2547 Merge bitcoin-core/libmultiprocess#311: bugfix: clear FD_CLOEXEC in child instead of parent before fork\n496fb84e69f test: cover immediate client disconnects for `ListenConnections`\n36c6c63520e doc: Document reference-counted EventLoop lifetime\n3a997e113cf Fix startup race in mpexample\nf5c15ce33ff Merge bitcoin-core/libmultiprocess#323: refactor: access ThreadContext through CurrentThread(), ci: switch Bitcoin Core to master\n66298c737f4 ci: Switch back to Bitcoin Core's master branch\n86b48105018 refactor: access ThreadContext through CurrentThread()\neea9c64f6e1 cmake: Fix stale codegen when mpgen binary changes\na26a08496b8 cmake: Fix mpgen capnp tool path for vcpkg/Windows builds\n140d9ba6ff7 test: allow custom log handler in `ListenSetup`\n1e0c7ff9a51 util: Clear FD_CLOEXEC in child instead of parent before fork\n8550ee6a317 util, refactor: Add ChildFail helper for post-fork child errors\n17eab90b526 test: Fix typo in listen_tests.cpp\nce865a9ba86 refactor: Directly use value in CustomBuildField\n3f221b5bfd7 Merge bitcoin-core/libmultiprocess#274: Add nonunix platform support\n1b0f6056062 doc: Remove trailing whitespace\nd8f8ca3119f ipc: Wrap mpgen main() in try-catch to print errors\nfbe5a14ad46 ci: Check out bitcoin/bitcoin PR #35084 instead of master\n39d3690d83d types: Replace SFINAE with requires clauses to avoid MSVC C2039 error\nba68520203c proxy, refactor: Fix C4305 truncation warning in Accessor on MSVC\n1d81d47811e util, refactor: Fix PtrOrValue constructor for move-only types on MSVC\nb883fe1e527 proxy: Fix shutdownWrite() exception handling on macOS with dynamic libraries\n0012411ccc6 proxy: Call shutdownWrite() in Connection destructor\n38312ad1912 proxy, refactor: Change ConnectStream and ServeStream to accept stream objects\ne96d5d742ab proxy, refactor: Replace EventLoop wakeup fd integers with KJ stream objects\ndb4f9a3d739 cmake: Bump minimum required Cap'n Proto version to 0.9\n652934fb793 util, refactor: Add SocketPair() and use it in SpawnProcess\n1c6ef7a26c0 util, refactor: Do not fork() and exec() separately\n1389cf3132f util, refactor: Add SpawnConnectInfo type alias and use it\nc7ca1f00b62 util, refactor: Add SocketId type alias and use it\nbe46a35203c util, refactor: Add ProcessId type alias and use it\n91a78db7808 doc: Bump version 13 > 14\nfa2c56ec27f ci: Bump channel to nixos-26.05\n\ngit-subtree-dir: src/ipc/libmultiprocess\ngit-subtree-split: 4d454a81da61b1094cee939b80e5e2f9880d420d"
  },
  {
   "sha": "d8bb996bdf6dc5aacc41517bb24d78b996e8510c",
   "date": "2026-09-08T08:13:51Z",
   "message": "multiprocess: Add bitcoin-wallet -ipcconnect option\n\nAdd `-ipcconnect` option to `bitcoin-wallet` to allow connecting to a bitcoin\nnode process over IPC.  The `bitcoin-wallet` tool doesn't really do anything with its\nconnection to the node yet, but it could potentially run or serve RPCs that\nrequire being online.\n\nExample usage:\n\n    src/bitcoin-node -regtest -debug -ipcbind=unix\n    src/bitcoin-wallet -regtest -ipcconnect=unix info"
  },
  {
   "sha": "567c2e020fd0bb115166bde963861b7bbbda5739",
   "date": "2026-09-08T08:13:51Z",
   "message": "Merge commit '4c842beaae2e97d7934800c8433da9632b21c0ff' into pr/subtree-14"
  },
  {
   "sha": "344c0fea96bce0278947f8c2415e3913f816db56",
   "date": "2026-09-08T08:13:51Z",
   "message": "Merge branch 'pr/ipc-connect' into pr/ipc-gui"
  },
  {
   "sha": "80bebc16242e10de0499b5adbf5edf58dad0bbb7",
   "date": "2026-09-08T08:13:51Z",
   "message": "multiprocess: Add bitcoin-gui -ipcconnect option\n\nAdd `-ipcconnect` option to `bitcoin-gui` to allow connecting gui to an\nexisting node instead of starting a new node process, so it is possible to\nstart and stop the gui independently of the node.\n\nThis change doesn't add an -ipcbind option to the bitcoin-wallet (which would\nallow the gui to control wallet processes without going through the node), but\nthis would be a logical extension to add in the future."
  }
 ],
 "timeline": [
  {
   "t": "2020-07-09T17:30:19Z",
   "kind": "comment",
   "who": "laanwj",
   "assoc": "MEMBER",
   "text": "Concept ACK, I've only reviewed the option help yet but `-ipcconnect` SGTM as option name, it reminds of `-rpcconnect` of the `-cli` client."
  },
  {
   "t": "2020-07-09T18:13:38Z",
   "kind": "review_comment",
   "who": "laanwj",
   "assoc": "MEMBER",
   "path": "src/bitcoin-wallet.cpp",
   "commit": "dbced82bbafd8e4cc62dc5d91a6531736dff2caf",
   "in_reply_to": null,
   "text": "I think this is the only case of multiple options separated by `,` inside the first argument of `ArgsManager::AddArg`. I don't know if it's strictly wrong, as it's not currently parsed in any way, but maybe the idea is to do so in the future. @MarcoFalke?"
  },
  {
   "t": "2020-07-09T18:29:19Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/bitcoin-wallet.cpp",
   "commit": "dbced82bbafd8e4cc62dc5d91a6531736dff2caf",
   "in_reply_to": 452402137,
   "text": "No plans right now to touch the command line help in any way, so this might be fine as is"
  },
  {
   "t": "2020-07-14T12:50:08Z",
   "kind": "review_comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "path": "src/bitcoin-wallet.cpp",
   "commit": "dbced82bbafd8e4cc62dc5d91a6531736dff2caf",
   "in_reply_to": 452402137,
   "text": "re: https://github.com/bitcoin/bitcoin/pull/19461#discussion_r452402137\n\n[quoted text omitted]\nThanks, dropped nonstandard formatting and updated description in base PR #19460. No reason to separately list -no prefix."
  },
  {
   "t": "2020-07-14T14:13:17Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "4041990fcba01a5c6eb22b827b2220f2bd8ee666"
  },
  {
   "t": "2020-07-14T14:18:05Z",
   "kind": "review",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "96c4cd092ed354858dfc457fafaec766b85c6e0d",
   "text": "Rebased 70aaca9ebecb802f7da4babd27a79a0551225475 -> 4041990fcba01a5c6eb22b827b2220f2bd8ee666 ([`pr/ipc-gui.1`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.1) -> [`pr/ipc-gui.2`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.2), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.1-rebase..pr/ipc-gui.2)) on top of #19460 pr/ipc-connect.3\nRebased 4041990fcba01a5c6eb22b827b2220f2bd8ee666 -> 0714770d6bf52fbf46a50aff298df8ffdf4eb3ff ([`pr/ipc-gui.2`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.2) -> [`pr/ipc-gui.3`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.3), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.2-rebase..pr/ipc-gui.3)) on top of #19460 pr/ipc-connect.4\nRebased 878e11049c97564f81018381b88bf314ce4c4f01 -> 5c05c38c1a6185ee18eaf74948cf28fd1560abf4 ([`pr/ipc-gui.4`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.4) -> [`pr/ipc-gui.5`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.5), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.4-rebase..pr/ipc-gui.5)) on top of #19460 pr/ipc-connect.7\nRebased 5c05c38c1a6185ee18eaf74948cf28fd1560abf4 -> 2b9fbc08cc9f27dd092798b75afa1e2318e749c9 ([`pr/ipc-gui.5`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.5) -> [`pr/ipc-gui.6`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.6), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.5-rebase..pr/ipc-gui.6)) on top of #19460 pr/ipc-connect.8\nRebased 2b9fbc08cc9f27dd092798b75afa1e2318e749c9 -> 6f39b4689aea86283b43add4bdebda11dee4d73e ([`pr/ipc-gui.6`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.6) -> [`pr/ipc-gui.7`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.7), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.6-rebase..pr/ipc-gui.7)) on top of #19460 pr/ipc-connect.9\nRebased 6f39b4689aea86283b43add4bdebda11dee4d73e -> e2e2a06bf91cc321eb7e6cab2c19cfc4984dfe1c ([`pr/ipc-gui.7`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.7) -> [`pr/ipc-gui.8`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.8), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.7-rebase..pr/ipc-gui.8)) on top of #19460 pr/ipc-connect.10\nRebased e2e2a06bf91cc321eb7e6cab2c19cfc4984dfe1c -> 137225d7ba437d7d14e122a3eb35512ef8648041 ([`pr/ipc-gui.8`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.8) -> [`pr/ipc-gui.9`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.9), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.8-rebase..pr/ipc-gui.9)) on top of #19460 pr/ipc-connect.14\nRebased 137225d7ba437d7d14e122a3eb35512ef8648041 -> 871891d38cb3a4b73fa2016de70990f221662d90 ([`pr/ipc-gui.9`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.9) -> [`pr/ipc-gui.10`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.10), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.9-rebase..pr/ipc-gui.10)) on top of #19460 pr/ipc-connect.15\nRebased 871891d38cb3a4b73fa2016de70990f221662d90 -> 4b045d994b82bb24d0cab1efd5488575b9e7851d ([`pr/ipc-gui.10`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.10) -> [`pr/ipc-gui.11`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.11), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.10-rebase..pr/ipc-gui.11)) on top of #19460 pr/ipc-connect.16 due to conflict with bitcoin-core/gui#233\nRebased 4b045d994b82bb24d0cab1efd5488575b9e7851d -> 7cb12b4bc81c7e8978830e427f9d36b8590d9848 ([`pr/ipc-gui.11`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.11) -> [`pr/ipc-gui.12`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.12), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.11-rebase..pr/ipc-gui.12)) on top of #19460 pr/ipc-connect.19\nRebased 7cb12b4bc81c7e8978830e427f9d36b8590d9848 -> e7dfe88e2ab772c4eed939dd5bda53c42827cac8 ([`pr/ipc-gui.12`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.12) -> [`pr/ipc-gui.13`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.13), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.12-rebase..pr/ipc-gui.13)) on top of #19460 pr/ipc-connect.21\nRebased e7dfe88e2ab772c4eed939dd5bda53c42827cac8 -> 4dc8af0440073813101b85360482713c7abc6949 ([`pr/ipc-gui.13`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.13) -> [`pr/ipc-gui.14`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.14), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.13-rebase..pr/ipc-gui.14)) on top of #19460 pr/ipc-connect.22\nRebased 4dc8af0440073813101b85360482713c7abc6949 -> c997272eb0a6c805f098c920d8210221f770672f ([`pr/ipc-gui.14`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.14) -> [`pr/ipc-gui.15`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.15), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.14-rebase..pr/ipc-gui.15)) on top of #19460 pr/ipc-connect.24 due to conflict with bitcoin-core/gui#381\nRebased c997272eb0a6c805f098c920d8210221f770672f -> e23cf8171fdd6e1187731dd2393fcd64469ffd80 ([`pr/ipc-gui.15`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.15) -> [`pr/ipc-gui.16`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.16), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.15-rebase..pr/ipc-gui.16)) on top of #19460 pr/ipc-connect.25 due to conflict with bitcoin-core/gui#434\nRebased e23cf8171fdd6e1187731dd2393fcd64469ffd80 -> f2f33658dddd45477e43bcad749833f6fd336bb2 ([`pr/ipc-gui.16`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.16) -> [`pr/ipc-gui.17`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.17), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.16-rebase..pr/ipc-gui.17)) on top of #19460 pr/ipc-connect.26\nRebased f2f33658dddd45477e43bcad749833f6fd336bb2 -> f8d4a15805296edb365602a37875637610fe77c7 ([`pr/ipc-gui.17`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.17) -> [`pr/ipc-gui.18`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.18), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.17-rebase..pr/ipc-gui.18)) on top of #19460 pr/ipc-connect.28"
  },
  {
   "t": "2020-07-14T18:29:01Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "0714770d6bf52fbf46a50aff298df8ffdf4eb3ff"
  },
  {
   "t": "2020-08-28T11:26:14Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "878e11049c97564f81018381b88bf314ce4c4f01"
  },
  {
   "t": "2020-09-10T19:50:04Z",
   "kind": "comment",
   "who": "meshcollider",
   "assoc": "CONTRIBUTOR",
   "text": "Concept ACK"
  },
  {
   "t": "2020-09-28T12:44:56Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "5c05c38c1a6185ee18eaf74948cf28fd1560abf4"
  },
  {
   "t": "2020-10-02T13:38:54Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "2b9fbc08cc9f27dd092798b75afa1e2318e749c9"
  },
  {
   "t": "2020-11-25T16:42:27Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "6f39b4689aea86283b43add4bdebda11dee4d73e"
  },
  {
   "t": "2020-12-12T00:16:38Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "e2e2a06bf91cc321eb7e6cab2c19cfc4984dfe1c"
  },
  {
   "t": "2021-02-04T04:20:57Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "137225d7ba437d7d14e122a3eb35512ef8648041"
  },
  {
   "t": "2021-02-22T02:28:23Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "871891d38cb3a4b73fa2016de70990f221662d90"
  },
  {
   "t": "2021-03-10T03:48:20Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "4b045d994b82bb24d0cab1efd5488575b9e7851d"
  },
  {
   "t": "2021-04-11T20:04:56Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "7cb12b4bc81c7e8978830e427f9d36b8590d9848"
  },
  {
   "t": "2021-04-27T14:22:22Z",
   "kind": "comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "text": "Needs rebase \ud83c\udf89\n\nWhat was the magic incantation again to tunnel a unix socket over SSH? I'll try if I can run the GUI on a different machine than the node."
  },
  {
   "t": "2021-06-02T07:13:40Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "e7dfe88e2ab772c4eed939dd5bda53c42827cac8"
  },
  {
   "t": "2021-06-18T17:48:56Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "4dc8af0440073813101b85360482713c7abc6949"
  },
  {
   "t": "2021-08-18T14:12:10Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "c997272eb0a6c805f098c920d8210221f770672f"
  },
  {
   "t": "2021-10-06T18:40:50Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "e23cf8171fdd6e1187731dd2393fcd64469ffd80"
  },
  {
   "t": "2021-11-01T14:52:23Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "f2f33658dddd45477e43bcad749833f6fd336bb2"
  },
  {
   "t": "2022-01-13T21:14:14Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "f8d4a15805296edb365602a37875637610fe77c7"
  },
  {
   "t": "2022-03-21T18:38:50Z",
   "kind": "review",
   "who": "ClaraBara22",
   "assoc": "NONE",
   "state": "APPROVED",
   "commit": "f8d4a15805296edb365602a37875637610fe77c7",
   "text": "Thank you"
  },
  {
   "t": "2022-09-27T01:40:29Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "38859c192d21b09ed933399cbfd053f2306feaf7"
  },
  {
   "t": "2023-02-11T00:01:57Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "be331f5748ff875a7691a921caa4bd009549c683"
  },
  {
   "t": "2023-02-11T11:38:49Z",
   "kind": "comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nOn an Ubuntu 22.10 machine I ran `src/bitcoin-node -ipcbind=unix:///tmp/node.sock`. I then opened an SSH connection: `ssh -L/tmp/remote-node.sock:/tmp/node.sock ubuntu`. And then on the mac I connected the GUI: `src/bitcoin-gui -ipconnect=unix:///tmp/remote-node.sock`\n\nI connected just after  the node caught up on old blocks. It had the most recent block, but the logs show it as 0.999998% finished. The UI displayed a nonsensical status for that:\n\nOnce a new block came in a few minutes later, the sync dialog was correctly dismissed. Also, when I started the node again and it had to sync a bunch of blocks, the progress dialog did work correctly. Except that the ETA was always 0 seconds.\n\nOther than that, it seems to work. Cool stuff!\n\nWhen I exit the GUI and after that stop `bitcoind` the latter crashes:\n\n```\n^C2023-02-11T12:02:40Z [rpc] Interrupting HTTP RPC server\n2023-02-11T12:02:40Z [rpc] Interrupting RPC\n2023-02-11T12:02:40Z tor: Thread interrupt\n2023-02-11T12:02:40Z Shutdown: In progress...\n2023-02-11T12:02:40Z addcon thread exit\n2023-02-11T12:02:40Z [rpc] Stopping HTTP RPC server\n2023-02-11T12:02:40Z torcontrol thread exit\n2023-02-11T12:02:40Z [rpc] Stopping RPC\n2023-02-11T12:02:40Z [rpc] RPC stopped.\nterminate called after throwing an instance of 'ipc::Exception'\n  what():  kj::Exception: kj/async-io-unix.c++:304: disconnected: ::read(fd, buffer, maxBytes): Connection reset by peer\nstack: 7ff9e59af780 5604c599569c 5604c594b366\nAborted (core dumped)\n```"
  },
  {
   "t": "2023-03-01T04:26:50Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "9936174c9f3f72cee25ead72359ed95600560a6b"
  },
  {
   "t": "2023-05-03T21:34:07Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "d50bb2707b55210027455b8f494370dcf98922ae"
  },
  {
   "t": "2023-05-04T12:35:20Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "5f91aa3d8b47cee97e625c3b5689a37dbd941eff"
  },
  {
   "t": "2023-05-05T10:33:09Z",
   "kind": "comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nThis still happens on 5f91aa3d8b47cee97e625c3b5689a37dbd941eff. Same setup as above: node and wallet running on Ubuntu 23.04 with a GUI client connecting from macOS using a unix socket of SSH.\n\nBut now I've notice this happens even if you don't connect to it, i.e. starting without `-ipcbind`.\n\nAfter letting the chain sync (a few days worth of blocks), I shut it down. At that point the log (on Ubuntu):\n\n```\n2023-05-05T10:30:24Z UpdateTip: new best=000000000000000000010ed2e719320bb8bdea58868cf0bee4897b33b7c20c14 height=788138 version=0x32b96000 log2_work=94.158122 tx=831696670 date='2023-05-03T20:58:19Z' progress=0.999404 cache=515.2MiB(4072240txo)\n2023-05-05T10:30:29Z Synchronizing blockheaders, height: 788359 (~100.00%)\n^C2023-05-05T10:30:42Z [rpc] Interrupting HTTP RPC server\n2023-05-05T10:30:42Z [rpc] Interrupting RPC\n2023-05-05T10:30:42Z tor: Thread interrupt\n2023-05-05T10:30:42Z torcontrol thread exit\n2023-05-05T10:30:42Z addcon thread exit\n2023-05-05T10:30:42Z Shutdown: In progress...\n2023-05-05T10:30:42Z opencon thread exit\n2023-05-05T10:30:42Z [rpc] Stopping HTTP RPC server\n2023-05-05T10:30:42Z [rpc] Stopping RPC\n2023-05-05T10:30:42Z [rpc] RPC stopped.\nterminate called after throwing an instance of 'ipc::Exception'\n  what():  kj::Exception: kj/async-io-unix.c++:498: disconnected: ::read(fd, buffer, maxBytes): Connection reset by peer\nstack: 7fb82ba25644 7fb82ba34eab 7fb82b9c41b5 7fb82ba1bdb0 7fb82bb95720 7fb82bb8ec20 7fb82bb92df0 7fb82bbf6b30 7fb82bbf1220 7fb82bbe6cc0 7fb82bbe2800 7fb82bbd25d0 7fb82bbd3084 7fb82bbcf610 564eea2664d0 564eea26ad60\nAborted (core dumped)\n```\n\nI then have to restart the node and sync again.\n\n(update: it's unrelated to the commits in this PR, I added a comment on https://github.com/bitcoin/bitcoin/pull/10102#issuecomment-1536075360)"
  },
  {
   "t": "2023-05-05T11:41:06Z",
   "kind": "comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "text": "I'm able to produce another crash that may be related to this PR. When using an external signer that's connected to the Ubuntu machine, and trying to spend with it from the macOs GUI. After I click Sign on device, and hit \"send\":\n\n```\nAssertion failed: (!complete), function sendButtonClicked, file sendcoinsdialog.cpp, line 525.\nzsh: abort      src/bitcoin-gui -ipcconnect=unix:///tmp/remote-node.sock\n```\n\nIt also crashes if I create a PSBT (options -> wallet -> enable psbt controls) instead, just a different line\n\n```\nAssertion failed: (!complete), function sendButtonClicked, file sendcoinsdialog.cpp, line 509.\n```\n\nBoth nodes were configured with have `--enable-external-signer`. I'm able to call `enumeratesigners` from the console.\n\nThese asserts happen after calling `fillPSBT(` _without_ signing (This prevents an external from being called prematurely). `complete` can't be possibly be true, hence the assert."
  },
  {
   "t": "2023-05-05T14:44:10Z",
   "kind": "comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "text": "Thanks Sjors, I'm trying to reproduce the shutdown error but didn't succeed yet. Will try again with a mainnet node. I didn't look into the external signer bug yet, but maybe that is more straightforward. In both cases running with -debug=ipc could make it clearer what's going on, especially in the shutdown case. Probably what is happening in that case is that some thread is trying make an IPC call after the socket is closed, so an ipc::Exception is raised which is uncaught. Fix might be synchronizing the IPC call & socket close, or just catching the exception and handling it"
  },
  {
   "t": "2024-07-26T19:54:44Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "359a59bb70abc823eddd3c403e80e82bd03d9174"
  },
  {
   "t": "2024-09-19T11:08:33Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "ae16815f5f50e14efb6b733bcb3d57c89fd7de07"
  },
  {
   "t": "2024-09-26T14:08:40Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "06b970bc63e3811e7d2aac8c856847b7db6ddc53"
  },
  {
   "t": "2024-12-06T19:26:54Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "34b714020e887e1f37dd153791ee318c53946e18"
  },
  {
   "t": "2025-03-18T15:18:35Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "a20cf1d38217c407d1e7efada1790b39179e9f4e"
  },
  {
   "t": "2025-03-18T16:00:29Z",
   "kind": "comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "text": "(The arm CI failed)"
  },
  {
   "t": "2025-03-19T17:18:01Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "9706a5c58b4e7c4a570500f053d5a948d144cb30"
  },
  {
   "t": "2025-03-25T18:48:20Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "dbced82bbafd8e4cc62dc5d91a6531736dff2caf"
  },
  {
   "t": "2025-03-27T00:25:02Z",
   "kind": "comment",
   "who": "jimhashhq",
   "assoc": "NONE",
   "text": "As promised in #10102 comments, I tried out `-ipcconnect` using rebased pr-19641 (thank you); everything seemed to work consistent with my new understanding of multiprocess interactions (thanks again).  I did notice one issue:\n\n1) If `bitcoin-node` is run with -`disablewallet` subsequent start of a `bitcoin-gui` with`-ipcconnect=auto`, but _without_ `-disablewallet` will crash `bitcoin-node`.  This is obviously an operator error, but may be worth handling w/o node crash. Error is:\n\n[quoted text omitted]\nNote: `bitcoin-gui`and `bitcoin-node` work just fine if `bitcoin-gui` correctly started with `-disablewallet`.\nOf interest, `bitcoin-cli` wallet-related RPC commands run against a `bitcoin-node` with `-disablewallet` (again, an operator error) correctly just return a `Method not found` RPC error and do not cause node crash.\n\nPlease reference `-disablewallet` notes at [docs/developer-notes.md#wallet](https://github.com/bitcoin/bitcoin/blob/master/doc/developer-notes.md#wallet)\n\nInterestingly, a _prior revision_ to [docs/developer-notes.md#wallet](https://github.com/bitcoin/bitcoin/blob/master/doc/developer-notes.md#wallet) expands on this and references an obsolete/superceded test:\n```\n   - *Rationale*: In RPC code that conditionally use the wallet (such as\n     `validateaddress`) it is easy to forget that global pointer `pwalletMain`\n     can be NULL. See `qa/rpc-tests/disablewallet.py` for functional tests\n     exercising the API with `-disablewallet`\n```\nI did not yet try and debug the crash as I'm not totally sure I built from the correct integration branch for this?\nHopefully some of this is useful, thank you.\nSee also:  #19460"
  },
  {
   "t": "2025-04-07T15:58:09Z",
   "kind": "comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nThanks for the report. I created https://github.com/bitcoin-core/libmultiprocess/issues/169 to track it. It sounds like you are using the correct branch, and as long as you are using any branch containing the changes in this PR, following those steps should not crash and the fact that they do is a bug. I'm trying to reproduce the crash now and will add a stack trace to https://github.com/bitcoin-core/libmultiprocess/issues/169 if I can. I'd expect fixing this to be pretty simple after that."
  },
  {
   "t": "2025-04-08T14:36:16Z",
   "kind": "comment",
   "who": "jimhashhq",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nThank you; glad to hear you were able to easily reproduce.  I did not report an issue myself only because:\n1) Didn't want to sound alarmist; this is isolated to the experimental multiprocess feature.\n2) Calling this just an issue might avoid addressing deeper process control hierarchy challenges,\nprioritizing a temporary implementation over longer term design (below).\n3) I'm not currently qualified to opine on any potential pitfalls of mixing/matching legacy Boost\nthreading/synchronization with KJ cooperative multitasking, coroutines, etc.\n[quoted text omitted]\n\nSaw _one_ other statement to this effect, but can't place it RN, will reference here if I can.\n\nI also would also be interested in seeing multiprocess achieve the goal of *not* having the node act as a go-between for wallet RPCs, and might be personally interested on working on any formal software \"interface rationalization\" spec to that end, if one doesn't exist already."
  },
  {
   "t": "2025-10-15T00:41:21Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "f956e90fbdeff8c184ea2e6fb9362b2d3f12f30f"
  },
  {
   "t": "2025-10-22T09:29:05Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "6bab3c091b6e9f8a90255066e7fb7f063eede5bc"
  },
  {
   "t": "2025-11-20T18:51:29Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "8e4ceb66a97fa14afc932d12f944662638ed87af"
  },
  {
   "t": "2025-11-20T19:07:39Z",
   "kind": "comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "text": "Rebased dbced82bbafd8e4cc62dc5d91a6531736dff2caf -> f956e90fbdeff8c184ea2e6fb9362b2d3f12f30f ([`pr/ipc-gui.30`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.30) -> [`pr/ipc-gui.31`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.31), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.30-rebase..pr/ipc-gui.31))\n\nRebased f956e90fbdeff8c184ea2e6fb9362b2d3f12f30f -> 6bab3c091b6e9f8a90255066e7fb7f063eede5bc ([`pr/ipc-gui.31`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.31) -> [`pr/ipc-gui.32`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.32), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.31-rebase..pr/ipc-gui.32))\n\nRebased 6bab3c091b6e9f8a90255066e7fb7f063eede5bc -> 8e4ceb66a97fa14afc932d12f944662638ed87af ([`pr/ipc-gui.32`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.32) -> [`pr/ipc-gui.33`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.33), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.32-rebase..pr/ipc-gui.33)) on top of #19460 pr/ipc-connect.48\n\nRebased 8e4ceb66a97fa14afc932d12f944662638ed87af -> 1b7e9b30bdb3db31ee94ed500c7437eaba817581 ([`pr/ipc-gui.33`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.33) -> [`pr/ipc-gui.34`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.34), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.33-rebase..pr/ipc-gui.34))\n\nRebased 1b7e9b30bdb3db31ee94ed500c7437eaba817581 -> 7f80749c5140dea02c411931e5df165b4cf7aec5 ([`pr/ipc-gui.34`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.34) -> [`pr/ipc-gui.35`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.35), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.34-rebase..pr/ipc-gui.35))\n\nRebased 7f80749c5140dea02c411931e5df165b4cf7aec5 -> 86eb826842691ed52057a1aada702a5c1eb7c262 ([`pr/ipc-gui.35`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.35) -> [`pr/ipc-gui.36`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.36), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.35-rebase..pr/ipc-gui.36)) on top of #19460 pr/ipc-connect.51\n\nRebased 86eb826842691ed52057a1aada702a5c1eb7c262 -> 93a1d8e9fb0adb578656a42b30aeb821ba193f34 ([`pr/ipc-gui.36`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.36) -> [`pr/ipc-gui.37`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.37), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.36-rebase..pr/ipc-gui.37)) on top of #19460 pr/ipc-connect.52\n\nRebased 93a1d8e9fb0adb578656a42b30aeb821ba193f34 -> bb4f280f34902a41846463fdc41721c8f7382c79 ([`pr/ipc-gui.37`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.37) -> [`pr/ipc-gui.38`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.38), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.37-rebase..pr/ipc-gui.38)) on top of #19460 pr/ipc-connect.53\n\nRebased bb4f280f34902a41846463fdc41721c8f7382c79 -> 5f93661901bcaee4731a02b86a31712f237629af ([`pr/ipc-gui.38`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.38) -> [`pr/ipc-gui.39`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.39), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.38-rebase..pr/ipc-gui.39)) on top of #19460 pr/ipc-connect.54\n\nRebased 5f93661901bcaee4731a02b86a31712f237629af -> 80bebc16242e10de0499b5adbf5edf58dad0bbb7 ([`pr/ipc-gui.39`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.39) -> [`pr/ipc-gui.40`](https://github.com/ryanofsky/bitcoin/commits/pr/ipc-gui.40), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/ipc-gui.39-rebase..pr/ipc-gui.40)) on top of #19460 pr/ipc-connect.55 due to conflicts with #36176"
  },
  {
   "t": "2025-12-12T12:18:27Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "1b7e9b30bdb3db31ee94ed500c7437eaba817581"
  },
  {
   "t": "2025-12-16T02:09:56Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "7f80749c5140dea02c411931e5df165b4cf7aec5"
  },
  {
   "t": "2026-01-07T18:26:32Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "86eb826842691ed52057a1aada702a5c1eb7c262"
  },
  {
   "t": "2026-04-01T21:44:19Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "93a1d8e9fb0adb578656a42b30aeb821ba193f34"
  },
  {
   "t": "2026-07-14T19:33:31Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "bb4f280f34902a41846463fdc41721c8f7382c79"
  },
  {
   "t": "2026-08-18T18:21:54Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "8596dcc0155d4fa65132a99437301de8ec12088b"
  },
  {
   "t": "2026-09-09T02:52:20Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "80bebc16242e10de0499b5adbf5edf58dad0bbb7"
  }
 ],
 "labels_log": [
  {
   "t": "2020-07-07T20:35:14Z",
   "action": "labeled",
   "label": "Build system",
   "who": "DrahtBot"
  },
  {
   "t": "2020-07-07T20:35:14Z",
   "action": "labeled",
   "label": "Docs",
   "who": "DrahtBot"
  },
  {
   "t": "2020-07-07T20:35:14Z",
   "action": "labeled",
   "label": "GUI",
   "who": "DrahtBot"
  },
  {
   "t": "2020-07-07T20:35:14Z",
   "action": "labeled",
   "label": "P2P",
   "who": "DrahtBot"
  },
  {
   "t": "2020-07-07T20:35:14Z",
   "action": "labeled",
   "label": "RPC/REST/ZMQ",
   "who": "DrahtBot"
  },
  {
   "t": "2020-07-07T20:35:14Z",
   "action": "labeled",
   "label": "Tests",
   "who": "DrahtBot"
  },
  {
   "t": "2020-07-07T20:35:14Z",
   "action": "labeled",
   "label": "Utils/log/libs",
   "who": "DrahtBot"
  },
  {
   "t": "2020-07-07T20:35:14Z",
   "action": "labeled",
   "label": "Wallet",
   "who": "DrahtBot"
  },
  {
   "t": "2020-07-11T12:43:53Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-07-14T19:51:28Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-07-23T17:00:50Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-08-28T13:22:43Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-08-31T10:17:32Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-09-17T07:20:12Z",
   "action": "unlabeled",
   "label": "Build system",
   "who": "ajtowns"
  },
  {
   "t": "2020-09-17T07:20:12Z",
   "action": "unlabeled",
   "label": "Docs",
   "who": "ajtowns"
  },
  {
   "t": "2020-09-17T07:20:12Z",
   "action": "unlabeled",
   "label": "P2P",
   "who": "ajtowns"
  },
  {
   "t": "2020-09-17T07:20:12Z",
   "action": "unlabeled",
   "label": "RPC/REST/ZMQ",
   "who": "ajtowns"
  },
  {
   "t": "2020-09-17T07:20:12Z",
   "action": "unlabeled",
   "label": "Tests",
   "who": "ajtowns"
  },
  {
   "t": "2020-09-17T07:20:12Z",
   "action": "unlabeled",
   "label": "Wallet",
   "who": "ajtowns"
  },
  {
   "t": "2020-09-28T13:10:38Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-10-27T10:04:18Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-11-25T17:30:21Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-12-02T13:16:05Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-12-12T00:25:21Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-12-16T15:56:56Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-02-04T05:47:44Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-02-04T10:01:42Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-02-22T03:19:45Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-03-02T11:58:58Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-03-10T05:31:24Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-03-11T14:56:14Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-04-11T20:40:44Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-04-27T11:17:30Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-06-02T09:17:46Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-06-09T07:49:00Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-06-18T18:47:52Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-06-23T13:13:05Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-08-18T14:42:18Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-09-24T13:54:26Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-10-06T20:27:27Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-10-15T09:40:49Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-11-01T15:05:23Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-11-10T20:21:54Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-01-13T21:23:39Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-01-31T18:49:58Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-09-27T03:43:53Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-12-06T11:41:02Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-02-11T00:47:34Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-02-17T19:17:40Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-03-01T04:47:43Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-03-11T10:52:13Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-03T23:17:09Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-04T00:32:43Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-04T14:53:07Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-14T08:53:22Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-21T08:37:05Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-30T16:04:48Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-26T20:01:49Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-26T22:39:26Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-08-16T10:34:14Z",
   "action": "labeled",
   "label": "Needs CMake port",
   "who": "hebasto"
  },
  {
   "t": "2024-08-28T10:05:38Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-08-29T05:17:59Z",
   "action": "unlabeled",
   "label": "Needs CMake port",
   "who": "maflcko"
  },
  {
   "t": "2024-09-19T12:28:47Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-09-23T20:40:00Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-09-26T15:18:07Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-11-21T14:07:54Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-12-06T21:26:23Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-01-29T13:34:14Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-19T21:01:02Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "ryanofsky"
  },
  {
   "t": "2025-03-25T22:25:44Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-04-02T14:25:55Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-10-15T00:58:19Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-11-12T17:18:57Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-11-20T19:29:29Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-11-20T21:37:11Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-04T15:18:22Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-12T13:18:36Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-07T19:47:03Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-04T20:42:37Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-04-01T22:51:59Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-07-07T12:41:44Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-07-14T21:34:56Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-07-29T09:19:35Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-18T19:10:03Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-21T08:44:39Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-09-09T04:49:48Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  }
 ],
 "state_log": [
  {
   "t": "2023-09-20T16:09:41Z",
   "kind": "convert_to_draft",
   "who": "achow101"
  }
 ],
 "text_chars": 35821,
 "text_tokens_estimate": 8955,
 "changed_paths": [
  "CMakeLists.txt",
  "contrib/devtools/circular-dependencies.py",
  "doc/design/libraries.md",
  "doc/multiprocess.md",
  "src/CMakeLists.txt",
  "src/bitcoin-cli.cpp",
  "src/bitcoin-wallet.cpp",
  "src/bitcoind.cpp",
  "src/init.cpp",
  "src/init.h",
  "src/init/basic.cpp",
  "src/init/bitcoin-gui.cpp",
  "src/init/bitcoin-node.cpp",
  "src/init/bitcoin-wallet-ipc.cpp",
  "src/init/common.cpp",
  "src/init/common.h",
  "src/interfaces/chain.h",
  "src/interfaces/init.h",
  "src/interfaces/ipc.h",
  "src/interfaces/node.h",
  "src/interfaces/wallet.h",
  "src/ipc/CMakeLists.txt",
  "src/ipc/capnp/chain-types.h",
  "src/ipc/capnp/chain.capnp",
  "src/ipc/capnp/chain.cpp",
  "src/ipc/capnp/common-types.h",
  "src/ipc/capnp/common.capnp",
  "src/ipc/capnp/common.cpp",
  "src/ipc/capnp/common.h",
  "src/ipc/capnp/context.h",
  "src/ipc/capnp/handler-types.h",
  "src/ipc/capnp/handler.capnp",
  "src/ipc/capnp/init-types.h",
  "src/ipc/capnp/init.capnp",
  "src/ipc/capnp/init.cpp",
  "src/ipc/capnp/node-types.h",
  "src/ipc/capnp/node.capnp",
  "src/ipc/capnp/node.cpp",
  "src/ipc/capnp/node.h",
  "src/ipc/capnp/wallet-types.h",
  "src/ipc/capnp/wallet.capnp",
  "src/ipc/capnp/wallet.cpp",
  "src/ipc/capnp/wallet.h",
  "src/ipc/context.h",
  "src/ipc/interfaces.cpp",
  "src/ipc/libmultiprocess/.clang-tidy",
  "src/ipc/libmultiprocess/.github/workflows/bitcoin-core-ci.yml",
  "src/ipc/libmultiprocess/.github/workflows/ci.yml",
  "src/ipc/libmultiprocess/CMakeLists.txt",
  "src/ipc/libmultiprocess/ci/README.md",
  "src/ipc/libmultiprocess/ci/configs/default.bash",
  "src/ipc/libmultiprocess/ci/configs/freebsd.bash",
  "src/ipc/libmultiprocess/ci/configs/llvm.bash",
  "src/ipc/libmultiprocess/ci/configs/macos.bash",
  "src/ipc/libmultiprocess/ci/configs/netbsd.bash",
  "src/ipc/libmultiprocess/ci/configs/newdeps.bash",
  "src/ipc/libmultiprocess/ci/configs/olddeps.bash",
  "src/ipc/libmultiprocess/ci/configs/openbsd.bash",
  "src/ipc/libmultiprocess/ci/configs/sanitize.bash",
  "src/ipc/libmultiprocess/ci/scripts/ci.sh",
  "src/ipc/libmultiprocess/cmake/TargetCapnpSources.cmake",
  "src/ipc/libmultiprocess/cmake/compat_config.cmake",
  "src/ipc/libmultiprocess/cmake/pthread_checks.cmake",
  "src/ipc/libmultiprocess/doc/design.md",
  "src/ipc/libmultiprocess/doc/install.md",
  "src/ipc/libmultiprocess/doc/usage.md",
  "src/ipc/libmultiprocess/doc/versions.md",
  "src/ipc/libmultiprocess/example/calculator.cpp",
  "src/ipc/libmultiprocess/example/example.cpp",
  "src/ipc/libmultiprocess/example/printer.cpp",
  "src/ipc/libmultiprocess/include/mp/config.h.in",
  "src/ipc/libmultiprocess/include/mp/proxy-io.h",
  "src/ipc/libmultiprocess/include/mp/proxy-types.h",
  "src/ipc/libmultiprocess/include/mp/proxy.h",
  "src/ipc/libmultiprocess/include/mp/type-char.h",
  "src/ipc/libmultiprocess/include/mp/type-chrono.h",
  "src/ipc/libmultiprocess/include/mp/type-context.h",
  "src/ipc/libmultiprocess/include/mp/type-data.h",
  "src/ipc/libmultiprocess/include/mp/type-function.h",
  "src/ipc/libmultiprocess/include/mp/type-interface.h",
  "src/ipc/libmultiprocess/include/mp/type-map.h",
  "src/ipc/libmultiprocess/include/mp/type-number.h",
  "src/ipc/libmultiprocess/include/mp/type-string.h",
  "src/ipc/libmultiprocess/include/mp/type-struct.h",
  "src/ipc/libmultiprocess/include/mp/type-threadmap.h",
  "src/ipc/libmultiprocess/include/mp/util.h",
  "src/ipc/libmultiprocess/include/mp/version.h",
  "src/ipc/libmultiprocess/shell.nix",
  "src/ipc/libmultiprocess/src/mp/gen.cpp",
  "src/ipc/libmultiprocess/src/mp/proxy.cpp",
  "src/ipc/libmultiprocess/src/mp/util.cpp",
  "src/ipc/libmultiprocess/test/CMakeLists.txt",
  "src/ipc/libmultiprocess/test/mp/test/common.h",
  "src/ipc/libmultiprocess/test/mp/test/connect_tests.cpp",
  "src/ipc/libmultiprocess/test/mp/test/foo-types.h",
  "src/ipc/libmultiprocess/test/mp/test/foo.capnp",
  "src/ipc/libmultiprocess/test/mp/test/foo.h",
  "src/ipc/libmultiprocess/test/mp/test/listen_tests.cpp",
  "src/ipc/libmultiprocess/test/mp/test/spawn_tests.cpp",
  "src/ipc/libmultiprocess/test/mp/test/test.cpp",
  "src/ipc/libmultiprocess/test/mp/test/unixlistener.h",
  "src/ipc/stub.cpp",
  "src/net.h",
  "src/net_processing.h",
  "src/netbase.h",
  "src/node/interfaces.cpp",
  "src/policy/fees/block_policy_estimator.h",
  "src/qt/bitcoin.cpp",
  "src/qt/bitcoin.h",
  "src/qt/initexecutor.cpp",
  "src/qt/initexecutor.h",
  "src/qt/test/apptests.cpp",
  "src/qt/test/apptests.h",
  "src/qt/walletcontroller.cpp",
  "src/rpc/request.h",
  "src/test/btcsignals_tests.cpp",
  "src/test/util/setup_common.cpp",
  "src/util/btcsignals.h",
  "src/util/result.h",
  "src/wallet/coincontrol.h",
  "src/wallet/init.cpp",
  "src/wallet/interfaces.cpp",
  "src/wallet/types.h",
  "src/wallet/wallet.h",
  "src/wallet/wallettool.cpp",
  "src/wallet/wallettool.h",
  "test/functional/combine_logs.py",
  "test/functional/feature_block.py",
  "test/functional/feature_config_args.py",
  "test/functional/feature_taproot.py",
  "test/functional/test_framework/test_node.py",
  "test/functional/wallet_createwallet.py",
  "test/functional/wallet_descriptor.py",
  "test/functional/wallet_encryption.py",
  "test/functional/wallet_fast_rescan.py",
  "test/functional/wallet_groups.py",
  "test/functional/wallet_importdescriptors.py",
  "test/functional/wallet_multiwallet.py",
  "test/functional/wallet_reorgsrestore.py",
  "test/functional/wallet_resendwallettransactions.py",
  "test/functional/wallet_transactiontime_rescan.py",
  "test/lint/git-subtree-check.sh"
 ],
 "files": [
  {
   "path": "CMakeLists.txt",
   "add": 14,
   "del": 0
  },
  {
   "path": "contrib/devtools/circular-dependencies.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "doc/design/libraries.md",
   "add": 1,
   "del": 1
  },
  {
   "path": "doc/multiprocess.md",
   "add": 6,
   "del": 0
  },
  {
   "path": "src/CMakeLists.txt",
   "add": 9,
   "del": 3
  },
  {
   "path": "src/bitcoin-cli.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/bitcoin-wallet.cpp",
   "add": 19,
   "del": 3
  },
  {
   "path": "src/bitcoind.cpp",
   "add": 4,
   "del": 2
  },
  {
   "path": "src/init.cpp",
   "add": 6,
   "del": 3
  },
  {
   "path": "src/init.h",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/init/basic.cpp",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/init/bitcoin-gui.cpp",
   "add": 9,
   "del": 20
  },
  {
   "path": "src/init/bitcoin-node.cpp",
   "add": 23,
   "del": 12
  },
  {
   "path": "src/init/bitcoin-wallet-ipc.cpp",
   "add": 85,
   "del": 0
  },
  {
   "path": "src/init/common.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/init/common.h",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/interfaces/chain.h",
   "add": 5,
   "del": 4
  },
  {
   "path": "src/interfaces/init.h",
   "add": 4,
   "del": 1
  },
  {
   "path": "src/interfaces/ipc.h",
   "add": 4,
   "del": 1
  },
  {
   "path": "src/interfaces/node.h",
   "add": 5,
   "del": 5
  },
  {
   "path": "src/interfaces/wallet.h",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/ipc/CMakeLists.txt",
   "add": 19,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/chain-types.h",
   "add": 112,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/chain.capnp",
   "add": 189,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/chain.cpp",
   "add": 208,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/common-types.h",
   "add": 251,
   "del": 2
  },
  {
   "path": "src/ipc/capnp/common.capnp",
   "add": 84,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/common.cpp",
   "add": 51,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/common.h",
   "add": 27,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/context.h",
   "add": 14,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/handler-types.h",
   "add": 10,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/handler.capnp",
   "add": 17,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/init-types.h",
   "add": 25,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/init.capnp",
   "add": 9,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/init.cpp",
   "add": 40,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/node-types.h",
   "add": 110,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/node.capnp",
   "add": 213,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/node.cpp",
   "add": 97,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/node.h",
   "add": 40,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/wallet-types.h",
   "add": 55,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/wallet.capnp",
   "add": 269,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/wallet.cpp",
   "add": 251,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/wallet.h",
   "add": 36,
   "del": 0
  },
  {
   "path": "src/ipc/context.h",
   "add": 5,
   "del": 0
  },
  {
   "path": "src/ipc/interfaces.cpp",
   "add": 6,
   "del": 4
  },
  {
   "path": "src/ipc/libmultiprocess/.clang-tidy",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/ipc/libmultiprocess/.github/workflows/bitcoin-core-ci.yml",
   "add": 3,
   "del": 0
  },
  {
   "path": "src/ipc/libmultiprocess/.github/workflows/ci.yml",
   "add": 15,
   "del": 9
  },
  {
   "path": "src/ipc/libmultiprocess/CMakeLists.txt",
   "add": 17,
   "del": 7
  },
  {
   "path": "src/ipc/libmultiprocess/ci/README.md",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/ipc/libmultiprocess/ci/configs/default.bash",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/ipc/libmultiprocess/ci/configs/freebsd.bash",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/ipc/libmultiprocess/ci/configs/llvm.bash",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/ipc/libmultiprocess/ci/configs/macos.bash",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/ipc/libmultiprocess/ci/configs/netbsd.bash",
   "add": 1,
   "del": 7
  },
  {
   "path": "src/ipc/libmultiprocess/ci/configs/newdeps.bash",
   "add": 6,
   "del": 0
  },
  {
   "path": "src/ipc/libmultiprocess/ci/configs/olddeps.bash",
   "add": 4,
   "del": 1
  },
  {
   "path": "src/ipc/libmultiprocess/ci/configs/openbsd.bash",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/ipc/libmultiprocess/ci/configs/sanitize.bash",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/ipc/libmultiprocess/ci/scripts/ci.sh",
   "add": 18,
   "del": 0
  },
  {
   "path": "src/ipc/libmultiprocess/cmake/TargetCapnpSources.cmake",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/ipc/libmultiprocess/cmake/compat_config.cmake",
   "add": 0,
   "del": 42
  },
  {
   "path": "src/ipc/libmultiprocess/cmake/pthread_checks.cmake",
   "add": 8,
   "del": 0
  },
  {
   "path": "src/ipc/libmultiprocess/doc/design.md",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/ipc/libmultiprocess/doc/install.md",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/ipc/libmultiprocess/doc/usage.md",
   "add": 6,
   "del": 0
  },
  {
   "path": "src/ipc/libmultiprocess/doc/versions.md",
   "add": 8,
   "del": 2
  },
  {
   "path": "src/ipc/libmultiprocess/example/calculator.cpp",
   "add": 4,
   "del": 9
  },
  {
   "path": "src/ipc/libmultiprocess/example/example.cpp",
   "add": 7,
   "del": 5
  },
  {
   "path": "src/ipc/libmultiprocess/example/printer.cpp",
   "add": 4,
   "del": 9
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/config.h.in",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/proxy-io.h",
   "add": 74,
   "del": 28
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/proxy-types.h",
   "add": 31,
   "del": 12
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/proxy.h",
   "add": 8,
   "del": 6
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/type-char.h",
   "add": 9,
   "del": 3
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/type-chrono.h",
   "add": 25,
   "del": 2
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/type-context.h",
   "add": 15,
   "del": 3
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/type-data.h",
   "add": 2,
   "del": 3
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/type-function.h",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/type-interface.h",
   "add": 10,
   "del": 10
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/type-map.h",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/type-number.h",
   "add": 24,
   "del": 15
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/type-string.h",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/type-struct.h",
   "add": 12,
   "del": 12
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/type-threadmap.h",
   "add": 4,
   "del": 4
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/util.h",
   "add": 63,
   "del": 15
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/version.h",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/ipc/libmultiprocess/shell.nix",
   "add": 12,
   "del": 6
  },
  {
   "path": "src/ipc/libmultiprocess/src/mp/gen.cpp",
   "add": 39,
   "del": 41
  },
  {
   "path": "src/ipc/libmultiprocess/src/mp/proxy.cpp",
   "add": 94,
   "del": 35
  },
  {
   "path": "src/ipc/libmultiprocess/src/mp/util.cpp",
   "add": 216,
   "del": 31
  },
  {
   "path": "src/ipc/libmultiprocess/test/CMakeLists.txt",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/ipc/libmultiprocess/test/mp/test/common.h",
   "add": 27,
   "del": 0
  },
  {
   "path": "src/ipc/libmultiprocess/test/mp/test/connect_tests.cpp",
   "add": 212,
   "del": 0
  },
  {
   "path": "src/ipc/libmultiprocess/test/mp/test/foo-types.h",
   "add": 6,
   "del": 0
  },
  {
   "path": "src/ipc/libmultiprocess/test/mp/test/foo.capnp",
   "add": 12,
   "del": 0
  },
  {
   "path": "src/ipc/libmultiprocess/test/mp/test/foo.h",
   "add": 31,
   "del": 1
  },
  {
   "path": "src/ipc/libmultiprocess/test/mp/test/listen_tests.cpp",
   "add": 47,
   "del": 77
  },
  {
   "path": "src/ipc/libmultiprocess/test/mp/test/spawn_tests.cpp",
   "add": 28,
   "del": 5
  },
  {
   "path": "src/ipc/libmultiprocess/test/mp/test/test.cpp",
   "add": 190,
   "del": 6
  },
  {
   "path": "src/ipc/libmultiprocess/test/mp/test/unixlistener.h",
   "add": 84,
   "del": 0
  },
  {
   "path": "src/ipc/stub.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/net.h",
   "add": 3,
   "del": 0
  },
  {
   "path": "src/net_processing.h",
   "add": 3,
   "del": 0
  },
  {
   "path": "src/netbase.h",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/node/interfaces.cpp",
   "add": 10,
   "del": 4
  },
  {
   "path": "src/policy/fees/block_policy_estimator.h",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/qt/bitcoin.cpp",
   "add": 35,
   "del": 8
  },
  {
   "path": "src/qt/bitcoin.h",
   "add": 7,
   "del": 2
  },
  {
   "path": "src/qt/initexecutor.cpp",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/qt/initexecutor.h",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/qt/test/apptests.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/qt/test/apptests.h",
   "add": 5,
   "del": 1
  },
  {
   "path": "src/qt/walletcontroller.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/rpc/request.h",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/test/btcsignals_tests.cpp",
   "add": 46,
   "del": 0
  },
  {
   "path": "src/test/util/setup_common.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/util/btcsignals.h",
   "add": 69,
   "del": 9
  },
  {
   "path": "src/util/result.h",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/wallet/coincontrol.h",
   "add": 3,
   "del": 0
  },
  {
   "path": "src/wallet/init.cpp",
   "add": 8,
   "del": 0
  },
  {
   "path": "src/wallet/interfaces.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/wallet/types.h",
   "add": 5,
   "del": 0
  },
  {
   "path": "src/wallet/wallet.h",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/wallet/wallettool.cpp",
   "add": 5,
   "del": 6
  },
  {
   "path": "src/wallet/wallettool.h",
   "add": 5,
   "del": 1
  },
  {
   "path": "test/functional/combine_logs.py",
   "add": 12,
   "del": 0
  },
  {
   "path": "test/functional/feature_block.py",
   "add": 10,
   "del": 2
  },
  {
   "path": "test/functional/feature_config_args.py",
   "add": 1,
   "del": 0
  },
  {
   "path": "test/functional/feature_taproot.py",
   "add": 1,
   "del": 0
  },
  {
   "path": "test/functional/test_framework/test_node.py",
   "add": 31,
   "del": 8
  },
  {
   "path": "test/functional/wallet_createwallet.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/wallet_descriptor.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/wallet_encryption.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/wallet_fast_rescan.py",
   "add": 4,
   "del": 4
  },
  {
   "path": "test/functional/wallet_groups.py",
   "add": 3,
   "del": 3
  },
  {
   "path": "test/functional/wallet_importdescriptors.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/wallet_multiwallet.py",
   "add": 6,
   "del": 6
  },
  {
   "path": "test/functional/wallet_reorgsrestore.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/wallet_resendwallettransactions.py",
   "add": 4,
   "del": 4
  },
  {
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "add": 1,
   "del": 0
  },
  {
   "path": "test/lint/git-subtree-check.sh",
   "add": 2,
   "del": 1
  }
 ],
 "test_lines": 173,
 "git": {
  "head": "80bebc16242e10de0499b5adbf5edf58dad0bbb7",
  "head_matches_backup": true,
  "base": "33a363ea250839ca31ea043b7500789d2e5d844b",
  "commits": [
   {
    "sha": "ae6b583256",
    "subject": "Add capnp serialization code for bitcoin types",
    "files": 2,
    "add": 157,
    "del": 2
   },
   {
    "sha": "4466e5ce9b",
    "subject": "Add capnp wrapper for Handler interface",
    "files": 3,
    "add": 28,
    "del": 0
   },
   {
    "sha": "7b997424a9",
    "subject": "Add capnp wrapper for Chain interface",
    "files": 10,
    "add": 587,
    "del": 7
   },
   {
    "sha": "c2dfc0c57f",
    "subject": "multiprocess: Expose Chain interface",
    "files": 3,
    "add": 6,
    "del": 0
   },
   {
    "sha": "d9cfcf89bb",
    "subject": "build: suppress -Wc++23-lambda-attributes in warn_interface",
    "files": 1,
    "add": 14,
    "del": 0
   },
   {
    "sha": "bc86e9270e",
    "subject": "Merge branch 'pr/ipc-chain' into pr/ipc",
    "files": 14,
    "add": 778,
    "del": 9
   },
   {
    "sha": "c0ae4dfa00",
    "subject": "test: Increase feature_block.py and feature_taproot.py timeouts",
    "files": 3,
    "add": 12,
    "del": 2
   },
   {
    "sha": "f274686c60",
    "subject": "test: Fix multiprocess test for unclean shutdown on kill",
    "files": 1,
    "add": 15,
    "del": 0
   },
   {
    "sha": "32937a817c",
    "subject": "util: Add util::Result workaround to be compatible with libmultiprocess",
    "files": 2,
    "add": 6,
    "del": 1
   },
   {
    "sha": "12ae360d84",
    "subject": "test: characterize btcsignals callback destruction timing",
    "files": 1,
    "add": 59,
    "del": 0
   },
   {
    "sha": "d5c694aeb1",
    "subject": "btcsignals: destroy callbacks eagerly on disconnect",
    "files": 2,
    "add": 52,
    "del": 29
   },
   {
    "sha": "66821528e4",
    "subject": "btcsignals: fall back to atomic_load/store without __cpp_lib_atomic_shared_ptr",
    "files": 1,
    "add": 25,
    "del": 1
   },
   {
    "sha": "8fc97929d9",
    "subject": "multiprocess: Add capnp serialization code for bitcoin types",
    "files": 6,
    "add": 161,
    "del": 1
   },
   {
    "sha": "897a9c3b3e",
    "subject": "interfaces, refactor: Change WalletLoader::restoreWallet parameter order",
    "files": 3,
    "add": 4,
    "del": 4
   },
   {
    "sha": "d5bfd35ca8",
    "subject": "multiprocess: Add capnp wrapper for Wallet interface",
    "files": 13,
    "add": 763,
    "del": 1
   },
   {
    "sha": "99442afacb",
    "subject": "multiprocess: Add capnp wrapper for Node interface",
    "files": 9,
    "add": 356,
    "del": 24
   },
   {
    "sha": "8eb998f88f",
    "subject": "multiprocess: Make bitcoin-gui spawn a bitcoin-node process",
    "files": 10,
    "add": 102,
    "del": 22
   },
   {
    "sha": "48ca9f18b1",
    "subject": "multiprocess: Make bitcoin-node spawn a bitcoin-wallet process",
    "files": 9,
    "add": 173,
    "del": 12
   },
   {
    "sha": "8f40dedc6d",
    "subject": "multiprocess: Add debug.log .wallet/.gui suffixes",
    "files": 31,
    "add": 99,
    "del": 63
   },
   {
    "sha": "c941fc462b",
    "subject": "doc: Multiprocess misc doc and comment updates",
    "files": 2,
    "add": 7,
    "del": 1
   },
   {
    "sha": "13e14ac995",
    "subject": "combine_logs: Handle multiprocess wallet log files",
    "files": 1,
    "add": 4,
    "del": 0
   },
   {
    "sha": "d00ce388b3",
    "subject": "Merge branch 'pr/ipc' into pr/ipc-connect",
    "files": 80,
    "add": 2579,
    "del": 119
   },
   {
    "sha": "4c842beaae",
    "subject": "Squashed 'src/ipc/libmultiprocess/' changes from e8de5c7b68e..4d454a81da6",
    "files": 56,
    "add": 1398,
    "del": 420
   },
   {
    "sha": "d8bb996bdf",
    "subject": "multiprocess: Add bitcoin-wallet -ipcconnect option",
    "files": 5,
    "add": 31,
    "del": 10
   },
   {
    "sha": "567c2e020f",
    "subject": "Merge commit '4c842beaae2e97d7934800c8433da9632b21c0ff' into pr/subtree-14",
    "files": 56,
    "add": 1398,
    "del": 420
   },
   {
    "sha": "344c0fea96",
    "subject": "Merge branch 'pr/ipc-connect' into pr/ipc-gui",
    "files": 83,
    "add": 2610,
    "del": 129
   },
   {
    "sha": "80bebc1624",
    "subject": "multiprocess: Add bitcoin-gui -ipcconnect option",
    "files": 9,
    "add": 41,
    "del": 20
   }
  ],
  "patch_truncated": true
 },
 "input_hash": "8cca072fa87ce468",
 "extracted_at": "2026-09-17T16:15:31+00:00"
}