{
 "number": 36074,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/36074",
 "title": "scripted-diff: [test] Add util/check.h includes for assertions",
 "author": "maflcko",
 "author_association": "MEMBER",
 "created_at": "2026-08-25T09:30:14Z",
 "updated_at": "2026-09-05T13:21:08Z",
 "age_days": 23,
 "draft": true,
 "labels": [
  "Refactoring",
  "Needs rebase"
 ],
 "milestone": null,
 "base": "master",
 "head_sha": "bd900dc6bbf2204c78c19e6293d4321da8dfe71a",
 "head_ref": "2608-test-assert",
 "head_repo": "maflcko/bitcoin-core",
 "head_history": [
  {
   "t": "2026-08-26T11:28:38Z",
   "sha": "3440553098a5c69fefe81d7b6ad70b8add3acc02"
  },
  {
   "t": "2026-08-29T14:40:42Z",
   "sha": "faddb90c7957b623d08d45493a827154d2ef9367"
  },
  {
   "t": "2026-08-31T14:33:25Z",
   "sha": "203cd079ea222e98a5d1fe6a1b9250b03ba3dc90"
  },
  {
   "t": "2026-09-01T06:48:25Z",
   "sha": "4708bd9251ccf05cbcdd1b9c8b14d0771bee20ff"
  },
  {
   "t": "2026-09-01T06:54:28Z",
   "sha": "bd900dc6bbf2204c78c19e6293d4321da8dfe71a"
  }
 ],
 "additions": 341,
 "deletions": 225,
 "changed_files": 155,
 "commit_count": 3,
 "size_bucket": "L",
 "mergeable_state": "dirty",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {},
   "conflicts": [
    {
     "number": 36159,
     "title": "http: Improve HTTPRemoteClient::MaybeDisconnect()",
     "author": "hodlinator"
    },
    {
     "number": 36135,
     "title": "fuzz: test HTTPRequest state machine in http_request",
     "author": "frankomosh"
    },
    {
     "number": 36130,
     "title": "test: add tests in transaction_tests.cpp covering live mutants",
     "author": "ViniciusCestarii"
    },
    {
     "number": 36091,
     "title": "test: Add debug output to common tested types",
     "author": "rustaceanrob"
    },
    {
     "number": 36070,
     "title": "wallet: Add deriveHDKey interface",
     "author": "PraneethGunas"
    },
    {
     "number": 36068,
     "title": "fuzz: reuse one fuzzed wallet across inputs",
     "author": "brunoerg"
    },
    {
     "number": 35998,
     "title": "wallet: Handle or explicitly ignore `WalletBatch` write failures",
     "author": "achow101"
    },
    {
     "number": 35916,
     "title": "fuzz: improve ipc fuzz coverage",
     "author": "enirox001"
    },
    {
     "number": 35887,
     "title": "ipc: use std::optional for checkSpawned(), add tests and rename arg -ipcfd to -ipcchild",
     "author": "ViniciusCestarii"
    },
    {
     "number": 35752,
     "title": "wallet: make encryption state updates atomic",
     "author": "l0rinc"
    },
    {
     "number": 35731,
     "title": "Indexes: Harden the flush-error notification invariant",
     "author": "arejula27"
    },
    {
     "number": 35714,
     "title": "validation: stop writes after flush failure",
     "author": "l0rinc"
    },
    {
     "number": 35713,
     "title": "Remove boost as a unit test runner",
     "author": "rustaceanrob"
    },
    {
     "number": 35646,
     "title": "RFC: Separate out runtime errors from BlockValidationState using `util::Expected`",
     "author": "yuvicc"
    },
    {
     "number": 35511,
     "title": "RFC: consensus: Make `CAmount` a class",
     "author": "hodlinator"
    },
    {
     "number": 35377,
     "title": "wallet: Allow importing of descriptors without private keys when the wallet has the private keys",
     "author": "achow101"
    },
    {
     "number": 35003,
     "title": "validation: improve block data I/O error handling in P2P paths",
     "author": "furszy"
    },
    {
     "number": 34861,
     "title": "wallet: Add importdescriptors interface",
     "author": "polespinasa"
    },
    {
     "number": 34778,
     "title": "logging: rewrite macros to enforce restrictions at compile-time, improve efficiency and usability",
     "author": "ryanofsky"
    },
    {
     "number": 34681,
     "title": "wallet: move rescan logic into ChainScanner and wallet/scan",
     "author": "Eunovo"
    },
    {
     "number": 32387,
     "title": "ipc: add windows support",
     "author": "ryanofsky"
    },
    {
     "number": 30342,
     "title": "kernel, logging: Pass Logger instances to kernel objects",
     "author": "ryanofsky"
    },
    {
     "number": 29278,
     "title": "Wallet:  Add `maxfeerate` wallet startup option",
     "author": "ismaelsadeeq"
    },
    {
     "number": 29256,
     "title": "log, refactor: Allow log macros to accept context arguments",
     "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": [
   "jeanpablojp",
   "l0rinc"
  ]
 },
 "signals": {
  "needs_rebase": true,
  "ci_failed": false,
  "mergeable_state": "dirty",
  "last_author_activity": "2026-09-01T06:55:27Z",
  "last_reviewer_activity": "2026-08-29T17:02:09Z",
  "last_reviewer": "jeanpablojp",
  "author_silent_days": 16,
  "waiting_on_author_days": 0,
  "days_since_update": 12
 },
 "refs": {
  "mentioned": [],
  "depends_on": [],
  "fixes": [],
  "linked_issues": [],
  "references": [],
  "conflicts": [
   36159,
   36135,
   36130,
   36091,
   36070,
   36068,
   35998,
   35916,
   35887,
   35752,
   35731,
   35714,
   35713,
   35646,
   35511,
   35377,
   35003,
   34861,
   34778,
   34681,
   32387,
   30342,
   29278,
   29256
  ]
 },
 "stack": {
  "shares_commits_with": [],
  "based_on": [],
  "base_for": []
 },
 "review_paths": [
  "src/test/fuzz/mini_miner.cpp",
  "test/lint/test_runner/src/lint_cpp.rs"
 ],
 "body": "In test code, `assert` is used. This is perfectly fine, but sometimes confusion arises, when it is unclear whether `NDEBUG` can disable the assertions, or whether to use `assert` or `Assert`.\n\nAvoid that confusion in test code with a scripted replacement to add the util/check.h include. The changes here will also make it easier to run IWYU.\n\nScope: This change is only about test code (bench, fuzz, unit), other code can be done later, if there is need to.",
 "commits": [
  {
   "sha": "33afe004af608c68922a14e7f7286385535703d5",
   "date": "2026-09-01T06:52:44Z",
   "message": "scripted-diff: [test] Add util/check.h includes for assertions\n\nThe project has a compile error when compiled without assertions in\nutil/check.h. Thus, util/check.h should be included for all assertions.\n\nSo do that with a scripted-diff for Assert and assert, and remove the\ncassert include, which is exported from util/check.h.\n\n-BEGIN VERIFY SCRIPT-\n\n # Select all test .cpp and .h files\n paths=(\n   'src/bench/'\n   'src/ipc/test/'\n   'src/qt/test/'\n   'src/test/'\n   'src/wallet/test/'\n   ':(exclude)src/bench/nanobench.h'\n )\n\n # Add the util/check.h includes\n for f in $(git grep -l --extended-regexp \"\\<(a|A)ssert\\(\" -- \"${paths[@]}\"); do\n   if ! grep --quiet \"util/check.h\" \"$f\"; then\n     line=$(grep --line-number --max-count=1 '^#include' \"$f\" | cut --delimiter=: --fields=1)\n     sed --in-place \"${line}i#include <util/check.h>\" \"$f\"\n   fi\n done\n\n # Remove cassert includes\n for f in $(git grep -l '<cassert>' -- \"${paths[@]}\"); do\n   sed --in-place '/^#include <cassert>$/d' \"$f\"\n done\n\n-END VERIFY SCRIPT-"
  },
  {
   "sha": "4edc1a3e86e33db47ebe8f039bcadc0dd7069d61",
   "date": "2026-09-01T06:52:53Z",
   "message": "lint: Allow clang-format to be used in scripted-diff\n\nAlso, remove the unused pushd/popd. No command in this file requires a\nspecial PWD."
  },
  {
   "sha": "bd900dc6bbf2204c78c19e6293d4321da8dfe71a",
   "date": "2026-09-01T06:53:57Z",
   "message": "scripted-diff: [test] Sort includes\n\n-BEGIN VERIFY SCRIPT-\ngit show -U0 HEAD~1 | ./contrib/devtools/clang-format-diff.py -p1 -i -v\n-END VERIFY SCRIPT-"
  }
 ],
 "timeline": [
  {
   "t": "2026-08-25T12:15:58Z",
   "kind": "comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "text": "Hmm, I guess `Assert(0/false)` being a function trips GCC into thinking it can return? Though, the optimized codegen is unaffected on GCC. Funnily clang doesn't warn, but pessimises codegen: https://godbolt.org/z/h79K1scWK\n\nI guess that means we could add an explicit `#define AssertUnreachable() assertion_fail(std::source_location::current(), \"Unreachable code\")`"
  },
  {
   "t": "2026-08-26T11:28:38Z",
   "kind": "force_push",
   "who": "maflcko",
   "commit": "3440553098a5c69fefe81d7b6ad70b8add3acc02"
  },
  {
   "t": "2026-08-26T19:36:02Z",
   "kind": "review_comment",
   "who": "jeanpablojp",
   "assoc": "CONTRIBUTOR",
   "path": "src/test/fuzz/mini_miner.cpp",
   "commit": "3440553098a5c69fefe81d7b6ad70b8add3acc02",
   "in_reply_to": null,
   "text": "This one doesn't match `\\<assert\\(` because of the space, and it's the only one left in the swept paths. `lint_c_assert` uses the same regex, so it doesn't catch it either. I added `assert (1);` to a covered file and the linter still passes. How about `\\<assert\\s*\\(`?"
  },
  {
   "t": "2026-08-26T19:36:02Z",
   "kind": "review_comment",
   "who": "jeanpablojp",
   "assoc": "CONTRIBUTOR",
   "path": "test/lint/test_runner/src/lint_cpp.rs",
   "commit": "3440553098a5c69fefe81d7b6ad70b8add3acc02",
   "in_reply_to": null,
   "text": "`src/ipc/test/` is left out here, and `src/ipc/test/fuzz/ipc.cpp` has six `assert(`. `lint-tests.py` already counts that directory as part of the test suite. Is this intentional?"
  },
  {
   "t": "2026-08-29T14:40:42Z",
   "kind": "force_push",
   "who": "maflcko",
   "commit": "faddb90c7957b623d08d45493a827154d2ef9367"
  },
  {
   "t": "2026-08-29T14:47:52Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/test/fuzz/mini_miner.cpp",
   "commit": "3440553098a5c69fefe81d7b6ad70b8add3acc02",
   "in_reply_to": 3866101294,
   "text": "Thx, but I've dropped the third and forth commit for now, because:\n\n* It trips GCC (https://github.com/bitcoin/bitcoin/pull/36074#issuecomment-5410234301)\n* There seems to be many code conflicts, so this likely won't make it to merge"
  },
  {
   "t": "2026-08-29T15:06:40Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/test/fuzz/mini_miner.cpp",
   "commit": "3440553098a5c69fefe81d7b6ad70b8add3acc02",
   "in_reply_to": 3866101294,
   "text": "This is why I only migrated the problematic usages with side effects - but I'm glad you're taking a stab at it systemically, even if just for tests for now"
  },
  {
   "t": "2026-08-29T17:02:09Z",
   "kind": "review_comment",
   "who": "jeanpablojp",
   "assoc": "CONTRIBUTOR",
   "path": "test/lint/test_runner/src/lint_cpp.rs",
   "commit": "3440553098a5c69fefe81d7b6ad70b8add3acc02",
   "in_reply_to": 3866101304,
   "text": "The comma in `'src/ipc/test/',` ends up inside the element, so it still matches nothing."
  },
  {
   "t": "2026-08-31T14:33:25Z",
   "kind": "force_push",
   "who": "maflcko",
   "commit": "203cd079ea222e98a5d1fe6a1b9250b03ba3dc90"
  },
  {
   "t": "2026-09-01T06:48:25Z",
   "kind": "force_push",
   "who": "maflcko",
   "commit": "4708bd9251ccf05cbcdd1b9c8b14d0771bee20ff"
  },
  {
   "t": "2026-09-01T06:54:28Z",
   "kind": "force_push",
   "who": "maflcko",
   "commit": "bd900dc6bbf2204c78c19e6293d4321da8dfe71a"
  },
  {
   "t": "2026-09-01T06:55:27Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "test/lint/test_runner/src/lint_cpp.rs",
   "commit": "3440553098a5c69fefe81d7b6ad70b8add3acc02",
   "in_reply_to": 3866101304,
   "text": "[quoted text omitted]\n\nWhoops, fixed. Thx"
  }
 ],
 "labels_log": [
  {
   "t": "2026-08-25T09:30:19Z",
   "action": "labeled",
   "label": "Refactoring",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-25T10:52:19Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-26T11:16:58Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-26T13:27:15Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-29T16:14:07Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-31T16:51:04Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-09-01T06:54:59Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-09-01T07:47:46Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-09-01T08:34:38Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-09-05T13:21:07Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  }
 ],
 "state_log": [
  {
   "t": "2026-08-25T09:30:18Z",
   "kind": "renamed",
   "who": "DrahtBot",
   "from": " scripted-diff: [test] replace assert with Assert ",
   "to": "scripted-diff: [test] replace assert with Assert"
  },
  {
   "t": "2026-08-25T12:08:22Z",
   "kind": "convert_to_draft",
   "who": "maflcko"
  },
  {
   "t": "2026-08-29T14:38:54Z",
   "kind": "renamed",
   "who": "maflcko",
   "from": "scripted-diff: [test] replace assert with Assert",
   "to": "scripted-diff: [test] Add util/check.h includes for assertions "
  },
  {
   "t": "2026-08-29T14:38:58Z",
   "kind": "renamed",
   "who": "DrahtBot",
   "from": "scripted-diff: [test] Add util/check.h includes for assertions ",
   "to": "scripted-diff: [test] Add util/check.h includes for assertions"
  }
 ],
 "text_chars": 3167,
 "text_tokens_estimate": 791,
 "changed_paths": [
  "ci/lint/01_install.sh",
  "src/ipc/test/fuzz/ipc.cpp",
  "src/ipc/test/ipc_tests.cpp",
  "src/qt/test/addressbooktests.cpp",
  "src/qt/test/apptests.cpp",
  "src/qt/test/wallettests.cpp",
  "src/test/blockchain_tests.cpp",
  "src/test/blockencodings_tests.cpp",
  "src/test/blockfilter_tests.cpp",
  "src/test/blockmanager_tests.cpp",
  "src/test/btcsignals_tests.cpp",
  "src/test/chainstate_write_tests.cpp",
  "src/test/checkqueue_tests.cpp",
  "src/test/compress_tests.cpp",
  "src/test/crypto_tests.cpp",
  "src/test/cuckoocache_tests.cpp",
  "src/test/flatfile_tests.cpp",
  "src/test/fuzz/addition_overflow.cpp",
  "src/test/fuzz/addrman.cpp",
  "src/test/fuzz/asmap.cpp",
  "src/test/fuzz/asmap_direct.cpp",
  "src/test/fuzz/banman.cpp",
  "src/test/fuzz/base_encode_decode.cpp",
  "src/test/fuzz/bech32.cpp",
  "src/test/fuzz/bip324.cpp",
  "src/test/fuzz/bitdeque.cpp",
  "src/test/fuzz/bitset.cpp",
  "src/test/fuzz/block.cpp",
  "src/test/fuzz/block_header.cpp",
  "src/test/fuzz/block_index.cpp",
  "src/test/fuzz/block_index_tree.cpp",
  "src/test/fuzz/bloom_filter.cpp",
  "src/test/fuzz/cluster_linearize.cpp",
  "src/test/fuzz/coins_view.cpp",
  "src/test/fuzz/coinscache_sim.cpp",
  "src/test/fuzz/connect_block.cpp",
  "src/test/fuzz/connman.cpp",
  "src/test/fuzz/crypto_aes256.cpp",
  "src/test/fuzz/crypto_aes256cbc.cpp",
  "src/test/fuzz/crypto_chacha20.cpp",
  "src/test/fuzz/crypto_chacha20poly1305.cpp",
  "src/test/fuzz/crypto_common.cpp",
  "src/test/fuzz/crypto_diff_fuzz_chacha20.cpp",
  "src/test/fuzz/crypto_poly1305.cpp",
  "src/test/fuzz/cuckoocache.cpp",
  "src/test/fuzz/dbwrapper.cpp",
  "src/test/fuzz/decode_tx.cpp",
  "src/test/fuzz/descriptor_parse.cpp",
  "src/test/fuzz/deserialize.cpp",
  "src/test/fuzz/difference_formatter.cpp",
  "src/test/fuzz/fee_rate.cpp",
  "src/test/fuzz/feefrac.cpp",
  "src/test/fuzz/feeratediagram.cpp",
  "src/test/fuzz/fees.cpp",
  "src/test/fuzz/flatfile.cpp",
  "src/test/fuzz/float.cpp",
  "src/test/fuzz/golomb_rice.cpp",
  "src/test/fuzz/headerssync.cpp",
  "src/test/fuzz/hex.cpp",
  "src/test/fuzz/http_request.cpp",
  "src/test/fuzz/integer.cpp",
  "src/test/fuzz/key.cpp",
  "src/test/fuzz/key_io.cpp",
  "src/test/fuzz/kitchen_sink.cpp",
  "src/test/fuzz/locale.cpp",
  "src/test/fuzz/merkle.cpp",
  "src/test/fuzz/message.cpp",
  "src/test/fuzz/miniscript.cpp",
  "src/test/fuzz/muhash.cpp",
  "src/test/fuzz/multiplication_overflow.cpp",
  "src/test/fuzz/net.cpp",
  "src/test/fuzz/net_permissions.cpp",
  "src/test/fuzz/netaddress.cpp",
  "src/test/fuzz/netbase_dns_lookup.cpp",
  "src/test/fuzz/node_eviction.cpp",
  "src/test/fuzz/p2p_headers_presync.cpp",
  "src/test/fuzz/p2p_private_broadcast.cpp",
  "src/test/fuzz/p2p_transport_serialization.cpp",
  "src/test/fuzz/parse_hd_keypath.cpp",
  "src/test/fuzz/parse_iso8601.cpp",
  "src/test/fuzz/parse_numbers.cpp",
  "src/test/fuzz/poolresource.cpp",
  "src/test/fuzz/prevector.cpp",
  "src/test/fuzz/primitives_transaction.cpp",
  "src/test/fuzz/private_broadcast.cpp",
  "src/test/fuzz/rolling_bloom_filter.cpp",
  "src/test/fuzz/rpc.cpp",
  "src/test/fuzz/script.cpp",
  "src/test/fuzz/script_descriptor_cache.cpp",
  "src/test/fuzz/script_flags.cpp",
  "src/test/fuzz/script_sign.cpp",
  "src/test/fuzz/scriptnum_ops.cpp",
  "src/test/fuzz/secp256k1_ec_seckey_import_export_der.cpp",
  "src/test/fuzz/span.cpp",
  "src/test/fuzz/string.cpp",
  "src/test/fuzz/threadpool.cpp",
  "src/test/fuzz/transaction.cpp",
  "src/test/fuzz/tx_in.cpp",
  "src/test/fuzz/tx_out.cpp",
  "src/test/fuzz/txdownloadman.cpp",
  "src/test/fuzz/txgraph.cpp",
  "src/test/fuzz/txrequest.cpp",
  "src/test/fuzz/util.h",
  "src/test/fuzz/util/mempool.cpp",
  "src/test/fuzz/util/net.cpp",
  "src/test/fuzz/util/wallet.h",
  "src/test/fuzz/vecdeque.cpp",
  "src/test/fuzz/versionbits.cpp",
  "src/test/headers_sync_chainwork_tests.cpp",
  "src/test/httpserver_tests.cpp",
  "src/test/interfaces_tests.cpp",
  "src/test/key_io_tests.cpp",
  "src/test/logging_tests.cpp",
  "src/test/mempool_fee_estimator_tests.cpp",
  "src/test/mempool_tests.cpp",
  "src/test/miniminer_tests.cpp",
  "src/test/miniscript_tests.cpp",
  "src/test/net_tests.cpp",
  "src/test/node_init_tests.cpp",
  "src/test/orphanage_tests.cpp",
  "src/test/pcp_tests.cpp",
  "src/test/private_broadcast_tests.cpp",
  "src/test/random_tests.cpp",
  "src/test/rbf_tests.cpp",
  "src/test/scheduler_tests.cpp",
  "src/test/scriptnum10.h",
  "src/test/sigopcount_tests.cpp",
  "src/test/sock_tests.cpp",
  "src/test/streams_tests.cpp",
  "src/test/threadpool_tests.cpp",
  "src/test/transaction_tests.cpp",
  "src/test/txdownload_tests.cpp",
  "src/test/txrequest_tests.cpp",
  "src/test/txvalidation_tests.cpp",
  "src/test/util/chainstate.h",
  "src/test/util/cluster_linearize.h",
  "src/test/util/net.cpp",
  "src/test/util/net.h",
  "src/test/util/poolresourcetester.h",
  "src/test/util/transaction_utils.cpp",
  "src/test/util_tests.cpp",
  "src/test/validation_chainstatemanager_tests.cpp",
  "src/test/validation_tests.cpp",
  "src/wallet/test/coinselector_tests.cpp",
  "src/wallet/test/fuzz/coincontrol.cpp",
  "src/wallet/test/fuzz/coinselection.cpp",
  "src/wallet/test/fuzz/spend.cpp",
  "src/wallet/test/fuzz/wallet_bdb_parser.cpp",
  "src/wallet/test/group_outputs_tests.cpp",
  "src/wallet/test/ismine_tests.cpp",
  "src/wallet/test/psbt_wallet_tests.cpp",
  "src/wallet/test/spend_tests.cpp",
  "src/wallet/test/util.cpp",
  "src/wallet/test/wallet_test_fixture.cpp",
  "src/wallet/test/wallet_tests.cpp"
 ],
 "files": [
  {
   "path": "ci/lint/01_install.sh",
   "add": 6,
   "del": 11
  },
  {
   "path": "src/ipc/test/fuzz/ipc.cpp",
   "add": 5,
   "del": 4
  },
  {
   "path": "src/ipc/test/ipc_tests.cpp",
   "add": 7,
   "del": 6
  },
  {
   "path": "src/qt/test/addressbooktests.cpp",
   "add": 8,
   "del": 8
  },
  {
   "path": "src/qt/test/apptests.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/qt/test/wallettests.cpp",
   "add": 9,
   "del": 8
  },
  {
   "path": "src/test/blockchain_tests.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/blockencodings_tests.cpp",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/test/blockfilter_tests.cpp",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/test/blockmanager_tests.cpp",
   "add": 5,
   "del": 4
  },
  {
   "path": "src/test/btcsignals_tests.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/chainstate_write_tests.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/checkqueue_tests.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/compress_tests.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/crypto_tests.cpp",
   "add": 4,
   "del": 3
  },
  {
   "path": "src/test/cuckoocache_tests.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/flatfile_tests.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/addition_overflow.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/addrman.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/fuzz/asmap.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/test/fuzz/asmap_direct.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/test/fuzz/banman.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/fuzz/base_encode_decode.cpp",
   "add": 3,
   "del": 4
  },
  {
   "path": "src/test/fuzz/bech32.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/fuzz/bip324.cpp",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/test/fuzz/bitdeque.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/test/fuzz/bitset.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/test/fuzz/block.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/fuzz/block_header.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/block_index.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/block_index_tree.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/bloom_filter.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/cluster_linearize.cpp",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/test/fuzz/coins_view.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/coinscache_sim.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/connect_block.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/connman.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/crypto_aes256.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/crypto_aes256cbc.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/crypto_chacha20.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/crypto_chacha20poly1305.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/crypto_common.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/crypto_diff_fuzz_chacha20.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/crypto_poly1305.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/cuckoocache.cpp",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/test/fuzz/dbwrapper.cpp",
   "add": 0,
   "del": 1
  },
  {
   "path": "src/test/fuzz/decode_tx.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/descriptor_parse.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/deserialize.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/difference_formatter.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/fuzz/fee_rate.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/feefrac.cpp",
   "add": 4,
   "del": 2
  },
  {
   "path": "src/test/fuzz/feeratediagram.cpp",
   "add": 5,
   "del": 7
  },
  {
   "path": "src/test/fuzz/fees.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/test/fuzz/flatfile.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/fuzz/float.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/golomb_rice.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/headerssync.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/test/fuzz/hex.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/http_request.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/integer.cpp",
   "add": 0,
   "del": 1
  },
  {
   "path": "src/test/fuzz/key.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/fuzz/key_io.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/fuzz/kitchen_sink.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/locale.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/fuzz/merkle.cpp",
   "add": 4,
   "del": 3
  },
  {
   "path": "src/test/fuzz/message.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/miniscript.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/test/fuzz/muhash.cpp",
   "add": 4,
   "del": 2
  },
  {
   "path": "src/test/fuzz/multiplication_overflow.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/net.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/test/fuzz/net_permissions.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/fuzz/netaddress.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/fuzz/netbase_dns_lookup.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/node_eviction.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/p2p_headers_presync.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/p2p_private_broadcast.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/p2p_transport_serialization.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/parse_hd_keypath.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/parse_iso8601.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/parse_numbers.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/poolresource.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/prevector.cpp",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/test/fuzz/primitives_transaction.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/private_broadcast.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/test/fuzz/rolling_bloom_filter.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/rpc.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/script.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/fuzz/script_descriptor_cache.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/script_flags.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/script_sign.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/scriptnum_ops.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/secp256k1_ec_seckey_import_export_der.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/span.cpp",
   "add": 0,
   "del": 1
  },
  {
   "path": "src/test/fuzz/string.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/fuzz/threadpool.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/fuzz/transaction.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/fuzz/tx_in.cpp",
   "add": 0,
   "del": 1
  },
  {
   "path": "src/test/fuzz/tx_out.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/txdownloadman.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/test/fuzz/txgraph.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/test/fuzz/txrequest.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/test/fuzz/util.h",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/fuzz/util/mempool.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/fuzz/util/net.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/util/wallet.h",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/fuzz/vecdeque.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/test/fuzz/versionbits.cpp",
   "add": 5,
   "del": 4
  },
  {
   "path": "src/test/headers_sync_chainwork_tests.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/httpserver_tests.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/interfaces_tests.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/key_io_tests.cpp",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/test/logging_tests.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/mempool_fee_estimator_tests.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/mempool_tests.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/miniminer_tests.cpp",
   "add": 4,
   "del": 3
  },
  {
   "path": "src/test/miniscript_tests.cpp",
   "add": 8,
   "del": 7
  },
  {
   "path": "src/test/net_tests.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/node_init_tests.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/orphanage_tests.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/pcp_tests.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/private_broadcast_tests.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/test/random_tests.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/rbf_tests.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/scheduler_tests.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/scriptnum10.h",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/sigopcount_tests.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/sock_tests.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/streams_tests.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/threadpool_tests.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/transaction_tests.cpp",
   "add": 7,
   "del": 8
  },
  {
   "path": "src/test/txdownload_tests.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/txrequest_tests.cpp",
   "add": 4,
   "del": 4
  },
  {
   "path": "src/test/txvalidation_tests.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/util/chainstate.h",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/test/util/cluster_linearize.h",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/util/net.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/util/net.h",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/test/util/poolresourcetester.h",
   "add": 0,
   "del": 1
  },
  {
   "path": "src/test/util/transaction_utils.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/test/util_tests.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/test/validation_chainstatemanager_tests.cpp",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/test/validation_tests.cpp",
   "add": 4,
   "del": 4
  },
  {
   "path": "src/wallet/test/coinselector_tests.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/wallet/test/fuzz/coincontrol.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/wallet/test/fuzz/coinselection.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/wallet/test/fuzz/spend.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/wallet/test/fuzz/wallet_bdb_parser.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/wallet/test/group_outputs_tests.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/wallet/test/ismine_tests.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/wallet/test/psbt_wallet_tests.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/wallet/test/spend_tests.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/wallet/test/util.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/wallet/test/wallet_test_fixture.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/wallet/test/wallet_tests.cpp",
   "add": 8,
   "del": 8
  }
 ],
 "test_lines": 544,
 "git": {
  "head": "bd900dc6bbf2204c78c19e6293d4321da8dfe71a",
  "head_matches_backup": true,
  "base": "fe3c92cfe0da39d7f34ee3e11fee056b141afd0e",
  "commits": [
   {
    "sha": "33afe004af",
    "subject": "scripted-diff: [test] Add util/check.h includes for assertions",
    "files": 154,
    "add": 149,
    "del": 50
   },
   {
    "sha": "4edc1a3e86",
    "subject": "lint: Allow clang-format to be used in scripted-diff",
    "files": 1,
    "add": 6,
    "del": 11
   },
   {
    "sha": "bd900dc6bb",
    "subject": "scripted-diff: [test] Sort includes",
    "files": 149,
    "add": 334,
    "del": 312
   }
  ],
  "patch_truncated": true
 },
 "input_hash": "1bfc2a9891a694db",
 "extracted_at": "2026-09-17T16:15:31+00:00"
}