Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-27 17:50 UTC

FinLang-Ltd / finlang

FinLang — Deterministic, auditable financial rules engine.

PythonAGPL-3.0★ 14 estrellas⑂ 0 forksdesde sept 2025Ver en GitHub ↗

FinLang-Ltd/finlang tiene un índice de salud de 63 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (92/100) y la más baja, AI Readiness (38/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

63
global / 100
Moderado

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

63
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

FinLangOrganización
1 seguidor1 repositorio públicodesde sept 2025

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
PyPIfinlang0.8.355318hace 0 días

Métricas por categoría

Vitalidad

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

92Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
21.5/36Cadencia de commits — 31/52 semanas con commits
18/18Volumen de commits — 231 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_year231
human_commit_share1
days_since_last_push0
active_weeks_last_year31
Cómo se puntúa
27/27Publica versiones — 6 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~15,6 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count6
latest_release_tagv0.8.3
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases15,6
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?

43En riesgo · 18% del índice global
Cómo se puntúa
18.1/60Estrellas — 14 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars14
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 (AGPL-3.0)
18/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_contributing
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
36.6/80Descargas mensuales — 553 descargas/mes en pypi
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesfinlang
dependents
ecosystemspypi
total_downloads
monthly_downloads553
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?

51Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
46.8/46.8Resolución de issues — 100% de issues cerradas
28.7/38.3Aceptación de PR — 3/4 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs3
open_issues0
closed_issues1
issue_closed_ratio1
closed_unmerged_prs1
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
2.2/25Alcance del propietario — 1 seguidores de FinLang-Ltd
3.9/25Trayectoria — 1 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers1
owner_typeOrganization
is_verified
owner_loginFinLang-Ltd
public_repos1
account_age_days314
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en pypi
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 18 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesfinlang
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

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

72Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
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_ci
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

90Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://finlang.io
10/10Descripción del repositorio
10/10Topics — 10 topics
0/10Wiki
Datos de entrada utilizados
topicsagpl, audit, compliance, dsl, eu-ai-act, fintech, open-source, python, regtech, rules-engine
has_wikino
homepagehttps://finlang.io
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?

51Moderado · 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/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
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 — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate3,9
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, packaging, signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
25/25Dependencias indirectas libres de avisos conocidos — ninguna dependencia indirecta tiene un aviso conocido
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages4
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejó el cierre de dependencias en tiempo de ejecución de pypi:finlang@0.8.3 —lo que arrastra la instalación del paquete publicado—: 4 paquetes. No se analiza la alcanzabilidad.

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.

38En riesgo · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
36.3/40Historial de commits legible — 68 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,68
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
0/11Configuración de lint / formato
0/11Verificación estática de tipos
0/10Entorno reproducible
10/10Práctica demostrada con agentes — 44 de los últimos 100 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 — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,44
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
0/45Código verificable por tipos — Python sin configuración de verificación de tipos
53/55Tamaños de archivo manejables — 1/28 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes66.553
source_files_sampled28
oversized_source_files1
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

14estrellas de GitHub
1contribuidores
231commits en los últimos 12 meses
0días desde el último push
6versiones publicadas
1factor bus
0issues abiertas
PyPIecosistemas 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 3.9 / 10
3.9agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-27 17:50 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
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
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
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 1
RegistroPaqueteRestricción de versiónManifiesto
PyPIpandas>=2.0pyproject.toml
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

Avisos de dependencias 0

Instalar pypi:finlang@0.8.3 arrastra 4 paquetes, directos y transitivos: 0 tienen avisos conocidos, de los cuales 0 son dependencias directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "agpl",
        "audit",
        "compliance",
        "dsl",
        "eu-ai-act",
        "fintech",
        "open-source",
        "python",
        "regtech",
        "rules-engine"
      ],
      "is_fork": false,
      "size_kb": 5952,
      "has_wiki": false,
      "homepage": "https://finlang.io",
      "languages": {
        "Python": 342209
      },
      "pushed_at": "2026-07-26T18:03:28Z",
      "created_at": "2025-09-18T21:17:51Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-26T18:03:36Z",
      "description": "FinLang — Deterministic, auditable financial rules engine. ",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "AGPL-3.0",
      "default_branch": "main",
      "license_spdx_raw": "AGPL-3.0",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": "www.finlang.io",
      "name": "FinLang",
      "type": "Organization",
      "login": "FinLang-Ltd",
      "company": null,
      "location": "United Kingdom",
      "followers": 1,
      "avatar_url": "https://avatars.githubusercontent.com/u/232459559?v=4",
      "created_at": "2025-09-15T21:00:56Z",
      "is_verified": null,
      "public_repos": 1,
      "account_age_days": 314
    },
    "license": {
      "state": "standard",
      "spdx_id": "AGPL-3.0",
      "raw_spdx": "AGPL-3.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2026-07-26T18:15:00Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-07-20T17:59:08Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-07-16T11:41:28Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-06-29T21:23:55Z"
        },
        {
          "tag": "v0.7.9",
          "kind": "patch",
          "published_at": "2026-05-18T20:27:56Z"
        },
        {
          "tag": "v0.7.8",
          "kind": "patch",
          "published_at": "2026-05-09T14:38:19Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "d07d685de5e19fe22beda43ec954da2e0dc9e556",
          "body": "Version bump + release docs for v0.8.3 per RELEASE_CHECKLIST section 5.",
          "is_bot": false,
          "headline": "Merge branch release/v0.8.3",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-26T18:02:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "327b9de106fd1850cffe5c6560038648d1a1c895",
          "body": "Four sync points + CHANGELOG [0.8.3], release notes, README feature/version\ntables, classified doc version sweep (stamps earned per RELEASE_CHECKLIST\n2.5), DOCUMENT_MAP release state + release-notes inventory backfill\n(v0_7_9 through v0_8_3 rows).\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump version to 0.8.3",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-26T17:57:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cbeaecc761109ad8461c4faf1053a2c54ba4350e",
          "body": "Reconcile ML-date inference + --reconcile-date-format (74c3e14) and\nSOL-111 --verify-html + review-round hardening (c57ea38). Reviewed by\nCodex (three rounds, all findings closed and independently re-verified);\noperator accepted the external review per Path B.",
          "is_bot": false,
          "headline": "Merge branch claude/reconcile-date-locale-plumbing",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-26T17:08:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c57ea38afa4b8eb4fd890f5d4e4067c4984dc4e7",
          "body": "…iew-round hardening\n\nSOL-111: verify_html.py renders a self-contained plain-English evidence\nreport (what happened, scope of the check, fingerprint proof sample;\nmismatch detail only when present; structural failures named as such,\nnever blamed on rows that passed). Exposed as verify_html on /proce\n[…]\nmode starts above the 100K threshold)\n\nTests: daily 204/10 (Gate 4 27, Gate 8 29, Gate 10 60), API 29,\nship-with-repo smoke 7. quick_check 10/10.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(verify): --verify-html readable integrity report (SOL-111) + rev…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-26T17:08:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "74c3e14462ea165841d039f6555e115af79136b6",
          "body": "…sumption\n\nReconcile mis-keyed dates from external ML outputs, silently.\n\nreconcile.py documented 'both sides of a reconcile are post-engine CSVs, so\nengine defaults apply — no dayfirst/date_format plumbing here'. That assumption\nfails for the feature's headline use case: the ML side comes from a th\n[…]\nion' requirement\nis his.\n\nTests (test_reconcile.py, 3 new): inference regression, assumed-mode recording,\nexplicit-flag recording. WIP — see commit body of the follow-up for what\nremains before merge.",
          "is_bot": false,
          "headline": "fix(reconcile): infer the ML side's date convention, and state the as…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-26T10:33:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8b35e6e6bc18dc228c9e7a61a091ee3f186a4ed0",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/benchmarks-version-comparison'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-20T19:25:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06eaed314ce91d3f1bdebf04861d690577f9fc85",
          "body": "…ontinuity row + verify speed pointer)",
          "is_bot": false,
          "headline": "docs(benchmarks): version comparison carries forward to v0.8.2 (20M c…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-20T19:25:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2817f7996d01d648b69faa0084729cbd599cedda",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/benchmarks-20m-transcript'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-20T19:20:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0b3627c4e41caad336eba7c9f5cb94bad4c48e6",
          "body": "…anscript (run 2, both runs full PASS)",
          "is_bot": false,
          "headline": "docs(benchmarks): integrity results section carries the v0.8.2 20M tr…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-20T19:20:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e871b478d84381135d562738c5708e635a36263a",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/benchmarks-v082-20m'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-20T19:19:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "050e9f43d55a479742103a3d40344aa7136216b6",
          "body": "…6.9K FastIO, full field-by-field)",
          "is_bot": false,
          "headline": "docs(benchmarks): v0.8.2 20M integrity re-validation (179.7K std / 22…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-20T19:19:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0fe7336d9a3d446864b6ddfe5e32192ff0be0ce4",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'release/v0.8.2'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-20T17:42:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e1acc6d5fae0f7023e059254f02ca8f6c9c294f",
          "body": "SOL-110 verify vectorisation release: version sync across 4 points, CHANGELOG, release notes, ungated doc sweep (15 Last-verified stamps re-checked, flags.md + api_reference.md known-stale cleared with --help cross-check).",
          "is_bot": false,
          "headline": "Bump version to 0.8.2",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-20T17:42:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "057994354e48036074baf599920d465db0986297",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/sol-110-verify-vectorise'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-20T16:44:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97970a7eabb8a6c0c8643c1ee176e241744deb84",
          "body": "…ndidates)",
          "is_bot": false,
          "headline": "docs(DOCUMENT_MAP): fix stale workspace paths (archive/ + scratch/ ca…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-20T16:39:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8df60c2e086fce12db088e9794d649e543a56ac1",
          "body": "It carries no test counts. It computes its gate total dynamically\n($gateCount = 7/6) and delegates the daily counts to quick_check.ps1.\nThe \"New test added\" scenario has said \"quick_check.ps1 and\nfull_test_suite.ps1 (counts always)\" for generations - a sweep target\nwith nothing to sweep.\n\nHarmless s\n[…]\n).\n\nSurfaced by Angus challenging whether the suite and docs were really\nrelease-ready; verified against the script rather than the instruction.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: stop telling sessions to count-sweep full_test_suite.ps1",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-16T19:59:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0d94758d8657625e0624df4ecb4579de50225318",
          "body": "…tion\n\nThe authoritative file map still described the pre-SOL-110 internals.\nThe row now names the fast-path/fallback reader split, the uniques-trick\nnormalisation, and - load-bearing for future sessions - the rule that the\nscalar normalisers must never be forked (reconcile.py imports them, and\n_nor\n[…]\nhe Gate 8 pin tests.\n\nFound by re-walking DOCUMENT_MAP's own Common Change Scenarios against\nthis branch rather than trusting the earlier sweep.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(DOCUMENT_MAP): verify.py row describes the vectorised implementa…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-16T19:55:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7d904a5e333c8d30e6b6a210c2e529c641f5299d",
          "body": "…racy)\n\n- P2: reader docstring + inline comment now describe the real ragged-\n  long behaviour (fast-path truncation matching DictReader extras\n  handling, not fallback) - corrects the prior commit's claim too\n- count sweep v2: daily 185->187 / Gate 8 16->18 across README,\n  DOCUMENT_MAP, compliance\n[…]\n row extended with the new reader-\n  equivalence and fast-path-liveness pins\n\nGate run after changes: quick_check 10/10 (187 tests), single run.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(verify): action Codex review of SOL-110 (fast-path pins, doc accu…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-16T16:24:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09dc51e76427eeca44af6ab0da8ff433aa6c8937",
          "body": "- pandas reader fast path with byte-equivalent scalar fallback\n  (exact-duplicate headers, ragged long rows, empty files fall back)\n- once-per-unique-value normalisation reusing the scalar functions\n  verbatim (uniques trick - no semantic fork, spec section R)\n- two-mask compare preserves the full-m\n[…]\nosed),\n  DOCUMENT_MAP verify row + stale reference/ paths fixed per\n  BACKLOG trigger, count sweep across README/DOCUMENT_MAP/\n  compliance_pack\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(verify): vectorise read/normalise/compare path (SOL-110)",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-16T13:28:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "20e0bf67db3278529d8c87e5d26fd30b5817fcff",
          "body": null,
          "is_bot": false,
          "headline": "Ignore .playwright-mcp/ (browser-tool session artefacts)",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-16T11:25:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1a030db4f2efed5f9a086171f636980727475cd",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'release/v0.8.1'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-16T11:20:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c5ab22918454c7aa28190d57acf5a070362a7a0",
          "body": "Hardening release: 13 fixes from the 4-Jul code sweep (verify/reconcile comparison layer, audit determinism + attribution, fail-loud rules loading, API contract). Docs: CHANGELOG, release notes incl. two API compatibility callouts, version sweep across 16 docs, compliance pack refresh. Tests 168->182 daily + 26 API. No new features; categorisation output unchanged.",
          "is_bot": false,
          "headline": "Bump version to 0.8.1",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-16T11:20:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ba4050531755cc1854356d1655f851816fda931",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/api-boundary-hardening'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-16T08:29:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7495286dcdec84e019e6124c2a4d8231a9a201e6",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/cli-rules-source-hardening'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-16T08:29:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd0982e8ad33435e6c460c297b29ca5618ba2a28",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/engine-attribution-determinism'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-16T08:29:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89dd5b2c16f056b5aed71a6573703d98a7a7f157",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/verify-comparison-hardening'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-16T08:29:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c77f5093dadb5b377637c8025aa26529860c0087",
          "body": "… counts (Codex stack review)\n\nFinding 1 (P1): /process verify-fail 422 detail is now a structured object (error/exit_code/message/verify_report/stderr) -- documented in api_reference.md exit table + api.md auth section and exit table, flagged as v0.8.1 compatibility change. Empty FINLANG_API_KEY = \n[…]\n, impact 17; aggregate 182 unchanged) with 4-Jul hardening test descriptions. Release-notes callout obligation tracked in BACKLOG.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(api): document v0.8.1 contract changes + fix stale per-file test…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-15T08:46:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e1cf4bacd9ede66f764b00c43ad4c366c4d339ca",
          "body": "…sabled\n\n4-Jul sweep Branch 4:\n- /process with verify=true and engine exit 3 now returns 422 with a\n  structured detail carrying verify_report.json (it previously died with\n  the temp dir, leaving a bare 422 exactly when the report mattered).\n- FINLANG_API_KEY=\"\" treated as unset (compose passthroug\n[…]\ny: 24 -> 26 (verify-report-on-422, empty-key-disabled); sweep\nacross CLAUDE.md/AGENTS.md canaries (on disk), README, DOCUMENT_MAP.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(api): verify-fail 422 carries the report; empty API key = auth di…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-04T13:28:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "34c5dc25dfd9e560a794a7c98dffd6cd7566255f",
          "body": "…p Branch 3)\n\n- Missing/unreadable --rules file or unknown/unreadable --include-pack now\n  FATAL + exit 2 via the (previously dead) caller guards. Warn-and-continue\n  produced partial categorisation with exit 0 (demonstrated) — an\n  audit-integrity bug: output silently omitted an entire requested so\n[…]\nith the wrapper's existing exit-2 mapping; the tolerant\ntest_process_with_include_pack_only assertion (200|422) already covers it.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): named rules sources that fail to load are fatal (4-Jul swee…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-04T13:26:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1037b69c8045a9d71822e31973225d55a5e098b2",
          "body": "…ranch 2)\n\n- reset_index(drop=True) after the drop-rate guard: audit attribution is\n  positional downstream; gapped labels shifted impact old_rule/new_rule and\n  reconcile audit linkage for every row after a dropped row (F1, pre-existed\n  since v0.7.8 in reconcile).\n- mutable_fields set -> tuple: fi\n[…]\n10 gates green. Goldens unaffected (output-CSV bytes unchanged; full\nsuite 7/7 incl. golden matrix verified on this branch stack).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(engine): attribution alignment + audit determinism (4-Jul sweep B…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-04T13:17:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a4cf8f680085e58697a534ea5f674493308bf477",
          "body": "… clean\n\nP2 from the 4-July lessons record (strategy-backlog/reference/\nlessons-code-sweep-20260704.md): the injection-quote false-fail shipped\nbecause no test composed write-time transforms with read-back comparison.\nTestRoundTripInvariant cycles hostile-but-legitimate inputs (= @ tab\n+ - leading, \n[…]\nCounts: 175 -> 177 (Gate 8: 11 -> 13); sweep re-run across all ten\ntargets (CLAUDE.md + RELEASE_CHECKLIST.md on disk, gitignored).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(verify): round-trip invariant — engine output must always verify…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-04T13:05:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "65fed2d448e70fbfa0622a665b6fe3232772975f",
          "body": "…e's own output\n\nThree demonstrated defects from the 4 July post-v0.8.0 code sweep, all in\nthe comparison/trust layer (categorisation engine untouched):\n\n1. Injection-quote false-fail: the write-time formula-injection guard\n   (_csv_safe_text) prefixes ' to danger-leading cells (= + - @ tab);\n   ver\n[…]\n,\nboth showcase scripts, README.md, DOCUMENT_MAP.md; CLAUDE.md and\nRELEASE_CHECKLIST.md swept on disk (gitignored internal files).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(verify,reconcile): comparison layer must not contradict the engin…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-07-04T12:57:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b83b13abaddfd18146190014871604a724410a04",
          "body": "fix(ci): guard CLA Assistant Lite against non-PR issue comments (issue #5 GraphQL failure).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge branch 'claude/fix-cla-issue-comment-guard'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-29T21:02:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "481ede31f939038174f0f0f397c8bc63d8ab6794",
          "body": "The issue_comment trigger fires for comments on issues AND PRs. A comment on a\nplain issue (issue #5, 19 Jun 2026) made the action try to resolve a PullRequest\nof that number -> \"Could not resolve to a PullRequest with the number of 5\", and\nthe job failed in ~6s.\n\nAdd the action's recommended `if:` \n[…]\n\nevents, or on the CLA recheck / signature comments. Comments on plain issues now\nskip the step (job succeeds) instead of failing.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): guard CLA Assistant Lite against non-PR issue comments",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-29T21:02:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6c7b1a13d96744befe2887fdd4c861576a738108",
          "body": "v0.8.0 release: version bump 0.7.9->0.8.0 (4 sync points) + release docs (CHANGELOG, release notes, README, doc version sweep, CLI-help cross-check). Validated on the merged tree: full_test_suite 7/7, quick_check 10/10, adversarial 8/8, integrity re-verified to 20M rows field-by-field (0 mismatches, FastIO ~220K @ 20M, no regression vs v0.7.7 ~217K). LOCAL MERGE ONLY -- not pushed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge branch 'release/v0.8.0'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-29T20:38:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f0a97de4a470e783d69860101c97190c292ec0c8",
          "body": "… 20M)\n\nReplaces the vague \"a confirmation run backs the claim\" with the measured\nresult: re-verified at 20M rows (field-by-field, zero mismatches), FastIO\nthroughput consistent with the established ~217K figure, no regression. Notes\nthat throughput is scale-dependent (small runs are overhead-domina\n[…]\nchine scaling runs (1M->5M->10M->20M): FastIO converges\n~220K at 20M, std ~185K -- matching/marginally above the v0.7.7 benchmark.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(release): make perf no-regression claim concrete (re-verified at…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-29T20:24:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fff549fb12cc56528581147f5cddfa1a2f5dd39e",
          "body": "- CHANGELOG: [0.8.0] entry (reconcile-v2 SOL-103/104, impact SOL-105, API parity).\n- New docs/release_notes/release_notes_v0_8_0.md (Impact Analysis & Reconcile v2).\n- README: \"Byte-identical to v0.7.8\" -> \"Output-identical to v0.7.9 (additive\n  audit_max param)\"; Key-Features heading + Component St\n[…]\n\n  and cli_reference.md; discover/suggest clean.\n\nRELEASE_CHECKLIST.md (gitignored) daily-tier breakdown 137->168 updated on disk.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(release): v0.8.0 release documentation",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-29T15:25:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b7104db06cf8759e3ca8eef61d4b32d783425db2",
          "body": "4 sync points: __init__.py, pyproject.toml, run_finlang.py fallback,\ncanonical_fields.yaml. Path C, on release/v0.8.0 branch. Editable install\nreports FinLang 0.8.0. (Stray \"v0.7.9\" comment in canonical_fields.yaml line 3\nleft for the step-2 doc version sweep.)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump version to 0.8.0",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-29T11:37:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ee72aa463be90612c5c21ccfe535e894067f77c6",
          "body": "API parity for v0.8.0: expose reconcile-v2 (identity guard + key alignment +\norphans) and impact analysis over the HTTP API; honest structured 422 body on\nalignment-endpoint exit 1; API surface parity codified as a DOCUMENT_MAP\nchange-scenario. Live-smoke-tested (uvicorn + HTTP) before merge; test_api 24/24.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge branch 'claude/api-reconcile-impact-parity'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-29T11:26:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "37729290c39301d5996e311a18d10c3d3da9ac4b",
          "body": "Council review (Claude/ChatGPT/Gemini, unanimous) on the exit-1 -> 422 call for\n/reconcile + /impact: keep 422 (client-data, not server fault), but (1) make the\nbody a real discriminator and (2) document the exit-1 overloading honestly\ninstead of implying exit 1 cleanly == \"alignment failure\".\n\n- _a\n[…]\n \"API error taxonomy\" (token-absent exit-1 -> 500,\ntoken-present -> 422; additive stderr, no exit-code renumber).\n\ntest_api 24/24.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refine(api): honest structured 422 body on alignment-endpoint exit 1",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-29T07:42:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "733ad755347872e0f4bc8c168c8718c645aa4c4d",
          "body": "Codifies \"keeping the API up to date is core to every feature\" after the\nv0.8.0 near-miss (reconcile-v2 + impact shipped CLI-only; API lagged a sprint).\nNew DOCUMENT_MAP \"API surface parity\" row + cross-links from the CLI-flag and\ndiscover/suggest-flag rows. CLAUDE.md/AGENTS.md CLI-flag doc-maintenance bullet\nupdated on disk (canaries, no repo). Same branch as the parity build itself.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(process): make API surface parity a first-class change-scenario",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-29T07:21:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "51e023a08613031f75633411cc2d5182a789d0d4",
          "body": "…ity)\n\nBrings the FastAPI wrapper up to CLI parity for the v0.8.0 sprint features so\n\"three surfaces, one engine\" holds at ship.\n\n/reconcile:\n  - new Form params reconcile_identity_fields (SOL-103 identity guard) and\n    reconcile_key (SOL-104 key alignment)\n  - key-mode orphan artefacts surfaced as\n[…]\n test-suite/test_api.py (private repo): +7 -> 24 total, uncommitted\nuntil Path C two-repo push. quick_check 10/10; test_api 24/24.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(api): expose reconcile-v2 + impact over the HTTP API (v0.8.0 par…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-29T07:15:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4ff90f71aea34cabe6ce7de55c962cddcb90cb3e",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/reconcile-orphans-html'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-28T21:38:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14dd418655c74934e11ad5e83919484544f9a15f",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/sol-105-impact-html'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-28T21:38:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c35b35ea5a586055db297330c8f7c788c0b640a7",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/sol-105-impact-artefacts'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-28T21:38:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34b485a966ff991f32cf1879847f38e8e443006c",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/sol-105-impact-core'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-28T21:38:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56d3a18e9154f16e736dd6ffd57c8356576cecae",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/sol-104-key-alignment'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-28T21:38:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c13e61b9b822c59798fbf3de9dd84d67cb3a0ab2",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/sol-103-identity-guard'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-28T21:38:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4844d657fccee8eca0fb3e269a107831c1af7055",
          "body": "…iling)\n\nDocuments the performance/scale boundary a buyer's data engineer will ask\nabout: key alignment is an O(N+M) in-memory hash join (not pairwise);\nceiling is machine RAM, not a row count — roughly low-millions-of-rows on\na typical workstation, memory-bound before speed. No streaming I/O (out of\nscope); not yet benchmarked at that range. No throughput figures quoted\n(unbenchmarked = unbackable per register).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(reconcile): add Scale note (in-memory hash join, memory-bound ce…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-28T21:36:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ad57b9b7df6364a97083262ac2aac8ddcb55af03",
          "body": "Reader hit the gap — the terms were referenced (flag tables, flow\ndiagram) but never defined up front. Adds a 'Baseline vs candidate'\nsection near the top: current/--rules/before vs proposed/--impact-rules/\nafter, arrow-direction reading, and the main-vs-PR real-world mapping.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(impact): define baseline vs candidate explicitly",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-28T16:19:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e8d8775b1d7d57d7bb494d6e8c36f10b5ea4ed48",
          "body": "…te 10\n\nTwo approved follow-ons completing the reconcile-v2 / impact release:\n\n1. Orphans HTML section (SOL-104 follow-on, mockup-approved 28 Jun).\n   reconcile_html.py renders FinLang-side and ML-side orphan tables below\n   the mismatch table when key-mode produces orphans, with orphan counts\n   in\n[…]\nLIST.md, both\n  showcase scripts, CLAUDE.md + AGENTS.md headers\n- 10/10 daily gate green (Gate 10 = 50 tests); orphans test passes\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(reconcile): orphans section in HTML report + wire impact into Ga…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-28T13:31:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f4ca87fb0e9258712191a46ca75f701a50479854",
          "body": "Impact analysis HTML report (SOL-105 Branch 3, mockup-approved 28 Jun).\nNew impact_html.py renders an ImpactResult as a self-contained report:\namber \"REVIEW REQUIRED\" / green \"NO BEHAVIOURAL CHANGE\" banner, headline\ncards, transition matrix, per-rule deltas, prominent attribution-only\nsection, cappe\n[…]\nap +\n  CSV-keeps-all, green banner on no-change; --impact-html validation)\n- 10/10 daily gate green; 16/16 impact standalone green\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(impact): self-contained HTML report via --impact-html",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-28T13:15:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2187245ede67fbde5b9cbc2231bbbaed20661675",
          "body": "DOCUMENT_MAP catch-up for the sprint: impact.py file-inventory row\n(diff semantics, schema impact/1, update-when triggers); reconcile.py\nrow extended with identity-guard + key-alignment surfaces;\ntest_reconcile.py row 19 -> 33 with the new coverage; test_impact.py\nrow added (13 standalone, gate wiring pending Rule-4 approval);\narchitecture line 3 gains impact analysis.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(map): inventory rows for impact.py + SOL-103/104/105 test surfaces",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-10T12:49:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9e0df80ef0bda78675b6e8fab79dffb98d06df46",
          "body": "Impact analysis artefact layer (SOL-105 Branch 2). Written to\n--impact-output-dir on every impact run.\n\n- impact_report.json: versioned schema (impact/1); run metadata\n  (finlang version, UTC timestamp, input + both rulepack basenames);\n  SHA-256 of the rule TEXT each pass consumed - computed over t\n[…]\ntribution scenarios).\n- Docs sweep start: cli_reference.md + flags.md impact sections.\n  Full impact.md page lands with Branch 3 (mockup-gated).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(impact): JSON + CSV artefacts — schema impact/1, rule-text hashes",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-10T11:43:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2f474f35bbed2efc0ed87b22372fdea6873dec58",
          "body": "One frame, two passes, in-process (SOL-105 Branch 1). The same\nnormalised input runs through baseline (--rules) and candidate\n(--impact-rules) rulepacks; a vectorised diff reports what the change\ndoes before it goes live.\n\n- Behavioural change = any difference in (category, flags, status);\n  flags c\n[…]\n flag validations). Standalone\n  per the test_api.py precedent - gate wiring is a deliberate\n  orchestration decision pending explicit approval.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(impact): rule-change impact analysis core via --impact-rules",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-10T11:25:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8c5d6573b63093fb660186f3aea1503db4f3faff",
          "body": "Key-based row alignment with orphan detection (SOL-104). Opt-in;\npositional remains the default. Rows match by canonicalised composite\nkey (amounts numeric, dates ISO, text case-insensitive — same contract\nas the identity guard). Row counts may differ; unmatched rows are\nreported as orphans. Flag na\n[…]\n-choice\n  guidance, limitations recast), cli_reference, flags, faq; count\n  sweep across test-suite scripts, TEST_SUITE.md, DOCUMENT_MAP, README\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(reconcile): key-based alignment via --reconcile-key",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-10T11:14:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9da2628d266102c5cea554ff894a284dda668f3e",
          "body": "Positional identity verification before field comparison (SOL-103).\nWhen the configured identity fields (e.g. date,amount,counterparty)\nmisalign between FinLang and ML output, reconcile refuses to report:\nexit 1 (structural), reconcile_identity_failures.{csv,json} written,\nnormal mismatch artefacts \n[…]\nrecast (reconciliation.md),\n  cli_reference, flags, faq, workflows; count sweep across test-suite\n  scripts, TEST_SUITE.md, DOCUMENT_MAP, README\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(reconcile): identity guard via --reconcile-identity-fields",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-06-10T10:55:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9dd6e3277cce028790f3a3d3c24be39c4727d3e9",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/readme-v0.7.9-polish'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-20T21:36:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "222eff754e4d83a9ff815e982af4954fa8227e78",
          "body": "…aming\n\n- New 'What this is for' section after Overview frames FinLang as a\n  deterministic challenge layer for ML categorisation pipelines, with\n  three-surfaces-one-engine framing (CLI / Python subprocess /\n  self-hosted FastAPI).\n- Key Features header bumped v0.7.8 -> v0.7.9; new FastAPI Wrapper \n[…]\n cols)' inline at first\n  appearance; 5M x 50 / ~27.9K row/s enterprise benchmark preserved\n  as the general-CSV reference figure.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): v0.7.9 polish — version sweep + narrative + evidence fr…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-20T21:36:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bd67d3dee463930d020cedfbd3f19281add8a55c",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/extend-cleanroom-api'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-18T21:17:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87b45d3f4fdd9fd6dfd310bc44ed09e1fcec3dae",
          "body": "Reflects extension of test-suite/cleanroom_test.ps1 to add Gate 5 —\nfinlang-api launches, /health returns correct version + cli_resolved=true.\nMirrors v0.7.9 release-day manual mini-cleanroom (now automated).\n\nLive-tested against v0.7.9 PyPI install: 5/5 PASSED, 175.3s total.\nGate 5 ran in 1.8s (pol\n[…]\n1/Phase 2\nframing recast (~45-60 min); RELEASE_CHECKLIST.md alignment notes\n(CI presence, canonical-doc rule, v0.7.9 backup miss).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(map): cleanroom now validates 5 gates (incl. API surface)",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-18T21:09:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "259529968aaf2f83365559660ba73be65159e23d",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/release-day-doc-sweep'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-18T19:44:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b157185384c706da94d70dffed4011a386f8aceb",
          "body": "…erred pending register recast)\n\nBumps 'Last verified:' header from v0.7.8 → v0.7.9 on 10 technical docs\nthat are clean against the v0.7.9 register discipline:\n\n- amount_synthesis.md\n- flags.md\n- growth_loop_best_practices.md\n- i18n_examples.md\n- mapping_guide.md\n- rule_language.md\n- rulepacks.md\n- \n[…]\nd reconcile framing —\nleft as-is.\n\nbenchmarks.md kept at v0.7.7 (not re-validated; per RELEASE_CHECKLIST\nStep 2.5 exclusion list).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: bump version stamps to v0.7.9 (reconciliation.md and faq.md def…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-18T19:42:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dc46fcada568f7e857e3bddf6f4c36731e7fec01",
          "body": null,
          "is_bot": false,
          "headline": "docs: stamp v0.7.9 release date",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-18T19:24:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfb0e0dd6095872e729c7766b86ea80d62293895",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): stamp v0.7.9 release date",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-18T19:24:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0804eb967b71f41206bf0018599c044f164f8595",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/release-notes-v0.7.9'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-17T19:22:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc146a9aca3ccef3a0c1fabbe9a62bdecab0c526",
          "body": "Release notes file: docs/release_notes/release_notes_v0_7_9.md\n('Three Surfaces, One Engine').\n\nStructure (per spec): Headline → Released TBC → What's New → Why This\nMatters → What Hasn't Changed → Coming Next → How to Upgrade → Migration\nNotes → Acknowledgements.\n\nHeadline + opening beat used verba\n[…]\nerence.md — sample /health response version\n  '0.7.8' → '0.7.9' so the example matches what the v0.7.9 install\n  actually returns.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: release notes for v0.7.9 + pre-release polish pass",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-17T19:16:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "46174c8cb5b8be9d76fec0b6ad845efef7d880cb",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/pre-release-doc-sweep'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-17T10:31:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "427dc4f8983f0826a80ca19b9fc1417190e7aea9",
          "body": "Closes 7 accumulated doc-sync misses across v0.7.7 / v0.7.8 / v0.7.9, and\nadds two preventative Common Change Scenario rows so the same gaps don't\nrecur.\n\ninstall.md (4 fixes):\n- Header 'Last verified: v0.7.8' → 'v0.7.9 (target)'\n- Python version range '3.10–3.12' → '3.10–3.14' (matches pyproject.to\n[…]\nth files\n\nRoot cause noted: the Change Scenarios table is the spirit-guide's table\nof contents, and gaps in it become gaps in execution. The two new\nscenarios close the next iteration of this pattern.",
          "is_bot": false,
          "headline": "docs: pre-release doc sweep — DOCUMENT_MAP + install.md",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-17T10:28:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7cb2ffb86d18fdf92346b1dc5f0570c52b9e4a88",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/sol-041-api-wrapper'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-15T17:37:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bddbae4b1d946922ea4b6b37b138ccde9248b0f",
          "body": "… response\n\nPre-release UX fix surfaced by buyer-feedback loop: viewing the reconcile\nHTML report from the API previously required a 5-step extract-and-clean\nsequence (POST → parse JSON → extract report_html field → write to disk →\nunescape \\n / strip JSON wrapping → open in browser). Saving the res\n[…]\n10/10 quick_check pass (146.7s) — engine intact post-API addition\n- Path-leak grep clean\n- No new Phase 1/2 reconcile framing\n- format=json default preserves existing behaviour for all current callers",
          "is_bot": false,
          "headline": "feat(api): add ?format=html query param to /reconcile for direct HTML…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-15T16:21:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f83f13b9382aa99026911744d3254a8173b53089",
          "body": "Matches the SOL-040 Branch 4 precedent — version bump lands on the\nbuild branch so Path C release-day is just tag/push/build/twine, not\ntag/push/build/twine + scrambling to remember the version bump.\n\nSync points bumped:\n- src/finlang/__init__.py (`__version__`)\n- pyproject.toml (`version`)\n- src/fi\n[…]\ntry stays at '[Unreleased] — target v0.7.9 (fast-follow)';\nthe header rename to '[0.7.9] - <date>' happens on Path C release-day\nwhen the actual date is known. Same pattern as v0.7.8 release Saturday.",
          "is_bot": false,
          "headline": "chore(release-prep): bump version 0.7.8 → 0.7.9 across 5 sync points",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-12T17:27:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7b8167b20b61d12cd46499d8326e067044a61b74",
          "body": "Document the SOL-041 FastAPI wrapper.\n\nAdds user-facing API workflow docs and full endpoint reference, then\nlinks the API surface from README, CLI reference, CHANGELOG, and\nDOCUMENT_MAP.\n\nNotes:\n- API is a thin subprocess wrapper over existing CLI entry points.\n- API tests are tracked as a standalone 15-test gate.\n- Orchestration totals remain unchanged at 137 tests / 10 gates.",
          "is_bot": false,
          "headline": "docs: add FastAPI wrapper documentation",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-12T17:07:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d4719160dbb16a6c3fa31dcc7ce0005bb968e65",
          "body": "Three small fixes from the four-AI review of Commit 3:\n\n- /reconcile: whitelist exit codes {0, 3} rather than blacklist {1, 2},\n  so future unmapped exits can't fall through to HTTP 200 with a bad\n  exit_code in the body. Closes a theoretical gap that becomes real if\n  SOL-103 (identity guard) intro\n[…]\nring: soften the 'new CLI flags become available with\n  no API code changes' claim — endpoints have explicit Form() params,\n  new flags need new params. The wrapper is curated, not auto-\n  forwarding.",
          "is_bot": false,
          "headline": "Review tightening pass (panel review pre-docs)",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-12T16:25:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d2b117e8f452d4e3f00c4b2f712b35c30b77004d",
          "body": "Phase 3 of 4 — /reconcile wiring per build-day spec.\n\nReplaces the 501 placeholder with a full subprocess-dispatched\nimplementation:\n- Accepts input_csv + ml_output_csv + rules/include_pack + locale\n  flags; mirrors /process shape with reconcile-specific additions\n  (reconcile_fields, reconcile_html\n[…]\nh count\n  and same exit/review semantics)\n\nRetired test_reconcile_returns_501_until_sol040_lands.\n\nTest count captured from green output: 15/15 passed in 21.84s\n(12 original - 1 retired + 4 new = 15).",
          "is_bot": false,
          "headline": "feat(api): wire /reconcile + ReconcileResponse models",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-12T14:28:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "59ce5d8785640f79f9501ae23627157df3d541bf",
          "body": "Phase 2 of 4 — Audit Issue 1 fix per build-day spec.\n\nThe drop's main.py only passed --all to finlang-discover when\nreturn_all=True (the non-default). But prod/src/finlang/tools/discover.py\ndeclares --all-candidates (alias --all) as required=True, so the subprocess\ncall without it would exit non-zer\n[…]\nreturn_all=True\n\nSurfaced by the 8 May audit cross-check against current discover.py\nargparse; the drop's test_discover_finds_candidates would have failed\nagainst current discover.py without this fix.",
          "is_bot": false,
          "headline": "fix(api): /discover always passes --all (audit Issue 1)",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-12T14:14:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0b37771c8fddb347bbf18e76f3477bcc1da307d2",
          "body": "Phase 1 of 4 (skeleton commit per build-day plan):\n- Add src/finlang/api/__init__.py + main.py from scratch drop\n- Add finlang-api script entry to pyproject.toml\n- Add [api] optional dependency group (fastapi, uvicorn, python-multipart)\n\nNo functional changes yet. /discover audit fix and /reconcile wiring\nland in subsequent commits per spec build-day plan.",
          "is_bot": false,
          "headline": "feat(api): SOL-041 skeleton — drop src/finlang/api/ + pyproject extras",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-12T14:00:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2311228ff883d3496cbbf7bef88574e0fbdaf6e1",
          "body": null,
          "is_bot": false,
          "headline": "docs: stamp v0.7.8 release date",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-09T14:36:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86594aeea5274071baf2c302912a4e2a17176661",
          "body": null,
          "is_bot": false,
          "headline": "docs: sanitize absolute path examples to placeholder form",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-09T14:02:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fad50a2fbb27cf3ba8b26d296fd664fe340cff56",
          "body": "…takeaway",
          "is_bot": false,
          "headline": "docs: fix subject-verb agreement in reconciliation.md worked example …",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-06T17:58:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "963ba76fe94e4a26da9095bf1ccf1ae6eef74e0f",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/sol-102-reconcile-variations'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-06T17:52:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c76f06838a298e9af1549c18d25b5537504a4c0",
          "body": null,
          "is_bot": false,
          "headline": "docs: align reconciliation.md Quick Nav and triad framing",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-06T17:44:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba567267845201caa35024555a18802cf61bd710",
          "body": null,
          "is_bot": false,
          "headline": "docs: add flag variation examples to reconciliation.md",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-06T17:36:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33b20e7c2412e4af8c0164f7cb65255ab70c032c",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/sol-040-docs-and-release-prep'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-05T20:58:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d044a2ce6dcaf8ee3031acfcfbd62bd6c753b119",
          "body": "… growth_loop_best_practices.md voice register\n\nBranch 4 first-pass docs landed correct but academically\nstructured. Voice review surfaced gap against existing FinLang\ndocs. Rewrite applies workflows.md patterns: quick navigation,\nbidirectional When/When NOT, ASCII process flow diagrams,\nWhat's Happ\n[…]\nned post-thinktank review (absolutes ->\nconditionals, certainty-claims -> evidence-claims,\n\"validates\" -> \"challenges\" matching the body's positioning).\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: rewrite reconciliation.md and verify.md to match workflows.md /…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-05T20:57:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c24990c9db2b7ca9b65136dd36f98dd28e0f650a",
          "body": "…owcase\n\nVersion bump 0.7.7 -> 0.7.8 across 5 sync points (__init__.py, pyproject.toml,\nrun_finlang.py fallback, canonical_fields.yaml, prod/CLAUDE.md canary line).\nEngine byte-identical to v0.7.7 -- pure additive release.\n\nNew documentation:\n- docs/release_notes/release_notes_v0_7_8.md -- full rele\n[…]\ny post-PyPI sync items captured in review package\n(prod/CLAUDE.md L105 + L190; release_notes_v0_7_8.md released-date placeholder)\n-- NOT Branch 4 scope.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(release-prep): SOL-040 Branch 4 — v0.7.8 docs, release notes, sh…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-05T18:31:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "22bf8cd8b71e94104d9bce36d5c96ea15961d21b",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/sol-040-html-report'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-05T11:54:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26283c973f76d3c0eaa3c7db2892a59ebed1862b",
          "body": "…40 Branch 3\n\nSelf-contained HTML report alongside JSON+CSV when --reconcile-html\nis set. Mockup-gated visual contract approved before code; thinktank\nconsensus on three implementation disciplines (list-join row build,\nhtml.escape() on user input, dual-flag validation requiring both\n--reconcile and \n[…]\nto v0.7.9 polish per BACKLOG.\n\nTests 18+19 added (drift renders + escape; dual-flag validation).\nTest count 135 -> 137. Engine byte-identical to v0.7.7.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(reconcile): add --reconcile-html and reconcile_html.py for SOL-0…",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-05T11:53:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "55b75e87d52bb05f196ffb7becd780b0b8715d6e",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/reconcile-add-memo'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-05T09:38:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99507136838c865b2112a48b9eb090cf705aeb38",
          "body": "Surfaced during Branch 3 mockup-gate review. memo enriches the\nper-row mismatch dict for downstream presentation (HTML report,\nfuture audit viewer) without changing comparison logic. One field,\none test, count sweep.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(reconcile): add memo to mismatch row payload",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-05T09:37:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "19359f7168f6b809b17b1df4b87a5a224103a2ef",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/sol-040-demo-and-gate10'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-04T17:23:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e0a8dd169fe5cd5dc6ad2836bdd33f37a101d26",
          "body": "Branch 2 of SOL-040 sprint. Adds the daily-gate Gate 10 invocation,\ndemo fixtures, and DOCUMENT_MAP.md / README.md updates that reflect\nthe new test-suite shape (10 gates, 134 tests).\n\nTracked changes (commit surface):\n- DOCUMENT_MAP.md: reconcile.py row in Source Repo, test_reconcile.py\n  row (Gate\n[…]\nhan the projection.\n\nPath B multi-branch sprint discipline: this commit lands on local\nmain via --no-ff merge; no origin push until v0.7.8 release flow.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(reconcile): add Gate 10 and demo fixtures for SOL-040",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-04T17:22:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8aba2428e393dfc0b4e56e13680b0a2e0cb537b8",
          "body": null,
          "is_bot": false,
          "headline": "chore(gitignore): exclude .claude/ IDE state directory",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-04T14:21:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6b89179e1da508d252d7cbe766c0029d59b537e",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/sol-040-reconcile-mvp'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-04T13:35:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1056f95446bc0018393a2148cb0215610a028327",
          "body": "Thinktank review of branch 1 initial commit 734e2e3 surfaced 5 correctness\nitems + 4 must-add tests before merge. All applied as a single follow-on\ncommit on the existing branch (same logical unit, not a new branch).\n\nCode fixes (reconcile.py + run_finlang.py):\n  1. Reject empty --reconcile-fields a\n[…]\nost-fix state).\nPer agreed plan: Angus merges branch 1 to main directly without\nre-running thinktank — fixes are bounded, architecture already endorsed.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(reconcile): SOL-040 thinktank verdict — 5 must-fixes on branch 1",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-04T11:40:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "734e2e3b7ea6f8fc0b8f3489ecb3678ba2c05556",
          "body": "New file: src/finlang/tools/reconcile.py (~290 lines)\n- ReconcileResult NamedTuple mirroring VerifyResult shape\n- Public run_reconciliation() orchestrator\n- Helpers: _read_csv_rows, _resolve_field, _align_positional,\n  _load_audit_index, _compare_rows\n- Artifact generation: _write_report_json, _writ\n[…]\nlaude/sol-040-reconcile-mvp branch (Mon-Wed window). Engine\nuntouched. v0.7.7 baseline preserved. quick_check entry gate deferred\nto branch-close (Wed).\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(reconcile): SOL-040 Day 1 — reconcile module skeleton + CLI hook",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-04T08:47:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d9f0b94268f4dc38d0214d328ffee15bd94cf67a",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'claude/docmap-gitignore-align'",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-01T21:56:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ce5160681b80f75e6d9cc1dac24ee014e85ecf4",
          "body": "Reflect prod/CLAUDE.md gitignore status across the map: persistence\nmodel paragraph, version sync rule (with explicit asymmetric-coherence\nnote for the now-gitignored canary), Internal Process Files section\n(heading + intro acknowledge mixed visibility, CLAUDE.md row updated),\nthree Common Change Sc\n[…]\nut-of-scope follow-ups (separate Path B tasks): prod/CLAUDE.md\nself-describes as \"tracked\" in several places; PROJECT_FOLDER_STRUCTURE.md\nL34/L122 same.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: align DOCUMENT_MAP.md with CLAUDE.md gitignore flip (1 May 2026)",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-01T21:50:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c4869fd555e8ef8466e8203ebdfc7bb99dc1411e",
          "body": null,
          "is_bot": false,
          "headline": "Merge: gitignore prod/CLAUDE.md (treat working contract as internal)",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-01T20:48:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a91366467c16198e2701f1436646ba8990db402",
          "body": "Adds prod/CLAUDE.md to prod/.gitignore alongside RELEASE_CHECKLIST.md.\nBoth are internal-tooling files that live in prod/ for path coherence\nbut don't ship in the public PyPI repo.\n\nReasoning extends Process Lock 280426 (28 April 2026) doctrine:\nthe solo-maintainer + public-by-design + AI-as-advisor\n[…]\nrate after this commit. Needs a small\n  amendment when the next angus-os triage session lands. Not folded\n  into this task per anti-elegance discipline.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: gitignore prod/CLAUDE.md (treat working contract as internal)",
          "author_name": "Angus McNab",
          "author_login": "angusmcnab",
          "committed_at": "2026-05-01T20:43:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 6,
      "commits_last_year": 231,
      "latest_release_at": "2026-07-26T18:15:00Z",
      "latest_release_tag": "v0.8.3",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 31,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 15.6
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "finlang",
          "exists": true,
          "license": "AGPL-3.0-only",
          "keywords": [
            "Intended Audience :: Financial and Insurance Industry",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13",
            "Programming Language :: Python :: 3.14",
            "Topic :: Office/Business :: Financial"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/finlang/",
          "is_deprecated": false,
          "latest_version": "0.8.3",
          "repository_url": "https://github.com/FinLang-Ltd/finlang",
          "versions_count": 18,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 553,
          "first_published_at": "2025-11-16T17:04:14.405599Z",
          "latest_published_at": "2026-07-26T18:06:43.167854Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 14,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 66553,
      "source_files_sampled": 28,
      "oversized_source_files": 1,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 4,
        "malicious_count": 0,
        "assessed_package": "pypi:finlang@0.8.3",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "pandas",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0"
        }
      ],
      "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": 3,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 1,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "angusmcnab",
          "commits": 231,
          "avatar_url": "https://avatars.githubusercontent.com/u/31489469?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "cla.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 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": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 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": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "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": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "d07d685de5e19fe22beda43ec954da2e0dc9e556",
        "ran_at": "2026-07-27T17:50:39Z",
        "aggregate_score": 3.9,
        "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-26T18:03:47Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-04-28T06:59:04Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/FinLang-Ltd/finlang",
    "host": "github.com",
    "name": "finlang",
    "owner": "FinLang-Ltd"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 63,
      "inputs": {
        "security": 51,
        "vitality": 92,
        "community": 43,
        "governance": 51,
        "engineering": 72
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 92,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 86,
            "inputs": {
              "commits_last_year": 231,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 31
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "31/52 weeks with commits",
                "points": 21.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 31
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "231 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 231
                    }
                  }
                ],
                "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": 100,
            "inputs": {
              "releases_count": 6,
              "latest_release_tag": "v0.8.3",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 15.6
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "6 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~15.6 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 15.6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "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": 43,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 18,
            "inputs": {
              "forks": 0,
              "stars": 14,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "14 stars",
                "points": 18.1,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "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": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "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 (AGPL-3.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "AGPL-3.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "at_risk",
            "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": 46,
            "inputs": {
              "packages": [
                "finlang"
              ],
              "dependents": null,
              "ecosystems": "pypi",
              "total_downloads": null,
              "monthly_downloads": 553
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "553 downloads/month across pypi",
                "points": 36.6,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 553,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "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": "moderate",
        "name": "Sustainability & Governance",
        "value": 51,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "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 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "merged_prs": 3,
              "open_issues": 0,
              "closed_issues": 1,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 1
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "3/4 decided PRs merged",
                "points": 28.7,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 3,
                      "decided": 4
                    }
                  }
                ],
                "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": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "followers": 1,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "FinLang-Ltd",
              "public_repos": 1,
              "account_age_days": 314
            },
            "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": "1 followers of FinLang-Ltd",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1,
                      "login": "FinLang-Ltd"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "1 public repos, account ~0 yr old",
                "points": 3.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 1
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "finlang"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "18 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 18
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 72,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "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": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "agpl",
                "audit",
                "compliance",
                "dsl",
                "eu-ai-act",
                "fintech",
                "open-source",
                "python",
                "regtech",
                "rules-engine"
              ],
              "has_wiki": false,
              "homepage": "https://finlang.io",
              "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": "https://finlang.io",
                "points": 15,
                "status": "met",
                "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": "10 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "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": "moderate",
        "name": "Security",
        "value": 51,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 39,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 3.9
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection 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 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "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": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the pypi:finlang@0.8.3 runtime dependency closure — what installing the published package pulls in — 4 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "pypi:finlang@0.8.3",
                  "assessed": 4
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 4,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 4,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "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": "at_risk",
        "name": "AI Readiness",
        "value": 38,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.68,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "68 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 36.3,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 68,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 32,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.44,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "44 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 44,
                      "sampled": 100
                    }
                  }
                ],
                "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": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 53,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 66553,
              "source_files_sampled": 28,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/28 source files over 60KB",
                "points": 53,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 28,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T17:50:44.209418Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/f/FinLang-Ltd/finlang.svg",
  "full_name": "FinLang-Ltd/finlang",
  "license_state": "standard",
  "license_spdx": "AGPL-3.0"
}

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