Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-27 17:50 UTC

FinLang-Ltd / finlang

FinLang — Deterministic, auditable financial rules engine.

PythonAGPL-3.0★ 14 Sterne⑂ 0 Forksseit Sept. 2025Auf GitHub ansehen ↗

FinLang-Ltd/finlang erreicht einen Gesundheitsindex von 63 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (92/100) ab, am schwächsten bei AI Readiness (38/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

63
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

63
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

FinLangOrganisation
1 Follower1 öffentliches Reposeit Sept. 2025

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
PyPIfinlang0.8.355318vor 0 Tagen

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

92Exzellent · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
21.5/36Commit-Rhythmus — 31/52 Wochen mit Commits
18/18Commit-Volumen — 231 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year231
human_commit_share1
days_since_last_push0
active_weeks_last_year31

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 6 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 0 Tagen
27/27Release-Rhythmus — ein Release etwa alle 15,6 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count6
latest_release_tagv0.8.3
releases_from_tagsnein
days_since_latest_release0
mean_days_between_releases15,6
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

43Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
18.1/60Stars — 14 Stars
0/25Forks — 0 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks0
stars14
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (AGPL-3.0)
18/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingja
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein
Wie die Bewertung erfolgt
36.6/80Downloads pro Monat — 553 Downloads/Monat über pypi
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packagesfinlang
dependents
ecosystemspypi
total_downloads
monthly_downloads553
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

51Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
46.8/46.8Issue-Lösungsquote — 100 % der Issues geschlossen
28.7/38.3PR-Annahme — 3/4 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs3
open_issues0
closed_issues1
issue_closed_ratio1
closed_unmerged_prs1
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
2.2/25Reichweite des Inhabers — 1 Follower von FinLang-Ltd
3.9/25Kontohistorie — 1 öffentliche Repos, Kontoalter ca. 0 Jahre
Verwendete Eingangsdaten
followers1
owner_typeOrganization
is_verified
owner_loginFinLang-Ltd
public_repos1
account_age_days314

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf pypi
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 0 Tagen
20/20Versionshistorie — 18 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesfinlang
ecosystemspypi
any_deprecatednein
min_days_since_publish0

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

72Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 2 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — keine Daten
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: CI-Tests. Die verbleibenden Gewichte wurden renormalisiert.

Dokumentation

90Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://finlang.io
10/10Repository-Beschreibung
10/10Topics — 10 Topics
0/10Wiki
Verwendete Eingangsdaten
topicsagpl, audit, compliance, dsl, eu-ai-act, fintech, open-source, python, regtech, rules-engine
has_wikinein
homepagehttps://finlang.io
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

51Mittel · 16 % des Gesamtindex

Sicherheitslage

39Gefährdet
Wie die Bewertung erfolgt
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 — keine Daten
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.5Lizenz — 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 — keine Daten
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 — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate3,9
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): ci_tests, packaging, signed_releases. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
35/35Direkte Abhängigkeiten ohne bekannte Advisories — keine direkte Abhängigkeit trägt ein bekanntes Advisory
25/25Indirekte Abhängigkeiten ohne bekannte Advisories — keine indirekte Abhängigkeit trägt ein bekanntes Advisory
0/40Keine offenen Advisories — kein Advisory trägt ein Veröffentlichungsdatum
Verwendete Eingangsdaten
sourceosv
advisories0
affected_packages0
assessed_packages4
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Keine offenen Advisories. Die verbleibenden Gewichte wurden renormalisiert. Abgeglichen wurde die Laufzeit-Abhängigkeitshülle von pypi:finlang@0.8.3 — das, was die Installation des veröffentlichten Pakets nach sich zieht — mit 4 Paketen. Erreichbarkeit wird nicht analysiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

38Gefährdet · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
36.3/40Lesbare Commit-Historie — 68 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,68
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
0/11Statische Typprüfung
0/10Reproduzierbare Umgebung
10/10Belegte Agentenpraxis — 44 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfiles
has_dockerfilenein
typed_languagenein
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0,44
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
0/45Typprüfbarer Code — Python ohne Typprüfungs-Konfiguration
53/55Handhabbare Dateigrößen — 1/28 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languagePython
largest_source_bytes66.553
source_files_sampled28
oversized_source_files1
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — examples
Verwendete Eingangsdaten
example_dirsexamples
has_mcp_signalnein
api_schema_files

Eckdaten

14GitHub-Sterne
1Mitwirkende
231Commits, letzte 12 Monate
0Tage seit letztem Push
6Releases
1Bus-Faktor
0offene Issues
PyPIPaket-Ökosysteme

Warnungen zur Datenerhebung

  • 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

Weitere Details

OpenSSF Scorecard 3.9 / 10
3.9Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).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
k. A.CI-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
k. A.Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Direkte Abhängigkeiten 1
RegistryPaketVersionsvorgabeManifest
PyPIpandas>=2.0pyproject.toml
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Abhängigkeits-Advisories 0

Die Installation von pypi:finlang@0.8.3 zieht 4 Pakete nach sich, direkt und transitiv: 0 tragen bekannte Advisories, davon 0 direkte Abhängigkeiten.

Keine bekannten Advisories betreffen die bewerteten Abhängigkeiten.

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

JSON-Rohbericht maschinenlesbar
{
  "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"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenPyPI.