Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-26 23:35 UTC

bitcoindevkit / bdk_wallet

A modern, lightweight, descriptor-based wallet library written in Rust!

RustCustom license★ 54 stars⑂ 95 forkssince Apr 2025View on GitHub ↗

bitcoindevkit/bdk_wallet holds a health index of 79 out of 100, placing it in the Good band. It scores highest on Vitality (98/100) and lowest on AI Readiness (57/100). It was last updated 3 days ago. 3 contributors account for most of its recent work.

79
overall / 100
Good

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

79
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

Bitcoin Dev KitOrganization
736 followers46 public repossince Mar 2020

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
crates.iobdk_wallet3.1.0116,8922342 days agobitcoindescriptorpsbtwallet

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

98Excellent · 22% of overall
How it's scored
36/36Push recency — last push 3 days ago
31.8/36Commit cadence — 46/52 weeks with commits
18/18Commit volume — 240 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year240
human_commit_share0.96
days_since_last_push3
active_weeks_last_year46

Release discipline

100Excellent
How it's scored
27/27Ships releases — 13 releases published
36/36Release recency — latest release 42 days ago
27/27Release cadence — a release every ~42.3 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count13
latest_release_tagv3.1.0
releases_from_tagsno
days_since_latest_release42
mean_days_between_releases42.3
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

66Moderate · 18% of overall
How it's scored
28/60Stars — 54 stars
16.4/25Forks — 95 forks
6/15Watchers — 13 watchers
Inputs used
forks95
stars54
watchers13
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
16.9/22.5License — license file present, not a recognized license
18/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
6.3/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductno
has_pull_request_templateyes
How it's scored
67.6/80Monthly downloads — 116,892 downloads/month across crates
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesbdk_wallet
dependents
ecosystemscrates
total_downloads1,079,408
monthly_downloads116,892
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

77Good · 24% of overall
How it's scored
36/54Bus factor — 3 contributor(s) cover half of all commits
17.6/22.5Commit distribution — top contributor authored 22% of commits
13.5/13.5Contributor breadth — 98 contributors
10/10OpenSSF Scorecard: Contributors — project has 40 contributing companies or organizations
Inputs used
bus_factor3
contributors_sampled98
top_contributor_share0.22
How it's scored
21.1/46.8Issue resolution — 45% of issues closed
28.2/38.3PR acceptance — 134/182 decided PRs merged
10.5/15OpenSSF Scorecard: Code-Review — Found 5/7 approved changesets -- score normalized to 7
Inputs used
merged_prs134
open_issues154
closed_issues127
issue_closed_ratio0.452
closed_unmerged_prs48
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
20.6/25Owner reach — 736 followers of bitcoindevkit
24.2/25Track record — 46 public repos, account ~6 yr old
Inputs used
followers736
owner_typeOrganization
is_verified
owner_loginbitcoindevkit
public_repos46
account_age_days2,309
How it's scored
25/25Published & resolvable — 1 package(s) on crates
35/35Publish recency — latest publish 42 days ago
20/20Version history — 23 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesbdk_wallet
ecosystemscrates
any_deprecatedno
min_days_since_publish42

Engineering Quality

Are baseline engineering and documentation practices in place?

71Good · 20% of overall
How it's scored
24/24CI workflows — 5 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 10 out of 10 merged PRs checked by a CI test -- score normalized to 10
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepage
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

79Good · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
3/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 10 out of 10 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
5.2/7.5Code-Review — Found 5/7 approved changesets -- score normalized to 7
2.5/2.5Contributors — project has 40 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.2/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — no data
0.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
5/5SAST — SAST tool is run on all commits
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — no data
6.8/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate7.9
Excluded from scoring (no data or not applicable): packaging, signed_releases. Remaining weights renormalized.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

57Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 96 of 96 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
How it's scored
18/18One-command bootstrap — examples/justfile, justfile
22/22Automated tests
0/11Lint / format config
11/11Static type checking — Rust (statically typed)
0/10Reproducible environment
2/10Demonstrated agent practice — 1 of the last 100 commits agent-authored or agent-credited
8/8Automated maintenance — 4 of the last 100 commits are automated dependency updates
1/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileno
typed_languageyes
bootstrap_filesexamples/justfile, justfile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0.01
toolchain_manifestsCargo.toml
dependency_bot_commit_share0.04
How it's scored
45/45Type-checkable code — Rust (statically typed)
50.1/55Manageable file sizes — 4/45 source files over 60KB
Inputs used
primary_languageRust
largest_source_bytes165,781
source_files_sampled45
oversized_source_files4
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

54GitHub stars
98contributors
240commits, last 12 months
3days since last push
13releases
3bus factor
154open issues
crates.iopackage ecosystems

Data collection warnings

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • No resolved dependencies carried a version and a supported ecosystem

More detail

Star and fork history 0 ★ / 95 ⇿
0Stars
95Forks
13Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

0204060801009532025-042025-112026-07
Major 1Minor 1Patch 0

Each point covers 2 days.

OpenSSF Scorecard 7.9 / 10
7.9aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-26 23:35 UTC

10Binary-Artifactsno binaries found in the repo
4Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests10 out of 10 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
7Code-ReviewFound 5/7 approved changesets -- score normalized to 7
10Contributorsproject has 40 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
9Licenselicense file detected
10Maintained30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
n/aPackagingpackaging workflow not detected
1Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 1
10SASTSAST tool is run on all commits
10Security-Policysecurity policy file detected
n/aSigned-Releasesno releases found
9Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Direct dependencies 11
RegistryPackageVersion constraintManifest
crates.iobdk_chain0.23.3Cargo.toml
crates.iobdk_tx0.2.0Cargo.toml
crates.iobitcoin0.32.8Cargo.toml
crates.iominiscript12.3.5Cargo.toml
crates.iorand_core0.6.4Cargo.toml
crates.ioserde_json1Cargo.toml
crates.ioserde1Cargo.toml
crates.ioanyhow1Cargo.toml
crates.iobdk_file_store0.22.0Cargo.toml
crates.iobip392.2.2Cargo.toml
crates.iotempfile3.26.0Cargo.toml
All dependencies 19

Full resolved dependency set from the GitHub dependency graph: 11 direct and 8 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
crates.ioanyhowdirect
crates.iobdk_chaindirect
crates.iobdk_file_storedirect
crates.iobdk_txdirect
crates.iobip39direct
crates.iobitcoindirect
crates.iominiscriptdirect
crates.iorand_coredirect
crates.ioserdedirect
crates.ioserde_jsondirect
crates.iotempfiledirect
crates.ioassert_matchesindirect
crates.iobdk_bitcoind_rpcindirect
crates.iobdk_electrumindirect
crates.iobdk_esploraindirect
crates.ioclapindirect
crates.ioctrlcindirect
crates.iorandindirect
crates.iotokioindirect
Dependency advisories not assessed

Advisory matching could not run for this report: No resolved dependencies carried a version and a supported ecosystem

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 7606,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Just": 2008,
        "Rust": 1089283,
        "Shell": 1103
      },
      "pushed_at": "2026-07-23T18:08:22Z",
      "created_at": "2025-04-03T18:21:58Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-23T16:04:06Z",
      "description": "A modern, lightweight, descriptor-based wallet library written in Rust! ",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "master",
      "license_spdx_raw": "NOASSERTION",
      "primary_language": "Rust",
      "significant_languages": [
        "Rust"
      ]
    },
    "owner": {
      "blog": "https://bitcoindevkit.org/",
      "name": "Bitcoin Dev Kit",
      "type": "Organization",
      "login": "bitcoindevkit",
      "company": null,
      "location": null,
      "followers": 736,
      "avatar_url": "https://avatars.githubusercontent.com/u/62867074?v=4",
      "created_at": "2020-03-30T04:10:49Z",
      "is_verified": null,
      "public_repos": 46,
      "account_age_days": 2309
    },
    "license": {
      "state": "custom",
      "spdx_id": null,
      "raw_spdx": "NOASSERTION",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v3.1.0",
          "kind": "minor",
          "published_at": "2026-06-14T03:57:03Z"
        },
        {
          "tag": "wallet-2.4.0",
          "kind": "other",
          "published_at": "2026-04-28T19:29:26Z"
        },
        {
          "tag": "v3.0.0",
          "kind": "major",
          "published_at": "2026-04-13T14:18:50Z"
        },
        {
          "tag": "v3.0.0-rc.2",
          "kind": "prerelease",
          "published_at": "2026-03-26T00:28:03Z"
        },
        {
          "tag": "v3.0.0-rc.1",
          "kind": "prerelease",
          "published_at": "2026-03-10T23:25:24Z"
        },
        {
          "tag": "wallet-2.3.0",
          "kind": "other",
          "published_at": "2025-12-04T16:58:34Z"
        },
        {
          "tag": "wallet-2.2.0",
          "kind": "other",
          "published_at": "2025-10-01T15:14:47Z"
        },
        {
          "tag": "wallet-2.1.0",
          "kind": "other",
          "published_at": "2025-08-07T15:00:52Z"
        },
        {
          "tag": "wallet-2.0.0",
          "kind": "other",
          "published_at": "2025-06-04T23:48:19Z"
        },
        {
          "tag": "wallet-2.0.0-beta.0",
          "kind": "other",
          "published_at": "2025-05-29T12:51:59Z"
        },
        {
          "tag": "wallet-1.2.0",
          "kind": "other",
          "published_at": "2025-04-17T03:14:12Z"
        },
        {
          "tag": "wallet-1.1.0",
          "kind": "other",
          "published_at": "2025-04-17T03:15:19Z"
        },
        {
          "tag": "wallet-1.0.0",
          "kind": "other",
          "published_at": "2025-04-17T03:16:20Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "e6e3ddfa3cbb5b551dcbe4268602ff8242d5ea42",
          "body": "…rom 10.3.0 to 10.4.0\n\nbc83556686ff5ba8f728672f068e8a47b55ec269 build(deps): bump actions/stale from 10.3.0 to 10.4.0 (dependabot[bot])\n\nPull request description:\n\n  Bumps [actions/stale](https://github.com/actions/stale) from 10.3.0 to 10.4.0.\n  <details>\n  <summary>Release notes</summary>\n  <p><em\n[…]\ndMammal:\n    ACK bc83556686ff5ba8f728672f068e8a47b55ec269\n\nTree-SHA512: 94aa27f54f779a6251d07f998e43a3d9ddc5cc3408875e663e071253199979884184701d6d919e7309ee2281d3ed880b8077d1c66232c3ea459bad56592ab8b1",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#515: build(deps): bump actions/stale f…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-07-23T16:03:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "752d7b5390f0f085176af50ec58ea13ff2476f64",
          "body": "…t from 6 to 7\n\nd2817aba9d9f76e77bcdd6a56679e6d00a4d65db build(deps): bump actions/checkout from 6 to 7 (dependabot[bot])\n\nPull request description:\n\n  Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.\n  <details>\n  <summary>Release notes</summary>\n  <p><em>Sourced from <a h\n[…]\ndMammal:\n    ACK d2817aba9d9f76e77bcdd6a56679e6d00a4d65db\n\nTree-SHA512: d9c3844c0dd85f55a76dba25e453a77323fd97376c385cdeb1f89793324bdce373d57d0d105f9e65adc9f4e8439e984c7c4ea5dd2f39db1296df2714178f0633",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#504: build(deps): bump actions/checkou…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-07-23T15:48:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0007794daec74d8136de7ded40d3611ef9ca3dd3",
          "body": "…-action from 6.0.0 to 7.0.0\n\n83bf7c3b75f36698b6ecab0701f9341a41141b97 build(deps): bump codecov/codecov-action from 6.0.0 to 7.0.0 (dependabot[bot])\n\nPull request description:\n\n  Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 6.0.0 to 7.0.0.\n  <details>\n  <summary>Re\n[…]\ndMammal:\n    ACK 83bf7c3b75f36698b6ecab0701f9341a41141b97\n\nTree-SHA512: 2d367d6ddc382c55ed262e5676890349cb802b33c1e2ee0327d11cecba5b64649abcdeee9a492b0c20ee0f05cafa0070c333a7a73fede60e29495fe76d2116cd",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#498: build(deps): bump codecov/codecov…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-07-23T15:32:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b71129ead46dab634fc8a4ac7bc5933903fda2ae",
          "body": "…431 rule 2\n\n7982b6e8fe0b47984d0b148b325f8b4bd9e44481 test(wallet): add test for bip-431 rule 2 (Leonardo Lima)\n589e76aab8a9fc806cee78bd70cf97e1fbcf9429 fix(wallet): add filter for bip-431 rule 2 (Leonardo Lima)\n\nPull request description:\n\n  partially addresses #477\n  supersedes #442\n\n  ### Descript\n[…]\n nymius:\n    ACK 7982b6e8fe0b47984d0b148b325f8b4bd9e44481\n\nTree-SHA512: bc17a1dd1f413dbe8f15ada6be1e4f61afd7e961aadc72424bc399783098db7ebf838c09b279951d8235758e4c2e7ad9d4c8d8cd3b1b1cfb97c486d358c83049",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#478: fix(wallet): add support for bip-…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-07-23T15:06:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b01f2f61ca9a1625131b914f080be77c86c17e65",
          "body": "a150344179d667ed5ef1c76223aacdaede3d5f14 docs(examples): Add create_psbt and rbf examples (valued mammal)\n0b681a6ae14eca50c41f02dcb7fc8413c9b4cfbe test: Add create_psbt functional integration coverage (valued mammal)\nb9942464588293d1e8e06195fccf3780d6af81e3 feat(wallet,psbt): Add bdk-tx create_psbt \n[…]\nlet/blob/master/CONTRIBUTING.md)\n\nTop commit has no ACKs.\n\nTree-SHA512: 61dd4b632d2a5bdb0737a7a8e670065d93a1fba11340e5563bac1f4ac34acbb4a13eea68b59597430c808049438e7e2c6b6fe8d6e72a7c2821df93cbbb256d4f",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#516: feat: Add Wallet::create_psbt",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-07-22T14:51:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a150344179d667ed5ef1c76223aacdaede3d5f14",
          "body": null,
          "is_bot": false,
          "headline": "docs(examples): Add create_psbt and rbf examples",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-07-22T13:53:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b681a6ae14eca50c41f02dcb7fc8413c9b4cfbe",
          "body": null,
          "is_bot": false,
          "headline": "test: Add create_psbt functional integration coverage",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-07-22T13:53:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9942464588293d1e8e06195fccf3780d6af81e3",
          "body": "Introduce the unstable create_psbt and replace_by_fee APIs behind\nthe bdk-tx feature and --cfg bdk_wallet_unstable.\n\nThis adds PsbtParams and SelectionStrategy, integrates bdk_tx into\nwallet PSBT/RBF construction, re-exports bdk_tx when enabled, and\nincludes supporting error types needed by the new flow.",
          "is_bot": false,
          "headline": "feat(wallet,psbt): Add bdk-tx create_psbt API surface",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-07-22T13:53:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f28bb02354e73b4584a7a62659acae568b0173b",
          "body": "Prepare the repository for upcoming unstable-gated API commits by\nproving the cfg workflow end-to-end before any new surface is added.\n\nThis change wires bdk_wallet_unstable into CI coverage, testing,\nlinting, and docs checks, while keeping no-default-features and no_std\nbuilds validated in a stable lane. It also splits local just tasks into\nstable and unstable paths so pre-push validation correctly exercises\nboth.",
          "is_bot": false,
          "headline": "build(ci): Wire unstable cfg into local and CI workflows",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-07-22T13:53:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7982b6e8fe0b47984d0b148b325f8b4bd9e44481",
          "body": "- introduce `test_create_and_spend_from_tx` to exercise BIP-431 rule-2\n  filtering in-memory, not relying on `bdk_testenv`/`bdk_electrum`.\n\nNOTE: I asked Claude to remove the `bdk_testenv` dependency, keeping\nthe test behavior in-memory.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(wallet): add test for bip-431 rule 2",
          "author_name": "Leonardo Lima",
          "author_login": "oleonardolima",
          "committed_at": "2026-07-14T18:10:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "589e76aab8a9fc806cee78bd70cf97e1fbcf9429",
          "body": "- add new step in `filter_utxos` to validate BIP-431 rule 2, which\n  validates the proper usage of unconfirmed TRUC/non-TRUC ancestor in a\n  TRUC/non-TRUC tx.\n- update docs explaining the manual selection caveat when building\n  non-TRUC/TRUC txs.",
          "is_bot": false,
          "headline": "fix(wallet): add filter for bip-431 rule 2",
          "author_name": "Leonardo Lima",
          "author_login": "oleonardolima",
          "committed_at": "2026-07-14T18:10:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc83556686ff5ba8f728672f068e8a47b55ec269",
          "body": "Bumps [actions/stale](https://github.com/actions/stale) from 10.3.0 to 10.4.0.\n- [Release notes](https://github.com/actions/stale/releases)\n- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/stale/compare/eb5cf3af3ac0a1aa4c9c45633dd1ae542a27\n[…]\n:\n- dependency-name: actions/stale\n  dependency-version: 10.4.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "build(deps): bump actions/stale from 10.3.0 to 10.4.0",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-13T03:53:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "75e0d30aa9d8aaa3dfe19d9661e5127d6f7886db",
          "body": "…e_psbt outcomes\n\n72261ced00fd0ce71a3377395de6d72b9d241e43 docs(wallet): Format code comment (valued mammal)\nec3a683f0d9247c6e533914e84d83b68ad09d3ce refactor: clarify try_finalize_psbt timelock inputs (Matthew)\n8a7b5de61946fef9cd0c586bc4e0cdc1a5372ac4 docs: clarify try_finalize_psbt behavior (Matth\n[…]\ndMammal:\n    ACK 72261ced00fd0ce71a3377395de6d72b9d241e43\n\nTree-SHA512: 0b2573f4b1f24e4e464b9d5ded936d5602cdc9500072ff3d4cdb0fded9cee6935888d82d6db70212018bdba010db6631d22bb16834c991e1af592a0275912293",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#433: feat: expose detailed try_finaliz…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-07-08T15:46:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "72261ced00fd0ce71a3377395de6d72b9d241e43",
          "body": null,
          "is_bot": false,
          "headline": "docs(wallet): Format code comment",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-07-08T15:34:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec4d68bf23d7e5935dc3bd555079aee3c65ad198",
          "body": "… workflow\n\nedc5e1fa04934067416158497e671cfe06391fab chore(ci): add stale issue and pr automation (Rishit Modi)\n\nPull request description:\n\n  ### Description\n  Part of #410\n  Closes #386\n\n  Adds `.github/workflows/stale.yml` using `actions/stale@v10` to automatically label and close inactive issues \n[…]\ndMammal:\n    ACK edc5e1fa04934067416158497e671cfe06391fab\n\nTree-SHA512: 900dee08631134f8d5ade996fb1e1ef25b1ca8bc6f946012d451679f40ce8570640119a29980337257fbd1807e6451cf4dffb770d1b3b135bcd4e25f31a8cb1a",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#497: chore(ci): add stale issue triage…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-07-08T14:27:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "275406e1ec6759efbf1c2fc2dabb2882cc4cb1e8",
          "body": "…LoadParams::two_path_descriptor\n\na06e0a8dd60d52dfad53ed6a05071e758411a8f0 chore: bump rust-toolchain to 1.96.0 (Listener)\n77a727d16c13967bc5a78688768f83c556856c10 docs(wallet,params): Fix doc for LoadParams::two_path_descriptor (Listener)\n\nPull request description:\n\n  ### Description\n\n  Fix incorre\n[…]\ndMammal:\n    ACK a06e0a8dd60d52dfad53ed6a05071e758411a8f0\n\nTree-SHA512: c5098cad750a59bd175d959b22c037598b87eb765f4f163c81149b14f624294756889a0b7b64f3751e46cb1202fe9905afc5cb3d955f0eef750421b819f1ae71",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#510: docs(wallet,params): Fix doc for …",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-07-06T15:11:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a06e0a8dd60d52dfad53ed6a05071e758411a8f0",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump rust-toolchain to 1.96.0",
          "author_name": "Listener",
          "author_login": "bladed-operative",
          "committed_at": "2026-07-06T14:28:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77a727d16c13967bc5a78688768f83c556856c10",
          "body": null,
          "is_bot": false,
          "headline": "docs(wallet,params): Fix doc for LoadParams::two_path_descriptor",
          "author_name": "Listener",
          "author_login": "bladed-operative",
          "committed_at": "2026-07-06T14:18:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edc5e1fa04934067416158497e671cfe06391fab",
          "body": null,
          "is_bot": false,
          "headline": "chore(ci): add stale issue and pr automation",
          "author_name": "Rishit Modi",
          "author_login": "EliteCoder18",
          "committed_at": "2026-07-01T21:45:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec3a683f0d9247c6e533914e84d83b68ad09d3ce",
          "body": null,
          "is_bot": false,
          "headline": "refactor: clarify try_finalize_psbt timelock inputs",
          "author_name": "Matthew",
          "author_login": "reez",
          "committed_at": "2026-06-22T16:24:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a7b5de61946fef9cd0c586bc4e0cdc1a5372ac4",
          "body": null,
          "is_bot": false,
          "headline": "docs: clarify try_finalize_psbt behavior",
          "author_name": "Matthew",
          "author_login": "reez",
          "committed_at": "2026-06-22T16:24:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f8cbcaf394cd0a1c1c934203c3298e000092d47",
          "body": null,
          "is_bot": false,
          "headline": "fix: preserve output metadata in try_finalize_psbt",
          "author_name": "Matthew",
          "author_login": "reez",
          "committed_at": "2026-06-22T16:24:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50a1a0f55ce5a6e1d15ef7dc2515807fd69ba7a3",
          "body": null,
          "is_bot": false,
          "headline": "fix: preserve opaque psbt input fields on finalize",
          "author_name": "Matthew",
          "author_login": "reez",
          "committed_at": "2026-06-22T16:24:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6afd006737e3cc689db177617f9626b0055436d1",
          "body": null,
          "is_bot": false,
          "headline": "feat: expose detailed try_finalize_psbt outcomes",
          "author_name": "Matthew",
          "author_login": "reez",
          "committed_at": "2026-06-22T16:24:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2817aba9d9f76e77bcdd6a56679e6d00a4d65db",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v6...v7)\n\n---\nupdated-dependenc\n[…]\n:\n- dependency-name: actions/checkout\n  dependency-version: '7'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "build(deps): bump actions/checkout from 6 to 7",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-22T03:53:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "58fe631177047ef1c49947ff453110f47138adcd",
          "body": "2a04e3b0727c64ef6063d70610c79c1145f31ed8 chore: Bump version to 3.1.0 (valued mammal)\n6f5912ef06bc82d0d0acb5ac0f6b09592c045664 chore: Update CHANGELOG.md (valued mammal)\n\nPull request description:\n\n  Update `CHANGELOG.md` in preparation for release and bump the version to 3.1.0 in `Cargo.toml`.\n\n  Close #500\n\nTop commit has no ACKs.\n\nTree-SHA512: 9c563df1a955da550a537b08c2af1e49bddba2a2caacf0ec4cc803df309fa152fe0e30377dfc15638cee8c0cb9b59fa9dbbf5a61b46c37e43f9dacf4fe1ab3ee",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#501: Release 3.1.0",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-06-14T03:37:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a04e3b0727c64ef6063d70610c79c1145f31ed8",
          "body": "Signed-off-by: valued mammal <valuedmammal@protonmail.com>",
          "is_bot": false,
          "headline": "chore: Bump version to 3.1.0",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-06-14T03:25:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f5912ef06bc82d0d0acb5ac0f6b09592c045664",
          "body": "Signed-off-by: valued mammal <valuedmammal@protonmail.com>",
          "is_bot": false,
          "headline": "chore: Update CHANGELOG.md",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-06-14T03:24:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8181e847e9a0cef8e63136ab0fd623e2ffc88a60",
          "body": "…th_signers\n\n35f753f357b5b80859d56bd3f03b39e73ead35e1 test(wallet): cover sign_with_signers (Noah Joeris)\n62cd294d6796b8f0f862abfc70c49875eab6c33b feat(wallet): add sign_with_signers (Noah Joeris)\n\nPull request description:\n\n  ### Description\n\n  Adds `Wallet::sign_with_signers`, allowing callers to \n[…]\nolima:\n    utACK 35f753f357b5b80859d56bd3f03b39e73ead35e1\n\nTree-SHA512: 4a0802d87de4150fdf132e7b650610e3ee6bb87b55531ae1d49cd26b1c9743ef668c4f266185e5240b079b2b6776674e4befa3ea284c5f5d331fdd96f5e89cbf",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#490: feat(wallet): add Wallet::sign_wi…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-06-09T15:15:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "83bf7c3b75f36698b6ecab0701f9341a41141b97",
          "body": "Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 6.0.0 to 7.0.0.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/c\n[…]\nndency-name: codecov/codecov-action\n  dependency-version: 7.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "build(deps): bump codecov/codecov-action from 6.0.0 to 7.0.0",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-08T03:53:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "35f753f357b5b80859d56bd3f03b39e73ead35e1",
          "body": null,
          "is_bot": false,
          "headline": "test(wallet): cover sign_with_signers",
          "author_name": "Noah Joeris",
          "author_login": "noahjoeris",
          "committed_at": "2026-06-05T11:49:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62cd294d6796b8f0f862abfc70c49875eab6c33b",
          "body": null,
          "is_bot": false,
          "headline": "feat(wallet): add sign_with_signers",
          "author_name": "Noah Joeris",
          "author_login": "noahjoeris",
          "committed_at": "2026-06-04T17:16:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8e006f0b2fbac5ae56e84990fbeab6337c160e3",
          "body": "…klist items to contributing guide\n\n879b9865b2ebf2d0e4a2a2c6a7f843cb4581af6e docs: move PR checklist to contributing guide (Noah Joeris)\n\nPull request description:\n\n  ### Description\n\n  Suggests moving most pull request checklist items from the PR template into `CONTRIBUTING.md`, keeping checklist m\n[…]\ndMammal:\n    ACK 879b9865b2ebf2d0e4a2a2c6a7f843cb4581af6e\n\nTree-SHA512: 1f03e3534adf5709d856c41992e1ca78da07c856c9d2321c4b4781b876f2da6bbbbdd0778f308243f253422d523539198606110447ea4dbe2ed45d4300a1c8d5",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#492: docs: suggest moving most PR chec…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-06-04T15:56:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "879b9865b2ebf2d0e4a2a2c6a7f843cb4581af6e",
          "body": null,
          "is_bot": false,
          "headline": "docs: move PR checklist to contributing guide",
          "author_name": "Noah Joeris",
          "author_login": "noahjoeris",
          "committed_at": "2026-06-03T07:59:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39de6ed387af67b23a37c874edd0cd4f1daf8044",
          "body": "…ghashes in SignerWrapper::sign_input\n\n9e45c56246f1dacb0e3ffdea293eb8cdf85fe5e3 fix(signer): respect allow_all_sighashes in sign_input (Muhammad)\n\nPull request description:\n\n  <!-- You can erase any parts of this template not applicable to your Pull Request. -->\n\n  ### Description\n  `SignOptions::al\n[…]\n6246f1dacb0e3ffdea293eb8cdf85fe5e3; ran the tests locally\n\nTree-SHA512: 1f1b5ac699d028f70287c0d38e3d1740e92232000b75c437bad03e6b13fcce9b655e7f4094fbcba5b4b14a019f43abaede4fe8a644ae509aab9cd36809ad7a8b",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#476: fix(signer): respect allow_all_si…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-05-26T21:54:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2356e6e86f31f7e138d3e43a93b892f81114d9ee",
          "body": "…xo fee rounding\n\ndaf8d810a7e2bddd1bee5c1cedf38e9292f92bf5 fix(coin_selection): avoid per-utxo fee rounding (benthecarman)\n\nPull request description:\n\n  select_sorted_utxos computed fee_rate * weight per utxo and summed\n  the results. Because FeeRate * Weight ceils to whole sats, each\n  input added \n[…]\nll/479/commits/daf8d810a7e2bddd1bee5c1cedf38e9292f92bf5).\n\nTree-SHA512: 06a302ca0bbdce836901348f26da20d9576fc4e505d7b38d444aad8b0ede7f47f16b34cf05c9cf314f95c28e7f1236f21686b4898cb4740b6253802c817fcaa7",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#479: fix(coin_selection): avoid per-ut…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-05-26T21:35:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bd164ad1e414541c5509c180f171f754cf19d86f",
          "body": "… explicit public descriptor checksum\n\n687c4153ef3d6627bc1d4428841baddfb4f87c5e docs(wallet): Improve docs for `wallet_name_from_descriptor` (valued mammal)\nc932b98a4566cf9dc5658b1acb2b653991bdf862 test(wallet): Add assertion for wallet name with change descriptor (valued mammal)\n18ea7eea45a9160d99e\n[…]\ndMammal:\n    ACK 687c4153ef3d6627bc1d4428841baddfb4f87c5e\n\nTree-SHA512: 02b50495136ae73226de5e6db446913b611c3d17cb9ba5f433ebca4af7144f7bc420e84db59d7a9eb5727277bd334f9bb0d58119cb36799126a8ff2518cdcd8d",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#482: Fix wallet name generation to use…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-05-26T17:30:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "687c4153ef3d6627bc1d4428841baddfb4f87c5e",
          "body": null,
          "is_bot": false,
          "headline": "docs(wallet): Improve docs for `wallet_name_from_descriptor`",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-05-26T17:14:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c932b98a4566cf9dc5658b1acb2b653991bdf862",
          "body": null,
          "is_bot": false,
          "headline": "test(wallet): Add assertion for wallet name with change descriptor",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-05-26T17:14:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "18ea7eea45a9160d99e5557f6889b0b32792f7d8",
          "body": "…or checksums\n\n- Update `wallet_name_from_descriptor` to compute descriptor checksum explicitly\n- Remove reliance on `to_string()` implicitly containing `#checksum`\n- Clarify that wallet name is defined by public descriptor checksums\n- Add regression test for equivalent xpub/xprv wallet names",
          "is_bot": false,
          "headline": "feat(wallet): derive wallet_name_from_descriptor from public descript…",
          "author_name": "AmosOO7",
          "author_login": "AmosOO7",
          "committed_at": "2026-05-17T17:26:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6dca318c9d29bec5bedfed27a6d36a21e6bc8204",
          "body": "…s in Utxo::txout for Foreign variant\n\nedb0f523da584cccf4a98a45fd4da707f19f8ade fix(types): avoid reachable panics in Utxo::txout for Foreign variant (Muhammad)\n\nPull request description:\n\n  ### Description\n\n  `Utxo::txout()` contained two reachable panics for the `Foreign` variant:\n\n  1. `prev_tx.o\n[…]\ndMammal:\n    ACK edb0f523da584cccf4a98a45fd4da707f19f8ade\n\nTree-SHA512: de4f81c355c0933843492ecf79610544192fbc3cd4c69de6148e64101658bdadd855fc983f8b4cae797ccfb6ea5cf2ca83a6d9d2ec034934674d88c122f0ab88",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#487: fix(types): avoid reachable panic…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-05-13T13:30:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "edb0f523da584cccf4a98a45fd4da707f19f8ade",
          "body": null,
          "is_bot": false,
          "headline": "fix(types): avoid reachable panics in Utxo::txout for Foreign variant",
          "author_name": "Muhammad",
          "author_login": "muhahahmad68",
          "committed_at": "2026-05-13T11:51:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e45c56246f1dacb0e3ffdea293eb8cdf85fe5e3",
          "body": null,
          "is_bot": false,
          "headline": "fix(signer): respect allow_all_sighashes in sign_input",
          "author_name": "Muhammad",
          "author_login": "muhahahmad68",
          "committed_at": "2026-05-08T22:43:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b612f52f9a81333c88fa44bbd2e95d2f1840458",
          "body": "…validation for psbt\n\n217dd85509af0b00bfd957f932eefc7fc8c274f7 fix(psbt): add non-witness-utxo validation for get_utxo_for (Muhammad)\n\nPull request description:\n\n  <!-- You can erase any parts of this template not applicable to your Pull Request. -->\n\n  ### Description\n\n  This PR fixes a security vu\n[…]\ndMammal:\n    ACK 217dd85509af0b00bfd957f932eefc7fc8c274f7\n\nTree-SHA512: 78fe5f38c62818bdc83eb81fef40c0414cc46957299b8b661f92d8312d1212258f7f469d70326841111e8a7e554df397d0975fdd6605ad1c8906ba53e2d609b4",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#471: fix(audit): add non-witness-utxo …",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-05-08T19:22:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a4532b7b6c345b42cbdf7f697f50e7a14f35771a",
          "body": "…acking in `combinations()` function\n\nd6bbe77a1fbf12fb28d23e4d53d0bd3f1691a2a6 fix(descriptor): correct index tracking in `combinations()` function (Elias Rohrer)\n\nPull request description:\n\n  ### Description\n\n  The combinations function was pushing `new_index` (the enumerate index relative to the s\n[…]\n7a1fbf12fb28d23e4d53d0bd3f1691a2a6; ran the tests locally\n\nTree-SHA512: f141296afe439d32c784780abea1978f44244b21d2951a68bdc167224deda48fa53c0ec931e223335e1b1d1d63fa9e5e0d5870c9d9fed59de5517941bd51cabb",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#453: fix(descriptor): correct index tr…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-05-08T19:11:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "daf8d810a7e2bddd1bee5c1cedf38e9292f92bf5",
          "body": "select_sorted_utxos computed fee_rate * weight per utxo and summed\nthe results. Because FeeRate * Weight ceils to whole sats, each\ninput added up to 0.999 sats of fractional fee. The error grew\nlinearly with the input count: at 1 sat/vb on 271-wu inputs\n(67.75 sat each), four inputs overpay by 1 sat\n[…]\nghing\nthe finished transaction and never exceeds the requested fee rate\nby more than one sat over the whole transaction.\n\nThis was found when comparing fee calculation differences between LDK\nand BDK.",
          "is_bot": false,
          "headline": "fix(coin_selection): avoid per-utxo fee rounding",
          "author_name": "benthecarman",
          "author_login": "benthecarman",
          "committed_at": "2026-05-08T18:26:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "217dd85509af0b00bfd957f932eefc7fc8c274f7",
          "body": null,
          "is_bot": false,
          "headline": "fix(psbt): add non-witness-utxo validation for get_utxo_for",
          "author_name": "Muhammad",
          "author_login": "muhahahmad68",
          "committed_at": "2026-05-08T14:02:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5fee0793cf03d6b95e21de6fa6e3ac7bb386959",
          "body": "…vation paths in PSBT key origins\n\n507f08a981e69a6c381f487b715c6a324638ea6b fix: avoid panic on hardened derivation paths in PSBT key origins (Elias Rohrer)\n\nPull request description:\n\n  ### Description\n  The verify_key closure in derive_from_psbt_key_origins called .expect() on xpub.derive_pub(), w\n[…]\na981e69a6c381f487b715c6a324638ea6b; ran the tests locally\n\nTree-SHA512: 4d796ff404f99fb86a49dcc0fce83c5e69499723a3f1ac447bb77518fd85bb45c7c84df4e9cfdc4840d010f2ec4d23cc841e735ee995014e6d88afc3bcf129d9",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#458: fix: avoid panic on hardened deri…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-05-05T18:47:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a6fe715b7b8cde4cf46e3af7c7aa12dabfe90f52",
          "body": "67fa46eb0530bea7d755448b628788aae15c2191 feat(doc): add `SECURITY.md` (Luis Schwab)\n\nPull request description:\n\n  Closes #435\n\n  ## Changelog\n  ```\n  - Add `SECURITY.md` listing the PGP key to be used for vulnerability disclosures\n  ```\n\nACKs for top commit:\n  notmandatory:\n    tACK 67fa46eb0530bea7\n[…]\nrdolima:\n    ACK 67fa46eb0530bea7d755448b628788aae15c2191\n\nTree-SHA512: b1df75ecaf0e33667836a68c039339c16a30d997312e63232ca49e6a0b3eef64e8c134221eea8132feecc36c3f5e6a5ea6e1c119f6a4e5b3e12cae72232cb188",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#437: Add `SECURITY.md`",
          "author_name": "merge-script",
          "author_login": "oleonardolima",
          "committed_at": "2026-05-05T13:54:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d6bbe77a1fbf12fb28d23e4d53d0bd3f1691a2a6",
          "body": "The combinations function was pushing `new_index` (the enumerate index\nrelative to the skipped iterator) instead of `index + 1 + new_index`\n(the absolute index in the original vec). This caused duplicate and\nincorrect combinations to be generated for inputs larger than trivial\nsizes.\n\nCo-Authored-By: HAL 9000\nSigned-off-by: Elias Rohrer <dev@tnull.de>",
          "is_bot": false,
          "headline": "fix(descriptor): correct index tracking in `combinations()` function",
          "author_name": "Elias Rohrer",
          "author_login": "tnull",
          "committed_at": "2026-05-01T00:20:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a9ad3b958e5c44768095ab85d33a3ea37a9b7d79",
          "body": "…n network kind detection and fixup\n\nda6c61d50b6360b09352b04086e0ed6916c5a50d fix: handle MultiXPrv/MultiXPub in network kind detection and fixup (Elias Rohrer)\n\nPull request description:\n\n  ### Description\n\n  The IntoDescriptorKey impl for DescriptorSecretKey was missing a MultiXPrv match arm, caus\n[…]\nsschwab:\n    ACK da6c61d50b6360b09352b04086e0ed6916c5a50d\n\nTree-SHA512: 1aa30d45d04ee0d287c069ca1599fa417e1dfcc20e157e9f68b9b5e051a3b3ecbcea2f9dd3fb9cbc00373a9bf6d89a1e4d8147e2f571071aca392816dac6b2e3",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#459: fix: handle MultiXPrv/MultiXPub i…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-30T21:07:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "46f3ba0188eaea3ab572a6ea41c21b872ad821ee",
          "body": "…utxo in add_foreign_utxo\n\nf0302e9760b63565c81aaae86af407f1d9a7074a fix: always validate non_witness_utxo in add_foreign_utxo (Elias Rohrer)\n\nPull request description:\n\n  ### Description\n  Previously, non_witness_utxo was only validated when witness_utxo was None. An attacker could supply both a val\n[…]\nolima:\n    utACK f0302e9760b63565c81aaae86af407f1d9a7074a\n\nTree-SHA512: 953527cafc898ba9ea955bfbddcf58605a84d70e712f93e3b07753a41bf358dbdcc00c815483cf5f41169632f28773a74d1f6c44bc14517903092e2fd15f15b9",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#461: fix: always validate non_witness_…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-30T20:25:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "db1eab42db6c75c1d15641825511115c7dbbc248",
          "body": "….2.1`\n\nd3fe261679caa76a604ed950c248b7e7982408ef fix(ci): pin `idna_adapter` to `1.2.1` (Leonardo Lima)\n\nPull request description:\n\n  ### Description\n\n  It fixes the MSRV CI by pining `idna_adapter`.\n\n  ### Notes to the reviewers\n\n  I noticed it's broken after merging #441, this PR should fix it.\n\n \n[…]\nsschwab:\n    ACK d3fe261679caa76a604ed950c248b7e7982408ef\n\nTree-SHA512: 92526486fd4719715e8a63eed007701094d5369afa51b98ebf5d5f98a3c043c9360b9f8ac82c234bbed402e4b89d53a8c49dd523b8663d4033bf6067179f13a5",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#466: fix(ci): pin `idna_adapter` to `1…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-28T04:29:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d3fe261679caa76a604ed950c248b7e7982408ef",
          "body": null,
          "is_bot": false,
          "headline": "fix(ci): pin `idna_adapter` to `1.2.1`",
          "author_name": "Leonardo Lima",
          "author_login": "oleonardolima",
          "committed_at": "2026-04-27T19:17:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ec014604265fad4367747cd8041c08303057afc",
          "body": "…alpha.0\n\nc55875d5483261e99a9e417c04276ce3999b68dc chore: bump rust-toolchain to 1.95.0 (valued mammal)\ned044de800c855459de49b40f621169f543c6546 chore: bump dev version to 3.1.0-alpha.0 (valued mammal)\n\nPull request description:\n\n  ### Description\n\n  This PR bumps the package version in `Cargo.toml`\n[…]\nrdolima:\n    ACK c55875d5483261e99a9e417c04276ce3999b68dc\n\nTree-SHA512: 4cfa1e9bb4c9318a6eb5f883776e5eb5a00386f4488e68369052d85517fb65b2e5a6fc0d6e88b81db94908abf094824bbc0d7cf804f5cf2e15e15ff23640a694",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#441: chore: bump dev version to 3.1.0-…",
          "author_name": "merge-script",
          "author_login": "oleonardolima",
          "committed_at": "2026-04-27T19:01:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c55875d5483261e99a9e417c04276ce3999b68dc",
          "body": "Clean up unused code in `test_get_funded_wallet_sent_and_received`.",
          "is_bot": false,
          "headline": "chore: bump rust-toolchain to 1.95.0",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-27T11:53:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f44b7af09b776499773703453cd5960b06456396",
          "body": "…ides\n\n68dccaff28fa2a92ca158d1ac95b41b3221e326c chore: allow local justfile overrides (Saad Hassan)\n\nPull request description:\n\n  ### Description\n\n  Closes #401\n\n  Adds support for local justfile overrides by including an optional `justfile.local` import at the top of the repository justfiles.\n\n  Th\n[…]\nCK 68dccaff28fa2a92ca158d1ac95b41b3221e326c. Works great!\n\nTree-SHA512: a4720c33749df587ba9671c254c6114ef8ea0e0170e607a770cc0f00a690a0db9dc3bdc4566441d654b8c2aeef75f9c8f21112313a7592e8e37e51b0c8858d54",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#460: chore: allow local justfile overr…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-24T21:12:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ed044de800c855459de49b40f621169f543c6546",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump dev version to 3.1.0-alpha.0",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-24T16:13:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0217d85764b6c682c50f8b23ef475fbb81612445",
          "body": "… binding names in `l:` and `u:` fragment modifiers\n\n5d158a4e064a00b1d15090cfa2e548be01c71a85 fix(descriptor): correct variable binding names in `l:` and `u:` fragment modifiers (Elias Rohrer)\n\nPull request description:\n\n  ### Description\n  The `l:` arm bound `a_networks_kinds` but referenced `a_net\n[…]\n4e064a00b1d15090cfa2e548be01c71a85; ran the tests locally\n\nTree-SHA512: b69f2832a077dd798e488962ff7bbd44ef660704941e40b2ad82d9c91629627740842e3393d82e317ab537c0afe4ef7674a3ee18b63337674fc24808f0145959",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#454: fix(descriptor): correct variable…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-24T16:08:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5d158a4e064a00b1d15090cfa2e548be01c71a85",
          "body": "…ment modifiers\n\nThe `l:` arm bound `a_networks_kinds` but referenced `a_network_kinds`,\nand the `u:` arm bound `a_networks` but referenced `a_network_kinds`.\nBoth closures silently captured the wrong variable from an outer scope,\nwhich could produce incorrect network kind filtering results.\n\nCo-Authored-By: HAL 9000\nSigned-off-by: Elias Rohrer <dev@tnull.de>",
          "is_bot": false,
          "headline": "fix(descriptor): correct variable binding names in `l:` and `u:` frag…",
          "author_name": "Elias Rohrer",
          "author_login": "tnull",
          "committed_at": "2026-04-24T14:59:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0302e9760b63565c81aaae86af407f1d9a7074a",
          "body": "Previously, non_witness_utxo was only validated when witness_utxo was\nNone. An attacker could supply both a valid witness_utxo and a\nnon_witness_utxo with the wrong txid, bypassing the txid/outpoint\nchecks entirely.\n\nRestructure the validation so non_witness_utxo is always checked when\npresent, regardless of whether witness_utxo is also set. Only require\nat least one of the two to exist.\n\nCo-Authored-By: HAL 9000\nSigned-off-by: Elias Rohrer <dev@tnull.de>",
          "is_bot": false,
          "headline": "fix: always validate non_witness_utxo in add_foreign_utxo",
          "author_name": "Elias Rohrer",
          "author_login": "tnull",
          "committed_at": "2026-04-24T07:54:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da6c61d50b6360b09352b04086e0ed6916c5a50d",
          "body": "The IntoDescriptorKey impl for DescriptorSecretKey was missing a\nMultiXPrv match arm, causing mainnet MultiXPrv keys to fall through\nto the catch-all and receive test_network_kind() instead of\nmainnet_network_kind().\n\nAlso add MultiXPub/MultiXPrv handling to the network fixup code in\ndescriptor/mod.rs, which previously only fixed up XPub/XPrv pairs.\n\nCo-Authored-By: HAL 9000\nSigned-off-by: Elias Rohrer <dev@tnull.de>",
          "is_bot": false,
          "headline": "fix: handle MultiXPrv/MultiXPub in network kind detection and fixup",
          "author_name": "Elias Rohrer",
          "author_login": "tnull",
          "committed_at": "2026-04-24T07:52:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "507f08a981e69a6c381f487b715c6a324638ea6b",
          "body": "The verify_key closure in derive_from_psbt_key_origins called\n.expect() on xpub.derive_pub(), which panics when the derivation\npath contains hardened steps. Since PSBT data is untrusted, a\nmaliciously crafted bip32_derivation entry with hardened steps could\ncrash the application.\n\nReplace the panic with graceful error handling by returning false\non derivation failure.\n\nCo-Authored-By: HAL 9000\nSigned-off-by: Elias Rohrer <dev@tnull.de>",
          "is_bot": false,
          "headline": "fix: avoid panic on hardened derivation paths in PSBT key origins",
          "author_name": "Elias Rohrer",
          "author_login": "tnull",
          "committed_at": "2026-04-24T07:51:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68dccaff28fa2a92ca158d1ac95b41b3221e326c",
          "body": null,
          "is_bot": false,
          "headline": "chore: allow local justfile overrides",
          "author_name": "Saad Hassan",
          "author_login": "Shgit29",
          "committed_at": "2026-04-24T07:50:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "35a87f3fd9a40d8882c15e2cb96517fb54a5e77f",
          "body": "…FeeRate::from_sat_per_vb_unchecked\n\nbe710a80c694391428a853eee61fe3967ed05034 chore(tests): replace deprecated FeeRate::from_sat_per_vb_unchecked (none34829)\n\nPull request description:\n\n  ### Description\n\n  `bitcoin-units 0.1.3` deprecated `FeeRate::from_sat_per_vb_unchecked` in favor of `FeeRate::f\n[…]\ndMammal:\n    ACK be710a80c694391428a853eee61fe3967ed05034\n\nTree-SHA512: b2354fcf6e39228bc5796f92af4d3692fbdb750267c2c5a7d814fc5c84f4af64b746562fda7e01dac282ba04acb17ff7bf5c7ef0155a3d6f302974003baf0629",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#455: chore(tests): replace deprecated …",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-23T20:50:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "be710a80c694391428a853eee61fe3967ed05034",
          "body": null,
          "is_bot": false,
          "headline": "chore(tests): replace deprecated FeeRate::from_sat_per_vb_unchecked",
          "author_name": "none34829",
          "author_login": "none34829",
          "committed_at": "2026-04-23T20:24:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44abb689042ca3fb9b6a182bdeb9eaccd682fff6",
          "body": "…s_result` returns the required UTXOs first\n\n8a5e76309b54443c65d7a89aa36ab2fa9b8d3e3a test(tx_builder): Add `test_add_utxo_final_outpoint_retained` (valued mammal)\n0b5d92702b0666f9f5aa2a57a8f77b9f67228dcb test(wallet): Add `test_tx_ordering_untouched_preserves_insertion_ordering_bnb_success` (valued\n[…]\nll/390/commits/8a5e76309b54443c65d7a89aa36ab2fa9b8d3e3a).\n\nTree-SHA512: 4ebf33f7d1fe6e6dcfff89e218aeefcec92ae8ae78c2589d7f496b433991122f48100be38ffa52b8fc2d67feb679d567a707dea8681810167eac1a6a04f9dcc0",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#390: fix(coin_selection): `calculate_c…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-22T20:18:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fbf803a6bb4aa8a1d097ef6673acfbf1a1c612ba",
          "body": "…comment in `create_tx`\n\n76a8cc6da25fcc40dc17cd29b4ca5677d47a604f docs(wallet): fix misleading RBF comment in `create_tx` (Vadim Anufriev)\n\nPull request description:\n\n  ### Description\n\n  Fix misleading comment in `create_tx` regarding empty tx output logic. This addresses a documentation nitpick br\n[…]\nsschwab:\n    ACK 76a8cc6da25fcc40dc17cd29b4ca5677d47a604f\n\nTree-SHA512: 6a788ffafbf195da2b6ef39b605319aec480dea8896dedc38a0244e3902e7f697611725ddfe81ca25204916802b4a6c5784d96ee1e78d21a003acdd3d8ef081f",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#422: docs(wallet): fix misleading RBF …",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-14T22:52:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f5a4c3856acd7095f5af7cab6c399fb5f15cefe1",
          "body": "…o_path_descriptor` method\n\nc4dbe422cd703c02cf3842264d140772be9575b2 feat(wallet): add `LoadParams::two_path_descriptor` method (Yuki Kishimoto)\n\nPull request description:\n\n  ### Description\n\n  Added `LoadParams::two_path_descriptor` to validate that both the external and internal wallet descriptors\n[…]\n Dmenec:\n    ACK c4dbe422cd703c02cf3842264d140772be9575b2\n\nTree-SHA512: 7afe2cf7b6752fa7e52f5f47b5066e8ea5af894dbcb1df9c0cdfecf7eaffa43158b2cd5fc225d7892ec01933ea88e0dadd8700de92688911809727ad5283bb6f",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#418: feat(wallet): add `LoadParams::tw…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-14T22:26:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cf543ff6abace57bb3a2d023efd8ac4af9a4f690",
          "body": "…nection` persister to transaction persister\n\nb8dfff80fbc24872aae01ac5be62da5e8e680de3 refactor: Delegate Connection persister to transaction persister (shinigami-777)\n\nPull request description:\n\n  Fixes #279\n\n  ### Description\n\n  The `WalletPersister` implementations for `rusqlite::Connection` and \n[…]\ndMammal:\n    ACK b8dfff80fbc24872aae01ac5be62da5e8e680de3\n\nTree-SHA512: 0bf12f10f6173a77f3e204ae01d05b3b87926dff3ec0cc4e4dd1a3d2eb6b6885900c52cf272ac1953ad6038722515c532b29ba8b3f5e5271fa635f1ac59cf06c",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#421: refactor: Delegate `rusqlite::Con…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-14T22:15:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b8dfff80fbc24872aae01ac5be62da5e8e680de3",
          "body": null,
          "is_bot": false,
          "headline": "refactor: Delegate Connection persister to transaction persister",
          "author_name": "shinigami-777",
          "author_login": "shinigami-777",
          "committed_at": "2026-04-14T21:33:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5df32ca707e859506e8198f1f102aed87a837bf0",
          "body": "34931fc9be059ec14d7bf101d9d16e04633d324a chore: Release 3.0.0 (valued mammal)\n8a9faa8bb77550b9303601232dbc4c1b3203f7a6 chore: Update CHANGELOG.md (valued mammal)\n42c34d4883dffc9a54ff1fe3d7ff4772f4448e4f deps: Update bdk dependencies (valued mammal)\n\nPull request description:\n\n  ### Description\n\n  Th\n[…]\nsschwab:\n    ACK 34931fc9be059ec14d7bf101d9d16e04633d324a\n\nTree-SHA512: 2b05fc555a0c40ebcc256615e408164fc3ce1644fd0def40ac2460e2fab22ee97d7c179612fedde56db40d5ac8c36d9ba2c3cf1e0883afb31d44d4f3a0889633",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#432: chore: Release 3.0.0",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-13T01:29:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "67fa46eb0530bea7d755448b628788aae15c2191",
          "body": "Add a `SECURITY.md` listing the security PGP key to be used for disclosures:",
          "is_bot": false,
          "headline": "feat(doc): add `SECURITY.md`",
          "author_name": "Luis Schwab",
          "author_login": "luisschwab",
          "committed_at": "2026-04-10T19:24:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76a8cc6da25fcc40dc17cd29b4ca5677d47a604f",
          "body": "- Replace incorrect RBF example with sweeping UTXOs\n- Reorder comment items to match the code's condition order",
          "is_bot": false,
          "headline": "docs(wallet): fix misleading RBF comment in `create_tx`",
          "author_name": "Vadim Anufriev",
          "author_login": null,
          "committed_at": "2026-04-07T11:43:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34931fc9be059ec14d7bf101d9d16e04633d324a",
          "body": null,
          "is_bot": false,
          "headline": "chore: Release 3.0.0",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-06T19:00:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a9faa8bb77550b9303601232dbc4c1b3203f7a6",
          "body": null,
          "is_bot": false,
          "headline": "chore: Update CHANGELOG.md",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-06T19:00:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42c34d4883dffc9a54ff1fe3d7ff4772f4448e4f",
          "body": "`bdk_chain` 0.23.2 -> 0.23.3\n`bdk_file_store` 0.21.1 -> 0.22.0\n`bdk_bitcoind_rpc` 0.21.0 -> 0.22.0",
          "is_bot": false,
          "headline": "deps: Update bdk dependencies",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-06T18:44:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb7681ab83634dd7cc71b4908b385e38b8db6bef",
          "body": "8b4a51ec9408b238184b353415a118b62a223e4d fix(docs): use correct `intra-doc-links` (Leonardo Lima)\ndbf3d8e5f1ebe55dbb2cd92c41e08decfd24421d ci: add job to check `cargo doc` (Leonardo Lima)\n2f2346e58ed10e4b0865940b4db6ff7a3cbb933a fix(ci): pin required `icu_*` dependencies (Leonardo Lima)\n\nPull reques\n[…]\nsschwab:\n    ACK 8b4a51ec9408b238184b353415a118b62a223e4d\n\nTree-SHA512: 9fbe0190776c348867b13c06ec6f2c272fe5ee41995f3ff5898b7d149affc5e602d8afa06669702af7a04ad15bb2a7c940110830cd7e11116c4974ceda423877",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#416: ci: add docs check job",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-04-02T17:03:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8b4a51ec9408b238184b353415a118b62a223e4d",
          "body": null,
          "is_bot": false,
          "headline": "fix(docs): use correct `intra-doc-links`",
          "author_name": "Leonardo Lima",
          "author_login": "oleonardolima",
          "committed_at": "2026-04-02T14:47:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dbf3d8e5f1ebe55dbb2cd92c41e08decfd24421d",
          "body": null,
          "is_bot": false,
          "headline": "ci: add job to check `cargo doc`",
          "author_name": "Leonardo Lima",
          "author_login": "oleonardolima",
          "committed_at": "2026-04-02T14:47:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f2346e58ed10e4b0865940b4db6ff7a3cbb933a",
          "body": null,
          "is_bot": false,
          "headline": "fix(ci): pin required `icu_*` dependencies",
          "author_name": "Leonardo Lima",
          "author_login": "oleonardolima",
          "committed_at": "2026-04-02T14:47:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a5e76309b54443c65d7a89aa36ab2fa9b8d3e3a",
          "body": "Check that for repeated calls to `add_utxo`, given the same outpoint,\nthe final insertion takes effect.\n\nConsolidate `use` statements in `tx_builder::test` mod.\n\nCo-authored-by: codingp110 <codingp110@gmail.com>",
          "is_bot": false,
          "headline": "test(tx_builder): Add `test_add_utxo_final_outpoint_retained`",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-03-30T17:32:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b5d92702b0666f9f5aa2a57a8f77b9f67228dcb",
          "body": "…ering_bnb_success`\n\nThe test is set up in such a way that BnB can find a solution\nand demonstrates that `calculate_cs_result` correctly places\nrequired UTXOs before selected ones.",
          "is_bot": false,
          "headline": "test(wallet): Add `test_tx_ordering_untouched_preserves_insertion_ord…",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-03-30T17:32:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e020391c8e7f2feb4e74ceae4652db9006afb778",
          "body": "… first\n\nPreviously `calculate_cs_result` produced a CoinSelectionResult by\nappending the required utxos onto the selected ones, which changed\nthe order of transaction inputs when TxOrdering::Untouched was\nspecified. The intended behavior is for the order of the inputs\nto match the order in which the utxos were added to the TxBuilder.\nWe fix this by extending the required_utxos Vec with the\nselected_utxos before returning the CoinSelectionResult.",
          "is_bot": false,
          "headline": "fix(coin_selection): `calculate_cs_result` returns the required UTXOs…",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-03-30T17:32:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "826b19f59086b954cc300c0378f372720be4fab9",
          "body": "…-action from 5.5.2 to 6.0.0\n\nf3dfc2d706b435326d1271c00105f723df9e3462 build(deps): bump codecov/codecov-action from 5.5.2 to 6.0.0 (dependabot[bot])\n\nPull request description:\n\n  Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.5.2 to 6.0.0.\n  <details>\n  <summary>Re\n[…]\ndMammal:\n    ACK f3dfc2d706b435326d1271c00105f723df9e3462\n\nTree-SHA512: 35ace2b145609ae439323ae8666cf1ed8180bb91a1b9b3604e750de733507f5a9bbbeb81db93cf3be0b3713159d763144283ac28b5628da31fd7c1870beae8ea",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#424: build(deps): bump codecov/codecov…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-03-30T16:34:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ad0a5d14dea0d66c0eaf54be26b22de459e6c7b6",
          "body": "…ache from 2.8.2 to 2.9.1\n\n2c637ae58ce42dfebcc8758a5d5dd31e7286d5c9 build(deps): bump Swatinem/rust-cache from 2.8.2 to 2.9.1 (dependabot[bot])\n\nPull request description:\n\n  Bumps [Swatinem/rust-cache](https://github.com/swatinem/rust-cache) from 2.8.2 to 2.9.1.\n  <details>\n  <summary>Release notes<\n[…]\ndMammal:\n    ACK 2c637ae58ce42dfebcc8758a5d5dd31e7286d5c9\n\nTree-SHA512: 0d6f5141adea83969a93cfeded1b15d491b61e22c0116e7c774bb2a1f2b55e4aeb20b1d3d8710070b59b6c282c47e4926fe29e60086cf21d8bae86aa76ecf445",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#406: build(deps): bump Swatinem/rust-c…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-03-30T16:07:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ea9d1e54fce5f8812d0b51f58d4baca381881eb5",
          "body": "…artifact from 6 to 7\n\ne941d06ea2dd5fb357719855f790893c32dd8a72 build(deps): bump actions/upload-artifact from 6 to 7 (dependabot[bot])\n\nPull request description:\n\n  Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.\n  <details>\n  <summary>Release notes</summary\n[…]\ndMammal:\n    ACK e941d06ea2dd5fb357719855f790893c32dd8a72\n\nTree-SHA512: de417542392d54d29e6ef1c0e7016b34ae09fc1ffe42759cb48e526da63b43ccd2dc67c5b473a9da6e6b0b0b2a546719243ad87c4d3f8792b8ec128e7d0feea9",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#389: build(deps): bump actions/upload-…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-03-30T15:37:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bf547c8d029e1304cfb323f40c2110bb8d4329c2",
          "body": "…ble (1.94.0)\n\nd16fa8c5ea9b67d9e4950d86722626912fa6f3d7 build: Bump Rust compiler version to stable (1.94.0) (thunderbiscuit)\n\nPull request description:\n\n  This is just a bump of the default compiler version specified in `rust-toolchain.toml` to [1.94.0, the latest stable](https://releases.rs/).\n\nAC\n[…]\ndMammal:\n    ACK d16fa8c5ea9b67d9e4950d86722626912fa6f3d7\n\nTree-SHA512: daa1f073e3b1c722efea1aa2e8d11fefb47451e2569ca106457baebcac3820340222d4a8292bd7e7a164d9604752f32b33c2f377018365e1ed866bdb0ab94517",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#407: Bump Rust compiler version to sta…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-03-30T13:36:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f3dfc2d706b435326d1271c00105f723df9e3462",
          "body": "Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.5.2 to 6.0.0.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/c\n[…]\nndency-name: codecov/codecov-action\n  dependency-version: 6.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "build(deps): bump codecov/codecov-action from 5.5.2 to 6.0.0",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-03-30T03:55:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c4dbe422cd703c02cf3842264d140772be9575b2",
          "body": "Signed-off-by: Yuki Kishimoto <yukikishimoto@protonmail.com>",
          "is_bot": false,
          "headline": "feat(wallet): add `LoadParams::two_path_descriptor` method",
          "author_name": "Yuki Kishimoto",
          "author_login": "yukibtc",
          "committed_at": "2026-03-28T08:01:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e202c8c6f376dbe00c3c38623670f2e6f1fd44a",
          "body": "79783c5e6fa2cb1914d80122acf787d659c15af7 chore: bump version to `3.0.0-rc.2` (valued mammal)\nd8f6fa38fe3950a9efb72e2502de278c0dc48e41 chore: Update `CHANGELOG.md` (valued mammal)\n\nPull request description:\n\n  ### Description\n\n  Update the `CHANGELOG.md` with merged PRs since `3.0.0-rc.1` ([compare](\n[…]\nrdolima:\n    ACK 79783c5e6fa2cb1914d80122acf787d659c15af7\n\nTree-SHA512: b62dc2d549540da9a8f8c3a2f4c4f91ef6fe691638007bd8083476998d71cbb8c6cbf0145b711b8b21f875a2a70883563e46ed9c838907c25076b1ebd981fe17",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#417: chore: bump version to `3.0.0-rc.2`",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-03-25T23:51:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "79783c5e6fa2cb1914d80122acf787d659c15af7",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to `3.0.0-rc.2`",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-03-25T17:00:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8f6fa38fe3950a9efb72e2502de278c0dc48e41",
          "body": null,
          "is_bot": false,
          "headline": "chore: Update `CHANGELOG.md`",
          "author_name": "valued mammal",
          "author_login": "ValuedMammal",
          "committed_at": "2026-03-25T17:00:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb2c7edca80f32c7aeb443684367eaec3146f69d",
          "body": "…et_keychains migration helper\n\nc73097363aa1ed801bf10fea3bf54742ea68b70c fix(rusqlite): fix get_pre_v1_wallet_keychains migration helper (Steve Myers)\n\nPull request description:\n\n  ### Description\n\n  While working on bitcoindevkit/book-of-bdk#141 I found some very rough edges with how I'd implemente\n[…]\ndolima:\n    tACK c73097363aa1ed801bf10fea3bf54742ea68b70c\n\nTree-SHA512: bcc4f51522cb2260a4d393c65091a931d90a5b910906d967d660104be3805677b6afb4976bd23f9f2da209d879d7031f9b11ddb5d1e9b6f8136b344f16cc324d",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#411: fix(rusqlite): fix get_pre_1_wall…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-03-23T22:34:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c73097363aa1ed801bf10fea3bf54742ea68b70c",
          "body": "- add PreV1MigrationError\n- rename Pre1WalletKeychain to PreV1WalletKeychain\n- rename get_pre_1_wallet_keychains to get_pre_v1_wallet_keychains\n- change PreV1WalletKeychain::keychain to KeychainKind\n- change PreV1WalletKeychain::checksum to String\n- refactored and expanded migration tests with LLM 🤖\n- style: require `rusqlite` feature in migration mod\n- apply `[cfg(feature = \"rusqlite\")] for `migration` module instead of\n  having multiple ones in `migration.rs`.",
          "is_bot": false,
          "headline": "fix(rusqlite): fix get_pre_v1_wallet_keychains migration helper",
          "author_name": "Steve Myers",
          "author_login": "notmandatory",
          "committed_at": "2026-03-23T20:34:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d4adae088068076d5a8b57e29a764e199b7c36d",
          "body": "…Time` without panicking\n\n6980403a77788f2e131dfe625049a8ed429e889b fix(dsl): handle invalid AbsLockTime without panicking (AmosOO7)\n\nPull request description:\n\n  ## Summary\n  This PR fixes a potential panic in the descriptor! DSL macro when provided with an invalid absolute locktime. Previously, the\n[…]\ndMammal:\n    ACK 6980403a77788f2e131dfe625049a8ed429e889b\n\nTree-SHA512: aa0b90261a90c55ce9777dc4ec8009701a42716a4a5b6d46d94005185e9a85d904f70b2cbcab2f464e42e3e6360c4eec1b306f1cce887ce6d36638ced43b8a83",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#409: fix(dsl): handle invalid `AbsLock…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-03-20T06:09:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6980403a77788f2e131dfe625049a8ed429e889b",
          "body": "Previously, the `after()` macro in the descriptor DSL used `.expect()`\nwhen calling `AbsLockTime::from_consensus()`. This caused the macro to\npanic and crash the program if an invalid value was provided.\n\nThis commit:\n- Updates the `after()` macro rule to handle `Result` from `from_consensus`.\n- Map\n[…]\nAdds comprehensive unit tests for valid heights, timestamps, and\ninvalid boundary values.\n\nFixes a potential panic when using the `descriptor!` macro with untrusted\nor out-of-range absolute locktimes.",
          "is_bot": false,
          "headline": "fix(dsl): handle invalid AbsLockTime without panicking",
          "author_name": "AmosOO7",
          "author_login": "AmosOO7",
          "committed_at": "2026-03-20T06:03:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a9104442a62ad20f242af4134d97c8ca58ddc7c1",
          "body": "…Time` without panicking\n\ne101b9ee43b9826aba96feee60b0018a0796ef8f fix(dsl): handle invalid RelLockTime without panicking (AmosOO7)\n\nPull request description:\n\n  ## Summary\n\n  This PR fixes a panic that occurred when the `descriptor!` DSL macro was invoked with an out-of-range relative locktime valu\n[…]\ndMammal:\n    ACK e101b9ee43b9826aba96feee60b0018a0796ef8f\n\nTree-SHA512: 5003ed99ef55582f1444611e987314af4e7df3d485fbf14088c6df3299ca52d3e62333d5d002f8e01068b90b2b65c91d4bccf78505a4f303ebbfbc30aaee9cff",
          "is_bot": false,
          "headline": "Merge bitcoindevkit/bdk_wallet#404: fix(dsl): handle invalid `RelLock…",
          "author_name": "merge-script",
          "author_login": "ValuedMammal",
          "committed_at": "2026-03-20T05:28:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e101b9ee43b9826aba96feee60b0018a0796ef8f",
          "body": "The `descriptor!` DSL previously used `.expect(\"valid RelLockTime\")`\nwhen converting an integer into `miniscript::RelLockTime`, causing a\npanic for out-of-range values (e.g. values with the high bit set).\n\nThis change returns\n`DescriptorError::Miniscript(Error::RelativeLockTimeError)` for\ninvalid values, so callers can handle errors cleanly instead of\ncrashing.\n\nIncludes new tests verifying valid/invalid values and ensuring the\nmacro no longer panics.\n\nRan cargo fmt and cargo clippy, and just p",
          "is_bot": false,
          "headline": "fix(dsl): handle invalid RelLockTime without panicking",
          "author_name": "AmosOO7",
          "author_login": "AmosOO7",
          "committed_at": "2026-03-20T05:16:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d16fa8c5ea9b67d9e4950d86722626912fa6f3d7",
          "body": null,
          "is_bot": false,
          "headline": "build: Bump Rust compiler version to stable (1.94.0)",
          "author_name": "thunderbiscuit",
          "author_login": "thunderbiscuit",
          "committed_at": "2026-03-16T14:05:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 13,
      "commits_last_year": 240,
      "latest_release_at": "2026-06-14T03:57:03Z",
      "latest_release_tag": "v3.1.0",
      "releases_from_tags": false,
      "days_since_last_push": 3,
      "active_weeks_last_year": 46,
      "days_since_latest_release": 42,
      "mean_days_between_releases": 42.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 87,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "bdk_wallet",
          "exists": true,
          "license": "MIT OR Apache-2.0",
          "keywords": [
            "bitcoin",
            "descriptor",
            "psbt",
            "wallet"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/bdk_wallet",
          "is_deprecated": false,
          "latest_version": "3.1.0",
          "repository_url": "https://github.com/bitcoindevkit/bdk_wallet",
          "versions_count": 23,
          "total_downloads": 1079408,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 116892,
          "first_published_at": "2024-02-06T15:26:35.643118Z",
          "latest_published_at": "2026-06-14T03:51:37.668443Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 42
        }
      ]
    },
    "popularity": {
      "forks": 95,
      "stars": 54,
      "watchers": 13,
      "fork_history": {
        "days": [
          {
            "date": "2025-04-03",
            "count": 3
          },
          {
            "date": "2025-04-05",
            "count": 1
          },
          {
            "date": "2025-04-06",
            "count": 1
          },
          {
            "date": "2025-04-07",
            "count": 1
          },
          {
            "date": "2025-04-08",
            "count": 2
          },
          {
            "date": "2025-04-09",
            "count": 1
          },
          {
            "date": "2025-04-10",
            "count": 1
          },
          {
            "date": "2025-04-12",
            "count": 1
          },
          {
            "date": "2025-04-17",
            "count": 2
          },
          {
            "date": "2025-04-24",
            "count": 3
          },
          {
            "date": "2025-04-25",
            "count": 1
          },
          {
            "date": "2025-05-02",
            "count": 2
          },
          {
            "date": "2025-05-09",
            "count": 2
          },
          {
            "date": "2025-05-19",
            "count": 1
          },
          {
            "date": "2025-05-31",
            "count": 1
          },
          {
            "date": "2025-06-02",
            "count": 1
          },
          {
            "date": "2025-06-09",
            "count": 1
          },
          {
            "date": "2025-06-11",
            "count": 1
          },
          {
            "date": "2025-06-27",
            "count": 1
          },
          {
            "date": "2025-07-02",
            "count": 1
          },
          {
            "date": "2025-07-04",
            "count": 1
          },
          {
            "date": "2025-07-20",
            "count": 1
          },
          {
            "date": "2025-07-31",
            "count": 1
          },
          {
            "date": "2025-08-04",
            "count": 1
          },
          {
            "date": "2025-08-05",
            "count": 1
          },
          {
            "date": "2025-08-06",
            "count": 1
          },
          {
            "date": "2025-08-11",
            "count": 1
          },
          {
            "date": "2025-08-21",
            "count": 1
          },
          {
            "date": "2025-10-02",
            "count": 2
          },
          {
            "date": "2025-10-06",
            "count": 1
          },
          {
            "date": "2025-10-28",
            "count": 1
          },
          {
            "date": "2025-10-29",
            "count": 1
          },
          {
            "date": "2025-11-06",
            "count": 1
          },
          {
            "date": "2025-11-11",
            "count": 1
          },
          {
            "date": "2025-12-17",
            "count": 1
          },
          {
            "date": "2025-12-18",
            "count": 1
          },
          {
            "date": "2025-12-26",
            "count": 2
          },
          {
            "date": "2025-12-31",
            "count": 1
          },
          {
            "date": "2026-01-10",
            "count": 1
          },
          {
            "date": "2026-01-15",
            "count": 1
          },
          {
            "date": "2026-02-02",
            "count": 1
          },
          {
            "date": "2026-02-06",
            "count": 1
          },
          {
            "date": "2026-02-08",
            "count": 2
          },
          {
            "date": "2026-02-11",
            "count": 1
          },
          {
            "date": "2026-02-20",
            "count": 1
          },
          {
            "date": "2026-02-22",
            "count": 1
          },
          {
            "date": "2026-02-25",
            "count": 1
          },
          {
            "date": "2026-03-01",
            "count": 1
          },
          {
            "date": "2026-03-03",
            "count": 1
          },
          {
            "date": "2026-03-04",
            "count": 1
          },
          {
            "date": "2026-03-07",
            "count": 1
          },
          {
            "date": "2026-03-18",
            "count": 1
          },
          {
            "date": "2026-03-25",
            "count": 1
          },
          {
            "date": "2026-03-26",
            "count": 1
          },
          {
            "date": "2026-03-27",
            "count": 2
          },
          {
            "date": "2026-04-01",
            "count": 1
          },
          {
            "date": "2026-04-02",
            "count": 1
          },
          {
            "date": "2026-04-07",
            "count": 3
          },
          {
            "date": "2026-04-08",
            "count": 1
          },
          {
            "date": "2026-04-10",
            "count": 1
          },
          {
            "date": "2026-04-18",
            "count": 1
          },
          {
            "date": "2026-04-22",
            "count": 1
          },
          {
            "date": "2026-04-23",
            "count": 2
          },
          {
            "date": "2026-04-24",
            "count": 2
          },
          {
            "date": "2026-05-01",
            "count": 1
          },
          {
            "date": "2026-05-04",
            "count": 1
          },
          {
            "date": "2026-05-07",
            "count": 2
          },
          {
            "date": "2026-05-11",
            "count": 1
          },
          {
            "date": "2026-05-13",
            "count": 1
          },
          {
            "date": "2026-06-01",
            "count": 1
          },
          {
            "date": "2026-06-09",
            "count": 1
          },
          {
            "date": "2026-06-30",
            "count": 1
          },
          {
            "date": "2026-07-08",
            "count": 1
          },
          {
            "date": "2026-07-09",
            "count": 1
          },
          {
            "date": "2026-07-10",
            "count": 1
          },
          {
            "date": "2026-07-12",
            "count": 1
          },
          {
            "date": "2026-07-13",
            "count": 1
          },
          {
            "date": "2026-07-26",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 95,
        "total_forks": 95
      },
      "star_history": null,
      "open_issues_and_prs": 194
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "examples/justfile",
        "justfile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "Cargo.toml"
      ],
      "largest_source_bytes": 165781,
      "source_files_sampled": 45,
      "oversized_source_files": 4,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "Cargo.toml"
      ],
      "advisories": {
        "error": "No resolved dependencies carried a version and a supported ecosystem",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 19,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "crates"
      ],
      "dependencies": [
        {
          "name": "bdk_chain",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.23.3"
        },
        {
          "name": "bdk_tx",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2.0"
        },
        {
          "name": "bitcoin",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.32.8"
        },
        {
          "name": "miniscript",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "12.3.5"
        },
        {
          "name": "rand_core",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.6.4"
        },
        {
          "name": "serde_json",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "anyhow",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "bdk_file_store",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.22.0"
        },
        {
          "name": "bip39",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2.2.2"
        },
        {
          "name": "tempfile",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3.26.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "anyhow",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "bdk_chain",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "bdk_file_store",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "bdk_tx",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "bip39",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "bitcoin",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "miniscript",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "rand_core",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "serde",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "serde_json",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "tempfile",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "assert_matches",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "bdk_bitcoind_rpc",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "bdk_electrum",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "bdk_esplora",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "clap",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "ctrlc",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "rand",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "tokio",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 19,
        "direct_count": 11,
        "indirect_count": 8
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 40,
        "merged_prs": 134,
        "open_issues": 154,
        "closed_ratio": 0.452,
        "closed_issues": 127,
        "closed_unmerged_prs": 48
      },
      "bus_factor": 3,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "notmandatory",
          "commits": 593,
          "avatar_url": "https://avatars.githubusercontent.com/u/4724730?v=4"
        },
        {
          "type": "User",
          "login": "afilini",
          "commits": 451,
          "avatar_url": "https://avatars.githubusercontent.com/u/3058409?v=4"
        },
        {
          "type": "User",
          "login": "evanlinjin",
          "commits": 422,
          "avatar_url": "https://avatars.githubusercontent.com/u/14065705?v=4"
        },
        {
          "type": "User",
          "login": "ValuedMammal",
          "commits": 293,
          "avatar_url": "https://avatars.githubusercontent.com/u/95981133?v=4"
        },
        {
          "type": "User",
          "login": "danielabrozzoni",
          "commits": 175,
          "avatar_url": "https://avatars.githubusercontent.com/u/25042473?v=4"
        },
        {
          "type": "User",
          "login": "LLFourn",
          "commits": 151,
          "avatar_url": "https://avatars.githubusercontent.com/u/3734083?v=4"
        },
        {
          "type": "User",
          "login": "RCasatta",
          "commits": 92,
          "avatar_url": "https://avatars.githubusercontent.com/u/6470319?v=4"
        },
        {
          "type": "User",
          "login": "luisschwab",
          "commits": 49,
          "avatar_url": "https://avatars.githubusercontent.com/u/97608688?v=4"
        },
        {
          "type": "User",
          "login": "tcharding",
          "commits": 49,
          "avatar_url": "https://avatars.githubusercontent.com/u/12626037?v=4"
        },
        {
          "type": "User",
          "login": "oleonardolima",
          "commits": 47,
          "avatar_url": "https://avatars.githubusercontent.com/u/16902160?v=4"
        }
      ],
      "contributors_sampled": 98,
      "top_contributor_share": 0.22
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "audit.yml",
        "code_coverage.yml",
        "cont_integration.yml",
        "stale.yml",
        "zizmor.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 4,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "10 out of 10 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 7,
            "reason": "Found 5/7 approved changesets -- score normalized to 7",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 40 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 9,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 1,
            "reason": "dependency not pinned by hash detected -- score normalized to 1",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 10,
            "reason": "SAST tool is run on all commits",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 9,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "e6e3ddfa3cbb5b551dcbe4268602ff8242d5ea42",
        "ran_at": "2026-07-26T23:35:33Z",
        "aggregate_score": 7.9,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-26T02:00:53Z",
      "oldest_open_prs": [
        {
          "number": 206,
          "created_at": "2025-04-10T14:42:59Z",
          "last_comment_at": "2025-12-23T17:11:18Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 216,
          "created_at": "2025-04-24T13:08:00Z",
          "last_comment_at": "2026-07-13T12:03:46Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 222,
          "created_at": "2025-04-29T08:08:55Z",
          "last_comment_at": "2026-02-19T16:41:44Z",
          "last_comment_author": "Musab1258"
        },
        {
          "number": 229,
          "created_at": "2025-05-09T15:28:05Z",
          "last_comment_at": "2026-01-28T05:22:46Z",
          "last_comment_author": "evanlinjin"
        },
        {
          "number": 271,
          "created_at": "2025-06-24T14:31:12Z",
          "last_comment_at": "2026-03-06T16:55:58Z",
          "last_comment_author": "oleonardolima"
        },
        {
          "number": 276,
          "created_at": "2025-07-08T18:44:52Z",
          "last_comment_at": "2026-07-13T12:03:53Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 318,
          "created_at": "2025-09-24T18:10:08Z",
          "last_comment_at": "2026-07-17T19:29:25Z",
          "last_comment_author": "ValuedMammal"
        },
        {
          "number": 334,
          "created_at": "2025-10-28T11:58:02Z",
          "last_comment_at": "2025-12-04T19:29:52Z",
          "last_comment_author": "GideonBature"
        },
        {
          "number": 343,
          "created_at": "2025-11-07T21:09:46Z",
          "last_comment_at": "2026-05-05T14:35:21Z",
          "last_comment_author": "ValuedMammal"
        },
        {
          "number": 355,
          "created_at": "2025-12-15T15:04:51Z",
          "last_comment_at": "2026-07-21T16:40:30Z",
          "last_comment_author": "busayo-OD"
        },
        {
          "number": 360,
          "created_at": "2025-12-28T20:50:37Z",
          "last_comment_at": "2025-12-28T20:53:04Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 368,
          "created_at": "2026-01-16T22:52:38Z",
          "last_comment_at": "2026-02-18T18:55:55Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 370,
          "created_at": "2026-01-19T13:06:30Z",
          "last_comment_at": "2026-03-11T19:26:14Z",
          "last_comment_author": "aagbotemi"
        },
        {
          "number": 380,
          "created_at": "2026-02-08T10:40:09Z",
          "last_comment_at": "2026-02-23T19:20:15Z",
          "last_comment_author": "gyanranjanpanda"
        },
        {
          "number": 396,
          "created_at": "2026-03-04T23:44:57Z",
          "last_comment_at": "2026-03-04T23:48:08Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 414,
          "created_at": "2026-03-23T18:55:27Z",
          "last_comment_at": "2026-03-24T14:34:45Z",
          "last_comment_author": "Leeyah-123"
        },
        {
          "number": 423,
          "created_at": "2026-03-28T14:53:45Z",
          "last_comment_at": "2026-03-28T15:13:31Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 425,
          "created_at": "2026-03-31T19:35:51Z",
          "last_comment_at": "2026-03-31T19:39:19Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 427,
          "created_at": "2026-04-01T09:17:46Z",
          "last_comment_at": "2026-07-08T12:40:04Z",
          "last_comment_author": "noahjoeris"
        },
        {
          "number": 428,
          "created_at": "2026-04-01T15:38:54Z",
          "last_comment_at": "2026-05-28T17:04:42Z",
          "last_comment_author": "ValuedMammal"
        }
      ],
      "last_merged_pr_at": "2026-07-23T16:03:24Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": [
        {
          "number": 195,
          "created_at": "2020-10-22T12:04:35Z",
          "last_comment_at": "2026-07-13T12:01:22Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 193,
          "created_at": "2020-12-23T09:59:10Z",
          "last_comment_at": "2026-07-13T12:01:24Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 190,
          "created_at": "2021-02-26T03:23:02Z",
          "last_comment_at": "2026-01-28T16:31:52Z",
          "last_comment_author": "luisschwab"
        },
        {
          "number": 189,
          "created_at": "2021-07-14T18:36:46Z",
          "last_comment_at": "2026-07-13T12:01:26Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 188,
          "created_at": "2021-11-30T06:51:33Z",
          "last_comment_at": "2026-07-13T12:01:27Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 187,
          "created_at": "2022-01-11T23:59:46Z",
          "last_comment_at": "2022-09-05T06:40:41Z",
          "last_comment_author": "LLFourn"
        },
        {
          "number": 185,
          "created_at": "2022-02-16T02:15:27Z",
          "last_comment_at": "2026-07-13T12:01:29Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 184,
          "created_at": "2022-06-03T01:11:23Z",
          "last_comment_at": "2026-07-13T12:01:30Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 183,
          "created_at": "2022-06-28T02:38:54Z",
          "last_comment_at": "2026-07-13T12:01:32Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 182,
          "created_at": "2022-07-06T12:40:08Z",
          "last_comment_at": "2026-07-13T12:01:34Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 181,
          "created_at": "2022-07-07T19:03:54Z",
          "last_comment_at": "2026-07-13T12:01:36Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 180,
          "created_at": "2022-07-20T20:57:02Z",
          "last_comment_at": "2026-07-14T17:09:35Z",
          "last_comment_author": "ValuedMammal"
        },
        {
          "number": 420,
          "created_at": "2022-08-04T08:44:39Z",
          "last_comment_at": "2025-09-24T23:39:15Z",
          "last_comment_author": "notmandatory"
        },
        {
          "number": 178,
          "created_at": "2022-08-09T03:07:50Z",
          "last_comment_at": "2026-07-13T12:01:39Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 177,
          "created_at": "2022-08-10T18:02:12Z",
          "last_comment_at": "2026-07-13T12:01:41Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 176,
          "created_at": "2022-08-26T21:29:18Z",
          "last_comment_at": "2026-07-13T12:01:42Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 175,
          "created_at": "2022-08-30T08:58:08Z",
          "last_comment_at": "2026-07-13T12:01:44Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 173,
          "created_at": "2022-10-01T03:40:51Z",
          "last_comment_at": "2026-07-13T12:01:46Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 170,
          "created_at": "2023-01-10T19:53:54Z",
          "last_comment_at": "2026-07-13T12:10:06Z",
          "last_comment_author": "nvk"
        },
        {
          "number": 168,
          "created_at": "2023-01-18T15:21:40Z",
          "last_comment_at": "2026-07-08T00:25:38Z",
          "last_comment_author": "ValuedMammal"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/bitcoindevkit/bdk_wallet",
    "host": "github.com",
    "name": "bdk_wallet",
    "owner": "bitcoindevkit"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 79,
      "inputs": {
        "security": 79,
        "vitality": 98,
        "community": 66,
        "governance": 77,
        "engineering": 71
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 98,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 96,
            "inputs": {
              "commits_last_year": 240,
              "human_commit_share": 0.96,
              "days_since_last_push": 3,
              "active_weeks_last_year": 46
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 3 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "46/52 weeks with commits",
                "points": 31.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 46
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "240 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 240
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 13,
              "latest_release_tag": "v3.1.0",
              "releases_from_tags": false,
              "days_since_latest_release": 42,
              "mean_days_between_releases": 42.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "13 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 42 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 42
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~42.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 42.3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 3,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 3 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 66,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "forks": 95,
              "stars": 54,
              "watchers": 13,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "54 stars",
                "points": 28,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 54
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "95 forks",
                "points": 16.4,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 95
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "13 watchers",
                "points": 6,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file present, not a recognized license",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "license_custom",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "good",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 84,
            "inputs": {
              "packages": [
                "bdk_wallet"
              ],
              "dependents": null,
              "ecosystems": "crates",
              "total_downloads": 1079408,
              "monthly_downloads": 116892
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "116,892 downloads/month across crates",
                "points": 67.6,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 116892,
                      "ecosystems": "crates"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "good",
        "name": "Sustainability & Governance",
        "value": 77,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "good",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "bus_factor": 3,
              "contributors_sampled": 98,
              "top_contributor_share": 0.22
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "3 contributor(s) cover half of all commits",
                "points": 36,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 22% of commits",
                "points": 17.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 22
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "98 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 98
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 40 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "merged_prs": 134,
              "open_issues": 154,
              "closed_issues": 127,
              "issue_closed_ratio": 0.452,
              "closed_unmerged_prs": 48
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "45% of issues closed",
                "points": 21.1,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 45
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "134/182 decided PRs merged",
                "points": 28.2,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 134,
                      "decided": 182
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 5/7 approved changesets -- score normalized to 7",
                "points": 10.5,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "followers": 736,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "bitcoindevkit",
              "public_repos": 46,
              "account_age_days": 2309
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "736 followers of bitcoindevkit",
                "points": 20.6,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 736,
                      "login": "bitcoindevkit"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "46 public repos, account ~6 yr old",
                "points": 24.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 46
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "bdk_wallet"
              ],
              "ecosystems": "crates",
              "any_deprecated": false,
              "min_days_since_publish": 42
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on crates",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "crates"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 42 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 42
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "23 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 23
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 71,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "5 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "10 out of 10 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "good",
        "name": "Security",
        "value": 79,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "good",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 79,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 7.9
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection is not maximal on development and all release branches",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "10 out of 10 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 5/7 approved changesets -- score normalized to 7",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 40 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 1",
                "points": 0.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is run on all commits",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 11
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 57,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "96 of 96 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 96,
                      "sampled": 96
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 62,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "examples/justfile",
                "justfile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.01,
              "toolchain_manifests": [
                "Cargo.toml"
              ],
              "dependency_bot_commit_share": 0.04
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "examples/justfile, justfile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples/justfile, justfile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Rust (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "1 of the last 100 commits agent-authored or agent-credited",
                "points": 2,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "4 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 4,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 1",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 95,
            "inputs": {
              "primary_language": "Rust",
              "largest_source_bytes": 165781,
              "source_files_sampled": 45,
              "oversized_source_files": 4
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Rust (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "4/45 source files over 60KB",
                "points": 50.1,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 45,
                      "oversized": 4
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-26T23:35:58.864201Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/b/bitcoindevkit/bdk_wallet.svg",
  "full_name": "bitcoindevkit/bdk_wallet",
  "license_state": "custom",
  "license_spdx": null
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticscrates.io.