Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-29 02:28 UTC

Bittoku / bsv_sdk_elixir

BSV SDK for Elixir — primitives, script, transactions, wallet, tokens, SPV

ElixirMIT★ 9 estrellas⑂ 1 forkdesde feb 2026Ver en GitHub ↗

Bittoku/bsv_sdk_elixir tiene un índice de salud de 45 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es Vitality (74/100) y la más baja, Security (27/100). Se actualizó por última vez hace 12 días. Una sola persona concentra la mayor parte del trabajo reciente.

45
global / 100
En riesgo

Í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.

45
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

BittokuOrganización
2 seguidores5 repositorios públicosdesde sept 2014

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ón
Hexbsv_sdk2.0.1205614hace 58 días

Métricas por categoría

Vitalidad

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

74Bueno · 22% del índice global
Cómo se puntúa
28.8/36Recencia de push — último push hace 12 días
9/36Cadencia de commits — 13/52 semanas con commits
17.1/18Volumen de commits — 80 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year80
human_commit_share1
days_since_last_push12
active_weeks_last_year13
Cómo se puntúa
16.2/27Publica versiones — 10 etiquetas de versión (sin releases de GitHub)
36/36Recencia de las versiones — última versión hace 69 días
27/27Cadencia de publicación — una versión cada ~10,3 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count10
latest_release_tagv2.0.0
releases_from_tags
days_since_latest_release69
mean_days_between_releases10,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?

37En riesgo · 18% del índice global
Cómo se puntúa
14.6/60Estrellas — 9 estrellas
0/25Forks — 1 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks1
stars9
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
44.2/80Descargas mensuales — 2056 descargas/mes en hex
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesbsv_sdk
dependents
ecosystemshex
total_downloads8187
monthly_downloads2056
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?

38En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0.3/22.5Distribución de commits — el principal contribuyente firma el 99% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,988
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
0/38.3Aceptación de PR — 0/1 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs1
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
3.4/25Alcance del propietario — 2 seguidores de Bittoku
17.7/25Trayectoria — 5 repos públicos, cuenta de ~11 años
Datos de entrada utilizados
followers2
owner_typeOrganization
is_verified
owner_loginBittoku
public_repos5
account_age_days4331
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en hex
35/35Recencia de publicación — última publicación hace 58 días
20/20Historial de versiones — 14 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesbsv_sdk
ecosystemshex
any_deprecatedno
min_days_since_publish58

Calidad de Ingeniería

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

44En riesgo · 20% del índice global
Cómo se puntúa
0/24Flujos de trabajo de CI
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_cino
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

65Moderado
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
0/10Wiki
Datos de entrada utilizados
topics
has_wikino
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?

27Crítico · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
0/10Dangerous-Workflow — sin datos
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — sin datos
0/5Pinned-Dependencies — sin datos
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — sin datos
0/7.5Vulnerabilities — 24 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate2,7
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. 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.

68Moderado · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 75 de 80 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,938
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes6257
Cómo se puntúa
12.6/18Arranque con un solo comando — mix.exs (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
0/11Verificación estática de tipos
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 4 de los últimos 80 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — sin datos
Datos de entrada utilizados
has_nixno
has_tests
lockfilesmix.lock
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,05
toolchain_manifestsmix.exs
dependency_bot_commit_share0
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Pinned-Dependencies. Los pesos restantes se han renormalizado.
Cómo se puntúa
0/45Código verificable por tipos — Elixir sin configuración de verificación de tipos
54.4/55Tamaños de archivo manejables — 2/187 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageElixir
largest_source_bytes85.361
source_files_sampled187
oversized_source_files2

Datos clave

9estrellas de GitHub
2contribuidores
80commits en los últimos 12 meses
12días desde el último push
10versiones publicadas
1factor bus
0issues abiertas
Hexecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

OpenSSF Scorecard 2.7 / 10
2.7agregado

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-29 02:28 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
n/dDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
n/dPinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
n/dToken-PermissionsNo tokens found
0Vulnerabilities24 existing vulnerabilities detected
Dependencias directas 2
RegistroPaqueteRestricción de versiónManifiesto
Hexjason~> 1.4mix.exs
Hexreq~> 0.5mix.exs
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 793,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Elixir": 1134195
      },
      "pushed_at": "2026-07-16T13:00:45Z",
      "created_at": "2026-02-17T23:34:31Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-23T17:22:07Z",
      "description": "BSV SDK for Elixir — primitives, script, transactions, wallet, tokens, SPV",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Elixir",
      "significant_languages": [
        "Elixir"
      ]
    },
    "owner": {
      "blog": "https://bittoku.co.jp",
      "name": "Bittoku",
      "type": "Organization",
      "login": "Bittoku",
      "company": null,
      "location": null,
      "followers": 2,
      "avatar_url": "https://avatars.githubusercontent.com/u/8819545?v=4",
      "created_at": "2014-09-18T11:07:42Z",
      "is_verified": null,
      "public_repos": 5,
      "account_age_days": 4331
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2026-05-21T00:21:31Z"
        },
        {
          "tag": "v1.5.1",
          "kind": "patch",
          "published_at": "2026-05-17T06:22:08Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2026-05-01T05:00:52Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-03-26T06:38:59Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-02-26T05:31:08Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-02-26T03:31:00Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-02-26T03:02:43Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-02-26T01:46:01Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-02-26T01:12:44Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-02-17T13:33:34Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "978084f78c9a6b0071026cf39528ce597edfce0d",
          "body": "…ormat\n\nResolve the 4 blockers on PR #1 (H-01/H-02/M-01/M-02 remediation).\n\n1. H-01 secure_compare: the previous fix hashed the CONCATENATIONS SHA256(a<>b)\n   vs SHA256(b<>a), which are equal whenever the pieces commute (e.g.\n   \"\" <> \"x\" == \"x\" <> \"\"), so unequal inputs compared equal. Hash EACH in\n[…]\nand\n   that finding is outside this PR's declared scope.\n\n4. Formatted lib/bsv/private_key.ex (touched-file formatter gate).\n\nVerified: mix test 1085 passed, 0 failures; changed-file mix format clean.",
          "is_bot": false,
          "headline": "fix: address Hermes review — secure_compare, legacy decrypt, tests, f…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-16T12:59:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f807176a8e73c378949671d64694e70960882cf4",
          "body": "Applied fixes for findings in the GLaDOS security audit (v0.3.0):\n\nFIXED (this patch):\n- H-01: secure_compare timing leak — hash a<>b and b<>a instead of\n        returning early for different-length inputs\n- H-02: ECDH rescue clause — split ErlangError and ArgumentError;\n        remove blanket rescu\n[…]\nlidates range)\n- M-04: ARC/JungleBus use URI.encode_www_form for URL params\n- erl_crash.dump: gitignored, never committed\n\nNew test file: test/bsv/security_fix_test.exs covers all four fixed findings.",
          "is_bot": false,
          "headline": "fix: remediate 4 security audit findings (H-01, H-02, M-01, M-02)",
          "author_name": "jerrleey-cmd",
          "author_login": "jerrleey-cmd",
          "committed_at": "2026-07-16T12:59:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5fe4115417d9645e9f91aa8351bea37c8449ff5c",
          "body": "feat(stas3): STAS 3.0 v0.2.4 §15 NFT / augmentable port\n\nSee merge request bsv/bsv_sdk_elixir!1",
          "is_bot": false,
          "headline": "Merge branch 'feat/stas3-v024-section15' into 'main'",
          "author_name": "Dave",
          "author_login": "digitsu",
          "committed_at": "2026-07-16T12:58:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6180595c760802de8fb750cc0ecfdbe200cc33a",
          "body": "…y flags (MR !1 round 8)\n\nReader.parse_stas3/1 was assigning every push after redemption+flags to\nservice_fields and hard-coding optional_data to []. Decode the flags byte\ninto ScriptFlags and use service_field_count/1 to split the trailing pushes:\nfirst N go to service_fields, the remainder to opti\n[…]\nd with service fields\" test, which built a script with\nfreezable_or_flags: false while still pushing a service field — inconsistent\nwith the flags byte and now correctly reclassified as optional_data.",
          "is_bot": false,
          "headline": "fix(stas3): split trailing pushes into service_fields/optional_data b…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-16T12:32:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0add0fdf9b5e739da09190c2725e8174974d6798",
          "body": "…und 7)",
          "is_bot": false,
          "headline": "fix(stas3): preserve non-empty var2 through freeze/unfreeze (MR !1 ro…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-16T11:59:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1bf059c538cf22012ccb34ba3159c6396fab0620",
          "body": "… !1 round 6)\n\nAddresses reviewer note 2235 blockers 3 and 4.\n\nBlocker 3: swap remainder outputs now inherit their own source input's\nimmutable STAS 3.0 capability flags (freezable/confiscatable/nft/augmentable,\nspec §5.2.2/§15). A heterogeneous two-token swap is skipped by\nenforce_input_capability_\n[…]\nr-validated token input into a freeze/unfreeze covenant.\nRegression: \"freeze rejects a second, unvalidated token input\".\n\nBlockers 1, 2, 5 were already resolved in round 5 (364342a); verified on HEAD.",
          "is_bot": false,
          "headline": "fix(stas3): swap-remainder flag inheritance + single-input freeze (MR…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-16T06:29:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "364342a25d87b5fc3826a5af6ea1f112e615f8f8",
          "body": "…xed swap pieces (MR !1 round 5)\n\nAddress reviewer comment 2231 (dave, changes requested).\n\nBlocker 1 — unlocking-script OP_RETURN could bypass the locking script\npost-Genesis: run_verify/3 now clears `halt` at the unlock->lock phase\nboundary. BSV node semantics evaluate the two scripts separately o\n[…]\npieces.ex, lib/bsv/tokens/factory/stas3.ex,\nand their tests.\n\nVerify: mix compile --warnings-as-errors (dev+test) clean; mix test\n1118 tests / 0 failures; mix dialyzer green (11 pre-existing ignored).",
          "is_bot": false,
          "headline": "fix(stas3): unlock OP_RETURN bypass, swap-descriptor round-trip, inde…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-16T06:14:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9ad59bc3d16ee5a9a185e9a28ca669ca7c15f28d",
          "body": "…y builder (MR !1 round 4)\n\nAddress reviewer comment 2230 (dave, changes requested).\n\nBlocker 1 — NFT/AUGMENTABLE flags silently stripped on transfer outputs:\nbuild_stas3_base_tx now enforces STAS 3.0 capability-flag immutability\n(spec §5.2.2 / §15). When all consumed token inputs share an identical\n[…]\nentable preserved) + 5 builder tests (NFT-only, augmentable-only,\nNFT+augmentable auto-select 0.0.11; legacy boolean stays 0.0.9).\n\nmix test: 1105 tests, 0 failures. mix dialyzer: passed (11 ignores).",
          "is_bot": false,
          "headline": "fix(stas3): preserve immutable capability flags + engine-aware 7-arit…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-16T05:45:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "75b95dbf29a67256dba205c55b35932328431697",
          "body": "…MR !1 round 3)\n\nAddress Hermes round-3 blockers on MR !1.\n\n1. Dialyzer / typed contract: BSV.Tokens.ActionData.t() only listed\n   {:swap,_} | {:custom,_}, so the reader's new {:augment, data} value and the\n   §15 augment factory branches were untyped/unreachable to static analysis.\n   Add the {:aug\n[…]\nframe still building.\n\nVerified: git diff --check CLEAN; changed-file mix format --check-formatted\nCLEAN; mix compile --warnings-as-errors CLEAN; mix test 1096 passed, 0 failures;\nmix dialyzer exit 0.",
          "is_bot": false,
          "headline": "fix(stas3): augment type + frozen/action-data guard; dialyzer green (…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-16T05:16:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ad3ff41323e1eb92d5ce7ece47c15683586e9dda",
          "body": "…d 2)",
          "is_bot": false,
          "headline": "style(stas3): mix format all changed files vs gitlab main (MR !1 roun…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-16T02:08:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a0cc28075d8b0b4a7cd952ab331a84df989d8df",
          "body": "…1 review)\n\nRemove unused change_address_from_signing_key/1 (both clauses) and rename\nthe unused body binding to _body in skip_one_push/1, clearing the two\nmix compile --warnings-as-errors warnings flagged in review. Confirmed\nmix format --check-formatted passes on the reviewer's changed-file set.",
          "is_bot": false,
          "headline": "fix(stas3): mix format changed files + clear warnings-as-errors (MR !…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-15T15:36:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "270febfffad008f3756d96782d7484d5769c24ae",
          "body": "Vendor the Rust SDK's STAS 3.0 v0.2.4 §15 golden vectors and assert this Elixir\nimplementation reproduces them byte-for-byte — proving the two SDKs agree on the\nwhole §15 surface.\n\n- test/support/vectors/stas3_section15.json: copied verbatim from\n  crates/bsv-tokens/tests/vectors/stas3_section15.jso\n[…]\nsserts the hex matches, and\n  validates the directive-append covenant (expected == base ++ data, and\n  verify_augment_directive_appended agrees).\n\n3 tests, 0 failures — byte-identical to the Rust SDK.",
          "is_bot": false,
          "headline": "test(stas3): cross-SDK §15 conformance vs the Rust golden vectors",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-15T14:07:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9fe966fb60ed552210ea0ef42a9ea62a7f0f5bf7",
          "body": "…vative)\n\nHow the §15.1 one-output and §15.2 directive-append covenants interact with the\natomic-swap (spendType 1) and confiscation (spendType 3) paths is not yet pinned\nby the spec, and those builders bypass the normal-transfer NFT guard. Refuse NFT\ninputs there rather than risk an on-chain-invali\n[…]\nheck).\n- build_stas3_swap_cancel_tx: reject NFT inputs.\n\nTests: NFT+confiscatable confiscation, an NFT swap leg, and an NFT swap-cancel\ninput are each rejected. mix format clean; 65 tests, 0 failures.",
          "is_bot": false,
          "headline": "feat(stas3): guard NFT inputs on swap/confiscation paths (§15, conser…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-15T14:05:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9048ef1e98d2ef4f016c736dda5f1e1706c3250d",
          "body": "Issuance could only mint plain/freezable tokens on the 0.0.9 engine, so an NFT\ncould never be minted directly. Let issue outputs express the full capability\nset and an optional mint-time directive.\n\n- build_stas3_outputs: assemble a full ScriptFlags from the issue-output map\n  (freezable/confiscatab\n[…]\ns: minting NFT+AUGMENTABLE uses engine :v0_0_11 with both flags;\nAUGMENTABLE-without-NFT is rejected; minting with {:augment, data} installs the\nvar2 directive. mix format clean; 62 tests, 0 failures.",
          "is_bot": false,
          "headline": "feat(stas3): capability flags + var2 directive on issuance outputs (§15)",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-15T14:01:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3e38f5bf3f1ce21a37f9dfcb64f64cda315b9573",
          "body": "When a consumed UTXO's frame is NFT+AUGMENTABLE and its var2 is an augmentation\ndirective, the 0.0.11 covenant forces the produced token locking script to\nappend the directive data at its very end. The builder now satisfies that\ncovenant automatically.\n\n- Stas3Builder: encode {:augment, data} var2 a\n[…]\nt-directive NFT yields output == un-augmented script\n++ data (appended once); verify returns :ok/:directive_not_appended/:ok for\nappended/missing/no-directive. mix format clean; 128 tests, 0 failures.",
          "is_bot": false,
          "headline": "feat(stas3): directive-append covenant + verifier (§6.4/§15.2)",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-15T13:58:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4cd844f70a14ff8e9bc42e11731598775fb9adef",
          "body": "STAS 3.0 capability bits are immutable across a spend, so a transferred token\nmust re-emit its input's flags on the correct engine. The transfer output\nbuilder previously passed only `freezable` (dropping confiscatable) and always\nused the 0.0.9 engine, so NFT/augmentable — and even confiscatable — \n[…]\nscatable now propagating.\n\nTests: an NFT transfer output re-parses with the NFT flag and engine :v0_0_11;\na plain transfer output stays on :v0_0_9. mix format clean; full suite 1084\ntests, 0 failures.",
          "is_bot": false,
          "headline": "feat(stas3): propagate capability flags to transfer outputs (§15)",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-15T13:54:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b6098966277ff5543ee374ccb0b61bd86991762e",
          "body": "…5.1)\n\nThe Reader hardwired the 2899-byte 0.0.9 engine length, so it misparsed any\n0.0.11 (NFT/augmentable) script. Make parsing engine-agnostic, then enforce the\n§15.1 NFT invariant.\n\n- Reader.parse_stas3: locate the engine body via Engine.detect/1 (exact-match,\n  works for 0.0.9 and 0.0.11) instea\n[…]\neable) and produce exactly one output\n    (:nft_output_count).\n\nTests: split/merge/multi-output-transfer/second-input of a genuine 0.0.11 NFT\nare each rejected. mix format clean; 86 tests, 0 failures.",
          "is_bot": false,
          "headline": "feat(stas3): engine-agnostic parsing + NFT one-output enforcement (§1…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-15T13:50:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "40cefaf4817b8e2fc6e09cd8f5d730a25725dae8",
          "body": "…(§15.6)\n\nMirror the Rust SDK's engine module so NFT/augmentable tokens can be built on\nthe 0.0.11 engine they require.\n\n- New BSV.Tokens.Script.Engine: embeds both engine bodies (0.0.9 = 2899 B,\n  0.0.11 = 3146 B, byte-identical to the Rust SDK's), with template_bytes/1,\n  byte_len/1, select_engine\n[…]\nengine sizes/offsets/OP_RETURN, select_engine, detect (match + reject),\nflags.engine, and _with_engine(:v0_0_9) == default builder while :v0_0_11 is\n+247 bytes. mix format clean; 70 tests, 0 failures.",
          "is_bot": false,
          "headline": "feat(stas3): engine registry (0.0.9 + 0.0.11) + engine-aware builder …",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-15T10:47:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5192a2ec9c53f353afdb7f8b0df5e7843deb84ca",
          "body": "Mirror the Rust SDK's Stas3Flags: extend the STAS 3.0 flags model beyond\nfreeze/confiscate to the v0.2.4 §15 capability bits.\n\n- Add `nft` (bit 2, 0x04) and `augmentable` (bit 3, 0x08) to the struct;\n  `to_byte/1` + `encode/1` pack all four bits.\n- `decode/1` now reads the **last** byte of a multi-b\n[…]\nast-byte decoding, and validate. mix format\nclean; script_flags_test green (15 tests, 0 failures).\n\nFirst commit of the §15 Elixir port; verified against the Rust conformance\nvectors in later commits.",
          "is_bot": false,
          "headline": "feat(stas3): ScriptFlags bits 2/3 (NFT/AUGMENTABLE) + validate (§15)",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-07-15T10:42:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "483a6ad2104483b66e14fa32602248b0b1284ada",
          "body": "STAS-BTG, Tokens.Proof, and the experimental Tokens.Lineage validator\nare now @moduledoc false; the four build_btg_* facade delegates are\n@doc false. Removed from mix.exs doc groups, README feature list, and\nthe top-level BSV moduledoc. No functional change — modules remain\ncallable; only Hex.pm documentation visibility changed.",
          "is_bot": false,
          "headline": "chore(release): v2.0.1 — hide experimental STAS-BTG from public docs",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-05-31T16:19:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b191633147306dba0d8812802268d167ffaf5ce",
          "body": "Canonical STAS 3.0 engine (2899B / spec v0.2.3) + option-3 piece-array\nencoder + DXS-aligned swap-swap witness. Breaking template change\nrequires consumers to rebuild and re-sign STAS 3.0 transactions\nbefore broadcasting.\n\nSee CHANGELOG.md for the full breakdown.",
          "is_bot": false,
          "headline": "chore(release): v2.0.0",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-05-21T00:21:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a658f739121d1bb553f3aea6f08c6b2815788b99",
          "body": "The Stas3OutputParams struct defaults freezable: true, but the\ncanonical STAS 3.0 engine rejects unlocks whose destinations have\nfreezable=true without a matching service-field push. Rust's dest()\nhelper sets freezable=false explicitly; Elixir's test omitted the\nfield and inherited the wrong default\n[…]\nthe divergence was a single-byte flag at the tail of each\ndestination's locking script.\n\nResult: bsv_sdk_elixir swap-swap engine_verify now passes —\n1072/1072 mix tests green, matching Rust's 273/273.",
          "is_bot": false,
          "headline": "fix(test): set freezable=false on swap-swap destinations",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-05-21T00:06:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "01423deecdb881b6a6f0f2d9392145a1f4f98530",
          "body": "`splice_swap_trailing_in_place_of_tx_type` was using `List.pop_at` to\nextract the txType chunk, but `List.pop_at` returns `{popped,\nlist_with_item_removed}` — meaning `after_chunks` was the ENTIRE list\nminus the txType, NOT just chunks after txType. This duplicated all\n§7 slots into the spliced unlo\n[…]\nucture as the now-passing\nRust test. Remaining divergence is somewhere in byte content (likely\npreimage hashes, signature, or some interpreter-impl difference)\nthat needs a focused diagnostic session.",
          "is_bot": false,
          "headline": "fix(stas3): correct splice-position bug in swap-swap factory",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-05-20T23:48:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6fa5e1560050a236eebdc053bdd37508f31c34fa",
          "body": "…y still fails)\n\nMirrors bsv-sdk-rust 505cbaa.\n\nSplice the §9.5 trailing block IN PLACE OF the bare txType byte at\nspec §7 slot 18 (rather than prepending it to the whole script).\nOn-script form matches DXS:\n\n  push(counterparty_vout)              numeric — COUNTERPARTY input's vout\n  push(pieces[0]\n[…]\nfactory's output and the Rust factory's output that needs a focused\nprint-and-compare diagnostic. 1071/1072 mix tests pass; only the\nswap-swap engine_verify test still fails. Documented for follow-up.",
          "is_bot": false,
          "headline": "fix(stas3): DXS-align swap-swap witness layout (partial; engine_verif…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-05-20T23:17:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5af0c3d5f35da7605835a16ddaab22aa7c804dca",
          "body": "Mirrors bsv-sdk-rust e8bd923.\n\nThe §10.2 P2MPKH redeem-buffer parser at the start of the canonical\nengine reads OP_SIZE on the TOP of stack. With the trailing-piece\nblock APPENDED, the head piece ends up on top, the parser\nmis-classifies it as a long redeem buffer, OP_SPLITs it into bogus\nchunks, an\n[…]\ny.\n\nBoth SDKs now produce byte-identical wiring; the swap-swap engine_verify\ntest still @tag :skip'd pending the deeper back-to-genesis hash check\ninvestigation (mirror of Rust's #[ignore] reasoning).",
          "is_bot": false,
          "headline": "fix: prepend STAS 3.0 trailing-piece block to unlock script (not append)",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-05-20T22:27:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "12fd2042bf4d7cb173744ef255007e67f35d9a27",
          "body": "Replace the stale 2812-byte length-prefixed-piece-consumer engine with\nthe 2899-byte canonical engine from github.com/stassso/STAS-3-script-templates\n(spec v0.2.3, used verbatim by dxs-bsv-token-sdk). Rewrite the\npiece-array encoder/parser to match: each piece is its own OP_PUSHDATA\npush, and piece_\n[…]\nwith InvalidStackOperation under the canonical engine\n(deeper stack-shape mismatch in the preceding-tx layout or witness\nwiring before the piece block). Mirror of bsv-sdk-rust; deferred\ninvestigation.",
          "is_bot": false,
          "headline": "feat!: adopt STAS 3.0 canonical engine + option-3 piece-array encoder",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-05-20T22:07:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fd28f96edccb9d3e9f2a47c8b82c57de890a0711",
          "body": "See CHANGELOG.md for the v1.5.1 entry — STAS 3.0 piece-length limit fix\nplus the cross-SDK fixture test and lineage-validator doc update.",
          "is_bot": false,
          "headline": "chore(release): bump version to v1.5.1",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-05-17T06:22:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cdf5f3c4a26533c6ed7df64622556c9ebc530f9f",
          "body": "The §9.5 piece-array encodes each piece with a 1-byte length prefix.\nThe on-chain v0.1 engine reads that byte via OP_1 OP_SPLIT, which\nconsumes it as a SIGNED Bitcoin script-num — so a length >= 0x80 (128)\nreads as negative and OP_SPLIT rejects it. join_pieces/1 previously\nallowed up to 255, silentl\n[…]\n bytes and is unencodable under\n  the v0.1 engine. Symmetric with bsv-sdk-rust's #[ignore]d twin.\n  A known v0.1 engine limitation pending a spec revision.\n\nmix test: 1073 passed, 0 failed, 1 skipped.",
          "is_bot": false,
          "headline": "fix: STAS 3.0 piece-length limit is 127 bytes, not 255",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-05-17T06:11:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "12ae58bf02d4f136b97ea8e523155c6ab7de8de6",
          "body": "…imental\n\n- stas3_pieces_test.exs: new cross-SDK pin test asserts encode_merge_pieces/3\n  produces a canonical hex byte-identical to bsv-sdk-rust's matching test,\n  over a real STAS 3.0 locking-script fixture. Guards against the two SDKs\n  silently diverging on §9.5 piece byte-order.\n- lineage.ex: m\n[…]\n/:p2pkh, errors on a STAS 3.0 ancestor, and does not\n  model the Vin[0]==protoID issuance-set invariant or illegal_roots taint.\n  The authoritative STAS 3.0 lineage model lives in the athanor indexer.",
          "is_bot": false,
          "headline": "test: pin cross-SDK piece-array fixture; mark lineage validator exper…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-05-16T16:45:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f92aeca89ae20588c47c2396162cd94f1a8d092",
          "body": "STAS 3.0 v0.1 spec finalization, P2MPKH §10.2 alignment, end-to-end\nengine verification, and assorted interpreter/encoder fixes uncovered\nby running SDK transactions through the script interpreter.\n\nHighlights:\n- §7 unlock-witness encoder auto-wired into all STAS 3.0 factories\n- §9 build-time valida\n[…]\nflow under script-num\n- Fix: Genesis-rules OP_RETURN handling in Script.Interpreter\n- README install pin updated 0.1.0 -> ~> 1.5\n- CHANGELOG backfilled for v1.2.1, v1.3.0, v1.4.0\n\nTests: 1071 passing.",
          "is_bot": false,
          "headline": "chore: release v1.5.0",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-05-01T05:00:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fc5f9fa00594a62072c92541030fc7e7628f6876",
          "body": "Spec author confirmed the §10.3 wording \"OP_FALSE in place of both\nsignature and address/MPKH preimage\" refers to the\n*address/MPKH preimage* (the pubkey or multisig redeem script in\nthe authz slot 21+), NOT the sighashPreimage in slot 19. Slot 19\nmust always carry the real BIP-143 preimage so the e\n[…]\n asserts the\n  preimage chunk decodes back to those exact bytes (proves slot 19\n  is preserved through the with_witness path).\n\nTests: 1071 passing, no failures. Cross-SDK reference vectors\nunchanged.",
          "is_bot": false,
          "headline": "docs: clarify §10.3 no-auth interpretation; tighten test assertions",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-05-01T02:41:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "440ac2f3a930aaaee0f9a40baca7b474911ce271",
          "body": "Mirrors the Rust SDK fix. Spec §9.5 wording \"delimited by space\"\nwas misleading. The engine ASM consumes pieces via the atom\nOP_1 SPLIT OP_IFDUP OP_IF OP_SWAP SPLIT OP_ENDIF — each piece is\npreceded by a 1-byte length prefix.\n\nFix:\n- lib/bsv/tokens/script/stas3_pieces.ex: removed @space 0x20;\n  join\n[…]\nh is now :invalid_split_range — same class as the\n  Rust SDK's NumberTooSmall (piece length ≥ 128 read as negative\n  script-num). Deferred follow-up: cap pieces at 127B or auto-\n  split larger pieces.",
          "is_bot": false,
          "headline": "fix: STAS 3.0 piece-array is length-prefixed, not space-delimited",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-04-30T14:30:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a59a7471303bd726da1f98193ac109ff9d1f910c",
          "body": "First end-to-end test that runs an SDK-built STAS 3.0 transaction\nthrough the actual script interpreter with a real BIP-143 + ECDSA\nsighash function. The engine accepts our transactions.\n\nTwo real bugs uncovered and fixed:\n\n1. encode_unlock_amount/1 produced script-num-unsafe minimal LE.\n   For amou\n[…]\nfollow-up (factory-shape concerns, not encoder bugs):\n4-output split, spend with noteData, freeze (needs service-field\nplumbing), confiscation, swap cancellation. The script-num fix\nunblocks the rest.",
          "is_bot": false,
          "headline": "feat: end-to-end engine verification for STAS 3.0 transactions",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-04-28T13:52:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "659b63904a993cc73ff3adbba25555ce841d2a17",
          "body": "Every STAS 3.0 factory now produces an unlocking script of the form\nwitness_bytes || authz_bytes automatically — no caller opt-in required.\nTransactions built by the SDK are now engine-validatable by default.\n\nNew helper (factory/stas3/witness_builder.ex):\n- derive_witness_for_input/6: walks the par\n[…]\n atomic-swap, redeem) plus preimage round-trip and parseable outputs.\n\nTests pass: 1063 (was 1055 + 8 new). Cross-SDK vectors\n(deb7bfb8...P2MPKH MPKH and 181-byte recursive swap descriptor)\nunchanged.",
          "is_bot": false,
          "headline": "feat: auto-wire §7 unlock witness into all STAS 3.0 factories",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-04-28T01:49:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5ceb0e60dd0dd36358e58de63d3de6834fe8bd7d",
          "body": "Closes the gaps identified by the v0.1 compliance audit.\n\n§7 unlock-witness encoder:\n- New BSV.Tokens.Stas3UnlockWitness struct with slots 1-20 of the\n  spec §7 witness. to_script_bytes/1 emits them in spec push order:\n  STAS-output triplets skipped entirely when absent; change/note/\n  funding emit \n[…]\nion is absent.\n- Single-sig MPKH spend path test: HASH160(33B pubkey) -> P2PKH\n  unlock chunks indistinguishable from a normal P2PKH spend.\n\nTests: 1055 passing. Cross-SDK reference vectors unchanged.",
          "is_bot": false,
          "headline": "feat: STAS 3.0 v0.1 unlock-witness encoder, §9 enforcement, gap closures",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-04-28T01:31:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f763cb1c53459b7b78179a4456dc4d59a97e7b6f",
          "body": "Item H — Atomic-swap and merge piece arrays (spec §8.1, §9.5):\n- New module BSV.Tokens.Script.Stas3Pieces with encode/parse for the\n  trailing parameter block carried after the authz section in\n  atomic-swap (txType=1) and merge (txType=2..7) unlocking scripts.\n- Pieces are reverse-ordered slices of\n[…]\n the Rust SDK reference so cross-SDK byte-equality is\n  asserted on both sides.\n\nVerification:\n- mix compile clean (only pre-existing factory/stas3.ex:100 warning).\n- mix test: 1017 tests, 0 failures.",
          "is_bot": false,
          "headline": "feat: STAS 3.0 v0.1 atomic-swap pieces and recursive swap descriptor",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-04-26T06:12:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b7d285b475644246257ce313e266e7fd1fa52591",
          "body": "P2MPKH (spec §10.2):\n- Redeem buffer is now [m: 1B raw][0x21 pk]xN[n: 1B raw], length 2+34N.\n  m and n are raw bytes (NOT OP_m/OP_n opcodes); no trailing\n  OP_CHECKMULTISIG. MPKH = HASH160(redeem_buffer).\n- Add fixed 70-byte P2MPKH locking script body for issuance and redemption\n  outputs (Templates\n[…]\nrt to pushdata form, then prepend 0x02.\n  Round-trip preserves the original form.\n- Unlocking-script amounts encoded as minimal little-endian (up to 8\n  bytes) via Stas3Builder.encode_unlock_amount/1.",
          "is_bot": false,
          "headline": "feat: align P2MPKH and STAS 3.0 with finalized spec v0.1",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-04-26T05:55:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "949cd906ddb60e885be037086073257c811f9108",
          "body": null,
          "is_bot": false,
          "headline": "docs: add CLAUDE.md with repo guidance for Claude Code",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-04-13T07:06:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b4fb42950a0137823ef38b47831838de93130fe",
          "body": "…paces)",
          "is_bot": false,
          "headline": "chore: ignore .omc (OMC session state) and .worktrees (isolated works…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-04-13T07:06:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "afc95c854ca79bcb9dd6bcfc802129be0c231f77",
          "body": "STAS 3.0 compliance release:\n- Fix read_push_data: handle OP_PUSHDATA4, OP_1NEGATE, OP_1-OP_16\n- Add P2MPKH support for issuance, redemption, and script detection\n- Rename dSTAS references to STAS3 in docs\n- Add 18 opcode extraction tests\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 1.4.0",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-04-06T14:20:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9adf68f6b74593195f74c8a7de6fd5188084f9cf",
          "body": "16 tests constructing synthetic STAS3 scripts with each opcode\nvariant in the 2nd variable field position, verifying action_data_raw\nis correctly extracted through the public read_locking_script/1 API:\nOP_0, bare push (1/20/75 bytes), OP_PUSHDATA1/2/4, OP_1NEGATE,\nOP_1-OP_16, plus frozen flag isolation and owner/redemption checks.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add read_push_data opcode extraction tests per STAS 3.0 spec",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-04-06T14:17:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1398aa1abfbcbabdf8b26f57380c944e0645d182",
          "body": "…tection\n\n- Issuance: accept funding_key (SigningKey) in addition to\n  funding_private_key for P2MPKH contract TX signing\n- Redemption: accept redeem_key or redeem_multisig for P2MPKH\n  redeem outputs, backward-compatible with redeem_pkh\n- Script detection: add :p2mpkh to ScriptType, add p2mpkh?/1\n  detector in Reader for bare multisig locking scripts\n- All existing P2PKH code paths remain unchanged\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add P2MPKH support to STAS3 issuance, redemption, and script de…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-04-06T12:00:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dd9c56f6f1de28839f9105bd4ba31403a8748e1a",
          "body": "Add OP_PUSHDATA4 (0x4E), OP_1NEGATE (0x4F), and OP_1-OP_16 (0x51-0x60)\nhandling to both read_push_data and do_parse_push_items. Previously\nthese fell through to catch-all clauses that skipped 1 byte and returned\nnil, which misaligned the parser for OP_PUSHDATA4 and silently lost push\nvalues for OP_1\n[…]\nnd OP_1NEGATE.\n\nAlso renames remaining dSTAS references to STAS3 in CHANGELOG.md and\ndocs/PRD-p2mpkh-test-gaps.md (4 occurrences).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: handle all pushdata opcodes in read_push_data per STAS 3.0 spec",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-04-06T11:47:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "373b340212068ab0d98dd0ba1553fbef4198657b",
          "body": null,
          "is_bot": false,
          "headline": "Rename dSTAS/DSTAS → STAS 3 in all docs and moduledocs",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-04-04T06:05:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d1b432e8f1c988a1f86a5bb6a1157c3dbaf6cb6",
          "body": null,
          "is_bot": false,
          "headline": "Bump to v1.3.0 — STAS3 naming finalized",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-04-04T01:15:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce1ed730b960c1f4d4ac0e10b33fda6a5ec5c07c",
          "body": "Establishes versioned naming convention (STAS3, future STAS3-1, STAS4)\nfor token template generations. No behavioral changes.",
          "is_bot": false,
          "headline": "Rename DSTAS → STAS3 identifiers across tokens module",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-04-03T15:24:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56ce9e6b13ef91e157ed19634b54f678430cef13",
          "body": "User-facing text only — all Elixir module/function names (Dstas*, dstas*)\nand upstream references unchanged.",
          "is_bot": false,
          "headline": "Rename dSTAS/Gen3 branding to STAS 3.0 in docs and display strings",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-04-03T15:20:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3d3908ffdc56c972141f86959d0f75db1953ef1",
          "body": "The BIP39 word lists in priv/bip39/ were missing from the published\nHex package, causing compilation failures when used as a Hex dep.",
          "is_bot": false,
          "headline": "v1.2.1: Include priv/ in Hex package files",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-03-29T01:40:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d545c00fe45b3111ee59f5c6ddea55960907e905",
          "body": "P2MPKH, STAS v3, DSTAS full operations, DstasBundleFactory\n920 tests, 0 failures",
          "is_bot": false,
          "headline": "Merge feature/dstas-full-operations into main — v1.2.0",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-03-26T06:38:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf3fb8dff656c137edd98885001130f155fbada4",
          "body": "- P2MPKH (Pay-to-Multiple-Public-Key-Hash) support\n- STAS v3 factory with freeze, confiscation, swap, note output\n- DSTAS full operations: split, merge, confiscation, redeem, swap modes\n- DstasBundleFactory: automatic merge/split/transfer planning\n- 920 tests, 0 failures",
          "is_bot": false,
          "headline": "chore: bump version to 1.2.0",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-03-26T06:32:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f5cc5d0b97f82ab81ddc7e6270d38739c321d9e",
          "body": "Add 45 new tests covering all P2MPKH integration paths identified in\nPRD-p2mpkh-test-gaps.md:\n\nGap 1: Payment.resolve_signing_key/1 — all 3 branches (5 tests)\nGap 2: TokenInput.resolve_signing_key/1 — all 3 branches (5 tests)\nGap 3: Template.Stas P2MPKH signing — unlock_mpkh, unlock_from_signing_key\n[…]\nPKH.sign/3 standalone bare multisig — OP_0 + signatures\n       for 1-of-1, 2-of-3, 3-of-5, custom sighash flag (11 tests)\n\nAll 920 tests pass (875 existing + 45 new). No implementation files modified.",
          "is_bot": false,
          "headline": "test: fill P2MPKH integration test gaps (6 areas)",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-03-26T03:14:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e8738c929e14f38d4d8f7ae079379fb84051abc9",
          "body": "General-purpose P2MPKH template (BSV.Transaction.P2MPKH):\n- new_multisig/2: create m-of-n multisig script with validation\n- to_script_bytes/1, from_script_bytes/1: serialize/parse roundtrip\n- mpkh/1: compute 20-byte HASH160 of multisig script\n- lock/1: bare multisig locking script\n- unlock/2: Templa\n[…]\nbackward compat fallback to private_key\n- All STAS/DSTAS factories use resolve_signing_key -> auto-dispatch\n\n33 new tests (P2MPKH: 22, SigningKey: 6, OwnerAddress: 5)\n875 total tests pass, 0 failures.",
          "is_bot": false,
          "headline": "feat: add P2MPKH (Pay-to-Multiple-Public-Key-Hash) support",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-03-26T03:02:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3ffe215d9c9b6ee76e703c6f62bbea951de4f6d6",
          "body": "…ap, note output\n\nAdd full v3 factory functions to BSV.Tokens.Factory.Stas:\n\n- build_v3_base_tx/1 — core builder supporting 1-2 inputs, 1-4 outputs,\n  optional note output, spending type parameter\n- build_v3_transfer_tx/1, build_v3_split_tx/1, build_v3_merge_tx/1\n- build_v3_freeze_tx/1, build_v3_unf\n[…]\nuccess + edge cases),\nmerge (success + edge), freeze, unfreeze, confiscation, swap cancel,\nswap flow (success + edge), note output (present + absent), validation.\nAll 238 token tests pass, 0 failures.",
          "is_bot": false,
          "headline": "feat(tokens): Phase 3 — v3 STAS factory with freeze, confiscation, sw…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-03-25T14:21:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7ca041fabe1309e2f62d18d3dc3d5096062e8815",
          "body": "…l protocol support\n\nStasBuilder now supports the new STAS script version:\n\n- Add build_stas_v3_locking_script/3 — uses the shared template (same core\n  as dSTAS) with support for:\n  - 2nd variable field (action_data: swap config, frozen designation, custom)\n  - ScriptFlags (freezable + confiscatabl\n[…]\nbackward compat\n- DstasBuilder.build_dstas_locking_script accepts ScriptFlags struct\n- 5 new v3 builder tests (default, freezable, both flags, frozen, swap data)\n- All 220 token tests pass, 0 failures",
          "is_bot": false,
          "headline": "refactor(tokens): Phase 2 — add build_stas_v3_locking_script with ful…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-03-25T14:14:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9547172027bf6ddae07e9aa61ecbc249650fc737",
          "body": "…from dSTAS\n\nLift protocol-level concepts out of dSTAS-only modules into shared types:\n\n- Add BSV.Tokens.SpendType — shared spending-type parameter (transfer,\n  freeze/unfreeze, confiscation, swap_cancellation) with to_byte/from_byte\n- Add BSV.Tokens.ScriptFlags — protocol flags field (freezable + c\n[…]\niscatable field (default false)\n- DstasBuilder.build_dstas_flags/1 accepts ScriptFlags struct\n- 25 new tests (SpendType, ScriptFlags, backward compat delegation)\n- All 215 token tests pass, 0 failures",
          "is_bot": false,
          "headline": "refactor(tokens): Phase 1 — extract shared SpendType and ScriptFlags …",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-03-25T14:11:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b11d6ba592c76cec3a6181fd9661b46d7b02ddb5",
          "body": "…r planning",
          "is_bot": false,
          "headline": "feat(dstas): add DstasBundleFactory for automatic merge/split/transfe…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-03-24T16:19:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee172fc5e78747c973463298fe8cd466624aae44",
          "body": "…nd frozen rejection\n\n- Extend ActionData swap variant with full 61-byte structure: requested_script_hash (32),\n  requested_pkh (20), rate_numerator (u32 LE), rate_denominator (u32 LE)\n- Add action_data field to DstasOutputParams for swap remainder outputs\n- Add encode/decode_swap_action_data in Dst\n[…]\noutputs for remainder legs\n- 21 new tests covering all swap scenarios: encode/decode, mode detection, 1:1/fractional\n  rates, 2/3/4 outputs, frozen rejection, auto-detection, and remainder inheritance",
          "is_bot": false,
          "headline": "feat(dstas): add transfer-swap, swap-swap modes with remainder legs a…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-03-24T15:35:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "33d8dfab1b9c738a80e5131200411a1a20a5a90d",
          "body": "- build_dstas_split_tx: 1 input → 1-4 outputs, spending type 1\n- build_dstas_merge_tx: 2 inputs → 1-2 outputs, spending type 1\n- build_dstas_confiscate_tx: spending type 3 (confiscation authority)\n- build_dstas_redeem_tx: new factory producing P2PKH output, validates\n  issuer-only ownership, frozen rejection, and satoshi conservation\n- 12 new tests covering positive flows and negative validation cases",
          "is_bot": false,
          "headline": "feat(dstas): add split, merge, confiscation, and redeem operations",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-03-24T15:09:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37e34cbe6ca428addefef08d477d6af7dd60524c",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 1.1.0",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-26T05:31:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa43af0ed68c22b3233c593a55011358cf9d119f",
          "body": "- Document timing side-channel in ECDSA moduledoc (HIGH — application-grade, not HSM-grade)\n- Add inverse-point guard in ec_point_add: P + (-P) = infinity (MEDIUM)\n- Add r != 0 and s != 0 assertion in sign_with_k for defense-in-depth (MEDIUM)\n\nReview: SECURITY-REVIEW-RFC6979.md (GLaDOS)",
          "is_bot": false,
          "headline": "Address RFC 6979 security review findings",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-26T05:30:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c87e7a3d7688909460c0b7348dfdd9dfac524df",
          "body": "…ctors\n\nReplaces non-deterministic :crypto.sign with pure-Elixir ECDSA using\nRFC 6979 HMAC-DRBG for nonce generation. Verified against 7 bitcoinjs-lib\ntest vectors (k values and full r,s signatures). Cross-validated with\nOTP :crypto.verify. Property-based determinism and correctness tests.",
          "is_bot": false,
          "headline": "RFC 6979 deterministic ECDSA: pure-Elixir implementation with test ve…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-26T04:16:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05c70d16d97dfdcf3778cdbc54c62a87878b7ce1",
          "body": "- All 16 security audit findings addressed (C-01/C-02, H-01..H-04, M-01..M-05, L-01..L-04)\n- SIGHASH_FORKID enforcement, timing-safe compare, ECDH hardening\n- ExtKey key validation, URL sanitization, crash dump hygiene\n- Flaky mnemonic test replaced with deterministic assertion\n- RFC 6979 test excluded pending pure-Elixir implementation (next release)\n- 711 tests, 0 failures",
          "is_bot": false,
          "headline": "v1.0.0: Security audit fixes, test stabilization",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-26T03:31:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6675ed17ce11fd4adfeec4eda6f184862a57d690",
          "body": "…ng-safe compare, ECDH hardening, ExtKey validation, URL sanitization, crash dump hygiene",
          "is_bot": false,
          "headline": "Security audit fixes: RFC 6979 verification, FORKID enforcement, timi…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-26T03:22:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de3b76620b55a076f0d2a223d3e316db266452b5",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 0.3.0",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-26T03:02:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb191f8bcbf0c0429908b1857112cfbeee8dd4e2",
          "body": "Pairs PrivateKey + PublicKey with helpers: new/0, from_private_key/1,\npubkey_bytes/1, pubkey_hash/1. 5 new tests (709 total).",
          "is_bot": false,
          "headline": "Add BSV.KeyPair convenience struct",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-26T02:44:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffc8052821959936fea827687cbe9c7acbc50232",
          "body": "…te, to_txin/to_txout\n\n- sig/2 helper: signs with tx context via BIP-143 sighash, placeholder when no context\n- Contract.to_txout/1: compile locking contract to Transaction.Output\n- Contract.to_txin/1: compile unlocking contract to Transaction.Input\n- Contract.simulate/3: full lock/unlock roundtrip \n[…]\nlocktime, sighash type\n- VarIntHelpers: script-level VarInt prefix handling\n  - get_varint/1, read_varint/1, trim_varint/1\n  - Auto-imported via use BSV.Contract\n\n50 new tests (704 total), 0 failures.",
          "is_bot": false,
          "headline": "Contract DSL: sig helper, P2RPH, PushTxHelpers, VarIntHelpers, simula…",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-26T02:24:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b62324a949e5988a76d4ba1ee2e0d79f136701ae",
          "body": "- BSV.Contract: behaviour + pipeline DSL for locking/unlocking scripts\n- BSV.Contract.Helpers: opcode pipeline functions (auto-generated from\n  opcodes map), push/slice/trim/reverse/decode_uint, flow control\n  (op_if/op_notif with callbacks), iteration (each/repeat)\n- BSV.Contract.P2PKH: Pay to Publ\n[…]\nact.P2PK: Pay to Public Key\n- BSV.Contract.P2MS: Pay to Multi-Signature\n- BSV.Contract.OpReturn: OP_RETURN data outputs\n- BSV.Contract.Raw: wrap pre-built scripts\n- 673 tests, 0 failures (up from 654)",
          "is_bot": false,
          "headline": "feat: Contract DSL for script building",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-26T02:12:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6354fbab152151cddb581cfbb2a3710233b3b9e7",
          "body": "- BSV.BlockHeader: 80-byte header parse/serialize, hash (double SHA-256),\n  display-order hash_hex, hex roundtrip\n- BSV.Block: full block parse/serialize with transaction list, merkle root\n  calculation and validation, genesis detection\n- Tested against Bitcoin genesis block (correct coinbase tx)\n- 654 tests, 0 failures (up from 634)",
          "is_bot": false,
          "headline": "feat: Block and BlockHeader parsing/serialization",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-26T01:53:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1940ed2b14ad9e0e4b90f45ec6de55722599e8e9",
          "body": null,
          "is_bot": false,
          "headline": "bump: v0.2.0",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-26T01:46:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "262f6bfd5d9181a2d603fad212978a06dfe33b12",
          "body": "- BSV.ExtKey: full BIP-32 implementation (master from seed, derivation\n  paths, hardened/normal children, xprv/xpub serialization, public-only\n  derivation). Passes all BIP-32 test vector 1 checks.\n- BSV.Mnemonic: BIP-39 mnemonic generation, entropy roundtrip, PBKDF2\n  seed derivation, validation. P\n[…]\nBSV.Base58: added check_encode_raw/check_decode_raw for 4-byte version\n  prefix formats (BIP-32 serialization).\n- BIP-39 wordlists: en, es, fr, it, jp, ko, pt, cs\n- 634 tests, 0 failures (up from 594)",
          "is_bot": false,
          "headline": "feat: BIP-32 HD keys (ExtKey) and BIP-39 mnemonics",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-26T01:37:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a6e26c6b872f2582cee858972b15313b71dc771b",
          "body": null,
          "is_bot": false,
          "headline": "bump: v0.1.1",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-26T01:12:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e474604080e1f956effe8460cb010e969488b9d8",
          "body": "CRITICAL fixes:\n- Constant-time comparison for HMAC/key verification (timing attack)\n- secp256k1 curve validation in PublicKey.from_bytes (invalid curve attack)\n- Replace custom EC scalar multiplication with :crypto.compute_key/4\n- OP_CAT element size limit in script interpreter (memory bomb)\n- Docu\n[…]\nfy_hmac fall back to legacy KDF\n- KeyDeriver.derive_symmetric_key accepts legacy: true option\n- 8 new migration tests verify backward compatibility\n\n603 tests, 0 failures. 23 files changed, +500/-170.",
          "is_bot": false,
          "headline": "security: comprehensive vulnerability remediation and migration path",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-18T14:45:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f16a2df7981bc94e2356043ce2dff1d185408daf",
          "body": null,
          "is_bot": false,
          "headline": "fix: update repo URLs to Bittoku org",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-18T00:26:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c40deb754208d5a217689a90897836cf3038f80",
          "body": "Document ~100 public functions across transaction, wallet, tokens,\ntransport, and utility modules for complete ExDoc coverage.",
          "is_bot": false,
          "headline": "Add @doc strings to all public functions",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-17T13:33:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "481e83462dd4139c47c2689ece5361ef92a88ce2",
          "body": null,
          "is_bot": false,
          "headline": "Update authorship to Jerry David Chan",
          "author_name": "Jerry David Chan",
          "author_login": "digitsu",
          "committed_at": "2026-02-17T09:10:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "abe5eabcbdaaadb8d2aa27522ef1a66746f4343e",
          "body": "Feature-complete port of bsv-sdk-rust to Elixir:\n\n- E1: Primitives (keys, hashing, Base58, HD derivation)\n- E2: Script (opcodes, interpreter, P2PKH, OP_RETURN)\n- E3: Transaction (building, signing, BIP-143 sighash)\n- E4: Wallet (BRC-42/43 key derivation, ProtoWallet)\n- E5: Message (BRC-78 ECIES encr\n[…]\n Back-to-Genesis locking/unlocking, proof splitting, lineage\n- Coverage push to ~91%, 0 dialyzer warnings\n- Hex.pm ready: facade, README, LICENSE (MIT), ExDoc, package metadata\n\n594 tests, 0 failures.",
          "is_bot": false,
          "headline": "Complete BSV SDK Elixir port (E1-E9 + BTG + polish)",
          "author_name": "digitsu",
          "author_login": "digitsu",
          "committed_at": "2026-02-17T08:26:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d4f697dc2c81b74ca7df7ce15ef531052ccf9b38",
          "body": "- BSV.SPV.MerkleTreeParent: double-SHA256 merkle parent (internal + hex)\n- BSV.SPV.MerklePath: BRC-74 BUMP format parse/serialize/compute_root\n  - from_hex/from_bytes, to_hex/to_bytes\n  - compute_root/compute_root_hex with indexed recursive lookup\n  - Known BRC-74 test vectors verified (3 txids, sam\n[…]\n struct with data_format (:raw_tx, :raw_tx_and_bump, :txid_only)\n- Transaction: from_binary now returns {ok, tx, rest} 3-tuple\n  - Added txid_binary/1\n- 7 new tests (223 total), 0 failures, 0 warnings",
          "is_bot": false,
          "headline": "E7: SPV - Merkle paths, BEEF parse",
          "author_name": "digitsu",
          "author_login": "digitsu",
          "committed_at": "2026-02-16T18:05:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eaa5731afb94bf96430db4aab417b9cc714bd91a",
          "body": "- BSV.Auth.Certificate: struct, to_binary/from_binary, sign/verify\n  - Binary serialization with sorted fields for deterministic output\n  - Revocation outpoint encoding (txid.index)\n  - Sign with ProtoWallet, verify with anyone wallet\n- BSV.Auth.MasterCertificate: field encryption lifecycle\n  - crea\n[…]\ncate: verifier-side field decryption\n- BSV.Auth.Nonce: HMAC-based nonce create/verify\n- Full lifecycle test: issue → sign → decrypt → reveal → verify\n- 17 new tests (216 total), 0 failures, 0 warnings",
          "is_bot": false,
          "headline": "E6: Auth - BRC-31 certificates, nonce utilities",
          "author_name": "digitsu",
          "author_login": "digitsu",
          "committed_at": "2026-02-16T17:56:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "47b538d557f2e1e8214ab4bb53cd1a4ae5ed1308",
          "body": "- BSV.Message.Encrypted: encrypt/3, decrypt/2 (BRC-78 wire format)\n  - version || sender_pub || recipient_pub || key_id || ciphertext\n  - Error handling: version mismatch, wrong recipient, too short\n- BSV.Message.Signed: sign/2-3, verify/2-3 (BRC-77 wire format)\n  - version || sender_pub || verifier\n[…]\nd || signature_der\n  - Anyone mode (verifier=0x00) and specific-recipient mode\n  - Error handling: version mismatch, wrong verifier, missing verifier\n- 14 new tests (199 total), 0 failures, 0 warnings",
          "is_bot": false,
          "headline": "E5: Message - BRC-78 encryption, BRC-77 signing",
          "author_name": "digitsu",
          "author_login": "digitsu",
          "committed_at": "2026-02-16T17:48:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "adce0cca3ab160bcd25abc353dc2bbbbc5d47461",
          "body": "- PrivateKey: derive_shared_secret (EC scalar mult), derive_child (BRC-42)\n- PublicKey: derive_shared_secret, derive_child, point_add (EC arithmetic)\n- SymmetricKey: added struct wrapper (new/1, to_bytes/1)\n- BSV.Wallet behaviour: 7 callbacks (get_public_key, encrypt, decrypt,\n  create_signature, ve\n[…]\n levels, invoice number format)\n- BSV.Wallet.ProtoWallet: implements Wallet behaviour for crypto ops\n- Known Rust test vector verified: symmetric key 4ce8e868...\n- 43 new tests (185 total), 0 failures",
          "is_bot": false,
          "headline": "E4: Wallet - BRC-42/43 key derivation, ProtoWallet, Wallet behaviour",
          "author_name": "digitsu",
          "author_login": "digitsu",
          "committed_at": "2026-02-16T17:45:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 10,
      "commits_last_year": 80,
      "latest_release_at": "2026-05-21T00:21:31Z",
      "latest_release_tag": "v2.0.0",
      "releases_from_tags": true,
      "days_since_last_push": 12,
      "active_weeks_last_year": 13,
      "days_since_latest_release": 69,
      "mean_days_between_releases": 10.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "bsv_sdk",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "hex",
          "matches_repo": true,
          "registry_url": "https://hex.pm/packages/bsv_sdk",
          "is_deprecated": false,
          "latest_version": "2.0.1",
          "repository_url": "https://github.com/Bittoku/bsv_sdk_elixir",
          "versions_count": 14,
          "total_downloads": 8187,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 2056,
          "first_published_at": "2026-02-18T00:23:39.653926Z",
          "latest_published_at": "2026-05-31T16:21:10.245585Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 58
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 9,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-05-18",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "mix.exs"
      ],
      "largest_source_bytes": 85361,
      "source_files_sampled": 187,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 6257
    },
    "dependencies": {
      "manifests": [
        "mix.exs"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "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": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "hex"
      ],
      "dependencies": [
        {
          "name": "jason",
          "manifest": "mix.exs",
          "ecosystem": "hex",
          "version_constraint": "~> 1.4"
        },
        {
          "name": "req",
          "manifest": "mix.exs",
          "ecosystem": "hex",
          "version_constraint": "~> 0.5"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "digitsu",
          "commits": 79,
          "avatar_url": "https://avatars.githubusercontent.com/u/3816267?v=4"
        },
        {
          "type": "User",
          "login": "jerrleey-cmd",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/222969731?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.988
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "mix.lock"
      ],
      "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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "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": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no 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": 10,
            "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 0 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": null,
            "reason": "no dependencies found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not 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": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "24 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "978084f78c9a6b0071026cf39528ce597edfce0d",
        "ran_at": "2026-07-29T02:28:28Z",
        "aggregate_score": 2.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-16T13:00:47Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/Bittoku/bsv_sdk_elixir",
    "host": "github.com",
    "name": "bsv_sdk_elixir",
    "owner": "Bittoku"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 45,
      "inputs": {
        "security": 27,
        "vitality": 74,
        "community": 37,
        "governance": 38,
        "engineering": 44
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 74,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "commits_last_year": 80,
              "human_commit_share": 1,
              "days_since_last_push": 12,
              "active_weeks_last_year": 13
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 12 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 12
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "13/52 weeks with commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 13
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "80 commits in the last year",
                "points": 17.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 80
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 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": 88,
            "inputs": {
              "releases_count": 10,
              "latest_release_tag": "v2.0.0",
              "releases_from_tags": true,
              "days_since_latest_release": 69,
              "mean_days_between_releases": 10.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "10 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 69 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 69
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~10.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 10.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": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 37,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 15,
            "inputs": {
              "forks": 1,
              "stars": 9,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "9 stars",
                "points": 14.6,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "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": 55,
            "inputs": {
              "packages": [
                "bsv_sdk"
              ],
              "dependents": null,
              "ecosystems": "hex",
              "total_downloads": 8187,
              "monthly_downloads": 2056
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,056 downloads/month across hex",
                "points": 44.2,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2056,
                      "ecosystems": "hex"
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Sustainability & Governance",
        "value": 38,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 15,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.988
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 99% of commits",
                "points": 0.3,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 99
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 1
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "0/1 decided PRs merged",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 0,
                      "decided": 1
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 51,
            "inputs": {
              "followers": 2,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "Bittoku",
              "public_repos": 5,
              "account_age_days": 4331
            },
            "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": "2 followers of Bittoku",
                "points": 3.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 2,
                      "login": "Bittoku"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "5 public repos, account ~11 yr old",
                "points": 17.7,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 5
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "bsv_sdk"
              ],
              "ecosystems": "hex",
              "any_deprecated": false,
              "min_days_since_publish": 58
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on hex",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "hex"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 58 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 58
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "14 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Engineering Quality",
        "value": 44,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 27,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 27,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 2.7
            },
            "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 not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "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.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 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": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "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": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "24 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "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": 1
            },
            "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": 68,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.938,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 6257
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "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": "75 of 80 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 75,
                      "sampled": 80
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 61,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "mix.lock"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.05,
              "toolchain_manifests": [
                "mix.exs"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "mix.exs (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "mix.exs"
                    }
                  }
                ],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "4 of the last 80 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 4,
                      "sampled": 80
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 54,
            "inputs": {
              "primary_language": "Elixir",
              "largest_source_bytes": 85361,
              "source_files_sampled": 187,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Elixir without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Elixir"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/187 source files over 60KB",
                "points": 54.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 187,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-29T02:28:32.803357Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/b/Bittoku/bsv_sdk_elixir.svg",
  "full_name": "Bittoku/bsv_sdk_elixir",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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 agregadasHex.