原始 JSON 报告 机器可读
{
"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"
}