Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-26 23:35 UTC

bitcoindevkit / bdk_wallet

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

RustLicencia propia★ 54 estrellas⑂ 95 forksdesde abr 2025Ver en GitHub ↗

bitcoindevkit/bdk_wallet tiene un índice de salud de 79 sobre 100, lo que lo sitúa en la banda Bueno. Su puntuación más alta es Vitality (98/100) y la más baja, AI Readiness (57/100). Se actualizó por última vez hace 3 días. 3 personas concentran la mayor parte del trabajo reciente.

79
global / 100
Bueno

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

79
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

Bitcoin Dev KitOrganización
736 seguidores46 repositorios públicosdesde mar 2020

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
crates.iobdk_wallet3.1.0116.89223hace 42 díasbitcoindescriptorpsbtwallet

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

98Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 3 días
31.8/36Cadencia de commits — 46/52 semanas con commits
18/18Volumen de commits — 240 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year240
human_commit_share0,96
days_since_last_push3
active_weeks_last_year46
Cómo se puntúa
27/27Publica versiones — 13 versiones publicadas
36/36Recencia de las versiones — última versión hace 42 días
27/27Cadencia de publicación — una versión cada ~42,3 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count13
latest_release_tagv3.1.0
releases_from_tagsno
days_since_latest_release42
mean_days_between_releases42,3
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

66Moderado · 18% del índice global
Cómo se puntúa
28/60Estrellas — 54 estrellas
16.4/25Forks — 95 forks
6/15Observadores — 13 observadores
Datos de entrada utilizados
forks95
stars54
watchers13
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
16.9/22.5Licencia — archivo de licencia presente, no es una licencia reconocida
18/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conductno
has_pull_request_template
Cómo se puntúa
67.6/80Descargas mensuales — 116.892 descargas/mes en crates
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesbdk_wallet
dependents
ecosystemscrates
total_downloads1.079.408
monthly_downloads116.892
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

77Bueno · 24% del índice global
Cómo se puntúa
36/54Factor bus — la mitad de los commits recae en 3 contribuyente(s)
17.6/22.5Distribución de commits — el principal contribuyente firma el 22% de los commits
13.5/13.5Amplitud de contribuyentes — 98 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 40 contributing companies or organizations
Datos de entrada utilizados
bus_factor3
contributors_sampled98
top_contributor_share0,22
Cómo se puntúa
21.1/46.8Resolución de issues — 45% de issues cerradas
28.2/38.3Aceptación de PR — 134/182 PR decididos fusionados
10.5/15OpenSSF Scorecard: Code-Review — Found 5/7 approved changesets -- score normalized to 7
Datos de entrada utilizados
merged_prs134
open_issues154
closed_issues127
issue_closed_ratio0,452
closed_unmerged_prs48
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
20.6/25Alcance del propietario — 736 seguidores de bitcoindevkit
24.2/25Trayectoria — 46 repos públicos, cuenta de ~6 años
Datos de entrada utilizados
followers736
owner_typeOrganization
is_verified
owner_loginbitcoindevkit
public_repos46
account_age_days2309
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en crates
35/35Recencia de publicación — última publicación hace 42 días
20/20Historial de versiones — 23 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesbdk_wallet
ecosystemscrates
any_deprecatedno
min_days_since_publish42

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

71Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 5 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 10 out of 10 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

79Bueno · 16% del índice global
Cómo se puntúa
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.5Licencia — 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 — sin datos
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 — sin datos
6.8/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate7,9
Excluidos de la puntuación (sin datos o no aplicable): packaging, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

57Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 96 de 96 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
18/18Arranque con un solo comando — examples/justfile, justfile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Rust (tipado estático)
0/10Entorno reproducible
2/10Práctica demostrada con agentes — 1 de los últimos 100 commits con autoría o crédito de agente
8/8Mantenimiento automatizado — 4 de los últimos 100 commits son actualizaciones automáticas de dependencias
1/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfileno
typed_language
bootstrap_filesexamples/justfile, justfile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,01
toolchain_manifestsCargo.toml
dependency_bot_commit_share0,04
Cómo se puntúa
45/45Código verificable por tipos — Rust (tipado estático)
50.1/55Tamaños de archivo manejables — 4/45 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageRust
largest_source_bytes165.781
source_files_sampled45
oversized_source_files4
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

54estrellas de GitHub
98contribuidores
240commits en los últimos 12 meses
3días desde el último push
13versiones publicadas
3factor bus
154issues abiertas
crates.ioecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

Historial de estrellas y forks 0 ★ / 95 ⇿
0Estrellas
95Forks
13Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

0204060801009532025-042025-112026-07
Mayor 1Menor 1Parche 0

Cada punto abarca 2 días.

OpenSSF Scorecard 7.9 / 10
7.9agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).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/dPackagingpackaging 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/dSigned-Releasesno releases found
9Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 11
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias 19

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 11 paquetes directos y 8 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

RegistroPaqueteVersiónRelación
crates.ioanyhowdirecta
crates.iobdk_chaindirecta
crates.iobdk_file_storedirecta
crates.iobdk_txdirecta
crates.iobip39directa
crates.iobitcoindirecta
crates.iominiscriptdirecta
crates.iorand_coredirecta
crates.ioserdedirecta
crates.ioserde_jsondirecta
crates.iotempfiledirecta
crates.ioassert_matchesindirecta
crates.iobdk_bitcoind_rpcindirecta
crates.iobdk_electrumindirecta
crates.iobdk_esploraindirecta
crates.ioclapindirecta
crates.ioctrlcindirecta
crates.iorandindirecta
crates.iotokioindirecta
Avisos de dependencias sin evaluar

El cotejo de avisos no pudo ejecutarse para este informe: No resolved dependencies carried a version and a supported ecosystem

Informe JSON sin procesar legible por máquina
{
  "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
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadascrates.io.