Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-27 17:50 UTC

FinLang-Ltd / finlang

FinLang — Deterministic, auditable financial rules engine.

PythonAGPL-3.0★ 14 stars⑂ 0 forkssince Sep 2025View on GitHub ↗

FinLang-Ltd/finlang holds a health index of 63 out of 100, placing it in the Moderate band. It scores highest on Vitality (92/100) and lowest on AI Readiness (38/100). It was last updated today. A single contributor accounts for most of its recent work.

63
overall / 100
Moderate

Software health index

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

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

Score profile

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

Ownership

FinLangOrganization
1 follower1 public reposince Sep 2025

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

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
PyPIfinlang0.8.3553180 days ago

Metrics by category

Vitality

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

92Excellent · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
21.5/36Commit cadence — 31/52 weeks with commits
18/18Commit volume — 231 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year231
human_commit_share1
days_since_last_push0
active_weeks_last_year31

Release discipline

100Excellent
How it's scored
27/27Ships releases — 6 releases published
36/36Release recency — latest release 0 days ago
27/27Release cadence — a release every ~15.6 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count6
latest_release_tagv0.8.3
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases15.6
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

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

43At risk · 18% of overall
How it's scored
18.1/60Stars — 14 stars
0/25Forks — 0 forks
0/15Watchers — 0 watchers
Inputs used
forks0
stars14
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (AGPL-3.0)
18/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
36.6/80Monthly downloads — 553 downloads/month across pypi
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesfinlang
dependents
ecosystemspypi
total_downloads
monthly_downloads553
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

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

51Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
46.8/46.8Issue resolution — 100% of issues closed
28.7/38.3PR acceptance — 3/4 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs3
open_issues0
closed_issues1
issue_closed_ratio1
closed_unmerged_prs1
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
2.2/25Owner reach — 1 followers of FinLang-Ltd
3.9/25Track record — 1 public repos, account ~0 yr old
Inputs used
followers1
owner_typeOrganization
is_verified
owner_loginFinLang-Ltd
public_repos1
account_age_days314
How it's scored
25/25Published & resolvable — 1 package(s) on pypi
35/35Publish recency — latest publish 0 days ago
20/20Version history — 18 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesfinlang
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Engineering Quality

Are baseline engineering and documentation practices in place?

72Good · 20% of overall
How it's scored
24/24CI workflows — 2 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — no data
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.

Documentation

90Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://finlang.io
10/10Repository description
10/10Topics — 10 topics
0/10Wiki
Inputs used
topicsagpl, audit, compliance, dsl, eu-ai-act, fintech, open-source, python, regtech, rules-engine
has_wikino
homepagehttps://finlang.io
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

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

51Moderate · 16% of overall
How it's scored
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 — no data
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.5License — 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 — no data
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 — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate3.9
Excluded from scoring (no data or not applicable): ci_tests, packaging, signed_releases. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
25/25Indirect dependencies free of known advisories — no indirect dependency carries a known advisory
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages4
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
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.

AI Readiness

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

38At risk · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
36.3/40Legible commit history — 68 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.68
agent_instruction_files
agent_instruction_max_bytes
How it's scored
0/18One-command bootstrap
22/22Automated tests
0/11Lint / format config
0/11Static type checking
0/10Reproducible environment
10/10Demonstrated agent practice — 44 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0.44
toolchain_manifests
dependency_bot_commit_share0
How it's scored
0/45Type-checkable code — Python without a type-check config
53/55Manageable file sizes — 1/28 source files over 60KB
Inputs used
primary_languagePython
largest_source_bytes66,553
source_files_sampled28
oversized_source_files1
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

14GitHub stars
1contributors
231commits, last 12 months
0days since last push
6releases
1bus factor
0open issues
PyPIpackage ecosystems

Data collection 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

More detail

OpenSSF Scorecard 3.9 / 10
3.9aggregate

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/aCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/aPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Direct dependencies 1
RegistryPackageVersion constraintManifest
PyPIpandas>=2.0pyproject.toml
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Dependency advisories 0

Installing pypi:finlang@0.8.3 pulls in 4 packages, direct and transitive: 0 carry known advisories, of which 0 are direct dependencies.

No known advisories affect the assessed dependencies.

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "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"
}

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

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

How one result sits in the wider record: aggregate statisticsPyPI.