{
 "number": 36097,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/36097",
 "title": "mining: replace interrupt methods with cancellation arguments",
 "author": "xyzconstant",
 "author_association": "CONTRIBUTOR",
 "created_at": "2026-08-27T05:32:30Z",
 "updated_at": "2026-09-16T12:40:24Z",
 "age_days": 21,
 "draft": true,
 "labels": [
  "Mining",
  "CI failed"
 ],
 "milestone": null,
 "base": "master",
 "head_sha": "1c02f2abea5f3d72fa4887ec8f76e85f51276bbb",
 "head_ref": "ipc-cancellation-support",
 "head_repo": "xyzconstant/bitcoin",
 "head_history": [
  {
   "t": "2026-09-11T20:34:54Z",
   "sha": "1c02f2abea5f3d72fa4887ec8f76e85f51276bbb"
  }
 ],
 "additions": 2175,
 "deletions": 615,
 "changed_files": 70,
 "commit_count": 2,
 "size_bucket": "XL",
 "mergeable_state": "unstable",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {},
   "conflicts": [
    {
     "number": 36257,
     "title": "qa: assert_equals -> assert_true/assert_false",
     "author": "hodlinator"
    },
    {
     "number": 36167,
     "title": "[RFC] Enable `-Wunused`",
     "author": "fanquake"
    },
    {
     "number": 35932,
     "title": "ipc: make ipc::disconnectIncoming wait for in-progress calls to complete",
     "author": "ryanofsky"
    },
    {
     "number": 35675,
     "title": "mining: add block template manager",
     "author": "ismaelsadeeq"
    },
    {
     "number": 35671,
     "title": "mining: add TxCollection to bandwidth-efficiently validate external block templates",
     "author": "Sjors"
    },
    {
     "number": 35581,
     "title": "node: add block template manager and track waitNext fee inflow",
     "author": "ismaelsadeeq"
    },
    {
     "number": 35511,
     "title": "RFC: consensus: Make `CAmount` a class",
     "author": "hodlinator"
    },
    {
     "number": 35037,
     "title": "ipc: support per-address max-connections options on -ipcbind",
     "author": "enirox001"
    },
    {
     "number": 33922,
     "title": "mining: add getMemoryLoad() and track template non-mempool memory footprint",
     "author": "Sjors"
    },
    {
     "number": 32387,
     "title": "ipc: add windows support",
     "author": "ryanofsky"
    },
    {
     "number": 31117,
     "title": "miner: Reorg Testnet4 minimum difficulty blocks",
     "author": "fjahr"
    },
    {
     "number": 29409,
     "title": "multiprocess: Add capnp wrapper for Chain interface",
     "author": "ryanofsky"
    },
    {
     "number": 19461,
     "title": "multiprocess: Add bitcoin-gui -ipcconnect option",
     "author": "ryanofsky"
    },
    {
     "number": 19460,
     "title": "multiprocess: Add bitcoin-wallet -ipcconnect option",
     "author": "ryanofsky"
    },
    {
     "number": 10102,
     "title": "Multiprocess bitcoin",
     "author": "ryanofsky"
    }
   ]
  }
 },
 "acks_parsed": {},
 "acks_tally": {
  "ack": 0,
  "stale_ack": 0,
  "concept_ack": 0,
  "approach_ack": 0,
  "nack": 0,
  "concept_nack": 0,
  "approach_nack": 0
 },
 "reviews": {
  "approved": 0,
  "changes_requested": 0,
  "distinct_reviewers": [
   "ryanofsky"
  ]
 },
 "signals": {
  "needs_rebase": false,
  "ci_failed": true,
  "mergeable_state": "unstable",
  "last_author_activity": "2026-09-11T20:39:52Z",
  "last_reviewer_activity": "2026-08-27T20:58:38Z",
  "last_reviewer": "ryanofsky",
  "author_silent_days": 5,
  "waiting_on_author_days": 0,
  "days_since_update": 1
 },
 "refs": {
  "mentioned": [
   33575,
   33676,
   34184
  ],
  "depends_on": [],
  "fixes": [],
  "linked_issues": [],
  "references": [
   {
    "number": 33676,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2025-11-10",
    "title": "interfaces: enable cancelling running `waitNext` calls"
   },
   {
    "number": 34184,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-02-24",
    "title": "mining: add cooldown to createNewBlock() immediately after IBD"
   },
   {
    "number": 33575,
    "type": "issue",
    "state": "closed",
    "merged": false,
    "merged_at": null,
    "title": "RFC: Cancelling waitNext calls in the IPC mining interface"
   }
  ],
  "conflicts": [
   36257,
   36167,
   35932,
   35675,
   35671,
   35581,
   35511,
   35037,
   33922,
   32387,
   31117,
   29409,
   19461,
   19460,
   10102
  ]
 },
 "stack": {
  "shares_commits_with": [],
  "based_on": [],
  "base_for": []
 },
 "review_paths": [],
 "body": "**Depends on bitcoin-core/libmultiprocess#342. Only the last commit belongs to this PR.**\n\n---\n\nThe blocking methods (`waitTipChanged`, `createNewBlock`, and `BlockTemplate::waitNext`) currently rely on `interrupt()`/`interruptWait()` to cancel them when they are in progress (#33676, #34184). With request cancellation support in libmultiprocess (bitcoin-core/libmultiprocess#342), this is no longer needed.\n\nThis PR adds `CancelArg` arguments to those blocking methods to register a callback that runs on cancellation and deprecates the interrupt methods. Registering returns a `CancelGuard` that unregisters the callback when destroyed, so the event loop can't run it after the wrapped method goes out of scope.\n\nIn the capnp schema, use the `Proxy.extraParam` annotation for the C++ `CancelArg` parameter and the `Cxx.allowCancellation` annotation to enable request cancellation at the RPC layer.\n\nThe `CustomBuildExtraParam`/`CustomReadExtraParam` overloads for `CancelArg` live in `ipc/capnp/common-types.h`, following the reference implementation in the libmultiprocess PR. The client side wraps the request in a `kj::Canceler` and throws `InterruptException` when canceled, while the server side registers the method's callback with the request's server context, where the event loop runs it on cancellation.\n\nIn tests, update miner_tests to cancel `waitNext()` from another thread, and interface_ipc_mining.py to drop the response promise. Also add `drop_promise()` to ipc_util.py to abandon capnp promises, and a cancelable `waitCancel` method to the ipc_tests `FooInterface` to exercise both the client and server hooks.\n\nAdditional note: this is the Bitcoin Core side of approach 4 in #33575.",
 "commits": [
  {
   "sha": "f021228a991a9b8083a83bd9f6862d4a0b79ea04",
   "date": "2026-09-11T20:24:38Z",
   "message": "Update libmultiprocess subtree (TEMPORARY, bitcoin-core/libmultiprocess#342)"
  },
  {
   "sha": "1c02f2abea5f3d72fa4887ec8f76e85f51276bbb",
   "date": "2026-09-11T20:24:38Z",
   "message": "mining: replace interruptX methods with cancellation arguments\n\nAdd an optional `CancelArg` parameter to the blocking Mining methods\n`waitTipChanged`, `createNewBlock` and `waitNext`, and deprecate `interrupt()`\nand `interruptWait()`. The methods pass a CancelFn to the argument, which\nregisters it to run if the call is canceled.\n\nIn capnp schema, use the `Proxy.extraParam` annotation for the C++ `CancelArg`\nparameter and the `Cxx.allowCancellation` annotation to enable request\ncancels at the RPC layer.\n\nUpdate miner_tests to cancel `waitNext()` from another thread, and\ninterface_ipc_mining.py to drop the response promise and check the node\nlogs the cancellation. Also add `drop_promise()` to ipc_util.py to\nabandon capnp promises."
  }
 ],
 "timeline": [
  {
   "t": "2026-08-27T20:58:38Z",
   "kind": "comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "text": "Wow, this is very cool. The PR contains a lot of boilerplate updates but the heart of the change (5cdb565ee565b9cd61b3286a3945d7244d0f744c) is simply:\n\n```diff\n--- a/src/node/interfaces.cpp\n+++ b/src/node/interfaces.cpp\n@@ -926,8 +926,9 @@ public:\n         return SubmitBlock(chainman(), std::make_shared<const CBlock>(m_block_template->block), reason, debug);\n     }\n\n-    std::unique_ptr<BlockTemplate> waitNext(BlockWaitOptions options) override\n+    std::unique_ptr<BlockTemplate> waitNext(BlockWaitOptions options, interfaces::CancelArg cancel) override\n     {\n+        if (cancel) cancel([this] { InterruptWait(notifications(), m_interrupt_wait); });\n         auto new_template = WaitAndCreateNewBlock(chainman(),\n                                                   notifications(),\n                                                   m_node.mempool.get(),\n@@ -939,11 +940,6 @@ public:\n         return nullptr;\n     }\n\n-    void interruptWait() override\n-    {\n-        InterruptWait(notifications(), m_interrupt_wait);\n-    }\n-\n     const BlockCreateOptions m_create_options;\n\n     const std::unique_ptr<CBlockTemplate> m_block_template;\n```\n\nDropping the `interruptWait` method, replacing it with a `CancelArg` argument, and calling the argument with a lambda containing the code that used to be in `interruptWait` method.\n\nWith that change rust, python, and c++ clients can now cancel blocking requests more simply and efficiently using cap'n protos native cancellation mechanism, instead of needing to make new IPC calls to cancel previous ones.\n\nThere's an nontrivial amount of code to review here, but this is a very nice end-to-end implementation and demonstration that supporting this cancellation mechanism is worthwhile and makes things simpler for clients and servers. It could also become more important in the future if we want to have blocking calls that are individually cancellable instead of the current situation where interrupt methods can cancel multiple calls."
  },
  {
   "t": "2026-09-11T20:34:54Z",
   "kind": "force_push",
   "who": "xyzconstant",
   "commit": "1c02f2abea5f3d72fa4887ec8f76e85f51276bbb"
  },
  {
   "t": "2026-09-11T20:39:52Z",
   "kind": "comment",
   "who": "xyzconstant",
   "assoc": "CONTRIBUTOR",
   "text": "Updated to match the latest changes in the [upstream PR](https://github.com/bitcoin-core/libmultiprocess/pull/342).\n\n5cdb565ee565b9cd61b3286a3945d7244d0f744c -> 1c02f2abea5f3d72fa4887ec8f76e85f51276bbb ([compare](https://github.com/bitcoin/bitcoin/compare/5cdb565ee565b9cd61b3286a3945d7244d0f744c..1c02f2abea5f3d72fa4887ec8f76e85f51276bbb))\n\nNotable changes:\n\n- libmultiprocess no longer ships mp/type-cancel.h, so the `CustomBuildExtraParam`/`CustomReadExtraParam` overloads for `CancelArg` now live in `ipc/capnp/common-types.h`, and `CancelFn`/`CancelArg` moved to `interfaces/types.h`.\n- `CancelArg` now returns a `CancelGuard` that unregisters the callback when destroyed, so the event loop can't run it after the wrapped method goes out of scope.\n- Added a cancelable `waitCancel` method to the ipc_tests `FooInterface` to exercise both the client and server hooks."
  }
 ],
 "labels_log": [
  {
   "t": "2026-08-27T05:32:34Z",
   "action": "labeled",
   "label": "Mining",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-27T06:45:32Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  }
 ],
 "state_log": [
  {
   "t": "2026-08-27T05:34:51Z",
   "kind": "convert_to_draft",
   "who": "xyzconstant"
  }
 ],
 "text_chars": 5440,
 "text_tokens_estimate": 1360,
 "changed_paths": [
  "src/interfaces/mining.h",
  "src/interfaces/types.h",
  "src/ipc/capnp/common-types.h",
  "src/ipc/capnp/mining.capnp",
  "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/ci/scripts/config.sh",
  "src/ipc/libmultiprocess/ci/scripts/run.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.capnp",
  "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/test/ipc_test.capnp",
  "src/ipc/test/ipc_test.h",
  "src/ipc/test/ipc_tests.cpp",
  "src/node/interfaces.cpp",
  "src/test/miner_tests.cpp",
  "test/functional/interface_ipc_mining.py",
  "test/functional/test_framework/ipc_util.py"
 ],
 "files": [
  {
   "path": "src/interfaces/mining.h",
   "add": 18,
   "del": 14
  },
  {
   "path": "src/interfaces/types.h",
   "add": 51,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/common-types.h",
   "add": 94,
   "del": 0
  },
  {
   "path": "src/ipc/capnp/mining.capnp",
   "add": 11,
   "del": 5
  },
  {
   "path": "src/ipc/libmultiprocess/.clang-tidy",
   "add": 12,
   "del": 2
  },
  {
   "path": "src/ipc/libmultiprocess/.github/workflows/bitcoin-core-ci.yml",
   "add": 8,
   "del": 5
  },
  {
   "path": "src/ipc/libmultiprocess/.github/workflows/ci.yml",
   "add": 19,
   "del": 14
  },
  {
   "path": "src/ipc/libmultiprocess/CMakeLists.txt",
   "add": 16,
   "del": 62
  },
  {
   "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": 34,
   "del": 1
  },
  {
   "path": "src/ipc/libmultiprocess/ci/scripts/config.sh",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/ipc/libmultiprocess/ci/scripts/run.sh",
   "add": 6,
   "del": 4
  },
  {
   "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": 102,
   "del": 44
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/proxy-types.h",
   "add": 132,
   "del": 29
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/proxy.capnp",
   "add": 6,
   "del": 0
  },
  {
   "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": 27,
   "del": 13
  },
  {
   "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": 67,
   "del": 21
  },
  {
   "path": "src/ipc/libmultiprocess/include/mp/version.h",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/ipc/libmultiprocess/shell.nix",
   "add": 13,
   "del": 6
  },
  {
   "path": "src/ipc/libmultiprocess/src/mp/gen.cpp",
   "add": 94,
   "del": 44
  },
  {
   "path": "src/ipc/libmultiprocess/src/mp/proxy.cpp",
   "add": 106,
   "del": 47
  },
  {
   "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": 98,
   "del": 0
  },
  {
   "path": "src/ipc/libmultiprocess/test/mp/test/foo.capnp",
   "add": 14,
   "del": 0
  },
  {
   "path": "src/ipc/libmultiprocess/test/mp/test/foo.h",
   "add": 69,
   "del": 1
  },
  {
   "path": "src/ipc/libmultiprocess/test/mp/test/listen_tests.cpp",
   "add": 48,
   "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": 299,
   "del": 7
  },
  {
   "path": "src/ipc/libmultiprocess/test/mp/test/unixlistener.h",
   "add": 84,
   "del": 0
  },
  {
   "path": "src/ipc/test/ipc_test.capnp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/ipc/test/ipc_test.h",
   "add": 17,
   "del": 0
  },
  {
   "path": "src/ipc/test/ipc_tests.cpp",
   "add": 18,
   "del": 0
  },
  {
   "path": "src/node/interfaces.cpp",
   "add": 20,
   "del": 15
  },
  {
   "path": "src/test/miner_tests.cpp",
   "add": 18,
   "del": 0
  },
  {
   "path": "test/functional/interface_ipc_mining.py",
   "add": 19,
   "del": 22
  },
  {
   "path": "test/functional/test_framework/ipc_util.py",
   "add": 6,
   "del": 0
  }
 ],
 "test_lines": 65,
 "git": {
  "head": "1c02f2abea5f3d72fa4887ec8f76e85f51276bbb",
  "head_matches_backup": true,
  "base": "a24110cef7fa36138620f1876cd0722944618d07",
  "commits": [
   {
    "sha": "f021228a99",
    "subject": "Update libmultiprocess subtree (TEMPORARY, bitcoin-core/libmultiprocess#342)",
    "files": 59,
    "add": 1902,
    "del": 559
   },
   {
    "sha": "1c02f2abea",
    "subject": "mining: replace interruptX methods with cancellation arguments",
    "files": 11,
    "add": 273,
    "del": 56
   }
  ],
  "patch_truncated": true
 },
 "input_hash": "76191f9896c36413",
 "extracted_at": "2026-09-17T16:15:31+00:00"
}