公开记录
软件健康报告模式 0.26.0 · 指标 1.13.0 · 2026-07-22 05:14 UTC

Whatsonyourmind / modelforge

Bulge-tier Excel financial model factory — every cell live-formulated, every number traceable

Python自定义许可证★ 1 星标⑂ 0 复刻始于 2026年4月在 GitHub 上查看 ↗

Whatsonyourmind/modelforge 的健康指数为 100 分中的 53 分,处于「中等」区间。 其得分最高的类别是Vitality(75/100),最低的是Community & Adoption(27/100)。 最近一次更新在 22 天前。 近期的大部分工作由 1 位贡献者完成。

53
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

53
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

Luka个人账户
12 关注者20 个公开仓库始于 2025年12月

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
PyPImodelforge-finance0.12.0571729 天前

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

75良好 · 占总体的 22%
评分方式
28.8/36推送新近度 — 最近一次推送于 22 天前
5.5/36提交节奏 — 52 周中有 8 周有提交
18/18提交量 — 最近一年 134 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year134
human_commit_share1
days_since_last_push22
active_weeks_last_year8

发布纪律

94优秀
评分方式
27/27有发布版本 — 已发布 5 个发布版本
36/36发布时效 — 最近一次发布版本于 29 天前
27/27发布节奏 — 约每 9.8 天发布一次
4/10OpenSSF Scorecard:Signed-Releases — 2 out of the last 5 releases have a total of 4 signed artifacts.
所用输入
releases_count5
latest_release_tagv0.12.0
releases_from_tags
days_since_latest_release29
mean_days_between_releases9.8

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

27危急 · 占总体的 18%
评分方式
0/60星标 — 1 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 0 位关注者
所用输入
forks0
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold

社区健康

44存在风险
评分方式
22.5/22.5README
16.9/22.5许可证 — 存在许可证文件,但不是可识别的许可证
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
36.8/80月度下载量 — pypi 合计每月 571 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packagesmodelforge-finance
dependents
ecosystemspypi
total_downloads
monthly_downloads571
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

34存在风险 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0.3/22.5提交分布 — 头号贡献者编写了 98% 的提交
2.7/13.5贡献者广度 — 2 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled2
top_contributor_share0.985
评分方式
0/46.8议题解决 — 没有议题或无数据
0/38.3PR 接受 — 没有已裁定的拉取请求或无数据
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
已排除计分(无数据或不适用):议题解决, PR 接受。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
8/25所有者影响力 — Whatsonyourmind 有 12 位关注者
10.9/25既往记录 — 20 个公开仓库,账户约 0 年
所用输入
followers12
owner_typeUser
is_verified
owner_loginWhatsonyourmind
public_repos20
account_age_days226
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — pypi 上有 1 个软件包
35/35发布时效 — 最近一次发布于 29 天前
20/20版本历史 — 7 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesmodelforge-finance
ecosystemspypi
any_deprecated
min_days_since_publish29

工程质量

基础的工程与文档实践是否到位?

72良好 · 占总体的 20%

工程实践

60中等
评分方式
24/24CI 工作流 — 4 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
0/20OpenSSF Scorecard:CI-Tests — 无数据
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config
已排除计分(无数据或不适用):OpenSSF Scorecard:CI-Tests。 其余权重已重新归一化。

文档

90优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://pypi.org/project/modelforge-finance/
10/10仓库描述
10/10主题标签 — 14 个主题标签
0/10Wiki
所用输入
topicscredit-risk, excel, financial-modeling, llm-tools, mcp, openpyxl, ai-agents, audit-trail, data-lineage, dcf, lbo, mcp-server, valuation, yaml-to-excel
has_wiki
homepagehttps://pypi.org/project/modelforge-finance/
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

55中等 · 占总体的 16%

安全态势

44存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 无数据
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.2/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — 无数据
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
5/5Security-Policy — security policy file detected
3/7.5Signed-Releases — 2 out of the last 5 releases have a total of 4 signed artifacts.
6.8/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 10 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4.4
已排除计分(无数据或不适用):ci_tests, packaging。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
25/25间接依赖不含已知公告 — 没有间接依赖携带已知公告
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories0
affected_packages0
assessed_packages25
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
已排除计分(无数据或不适用):没有长期未处理的公告。 其余权重已重新归一化。 比对的是 pypi:modelforge-finance@0.12.0 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 25 个软件包。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

59中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
15/15机器可读文档(llms.txt) — 存在 llms.txt
40/40可读的提交历史 — 100 次人类提交中有 100 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
评分方式
0/18一条命令的引导启动
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — web/collab-worker/tsconfig.json
10/10可复现环境 — Dockerfile, lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 68 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilespackage-lock.json
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configsweb/collab-worker/tsconfig.json
agent_commit_share0.68
toolchain_manifests
dependency_bot_commit_share0
评分方式
27/45可类型检查的代码 — Python,已配置类型检查(web/collab-worker/tsconfig.json)
54.6/55可控的文件大小 — 采样的 452 个源文件中有 3 个超过 60KB
所用输入
primary_languagePython
largest_source_bytes100,966
source_files_sampled452
oversized_source_files3
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
20/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

1GitHub 星标
2贡献者
134最近 12 个月提交数
22距最近推送天数
5发布版本数
1巴士系数(bus factor)
0开放议题
PyPI软件包生态系统数

更多细节

OpenSSF Scorecard 4.4 / 10
4.4综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-22 05:14 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
不适用CI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
9Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
不适用Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
10Security-Policysecurity policy file detected
4Signed-Releases2 out of the last 5 releases have a total of 4 signed artifacts.
9Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities10 existing vulnerabilities detected
直接依赖 8
注册表软件包版本约束清单文件
PyPIpydantic>=2.6pyproject.toml
PyPIopenpyxl>=3.1.2pyproject.toml
PyPIpyyaml>=6.0.1pyproject.toml
PyPIrich>=13.7pyproject.toml
PyPIclick>=8.1pyproject.toml
PyPIformulas>=1.2.7pyproject.toml
PyPIreportlab>=4.0pyproject.toml
PyPInumpy>=1.26pyproject.toml
全部依赖 190

来自 GitHub 依赖图的完整解析依赖集合:8 个直接依赖与 182 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
PyPIclick直接
PyPIformulas直接
PyPInumpy直接
PyPIopenpyxl直接
PyPIpydantic直接
PyPIpyyaml直接
PyPIreportlab直接
PyPIrich直接
npm@cloudflare/kv-asset-handler0.5.0间接
npm@cloudflare/unenv-preset2.16.1间接
npm@cloudflare/workerd-darwin-641.20260601.1间接
npm@cloudflare/workerd-darwin-arm641.20260601.1间接
npm@cloudflare/workerd-linux-641.20260601.1间接
npm@cloudflare/workerd-linux-arm641.20260601.1间接
npm@cloudflare/workerd-windows-641.20260601.1间接
npm@cloudflare/workers-types4.20260603.1间接
npm@cspotcode/source-map-support0.8.1间接
npm@emnapi/core1.10.0间接
npm@emnapi/runtime1.10.0间接
npm@emnapi/wasi-threads1.2.1间接
npm@esbuild/aix-ppc640.27.3间接
npm@esbuild/android-arm0.27.3间接
npm@esbuild/android-arm640.27.3间接
npm@esbuild/android-x640.27.3间接
npm@esbuild/darwin-arm640.27.3间接
npm@esbuild/darwin-x640.27.3间接
npm@esbuild/freebsd-arm640.27.3间接
npm@esbuild/freebsd-x640.27.3间接
npm@esbuild/linux-arm0.27.3间接
npm@esbuild/linux-arm640.27.3间接
npm@esbuild/linux-ia320.27.3间接
npm@esbuild/linux-loong640.27.3间接
npm@esbuild/linux-mips64el0.27.3间接
npm@esbuild/linux-ppc640.27.3间接
npm@esbuild/linux-riscv640.27.3间接
npm@esbuild/linux-s390x0.27.3间接
npm@esbuild/linux-x640.27.3间接
npm@esbuild/netbsd-arm640.27.3间接
npm@esbuild/netbsd-x640.27.3间接
npm@esbuild/openbsd-arm640.27.3间接
npm@esbuild/openbsd-x640.27.3间接
npm@esbuild/openharmony-arm640.27.3间接
npm@esbuild/sunos-x640.27.3间接
npm@esbuild/win32-arm640.27.3间接
npm@esbuild/win32-ia320.27.3间接
npm@esbuild/win32-x640.27.3间接
npm@img/colour1.1.0间接
npm@img/sharp-darwin-arm640.34.5间接
npm@img/sharp-darwin-x640.34.5间接
npm@img/sharp-libvips-darwin-arm641.2.4间接
npm@img/sharp-libvips-darwin-x641.2.4间接
npm@img/sharp-libvips-linux-arm1.2.4间接
npm@img/sharp-libvips-linux-arm641.2.4间接
npm@img/sharp-libvips-linux-ppc641.2.4间接
npm@img/sharp-libvips-linux-riscv641.2.4间接
npm@img/sharp-libvips-linux-s390x1.2.4间接
npm@img/sharp-libvips-linux-x641.2.4间接
npm@img/sharp-libvips-linuxmusl-arm641.2.4间接
npm@img/sharp-libvips-linuxmusl-x641.2.4间接
npm@img/sharp-linux-arm0.34.5间接
npm@img/sharp-linux-arm640.34.5间接
npm@img/sharp-linux-ppc640.34.5间接
npm@img/sharp-linux-riscv640.34.5间接
npm@img/sharp-linux-s390x0.34.5间接
npm@img/sharp-linux-x640.34.5间接
npm@img/sharp-linuxmusl-arm640.34.5间接
npm@img/sharp-linuxmusl-x640.34.5间接
npm@img/sharp-wasm320.34.5间接
npm@img/sharp-win32-arm640.34.5间接
npm@img/sharp-win32-ia320.34.5间接
npm@img/sharp-win32-x640.34.5间接
npm@jridgewell/resolve-uri3.1.2间接
npm@jridgewell/sourcemap-codec1.5.5间接
npm@jridgewell/trace-mapping0.3.9间接
npm@napi-rs/wasm-runtime1.1.4间接
npm@oxc-project/types0.133.0间接
npm@poppinss/colors4.1.6间接
npm@poppinss/dumper0.6.5间接
npm@poppinss/exception1.2.3间接
npm@rolldown/binding-android-arm641.0.3间接
npm@rolldown/binding-darwin-arm641.0.3间接
npm@rolldown/binding-darwin-x641.0.3间接
npm@rolldown/binding-freebsd-x641.0.3间接
npm@rolldown/binding-linux-arm-gnueabihf1.0.3间接
npm@rolldown/binding-linux-arm64-gnu1.0.3间接
npm@rolldown/binding-linux-arm64-musl1.0.3间接
npm@rolldown/binding-linux-ppc64-gnu1.0.3间接
npm@rolldown/binding-linux-s390x-gnu1.0.3间接
npm@rolldown/binding-linux-x64-gnu1.0.3间接
npm@rolldown/binding-linux-x64-musl1.0.3间接
npm@rolldown/binding-openharmony-arm641.0.3间接
npm@rolldown/binding-wasm32-wasi1.0.3间接
npm@rolldown/binding-win32-arm64-msvc1.0.3间接
npm@rolldown/binding-win32-x64-msvc1.0.3间接
npm@rolldown/pluginutils1.0.1间接
npm@sindresorhus/is7.2.0间接
npm@speed-highlight/core1.2.15间接
npm@standard-schema/spec1.1.0间接
npm@tybys/wasm-util0.10.2间接
npm@types/chai5.2.3间接
npm@types/deep-eql4.0.2间接
npm@types/estree1.0.9间接
npm@vitest/expect4.1.8间接
npm@vitest/mocker4.1.8间接
npm@vitest/pretty-format4.1.8间接
npm@vitest/runner4.1.8间接
npm@vitest/snapshot4.1.8间接
npm@vitest/spy4.1.8间接
npm@vitest/utils4.1.8间接
npmassertion-error2.0.1间接
npmblake3-wasm2.1.5间接
npmchai6.2.2间接
npmconvert-source-map2.0.0间接
npmcookie1.1.1间接
npmdetect-libc2.1.2间接
npmerror-stack-parser-es1.0.5间接
npmes-module-lexer2.1.0间接
npmesbuild0.27.3间接
npmestree-walker3.0.3间接
npmexpect-type1.3.0间接
npmfdir6.5.0间接
npmfsevents2.3.3间接
npmisomorphic.js0.2.5间接
npmkleur4.1.5间接
npmlib00.2.117间接
npmlightningcss1.32.0间接
npmlightningcss-android-arm641.32.0间接
npmlightningcss-darwin-arm641.32.0间接
npmlightningcss-darwin-x641.32.0间接
npmlightningcss-freebsd-x641.32.0间接
npmlightningcss-linux-arm-gnueabihf1.32.0间接
npmlightningcss-linux-arm64-gnu1.32.0间接
npmlightningcss-linux-arm64-musl1.32.0间接
npmlightningcss-linux-x64-gnu1.32.0间接
npmlightningcss-linux-x64-musl1.32.0间接
npmlightningcss-win32-arm64-msvc1.32.0间接
npmlightningcss-win32-x64-msvc1.32.0间接
npmmagic-string0.30.21间接
npmminiflare4.20260601.0间接
npmnanoid3.3.12间接
npmobug2.1.1间接
npmpath-to-regexp6.3.0间接
npmpathe2.0.3间接
npmpicocolors1.1.1间接
npmpicomatch4.0.4间接
npmpostcss8.5.15间接
npmrolldown1.0.3间接
npmsemver7.8.1间接
npmsharp0.34.5间接
npmsiginfo2.0.0间接
npmsource-map-js1.2.1间接
npmstackback0.0.2间接
npmstd-env4.1.0间接
npmsupports-color10.2.2间接
npmtinybench2.9.0间接
npmtinyexec1.2.4间接
npmtinyglobby0.2.17间接
npmtinyrainbow3.1.0间接
npmtslib2.8.1间接
npmtypescript5.9.3间接
npmundici7.24.8间接
npmunenv2.0.0-rc.24间接
npmvite8.0.16间接
npmvitest4.1.8间接
npmwhy-is-node-running2.3.0间接
npmworkerd1.20260601.1间接
npmwrangler4.97.0间接
npmws8.20.1间接
npmy-protocols1.0.7间接
npmyjs13.6.31间接
npmyouch4.1.0-beta.10间接
npmyouch-core0.3.3间接
PyPIanthropic间接
PyPIfastapi间接
PyPIkiwisolver间接
PyPImcp间接
PyPIpandas间接
PyPIpdf2image间接
PyPIpdfplumber间接
PyPIpillow间接
PyPIpypdf间接
PyPIpytesseract间接
PyPIpytest间接
PyPIpython-docx间接
PyPIpython-multipart间接
PyPIpython-pptx间接
PyPIrequests间接
PyPIruff间接
PyPIsetuptools间接
PyPIuvicorn间接
依赖安全公告 0

安装 pypi:modelforge-finance@0.12.0 会引入 25 个包(直接与传递):其中 0 个存在已知公告,0 个为直接依赖。

没有已知公告影响已评估的依赖。

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "credit-risk",
        "excel",
        "financial-modeling",
        "llm-tools",
        "mcp",
        "openpyxl",
        "ai-agents",
        "audit-trail",
        "data-lineage",
        "dcf",
        "lbo",
        "mcp-server",
        "valuation",
        "yaml-to-excel"
      ],
      "is_fork": false,
      "size_kb": 2586,
      "has_wiki": false,
      "homepage": "https://pypi.org/project/modelforge-finance/",
      "languages": {
        "HTML": 21391,
        "Python": 4094149,
        "PLpgSQL": 8118,
        "Dockerfile": 1999,
        "TypeScript": 13510
      },
      "pushed_at": "2026-06-30T01:39:57Z",
      "created_at": "2026-04-17T00:22:32Z",
      "owner_type": "User",
      "updated_at": "2026-06-30T01:40:01Z",
      "description": "Bulge-tier Excel financial model factory — every cell live-formulated, every number traceable",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "master",
      "license_spdx_raw": "NOASSERTION",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Luka",
      "type": "User",
      "login": "Whatsonyourmind",
      "company": null,
      "location": "Milano, Italy",
      "followers": 12,
      "avatar_url": "https://avatars.githubusercontent.com/u/248369826?v=4",
      "created_at": "2025-12-07T23:39:12Z",
      "is_verified": null,
      "public_repos": 20,
      "account_age_days": 226
    },
    "license": {
      "state": "custom",
      "spdx_id": null,
      "raw_spdx": "NOASSERTION",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-06-22T15:17:43Z"
        },
        {
          "tag": "v0.11.2",
          "kind": "patch",
          "published_at": "2026-05-27T22:22:43Z"
        },
        {
          "tag": "v0.9.7",
          "kind": "patch",
          "published_at": "2026-05-15T08:47:03Z"
        },
        {
          "tag": "v0.9.6",
          "kind": "patch",
          "published_at": "2026-05-14T14:27:18Z"
        },
        {
          "tag": "v0.9.5",
          "kind": "patch",
          "published_at": "2026-05-14T13:28:37Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "a029c9586965d3728f36778d58851b1f60f8358c",
          "body": "Root cause of the 3.11-only ic_memo grounding failure: extract_numeric_tokens\napplied its identifier-weld guard (_is_year_or_id) only to bare plain numbers,\nnot to the suffixed currency/percent/bps/multiple path. So '3b' was parsed as\na 3-billion currency token out of a sha256 fragment ('...5e04a662\n[…]\nling scale already requires a word boundary).\nAdds regression tests for the exact sha256 fragment and the weld case. Grounding\ntolerance and fail-closed behavior unchanged; 19/19 grounding tests pass.",
          "is_bot": false,
          "headline": "fix(deck): don't parse hash/identifier-welded numbers as currency tokens",
          "author_name": "Luka Stanisljevic",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-30T01:39:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "379efc720487384ca54a74a4d8a2952442845dc9",
          "body": "The fail-closed grounding gate previously reported only the token text and\nslide index (e.g. \"'3b'@slide8\"), which is undiagnosable when a miss\nreproduces on only one interpreter and cannot be reproduced locally. Capture\nthe full source string the token was extracted from plus the nearest pool\nvalue\n[…]\nand gap on each GroundingFinding, and surface them in the\nDeckAdapterError sample. Purely diagnostic — the matching tolerance and\nfail-closed behavior are unchanged (17/17 grounding tests still pass).",
          "is_bot": false,
          "headline": "diag(deck): make numeric-grounding misses self-explaining in CI",
          "author_name": "Luka Stanisljevic",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-30T01:30:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ceaf919d9338d1fc394208caa0e61e641474059d",
          "body": "…-parity test)\n\ntest_golden_vectors_match_ts_kernel had been failing: the fixture's unicode string was\ndouble-encoded (cafe-with-acute -> its UTF-8 bytes reinterpreted as Latin-1) by a past\nfile round-trip, so Python hashed the corrupted string and missed the golden TS hash.\nProven: content_hash of \n[…]\nty were\nCORRECT all along — only the fixture was stale. Restored the string and wrote it\nASCII-escaped (ensure_ascii) so an encoding round-trip can never mangle it again.\nSuite 1539/1 -> 1540/0 green.",
          "is_bot": false,
          "headline": "test(oracert): repair mojibake'd unicode golden vector (restores hash…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-23T04:36:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8ea3ee2c9c831d5906a2c2a6605ef9fb904c32cd",
          "body": "- Genericize docstrings/comments that referenced an internal review\n  process (drop IC-review / round-2 / Killer-1 framing) while keeping\n  the underlying engineering facts (formula-density semantics, the\n  DCF-vs-market-cap Trust rule, acceptance criteria).\n- spec/hgb_carveout.py: drop named invest\n[…]\nypes from a docstring.\n- Move compliance/soc2_vendor_comparison.md out of the public tree\n  (internal vendor/budget note) and gitignore it.\n- web/app.py: remove a dead footer link to a gitignored doc.",
          "is_bot": false,
          "headline": "chore: scrub internal review-process notes from public source comments",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-22T15:45:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dfb62409041c4862dbbe48046f894035fa20fbbb",
          "body": "- Remove DEPLOY_NOW.md (owner SaaS deploy playbook containing local\n  machine paths, secret-file locations, and go-to-market notes) — this\n  belongs in the private repo alongside the other internal docs that are\n  already gitignored.\n- gitignore DEPLOY_*.md and build_*.xlsx test artifacts so they cannot\n  be re-committed.\n- CHANGELOG: generalize a release note to drop named outreach prospects.",
          "is_bot": false,
          "headline": "chore: keep internal deploy/GTM playbook out of public tree",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-22T15:16:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5691306090b68d093aece6a97752673d618bb223",
          "body": "… gates\n\nBumps 0.11.4 -> 0.12.0 and documents this wave: recompute-and-gate conservation\nat certify, deterministic perturbation-replay gate, deterministic deck\nnumeric-grounding gate, and the OraCert LLM-free verifier. Prepares the PyPI\npublish. No payment/pricing change; new gates are opt-in (default path unchanged).",
          "is_bot": false,
          "headline": "chore(release): modelforge-finance 0.12.0 — certificate & determinism…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-22T13:42:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23ce7ff76895c9082393e23b24299146c54c4041",
          "body": "…pt-in)\n\nThe baseline conservation gate recomputes the QC sheet only at the built\nnumbers, so a 'total' hardcoded to its baseline value still passes\nTotal == Sum-of-parts and certifies clean — a latent input-dependent defect.\n\nThis gate compiles the workbook once with the formulas engine, resolves t\n[…]\n the project-finance\n'debt amortized' one-sided check that a single-direction shock wrongly tripped);\nfalsifier (hardcoded total) caught two-sided. Deterministic, zero-LLM, opt-in.\nSuite 1535 -> 1540.",
          "is_bot": false,
          "headline": "feat(qc): perturbation-replay conservation gate (certify --perturb, o…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-22T12:40:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ac13357c9d8b42ab5ef605d397cbfad32ff58ca4",
          "body": "…LM-free)\n\nThe ModelForge half of OraCert: one standalone, LLM-free verifier for the\nshared oracert.dev/redrivable-result/v1 in-toto predicate, re-establishing\nresult CORRECTNESS (not just byte identity) across two heterogeneous producers.\n\n- oracert/canonical.py: content-hash kernel byte-identical \n[…]\nl (a real solver-produced statement + edge-case hash\nvectors). Falsifiers: tampered solution/hash and an authentic-bytes-but-\nwiring-defective workbook are both rejected. 15 tests; suite 1520 -> 1535.",
          "is_bot": false,
          "headline": "feat(oracert): cross-server re-derivable-result verifier (in-toto + L…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-22T10:57:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c2593b0b373424b7e661aaf16000a408eac44dba",
          "body": "Reconcile every rendered token on a composed deck back to a recomputed\ncertified-workbook fact OR a centrally-declared whitelisted derivation\n(leverage = debt/EBITDA, LTV, loan-to-cost, percent-of-total, capital-stack\nsum/shares). An unreconciled token — e.g. a millions-vs-thousands scale error\nthe \n[…]\ncross sponsor_lbo/real_estate/\ndevelopment_re ic_memo+teaser on real certified decks; falsifier proves a\nx1000 scale bug is caught. Default off — shipped certified path unchanged.\n\nSuite 1503 -> 1520.",
          "is_bot": false,
          "headline": "feat(deck): deterministic numeric-grounding gate (opt-in, fail-closed)",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-22T10:36:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2cbd53708800033a00bbcfcb5da9763b08c3f32a",
          "body": "…==1 at certify\n\ncertify proves a workbook has zero formula errors, but a conservation check that\nlegitimately recomputes to 0 (a balance sheet that doesn't balance, a debt\nroll-forward that telescopes, NI != EBT + tax) is a VALID formula returning 0 —\nnot an Excel error — so the model certifies CER\n[…]\n (documented; opt-in).\n\nTests: tests/test_conservation_audit.py (3) — clean PASS, certify-blind failing\ncheck (plain certify exit 0, --conservation exit 1), no-QC INDETERMINATE. Full\nsuite 1503 green.",
          "is_bot": false,
          "headline": "feat(qc): conservation gate — recompute QC sheet and require ALL_PASS…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-22T09:23:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "711e676cd9930f44f77ce3eb51a0ec15fb79dab7",
          "body": "The gallery table showed only the older/simpler templates; the advanced\ncredit/banking/securitization set — the actual differentiators — were hidden\nbehind the \"full list\" pointer. Add accurate rows for sponsor_lbo, bank_fig,\ndevelopment_re, and loan_tape_securitization, with sheet lists verified from\nthe built workbooks (development_re correctly shown without MC/sensitivity,\nwhich it does not ship).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(templates): surface the frontier templates in the gallery",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-18T02:56:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e0d1a8b68db5ed813fd03393accd45fe85f1023b",
          "body": "Wires the schedule auditor (interior hardcodes + roll-forward period drift)\ninto certify as an opt-in gate. `certify --schedule` runs audit_schedule after\nthe formula-error audit and exits non-zero on any finding — turning a CERTIFIED\nbadge into \"zero formula errors AND no certify-blind schedule def\n[…]\ntify (the defect is certify-blind) but FAILS `certify --schedule`.\n\nTests: tests/test_certify_schedule.py (2). Suite 1498 -> 1500.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): opt-in `certify --schedule` gate for the schedule auditor",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-18T02:06:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e6be87b4cea9007c26144b768450f82d96bb22ec",
          "body": "Extends modelforge.qc.audit_schedule with a second certify-blind check: an\nopening row whose period-t cell references its paired closing row at the WRONG\nprior period column (roll-forward period drift). This is the exact class behind\na real past bug where an inserted row shifted the closing referenc\n[…]\n a wrong-period reference injected into a real built model.\n\nTests: +5 (4 synthetic + 1 real-model injection). Suite 1493 -> 1498.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(qc): ScheduleAudit increment 2 — roll-forward period-drift detector",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-18T01:25:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "79416709bcc2d2eae5609920afcb39f9bf92c08c",
          "body": "certify proves a workbook has zero formula errors but cannot detect a cell that\nSHOULD be a formula and was overwritten with a bare number (e.g. a value typed\nover year 4 of a 10-year debt schedule). New modelforge.qc.audit_schedule flags\nexactly that: a non-innocuous hardcode wedged BETWEEN formula\n[…]\n mutates the workbook.\n\nTests: tests/test_schedule_audit.py (7) — synthetic edge cases + real-model\ninjection. Suite 1486 -> 1493.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(qc): schedule auditor — flag interior hardcodes certify can't see",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-18T00:38:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5f42ee31a7f48c3ef921ba35fb6453956357d143",
          "body": "…ped reality\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: correct template count (11→19) and provider count to match ship…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-17T19:11:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "70a809c2822615aabd897d10867bcc9e4a18029f",
          "body": "… certification moat\n\nBadge/header/list/server.json now state 19 templates (17 shipped + 2 preview); add development_re, bank_fig, loan_tape_securitization to the README list. The quickstart's first command pointed at examples/ (not shipped in the wheel) and failed for pip-install users -> repoint t\n[…]\nmoat (fail-closed via certify --strict / build --trust-strict) for the agent/embed use case; drop the stale 14/14 audit-all count.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: correct template count to 19, fix broken quickstart, foreground…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-17T11:19:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4301628390a7e092ae5a8032f2a09f4b9df57bac",
          "body": "- README/landing Tests badge 679->1486 (accurate); landing de-numbered to a CI-green claim to prevent recurrence\n\n- landing: v0.9->v0.11; drop uncited third-party ranking claim; fix two dead SCORECARD links\n\n- docs: correct pip package name modelforge->modelforge-finance at 5 install sites (real PyP\n[…]\nngling private-SCORECARD reference\n\n- add .github/FUNDING.yml (GitHub Sponsors)\n\nVerified: 1486 tests pass; no code paths touched.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: scrub stale/false public claims + add funding surface",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-17T00:23:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b8f351841fb080d93fb28494692533ad6c16a1dc",
          "body": "The synthetic-example safety test hardcoded the real-world identifiers it\nguards against, which published those exact strings in the public test\nsource. Replace the inline list with a gitignored tests/_leak_denylist.txt\n(or MODELFORGE_LEAK_DENYLIST env var) + positive synthetic-identifier\nassertions, so the guard stays strong locally/CI without leaking the terms.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(security): move synthetic-example denylist out of public source",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-16T23:06:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "752c57c20289f6f3a09d1c59f02e546e0efba714",
          "body": "Two platform-dependent nondeterminism sources broke the byte-identical\nrebuild guarantee on CI (Linux) while passing on Windows:\n\n1. text_measurer resolved fonts via unsorted Path.rglob()[0]; scandir\n   order is filesystem-arbitrary on Linux, so consecutive builds could\n   pick a different fallback \n[…]\nMU conversion.\n\nVerified on Linux: 28/28 builds -> a single identical hash (was 3 hashes,\n~30% flaky); full deck suite 686 passed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(deck): make .pptx layout byte-deterministic on Linux",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-16T22:26:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "83ffc9eae9aec20a3adf2fd4c57e156071edc19d",
          "body": "The deck layout engine imports kiwisolver/Pillow unconditionally, but the\nCI install omitted the 'deck' extra, so pytest failed at collection with\nModuleNotFoundError across 8 deck test modules (exit 2) since the\nmodelforge.deck merge. Passes locally only because the dev venv has them.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: add deck extra to test install so kiwisolver/Pillow are present",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-16T21:44:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4987d0ab1ed48e7d696d3b180fe5d9bb90b71b20",
          "body": "…ate 19\n\nAdds a cash-securitization template driven by a granular, stratified loan tape —\nthe engine the existing structured-credit family deliberately lacks. structured_credit\nstays static cumulative-loss tranching; npl stays a single-curve collection waterfall;\nthis EXTENDS them with the missing m\n[…]\nC checks replaced with checks that have teeth,\na negative-coupon floor, a sequential turbo across notes, and a reserve priority-of-payments fix.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(templates): add loan-tape cash securitization (CLO/RMBS) — Templ…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-15T15:20:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "035ac6d1f1324a5dba6e759142ebaf85d2eb759b",
          "body": "…ated capital return\n\nA single-entity bank / financial-institution model (Basel III/IV + EU CRR proxy\nfidelity) — the \"certified bank capital model\" frontier-gap cell no wrapper\noccupies. Mirrors the three_statement single-entity shape (no deal/waterfall\nspine) and uses the generic_qc QC sheet.\n\nShe\n[…]\n.py (clean-room\nparity 81/81, fully independent Python re-derivation). Full suite 1469/0,\nexample CERTIFIED (errors=0, gaps=0), QC ALL_PASS = 1.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(bank_fig): add Bank / FIG template (#18) — NII, RWA, CET1, MDA-g…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-15T12:16:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fdcfd10d205ef193d7433a4812bb61d51aeca882",
          "body": "…-one\n\nThe per-tranche \"Opening debt\" roll-forward baked a literal cursor offset (r+3)\ninto the opening formula. Normally opening->drawdown->repayment->closing makes\nr+3 == closing (correct), but a mandatory_1pct tranche inserts an extra\n\"Mandatory amortization rate\" input row between drawdown and r\n[…]\nening rolls from\nclosing, not repayment, across mandatory_1pct/bullet/linear.\n\nSuite 1456/1456, 19/19 examples CERTIFIED, 16/16 hardtests green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(debt): correct mandatory_1pct opening-balance roll-forward off-by…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-15T10:57:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1b871eb1e02a649df5ad25b19865190145f8a4ca",
          "body": "…een CLI, RE decks\n\nRoadmap item 6. Adds the development-phase real-estate capability the\nstabilized-asset real_estate template could not express, wires portfolio\nscreening to a CLI, and extends the certified-deck adapter to real estate.\n\ndevelopment_re template (17th in REGISTRY):\n- New Development\n[…]\n383 -> 1452 passed / 0 failed. All 21 examples CERTIFIED. Exposure\ngrep clean (only the negative-assertion guard test references the deny-list).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(development_re+screen+deck): ground-up development template, scr…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-15T10:07:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3ae43f98cb59207b96f72705eaff6b8b94eebfe9",
          "body": "…urface\n\nRoadmap items 2+3. New modelforge.deck package (extracted from the\nDeckForge project, imports rewritten, all SaaS/billing/llm/gslides/plotly\nsurfaces left behind):\n\n- ir/ themes/ layout/ rendering/ compose/ qa/ finance/ (~90 files + 15 themes)\n- Native deterministic IB charts (no Plotly/PNG\n[…]\nde-content gate: every slide >= 2 content shapes across 4 decks, zero\nskip warnings. exporters/pptx.py deprecated in favor of the deck pipeline.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(deck+mcp): certified committee-deck layer + conversational MCP s…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-12T21:04:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c2acc359ab048d20e0ba5e573f0dd4db4ea5967c",
          "body": "…frontier-agent baseline\n\nHarness: 3 frozen synthetic briefs (LBO/DCF/3-statement), clean-room ground\ntruth (numpy_financial, zero modelforge imports), deterministic scorer with\n6 pre-registered metrics (formula errors via third-party recalc, headline\naccuracy, hardcode rate, reproducibility, lineag\n[…]\ndentity, 3S framing). This commit is the\ntamper-evidence anchor for the harness. Adversarially verified by independent\nre-scoring before commit.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(benchmarks): pre-registered public benchmark v1 - ModelForge vs …",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-12T15:51:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "de5a8ba32eeeede8401012c2de838ac9a0de2c97",
          "body": "…to the corrected models\n\nThe model corrections shifted layouts / changed clean-room expectations, which the\npytest suite doesn't cover (these are standalone live-Excel harnesses):\n- three_statement: the new CFF 'Debt repayment' row shifted cff/net_change down\n  one — update the ROW map (cff 40->41,\n[…]\nty IRR 18.34% / MoIC 2.52x now reconcile to\n  numpy_financial on the live CF.\n\nAll 15 hardtests now pass (exit 0) without PYTHONIOENCODING set.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(hardtest): realign npl/portfolio_review/three_statement harness …",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-12T07:38:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e29ef07f5a7894f29138fedbeb8dd96ff95251bc",
          "body": "…cross the suite\n\nPYTHONIOENCODING is read only at interpreter startup and ignored by the running\nprocess, so on the default Windows cp1252 console hardtests that print Greek/math\nglyphs (U+0394 Δ, U+00D7 ×, U+03A3 Σ) crashed: hardtest_project_finance.py\nsilently SKIPPED 12 of its 15 financial-invar\n[…]\negardless of console codepage. Verified: project_finance now 15/15, hgb_carveout\nexits 0 — both run to completion without PYTHONIOENCODING set.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hardtest): standardize effective in-process UTF-8 console guard a…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-12T07:27:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f9da9f13860e8287ed8ad6075723aaa0aae37b49",
          "body": "…ypo + dangling-source guards, honest compliance/schema/scaffold\n\n- build/certify/monte-carlo no longer dump a raw Python traceback on a malformed\n  or incomplete spec: a shared _load_and_validate_spec() gives the same friendly\n  plain-language errors `validate` does (YAML parse, non-mapping, unknow\n[…]\ncturing` now prints a note that the stub needs fields\n  filled before it validates/builds.\n\nSuite 691/691; affected examples certify CERTIFIED.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli,spec): professional-grade validation UX — friendly errors, t…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-12T07:25:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ea27cb77990d4686fa89127f51c5aa6bdee4314d",
          "body": "…e counts, MC deltas, football field\n\nCells now render with formats that match their MEANING:\n- risk_sheet: Merton/KMV distance-to-default and d1/d2 are z-scores -> plain\n  2dp number (was \"3.94x\"); 'Horizon (years)'=1 -> \"1.0 y\" (was \"100.00%\").\n- sources_uses: fully-diluted share COUNT -> accounti\n[…]\ns both anchored at zero.\n\nSuite 691/691; all 20 examples certify CERTIFIED; determinism preserved (all\nchanges are build-time, clock/RNG-free).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(format): 6 number-format/chart semantics defects — z-scores, shar…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-12T07:12:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dff32670a58e9b6a0c15b4c8d8fbd399ff88ed7c",
          "body": "…E waterfalls, fund pref, 3-statement debt, DCF guard\n\n- covenants: 'Total Net Leverage' covenant is computed GROSS (no cash netting),\n  so relabel to 'Total Gross Leverage' in the 4 affected examples (the row label\n  already read 'Leverage (Debt / EBITDA)'). Honest label = matches the math.\n- npl: \n[…]\n also\n  guarantees g < WACC). Rejects g>=rf with a clear message; Enel (1.5%<3.9%) ok.\n\nSuite 691/691; all affected examples certify CERTIFIED.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(models): 7 P2 correctness/honesty defects — leverage label, NPL/R…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-12T06:59:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4faf7d404f465f0b8063f40bfd78963d431f92ae",
          "body": "… NPL subordination, shadow merger, fund net IRR\n\n- structured_credit: Principal Deficiency Ledger summed the t=0 column (all\n  loss% = 0) and added bare percentages, so it always read 0 even when junior/\n  equity were written down. Now sums final-period cumulative loss x tranche size\n  in EUR m (FM\n[…]\n fee\n  periods 1..N, carry at terminal). portfolio_review_us net IRR 32.1% <= gross.\n\nSuite 691/691; all 5 affected examples certify CERTIFIED.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(models): 5 P1 correctness defects — PDL, covenant entry leverage,…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-12T06:46:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "33ca9231a7a6cf3a1d7012e13bc36d2532078d11",
          "body": "…st-maturity year\n\nTwo P0 wrong-number defects a buyer would act on directly:\n\n1. Sponsor-LBO exit IRR/MoIC used Enterprise Value as the sponsor's exit\n   inflow, never repaying the ~EUR35m of tranche debt outstanding at exit.\n   Exit proceeds (and the dividend recap, and the hurdle reverse-solve) n\n[…]\nec each run (was reading a stale pre-built file). 22/22 checks pass.\n\nSuite 691/691; credit_memo + both LBO examples certify CERTIFIED via CLI.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(lbo,credit): exit returns = equity not EV; credit recovery off po…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-12T06:33:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "892972ec98eba6cf1aba7511d3b9dc6fc9d568b7",
          "body": "…nistic, manifest-valid workbook\n\nThe `build` command injected the Trust-Layer RedFlags and MOAT sheets AFTER\nbuild_model()'s styler + determinism-pin + manifest-hash, so the *delivered*\nworkbook (the default CLI path a user actually ships) had:\n  - 39-45 unstyled cells in MOAT/RedFlags -> certify W\n[…]\nbuild of credit_memo_cdmo -> CERTIFIED errors=0 style-gaps=0,\nbyte-identical across two builds, manifest hash == delivered file. Suite 691/691.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(build): make CLI 'build'/'certify' deliver a certifiable, determi…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-12T06:19:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "690824b075049a6d016b7d84733a22fcf14787af",
          "body": "…errors, 0 style-gaps)\n\nFinal professional-polish pass. Suite 691/691; every shipped example now certifies\nCERTIFIED (zero formula errors AND zero styling gaps), up from WARN.\n\n- styles.auto_style_gaps(wb): deterministic post-build pass that gives every value-bearing\n  cell an explicit font + number\n[…]\nere FMT_MULTIPLE -> FMT_INTEGER; dcf_enel + fairness_amplifon share-count\n  assumptions had unit: x -> count (a share count is not a multiple).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(polish): post-build auto-styler -> all 18 examples CERTIFIED (0 …",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-11T23:44:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a28a57feca87a780d7aa9158b536ecb7f5a6d75c",
          "body": "…rametric band\n\nUpgrade analytics from build-time static snapshots to scenario-reactive where Excel permits,\nhonest where it cannot. Suite 691/691; all 18 examples certify errors=0.\n\n- sensitivity: tornado Low/High deltas + the generic 2D data-table body now render as LIVE\n  Excel elasticity formula\n[…]\nan editable mc_vol cell (proven live on scenario\n  flip AND vol edit). Added a `modelforge monte-carlo` refresh command for an exact re-sample.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(analytics): make tornado/2D genuinely live + Monte Carlo live pa…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-11T23:09:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bdb73ec92f6ff5ac25e3b25da9ce432163c7854a",
          "body": "…e-out bridge, true DSCR sculpting\n\nEach was an honest gap; now a validated feature. Suite 689/689 (+9 finance_core tests); all\nexamples certify errors=0; each hardtest's gap-marker flipped into a real reconciliation vs\nindependent ground truth (numpy_financial / clean-room / model-independent ident\n[…]\nardtest CHECK E flipped\n  to validate flat DSCR; 15/15.\n\nRemoved the now-obsolete \"v0.12 roadmap / NOT shipped\" placeholder notes for all four.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(models): ship 4 missing capabilities — duration, fund KPIs, carv…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-11T22:40:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "88820d7ab98839e024ebe5d45fab8eca2a9bcf07",
          "body": "…iven inputs\n\nEvery deal-critical constant that was baked into a builder formula is now an OPTIONAL\nspec field surfaced as a visible, overridable named-input cell (default = prior value, so\nbehaviour is byte-identical when omitted). Full suite 680/680; all 14 examples certify\nerrors=0; every hardtes\n[…]\n spec field; other 12 templates still read getattr defaults — trivial follow-up)\n- gitignore: ignore _o_*.xlsx / _out_*.xlsx / output_* scratch\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(spec): parameterize hardcoded assumptions into auditable spec-dr…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-11T21:39:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f803020ca3b80b286986aefba6b7e5057f208593",
          "body": "…-honesty + 3 new defects\n\nAudit-driven hardening toward best-in-class UX for finance professionals. Full suite 680/680;\neach change gated by build + targeted hardtests/tests. Local only.\n\nNew defects fixed (found by the deep audit + the new certify gate):\n- mcp_server: build_model tool self-recurse\n[…]\n`schema`, `scaffold`,\n  and `certify` (zero-formula-error gate via new modelforge/qc/workbook_audit.py); new spec/errors.py + spec/scaffold.py.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ux+fix): professional-UX pass — MCP/CLI/determinism/QC/analytics…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-11T08:57:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9e4186795f9176cfe0fbec0f991d1bc60d3b9c8a",
          "body": "…ep + add validation scripts\n\nIndependent-ground-truth hard tests across all 14 shipped model types found and this\ncommit fixes 12 correctness/integrity defects (1 — true PF DSCR-sculpting — deferred and\nhonestly relabeled rather than faked). Full suite 680/680; each fix gated by its hard test.\n\n- c\n[…]\nunded\n  balance (lender IRR 7.89% -> 9.73%)\n- add 13 hardtest_*.py validation scripts (live-Excel vs numpy_financial + clean-room + invariants)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(models): harden 12 finance defects found by 14-deal hard-test swe…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-11T07:26:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "44273b7b2246435afe96cbcf67296b3fa22eba17",
          "body": "…om + loss conservation\n\nBuilds the 4-tranche IT SME securitization, EVALUATES the live Excel waterfall\n(formulas engine), reconciles every tranche size/loss%/outstanding/coupon to a\nclean-room reference, and asserts the model-independent LOSS CONSERVATION identity\n(Sigma tranche loss = pool loss) +\n[…]\n loss, whole-stack breach). 199/199 pass; senior takes exactly\n(20-10)/(100-10)=11.11% under stress. Self-contained (auto-builds its workbooks).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(structured-credit): hard waterfall test — live Excel vs clean-ro…",
          "author_name": "ModelForge Dev",
          "author_login": "claude",
          "committed_at": "2026-06-10T22:43:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5c58691741fd5ecada0018fefb8741692417a8f5",
          "body": "…nal ground-truth hardtest\n\nFound by hardtest_external_groundtruth.py (vs numpy_financial + clean-room DCF/LBO):\nirr() rejected the canonical PE/LBO stream [-equity,0,0,0,0,exit] because the\nsign-change guard checked adjacent pairs only — intervening zeros defeated it.\nFix: require >=1 positive AND >=1 negative cashflow (the correct IRR precondition).\nHardtest: 40/40 vs independent ground truth; DCF EV + LBO MOIC/IRR reconcile to 1e-9.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(finance_core): irr accepts sign-change separated by zeros + exter…",
          "author_name": "ModelForge Dev",
          "author_login": "claude",
          "committed_at": "2026-06-10T22:36:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0007fdce9099a0b903150d4fbf05fecd5e0c5d41",
          "body": "… count claims, stale tool header, list_sources/lineage_walk runtime bugs; add What-this-solves + llms.txt + GEO post\n\n- Replace all 17 tool docstrings with Use-when problem-framed descriptions\n- Regenerate module-level header to list actual 17 registered tools; remove phantom sensitivity_run\n- Fix \n[…]\no reflect 16 templates\n- Add 8 GitHub topics: mcp-server, dcf, lbo, audit-trail, data-lineage, yaml-to-excel, valuation, ai-agents\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(discovery): problem-framed MCP tool docstrings + fix QC/template…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-03T15:16:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "04c2d51bc99bad7093e2c55de7bce2d128142c70",
          "body": "…adges/CI\n\n- CHANGELOG: drop 'Strategic context' block (named non-compete evasion +\n  US/UK/EU/DACH/Nordic FI segments) and GTM-motion intro; neutral rewrite\n- Remove internal V06/V07_SHIPPED.md release notes (V07 named London/Zurich/\n  Frankfurt funds, UK pension, Swiss bank, DACH family office as \n[…]\nadge -> dynamic PyPI badge (was stale; PyPI 0.11.4)\n- deploy.yml: bump collab-worker Node 20 -> 22 (wrangler 4 floor; was failing)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: remove non-compete/FI-targeting copy from public surface + fix b…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-03T14:12:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f484c9e08d3581e9863ac615c59e52336a16dd94",
          "body": "Adds a structured \"Early Access / Commercial Inquiry\" issue form and a\nREADME CTA so production users / commercial interest have a clear,\nlow-friction intake path (previously there was no call-to-action or\ncapture anywhere). In-platform, no PII exposure.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add lead-capture CTA + Early Access issue template",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-03T13:09:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a78b4dee9ae54701f844104ad841aac01c0392db",
          "body": "Prevents the worker's install artifacts from being accidentally staged\ninto the repo.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(collab-worker): gitignore node_modules/dist/.wrangler",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-03T12:37:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "54dc61f28dff8fe294821b66b41a71333a49c635",
          "body": "…ories\n\ncollab-worker `npm audit` now 0 vulnerabilities (was 1 critical / 1 high\n/ 7 moderate). All advisories were in the dev/build toolchain (vitest\ntest runner + wrangler's bundled undici/miniflare/esbuild/ws) -- the\ndeployed Worker runtime deps (yjs, y-protocols, lib0) had no advisories,\nso the \n[…]\n (wrangler.toml + CollabDoc Durable Object binding valid, worker\nbundles). No test files exist, so the vitest major is inert here.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(collab-worker): bump wrangler 3->4 + vitest 2->4 to clear advis…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-03T12:36:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "46409d0f9892764964cfa9df7d9c4b043bd36169",
          "body": "…sh), self-contained MC test\n\n- __version__ 0.9.7 -> 0.11.4 (was out of sync with pyproject)\n- Force UTF-8 on CLI stdout/stderr so 'modelforge --help' no longer raises UnicodeEncodeError on Windows cp1252 (the help lists a command whose docstring contains 'χ²')\n- test_mc_sheet_on_all_templates now builds each example into tmp_path instead of reading gitignored prebuilt output/*.xlsx -> 679/679 from a clean checkout\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: sync __version__ to 0.11.4, UTF-8 CLI output (Windows --help cra…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-03T09:57:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a4492837fbabb8d3f04a4ca62d9622c5ff1fd2c8",
          "body": "Resolves the 'Proprietary license claimed but no LICENSE file' contradiction; version bump for clean PyPI re-publish with scrubbed README.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: add proprietary source-available LICENSE; bump 0.11.2 -> 0.11.3",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-03T09:03:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "08d65ad9cfa4749252e9de829944b1112cbc62b0",
          "body": "…e internal strategy doc\n\n- Reframe README + landing to developer/analyst audience (drop 'private capital teams / UK-EU credit / NPL / DACH-Nordic' targeting)\n- Remove bespoke '€15-100K per deal' + 'bank-grade engagements' solicitation\n- Drop Italian-niche market-targeting framing from landing + com\n[…]\nes shipped count); align landing test count to 679\n- Remove research/arc_threat_profile.md (internal GTM strategy, not for public)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: scrub FI-targeting/solicitation copy; fix template badge; remov…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-03T07:51:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "619b3302cef01005028997f2c3ef34bbb205903e",
          "body": "- Route security reports + contact to GitHub (advisories/issues), not personal email\n- Anonymize analyst + counterparty names in example specs to generic placeholders\n- Remove internal strategy outline from the public tree; genericize/rename ROI example\n- Drop personal name, location and social links from landing page + web footer\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(privacy): scrub maintainer PII + anonymize example/deal data",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-06-01T14:04:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "094991cc28eb01542d7e260049ae21e60f1bdb4c",
          "body": "…ver get committed\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: gitignore build artifacts (dist/, dist-*/) so wheels/sdists ne…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-29T12:19:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "778d5eb250d0eab3593866f9f663924a28860cd0",
          "body": "…ersarial findings) to private repo\n\nMoves to Whatsonyourmind/modelforge-private:\n- All SCORECARD*.md (consensus + v1/v2/v3 historical)\n- IC_DOSSIER + EXTERNAL_IC_REVIEW + TRIPLE_REVIEW (investment-committee briefings)\n- GTM_STRATEGY + MOAT_SWEEP + GAP_ANALYSIS_TO_9 (commercial positioning)\n- All 9 \n[…]\nupdated: drops scorecard badge + IC-review paragraph + PRD link.\n.gitignore extended so these patterns don't reappear by accident.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: move internal docs (scorecard, internal review, PRDs, GTM, adv…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-28T12:55:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f21537e94b27652d25538a12cc6a375c09140a18",
          "body": "Adds the Glama maintainer-claim file so when the modelforge MCP server is\nindexed at glama.ai/mcp/servers/Whatsonyourmind/modelforge the ownership\nattribution is correct. Unblocks the missing-glama label on the\npunkpeye/awesome-mcp-servers PR.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: add glama.json — claim listing for Glama MCP registry",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-27T23:18:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "07c151d2eda20af0e5b06aa12743457d9325fb57",
          "body": "Continues v0.11.1. Sweeps 14 hardcoded EN/IT pairs from the most common\nsheet builders (Cover, Operating, Covenants, Debt, Returns) into the\nLabel class. Sponsor LBO and unitranche workbooks now render correctly\nacross all 8 languages on the common path.\n\nAdded 14 new labels (105 → 119 total):\n* cov\n[…]\ncoded pairs in specialized template sheets (NPL, PF,\nRE, merger, DCF, bond structure, structured credit, etc.) remain v0.12\nscope.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(v0.11.2): common-sheet multi-language sweep",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-18T23:26:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0d38d258ecbf7456944f641e46d8b1ba5e667463",
          "body": "…UK example\n\n679/679 tests passing. Architectural cleanup of the v0.10/11 global-mutation\nshim. Multi-tenant safe: concurrent builds in different secondary languages\nno longer bleed.\n\nRenderer refactor (proper):\n* Added `Label.secondary` property that reads a contextvars.ContextVar and\n  returns the\n[…]\necard: 5.46 (v0.9.7 baseline) → ~5.75 (post-v0.11.1).\n\nVersion 0.11.0 → 0.11.1. CHANGELOG entry. PyPI publish remains user-action.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(v0.11.1): contextvar rendering + full multi-language ts_model + …",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-18T23:20:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "64877b86b939de8fecf16ffb74df90ff5ad3e8d5",
          "body": "…lian cleanup\n\nCloses the v0.10 PREVIEW/BETA gaps and pushes product quality toward the\nSCORECARD round-3 target. Ships in the same session as v0.10. 667/667 tests\npassing (657 baseline + 10 new).\n\nTrust Layer expansion (+6 rules, total 30+):\n* hgb_hebesatz_in_band — GewSt Hebesatz must be in legal \n[…]\nering all of\nthe above. Full suite 657 → 667 passing.\n\nVersion 0.10.0 → 0.11.0. CHANGELOG entry. PyPI publish remains user-action.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(v0.11): quality lift — Trust+ + HGB BETA + foreign example + Ita…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-18T18:36:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e1a82c0055855deccc5a3d5776473ae095e70dd9",
          "body": "PRD: PRD_v010_foreign_markets.md\n\nDrivers: six persona interviews across the W1 30-firm outreach list\n(US MM direct lending, US distressed, UK/EU credit, DACH turnaround,\nNordic MM, Benelux family PE) plus a non-compete-driven requirement to\nstrip Italian-market positioning from public surface.\n\nCha\n[…]\nst_v010_foreign_markets.py — all pass.\n  Existing suite 637/637 → 657/657.\n* Version 0.9.7 → 0.10.0.\n* CHANGELOG.md initial entry.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(v0.10): foreign-market expansion — kill Italian-only positioning",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-18T08:42:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e65b84fdd91cdfebf6f311ce8cb08935ef9519f4",
          "body": "…bjects\n\nCloudflare free plan requires SQLite-backed Durable Objects (cheaper compute).\nStandard new_classes migration fails with code 10097 on free accounts.",
          "is_bot": false,
          "headline": "fix(collab-worker): use new_sqlite_classes for CF free-plan Durable O…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-18T01:23:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67e5bcfc248dd55b9c83e342b676dd3d5c31b3e8",
          "body": "GitHub Actions setup-node was failing to find the lock file at the configured\ncache-dependency-path. Generated via npm install --package-lock-only.",
          "is_bot": false,
          "headline": "build(collab-worker): commit package-lock.json so CI npm cache resolves",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-18T01:22:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a781e4e36306cf3fb0b15e30e14b3b7d0a11ba8",
          "body": "Validates end-to-end automation: Render deploy hook + Cloudflare Worker.\nSecrets: RENDER_DEPLOY_HOOK_URL, CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID,\nSUPABASE_JWT_SECRET are all set.",
          "is_bot": false,
          "headline": "deploy: kick off first full SaaS deploy via GitHub Actions",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-18T01:21:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d005d23863f81321053def6dce1ef69e0c4eaf8",
          "body": "…pport cron)\n\nRender's free plan is web-only. The daily audit-listed harness can run via\nGitHub Actions scheduled workflow at zero cost. Re-add to render.yaml under\n'plan: starter' ($7/mo) when colocation becomes valuable.",
          "is_bot": false,
          "headline": "fix(deploy): drop cron service from render.yaml (free tier doesn't su…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-18T00:39:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4903ede8a17cfad72ebe91c24aee239922bd6be",
          "body": "…Version field\n\nRender's blueprint schema doesn't accept pythonVersion as a top-level service\nfield. Move to envVars per Render's documented runtime selection mechanism.",
          "is_bot": false,
          "headline": "fix(deploy): use PYTHON_VERSION env var instead of unsupported python…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-18T00:38:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73d1492127b2f8fe5fb0f459ca7a2eac9b5b1911",
          "body": "- .gitignore: add output/ + *.manifest.json (build artifacts shouldn't track)\n- AUDIT_RUN_LISTED.md/.json: refresh with latest 30-ticker LIVE Yahoo run\n- .continue-here.md: full session handoff\n  - 13 commits this 3-day session (May 14-17)\n  - Tests 471 -> 631 (+160)\n  - Score round-1 5.45 -> round-\n[…]\nwork for round)\n- Re-run triple-AI review without ≥1 LOI landing (verdict won't move)\n- Touch the license (user-deferred decision)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: save session — gitignore output/ + handoff for next session",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-17T15:25:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4ea6d65cd9835f1dd5646863cd3c50723a11846b",
          "body": "…ybook\n\nThe \"deploy the SaaS shell\" execution from the round-4 internal review's\nunanimous next-action recommendation. Three pieces:\n\n1. modelforge/web/saas_routes.py + create_app() integration:\n   - 11 new /api/v1/* routes (auth/whoami, tenants CRUD + members,\n     billing webhook with HMAC verific\n[…]\n, ingest your real\nteaser, tell me where the output is wrong.' That's the customer-pull\nmove all three reviewers are waiting for.\"\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(d5-deploy): SaaS shell wired into FastAPI + auto-deploy CI + pla…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-16T02:32:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ee65e4b26bea1822895024ad92e4faa8b0715d6d",
          "body": "D3 — fixed all remaining template moat-gate failures:\n- merger_proforma.py: PPA named ranges (asset_writeup_ppe,\n  intangibles_*, target_bv_equity) now wired into DTL + goodwill +\n  amortization formulas. Cell values are formulas pointing to the\n  Assumptions-sheet `_eur_m` named ranges (single sour\n[…]\n.\n\nQuality-only weighted lift: ~7.79 → ~7.95 (within 0.05 of 8.0;\nonly SOC2 spend gap remains for D7 to bridge the last 5 points).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(d3+d8): 14/14 moat-clean + 17 country defaults",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-15T16:14:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3aac105316577abd10e82078086b642bc8d8e1d9",
          "body": "Closes the D6 dev-only ceiling gap. Phase A free-tier blueprint:\nCloudflare Workers + Durable Objects host one Y.Doc per\n${tenantId}:${docId}. Free-tier capacity covers tens of concurrent\ndesign-partner users (100K req/day, 1M DO req/mo, ~100 concurrent\nWebSocket connections per Worker).\n\nweb/collab\n[…]\n via `wrangler deploy` (one-time login + ~10s\ndeploy). Browser UI (Yjs client) connects to ws_url for realtime\nmulti-user editing.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(d6): Yjs realtime collab — CF Worker + Python client",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-15T15:46:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bcbc2ee36ec527258acea2c6cae731aefcd9ac94",
          "body": "D4 — wire 2 more free Providers (LIVE count 4 → 5):\n- FREDProvider (free, no key required) — uses FRED's public CSV\n  endpoint (fredgraph.csv); switches to JSON API when FRED_API_KEY set.\n  history(series_id) returns macro time series as Bars.\n  Live verified: 10Y Treasury 4.46%, SOFR 3.56% (May 202\n[…]\n in pass/fail count, but 4\ntemplates moved from \"fails 2 gates\" to \"fails 1 gate (density)\").\n\nTests: full feeds suite 59/59 pass.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(d4+d3): FRED + AlphaVantage Providers + unitranche fee wiring",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-15T15:42:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e1523f22f4ba80dbcd6f2dd563ae1143a75fb6d0",
          "body": "modelforge/saas/ — full no-spend SaaS shell that runs on Supabase\nfree tier + Cloudflare Pages free + Stripe transactional. Code is\nexercisable today via dev-bypass headers; flips to verified Supabase\nJWT + tenant RLS once env vars are wired.\n\nThree modules:\n\n1. auth.py — AuthContext + JWT/header ve\n[…]\n.\n\nPhase-A no-spend SaaS-shell GATE met: every code path runs locally\nwith SQLite + dev bypass; production wiring is env-var only.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(d5): SaaS shell — multi-tenant auth + tenant + billing (free tier)",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-15T13:50:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e3b957cc330be206079b51584124a10ac7d346e5",
          "body": "modelforge/collab/ — data model + state machine for multi-user\nreview workflows. Realtime sync (Yjs / CF Workers Durable Objects /\nLiveblocks) is the Phase-B integration layer; the data model and\naudit trail ship now, free, no infra.\n\nThree modules:\n\n1. comments.py — CommentStore (SQLite, append-onl\n[…]\nover CF Workers Durable Objects)\nwill mirror these same events; no data-model rework required when\nthe realtime UX layer is added.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(d6): collab primitives — comments + 4-eyes review + workbook diff",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-15T13:46:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cdeb41f4af6f1722449199d453c18c4e1f341095",
          "body": "Adds modelforge/analytics/manifest.py — every workbook now ships with a\n``<workbook>.manifest.json`` sidecar containing the full audit envelope:\n\n- ``spec_sha256``     bytes-deterministic hash of the YAML spec\n- ``sources_sha256``  digest covering every source-doc row\n- ``source_hashes``   per-sourc\n[…]\nap (D2 → 8.5) without\nrequiring spend on Big-4 audit. Tests: +17 (15 manifest + 2 build_model\nintegration), 547/547 expected pass.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(d2): per-build manifest sidecar with source-doc hash chain",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-15T13:40:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9e3cbc2f6492104f4b2af435b8e82590bd4e34d1",
          "body": "D7 — Security / compliance (license deferred per user direction):\n- THREAT_MODEL.md: formal STRIDE catalogue with 23 threats (Spoofing,\n  Tampering, Repudiation, Information disclosure, Denial of service,\n  Elevation of privilege) + risk-rating summary + verification cadence\n- .github/workflows/secu\n[…]\n 15% for groups ≥ EUR 750M\n- 20 new tests covering rate selection, deductions, loss CF, BEPS\n\nTests: 530/530 (was 510, +20 Swiss).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(d7+d8): security hardening + international expansion",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-15T13:30:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b916142f7d8b256f1ad6eea5f695c7b3da9c6297",
          "body": "Adds scripts/moat_sweep.py that builds every example workbook and runs\nall 4 moat gates, emitting MOAT_SWEEP.md as the canonical scoreboard.\n\nCurrent state: 8/14 templates pass all 4 gates. Six fail on the\norphan-named-range or density gates (or both):\n- credit_memo_cdmo (8 orphans, 1 density gap)\n-\n[…]\niewers a consistent way to\nverify \"fully-formulated live Excel\" claim per internal review's\ncritique on the marketing/reality gap.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(d3): MOAT_SWEEP tool — moat-gate scoreboard across 14 templates",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-15T11:28:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ebe68f00120e0b6721b3ccf23119e22be9edaf6a",
          "body": "Implements the harness internal review demanded as the gate\nto lift D1 from 7.3 to 8.5+:\n\nUniverse: 20 named US listed-cos across 4 sectors\n- Tech: AAPL, MSFT, GOOG, META, NVDA\n- Bank: JPM, BAC, WFC, GS, MS\n- Pharma: PFE, JNJ, MRK, ABBV, LLY\n- Industrial: CAT, BA, GE, HON, UNP\n\nPipeline per ticker:\n\n[…]\n3B vs live market cap 94.9B for ENEL.MI (+482%).\" Killer\n#1 is now objectively closed.\n\nTests: 510/510 still pass (no regression).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(d1): 20-listed-co plausibility harness — closes priority item #1",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-15T11:20:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6470b86d744c79cfa7da1b1b455afbed3291da1f",
          "body": "D4 (data integrations) lift — first no-auth Provider with quote +\nhistory + fundamentals globally:\n- YahooProvider class wraps existing helpers + adds Yahoo's quote\n  Summary endpoint with cookie/crumb anti-bot dance for fundamentals\n- Registered in default registry as `yahoo` tier=free, no auth\n- L\n[…]\n(priority item)\nis now caught at audit time against live external reference, not\njust internal Trust Layer self-consistency rules.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(d4+d1): YahooProvider LIVE + live market-cap Trust rule",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-15T11:01:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b68cdf1b336945e01f68eb59529db18964b0cf73",
          "body": null,
          "is_bot": false,
          "headline": "ci: materialize example workbooks before tests",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-15T08:55:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a09bdf5b38d28a19ccc5ce7dedbcc520b5d1b6bc",
          "body": "Two CI issues found in the first v0.9.7 run:\n  1. test_web.py collection failed on missing fastapi -> add\n     [web,ingest] to the test install line so the full test set is\n     reachable on CI.\n  2. Ruff surfaced 356 pre-existing issues across the codebase\n     (mostly duplicate imports + unused im\n[…]\n feeds adapters).\n     Marking lint as advisory (continue-on-error + report-only) so\n     it tracks debt without blocking ships until a dedicated cleanup\n     pass lands. Tests + SBOM remain blocking.",
          "is_bot": false,
          "headline": "ci: fix test extras + make ruff advisory",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-15T08:52:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9b95d736b8ed33fd6be6d2c65661d56666b12f92",
          "body": "Highlights:\n- Trust Layer v1 — semantic plausibility gates across all 14 templates,\n  RedFlags sheet auto-injected, audit-all 14/14 FAIL-clean. Closes IC\n  review priority item (Enel +743% market-cap deviation now detected at\n  build time, was previously silent).\n- Canonical SCORECARD.md at consensu\n[…]\noprietary\n  pyproject text. This remains an open procurement gap.\n- Customer-pull (Killer #2) and enterprise wrapper (Killer #3) are\n  founder-driven and capital-blocked respectively; not engineering.",
          "is_bot": false,
          "headline": "release(0.9.7): Trust Layer v1 + honest scorecard + SBOM CI",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-15T08:45:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "994e7ccc25a0c3fa2bf293ff7879a7b3c4b8af03",
          "body": "CI workflow runs on every push to master and on every PR:\n  - test: pytest across Python 3.11 + 3.12 with full extras\n    (data, export, mcp, dev) — current suite 504 tests in ~77s\n  - lint: ruff check across modelforge/ tests/ scripts/\n  - sbom: generates CycloneDX 1.5 SBOM, validates structure,\n  \n[…]\n run, so committing creates noisy diffs without\ninformation gain. CI artifact + release attachment are the canonical\ndistribution paths.\n\nCloses IC-review gap \"no SBOM\" for D7 (Security / compliance).",
          "is_bot": false,
          "headline": "ci: add test/lint/SBOM workflow + ignore generated SBOM",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-15T08:42:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "45e5ae04900c30ea8fe6cc841d80c3dcdc9b847b",
          "body": "Tier-0 (free): EDGAR · OpenFIGI · GLEIF — LIVE today, validated\nagainst real APIs (full submission-history pulls, FIGI symbol\nresolution, LEI lookups).\n\nTier-1 (low-cost paid): Polygon ($29/mo) · FMP ($19/mo) · Finnhub ·\nTiingo — interface-complete, key-driven activation.\n\nTier-2 (institutional): Bl\n[…]\nokup (cuts hardcoded data 60%).\n\n42 new tests; full suite 504/504.\n\nStrategic posture: Phase B becomes a buy-decision (institutional\nkeys + multi-tenant SaaS), not a build-decision — see SCORECARD.md.",
          "is_bot": false,
          "headline": "feat(feeds): 11-provider unified data stack",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-15T08:31:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1a33ad37b2d5beb9b8f96d41703c800aa036d9c3",
          "body": "Closes internal review KILLER #1 — numerical plausibility failure.\n\nTrust Layer v1 — semantic plausibility gates that catch impossible\nnumbers BEFORE the model leaves QA. Architecture: TrustRule (named\ncheck) -> TrustEngine (runs ruleset against built workbook via\nWorkbookProbe) -> TrustReport (sort\n[…]\ns.\n\nAlso: ipo/restructuring template prompts for ingest pipeline,\nanalytics factor/sensitivity refinement (peer-band aware), CLI\n'modelforge audit' + 'modelforge audit-all' + '--trust-strict' QC\ngate.",
          "is_bot": false,
          "headline": "feat(trust+moat): Trust Layer v1 + moat classifier",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-15T08:31:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dfe4d514ed19115661d68b840e984fc6abb4bace",
          "body": "…creening + OCR\n\nD8 (regional coverage 6.5 -> 8.0, +0.12 weighted):\n- french_corp_tax.py: IS 25% + small-profits 15% + social surcharge 3.3%\n  + CVAE + CIR (R&D credit, 30%/5% tiered) + 88% participation exemption\n  + €1M loss CF unlimited / 50% above. Smoke: ETR 25.00% on €1M.\n- spanish_corp_tax.py\n[…]\nson: version sync 0.9.6\n\nInternational scorecard: 7.57 -> ~7.84\nPyPI published: pypi.org/project/modelforge-finance/0.9.6/\nMCP registry: io.github.Whatsonyourmind/modelforge v0.9.6 (will publish next)",
          "is_bot": false,
          "headline": "feat(v0.9.6): Tier-0+Tier-1 autonomous gap-closing — FR/ES/JP tax + s…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-14T14:26:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "116448e9510f2a415fbb298efaa7c7ac187513aa",
          "body": "…elease\n\nThe unscoped 'modelforge' on PyPI is owned by source{d} (ML library at 0.15.2).\nRenamed our PyPI distribution to 'modelforge-finance' while keeping import\nname 'modelforge' and brand 'ModelForge' everywhere else.\n\nChanges:\n- pyproject.toml: name = \"modelforge-finance\" · version 0.9.4 -> 0.9\n[…]\nv0.9.5 (isLatest)\n- GitHub:       public at https://github.com/Whatsonyourmind/modelforge\n\nDistribution channels open. Next session can submit awesome-mcp-* PRs that\npoint to working install commands.",
          "is_bot": false,
          "headline": "chore(v0.9.5): PyPI rename modelforge -> modelforge-finance + first r…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-14T13:27:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "05184ebc7b5b3194473bdcf2f3d9113443e9b034",
          "body": "Adds .github/workflows/publish.yml triggered on `git push origin v*`.\n\nThree jobs:\n1. build — builds wheel + sdist\n2. publish-pypi — uploads to PyPI using OIDC (no token stored anywhere)\n3. github-release — attaches wheel + sdist + SBOM (CycloneDX 1.5) to GH release,\n   auto-generates release notes \n[…]\nge\n    Workflow filename: publish.yml\n    Environment name:  pypi\n\nAfter that, every `git push origin vX.Y.Z` auto-publishes to PyPI.\n\npyproject: version 0.9.3 -> 0.9.4 (this workflow lives in v0.9.4)",
          "is_bot": false,
          "headline": "ci(v0.9.4): GitHub Actions PyPI publish via OIDC trusted publishing",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-14T13:06:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "266063f456a24f0ec939115f2b9b73f6c70f090d",
          "body": "…tion + version sync\n\n- README.md: add `<!-- mcp-name: io.github.Whatsonyourmind/modelforge -->`\n  marker required by MCP registry for PyPI-package ownership verification\n- README badges refreshed: v0.9.3 + SOTA 9.40 IT / 7.42 INTL + templates 14 + repo public\n- server.json: description compressed t\n[…]\nip by fetching the PyPI README, so PyPI must be live first). User action:\n`twine upload dist/modelforge-0.9.3-py3-none-any.whl` after PyPI token setup,\nthen `mcp-publisher publish` completes the loop.",
          "is_bot": false,
          "headline": "chore(v0.9.3): MCP-registry prep — add mcp-name tag + shorten descrip…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-14T12:55:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cbdbcba0acb7996120ef411b7efaabbc00915b97",
          "body": "D5 (productization) lift: web UI moves from \"functional but plain\" to\n\"presentable to a paying customer.\"\n\nChanges:\n- modelforge/web/app.py: _INDEX_HTML + _VIEW_HTML rewritten with Tailwind CDN\n  - Gradient hero header w/ navigation links to GitHub / Scorecard / GTM\n  - Upload form with proper file \n[…]\n_) — no endpoint changes needed\n- 13 routes intact, FastAPI app loads clean\n- pyproject: 0.9.2 -> 0.9.3\n\nNet D5 lift: 2.5 -> 5.5 weighted (+0.45 weighted points)\nInternational scorecard: 6.97 -> ~7.42",
          "is_bot": false,
          "headline": "feat(v0.9.3): Tailwind frontend on web UI — proper SaaS-grade look",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-14T12:53:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "402dfe6e77232b16d4fd16ecf5be296ff2f7b1e8",
          "body": "… + comments + SBOM\n\nInternational scorecard lift 6.56 -> ~7.20:\n\nTemplates (D3 modelling completeness +0.225):\n- spec/ipo.py + templates/ipo.py: IPO valuation packet\n  - 8 sheets: Cover, Assumptions, Sources, Comps, Precedents, DCF, Valuation, QC\n  - Trading-comp median + precedent-transaction medi\n[…]\nd end-to-end: IPO + restructuring builds produce valid .xlsx,\nREGISTRY now 14 templates, comments persist + resolve, SBOM emits valid\nCycloneDX. All 8 modules + scripts/generate_sbom.py compile clean.",
          "is_bot": false,
          "headline": "feat(v0.9.2): Phase A2 — IPO + restructuring templates + AlphaVantage…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-14T12:46:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1aeaed45e54537286618a885f90f39d895561f30",
          "body": "…x + free feeds + audit log\n\nInternational dimensions closed (+1.21 weighted lift):\n- D8 +3.0 raw (regional coverage 3.5 -> 6.5): added US GAAP + UK + German tax\n  - us_gaap_tax.py: federal 21% + state, NOL 80% rule, R&D credit (regular/ASC),\n    GILTI w/ § 250 50% deduction, BEAT @ 12.5%, § 162(m),\n[…]\nus (6.85) and Rogo (7.40)\n  Path to 9.0+ documented in SCORECARD_v3 with explicit Step A (autonomous, 3wk)\n  + Step B (Phase B capital, €350-600K, 6-12mo)\n\nItalian-niche unchanged (already SOTA): 9.30",
          "is_bot": false,
          "headline": "feat(v0.9.1): international scorecard lift 5.35 -> 6.56 — regional ta…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-14T12:28:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "52069b98cfe9eca00c06a2c5e7b10a98c7311cd5",
          "body": "…corecard + landing\n\nDistribution lever:\n- modelforge/mcp_server.py — FastMCP stdio server exposing 8 tools (build_model,\n  qc_workbook, list_sources, lineage_walk, list_templates, ingest_dataroom,\n  export_pptx, export_docx) for use inside Claude Code/Cursor/Cline/ChatGPT\n- pyproject: add `modelfor\n[…]\n templates (D8)\n\nCloses the autonomous-buildable subset of the international SOTA gap.\nDay-90 KPI targets: 3 paying customers, EUR 30-100K revenue, MCP weekly\ninstalls >=100, public landing page live.",
          "is_bot": false,
          "headline": "feat(v0.9): GTM prep — MCP server + PPTX/DOCX exporters + dual SOTA s…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-05-14T12:17:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "18cdeda9b32da48d5699c3d07dcbc0f76e70d3f7",
          "body": "Closes the three classes of non-live surface I flagged in yesterday's\nhonesty pass: (A) hardcoded coefficients -> named ranges, (B) placeholder\nzero-rows -> real formulas, (C) 2D sensitivity linear approx -> shadow-\nengine exact recompute. Audit unchanged at 422/425 PASS. 431 tests pass.\n\nTheme A — \n[…]\ntional[Assumption]\n- PFDebt.early_redemption_flag/year/principal_pct\n- PFDebt.mp_*_flag/mp_*_eur_m (5 event pairs)\n\nAudit: 422/425 PASS, 0 PARTIAL, 0 FAIL (unchanged from v0.8.8).\nTests: 431/431 pass.",
          "is_bot": false,
          "headline": "feat(v0.8.9 fully-live): closes every last hardcoded/placeholder",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-04-22T06:06:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c4fadef1a84d8796977d605f23ae572c3d8c1c68",
          "body": "… XIRR\n\nCloses Theme 0.C residuals from v0.8 Theme 4/6: rows that existed as\nstructural placeholders in v0.8 now live-compute with real formulas.\nAudit remains at 422/425 PASS (99.3%), pytest 431/431, zero regressions.\n\nPF cashflow live-compute (US-560..565):\n- O&M reserve balance + funding/release \n[…]\n(target_lev x EBITDA - sponsor_eq\n  when recap_enabled=1, recap_year hit)\n- Non-volatile: uses IRR (equal periods) instead of XIRR+TODAY()\n\nAudit #82 regression fix: removed TODAY() volatile function.",
          "is_bot": false,
          "headline": "feat(v0.8.8 live-compute): PF reserves + IFRS9ECL sheet + sponsor LBO…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-04-22T05:49:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3a80131a05557e00f71d7df2484d0da67c0dbc6a",
          "body": "…reen\n\nCloses all 53 v0.8.6 PARTIALs + pre-existing merger reverse classifier\nfailure. Gold-standard audit: 369 PASS -> 422 PASS (+53), 86.8% -> 99.3%.\n\nCluster A — Universal 2D Data Tables (US-500/501/502, closes 13):\n- append_generic_2d_tables() in analytics/sensitivity.py\n- Picks top-2 factors by\n[…]\nd_trip_classification failure\n\nBonus — CLI sponsor_lbo registration:\n- cli.py _load_spec_class() was missing sponsor_lbo (v0.8.5 regression)\n\nTests: 431 pass / 0 fail (was 430/1). Audit: 422/425 PASS.",
          "is_bot": false,
          "headline": "feat(v0.8.7 audit-clean): 0 PARTIAL / 0 FAIL, 99.3% PASS, 431 tests g…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-04-21T23:41:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "24d7be9d5c8eec743e07ef92376dbb670b84dc23",
          "body": "…rfall\n\nTheme 6 partial — US-260/261 addressed via compliance-sheet enhancement\n(not a new IFRS9ECL live-compute sheet; v1.0 scope). US-262/263 deferred\nto next session.\n\nShips:\n- compliance.py: canonical \"ECL = PD × LGD × EAD × DF\" formula row with\n  variable definitions. Individual Stage 1/2/3 row\n[…]\ned score ≥9.0 per PRD ship\ncriteria now met on every category.\n\n430/431 pytest pass (same pre-existing merger reverse classifier).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(v0.8 theme 6 partial + #101): IFRS 9 canonical ECL + SC PDL wate…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-04-21T22:53:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c69e5ad5602350bfc7167a927eda0681367826c5",
          "body": "… routing\n\nShips the biggest v0.8 lift. LBO category 14% -> 77% PASS (44 -> 22 checks\nafter routing unitranche/credit_memo out — they are private-credit refi,\nnot sponsor buyouts). Overall audit 323 -> 354 PASS, fails 9 -> 1.\n\nNew files:\n- modelforge/spec/sponsor_lbo.py: SponsorLBOSpec extends Unitr\n[…]\nPASS, 86 -> 67 PARTIAL, 9 -> 1 FAIL, 5 -> 3 N/A.\nLBO category: 0.14 -> 0.77 (3.4x improvement).\nOverall weighted: 76% -> 83% PASS.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(v0.8 theme 1): Sponsor LBO — new template, 14-story block, audit…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-04-21T22:46:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f612f8681faa907f8389b48554c552a3291e57cd",
          "body": "Extends the finance_core package (started with the Italian tax module)\nwith three additional primitives every template and external consumer\nneeds, so duplication across templates can be phased out incrementally\nwithout a big-bang refactor.\n\nformulas.py — pure-Python time-value + returns + valuation\n[…]\ne — no existing template is mutated. Downstream\ntemplates can migrate at their own pace by importing from\nmodelforge.finance_core.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(finance-core): shared formulas + currency + ID allocator",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-04-21T22:39:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1262272faa798188b82d828786736347f1165199",
          "body": "…/ PEX)\n\nNew modelforge.finance_core package with a template-agnostic Italian\ntax module that ModelForge templates + external consumers (Aither,\nCreditAI) can use to compute regime-correct tax burdens. Previously the\ncompliance sheet only rendered IRES/IRAP rates as static disclosures —\nnothing in t\n[…]\nrcharge + base floor, SIIQ 6-fact eligibility matrix,\nPEX 4-condition test, apply-regime exemptions, rates-snapshot\nimmutability).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(finance-core): Italian corporate-tax module (IRES / IRAP / SIIQ …",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-04-21T22:36:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "16ae7de0cde0d2b94a536ec7cd7658451437076b",
          "body": "3-Stmt gold-standard category: 5.50 -> 10.00 (100% PASS, 20/20 checks).\nAudit overall: 313 -> 323 PASS, fails 17 -> 9.\n\nUS-220 NOL tracker: Italian 5-year + 80% current-year offset schedule.\n  Opening → Generated (if EBT < 0) → Used (MIN of opening × 0.8 cap) →\n  Expired (>5y, placeholder) → Closing\n[…]\nns.\n\nAudit detectors updated #72-76 (previously all hardcoded fail).\n348/349 pytest pass (pre-existing merger reverse classifier).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(v0.8 theme 2): 3-stmt suite — NOL, DTA/DTL, SBC, Minority, Revolver",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-04-21T15:23:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8e09a7af4e36ea853a22aa3485b4253cc7198bbb",
          "body": "Wires three bulge-tier PF parameters from row-only display (v0.7) into\nlive compute. Remaining Theme 4 stories (US-242/243/245/246/248) still\nrow-only — documented for next session.\n\nUS-240 panel_degradation_pct_annual: compounds into revenue formula.\n  Revenue_t = Revenue_{t-1} × (1 + indexation) ×\n[…]\nr).\nAudit unchanged — detectors are label-based, and these rows were\nalready labeled in v0.7; this ships the missing live compute.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(v0.8 theme 4 partial): PF wire degradation, P90, and lock-up",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-04-21T15:08:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d660e17c170a5d89fe7afe08738bb7ca483eb311",
          "body": "…r + PPA\n\nv0.8 Theme 5 stories US-250..253 complete. M&A gold-standard category\ngoes 6.82 -> 91% PASS (10/11, 6 -> 10 passed).\n\nUS-250 cross-over breakeven synergy: reverse-solve additional pre-tax\n  synergy to reach EPS-neutral. MAX of zero and the gap so already-\n  accretive deals cleanly show 0. \n[…]\nverall audit: 310 -> 313 PASS. 348/349 pytest pass (same pre-existing\nmerger reverse classifier failure — unrelated to this work).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(v0.8 theme 5): M&A completion — breakeven + contribution + colla…",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-04-21T15:04:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a04a88e20ef83120ad5cc974f597ac393890039f",
          "body": "v0.8 Theme 3 stories US-230..233 complete. DCF gold-standard category\ngoes 50% -> 72% PASS (9/18 -> 13/18).\n\nUS-230 stub_period_days: first projection period is prorated by\n  stub_days/365 and discounted at the stub midpoint (mid-year) or stub\n  end (end-year). Subsequent periods cumulate stub_years\n[…]\nminals\n\n348/349 pytest pass (1 pre-existing test_reverse merger classifier).\nOverall audit: 304 -> 310 PASS (72% -> 73% weighted).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(v0.8 theme 3): DCF stub + fade + terminal normalization + 2D tables",
          "author_name": "Whatsonyourmind",
          "author_login": "Whatsonyourmind",
          "committed_at": "2026-04-21T14:57:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 5,
      "commits_last_year": 134,
      "latest_release_at": "2026-06-22T15:17:43Z",
      "latest_release_tag": "v0.12.0",
      "releases_from_tags": false,
      "days_since_last_push": 22,
      "active_weeks_last_year": 8,
      "days_since_latest_release": 29,
      "mean_days_between_releases": 9.8
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "modelforge-finance",
          "exists": true,
          "license": "Proprietary",
          "keywords": [],
          "ecosystem": "pypi",
          "matches_repo": null,
          "registry_url": "https://pypi.org/project/modelforge-finance/",
          "is_deprecated": false,
          "latest_version": "0.12.0",
          "repository_url": null,
          "versions_count": 7,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 571,
          "first_published_at": "2026-05-14T13:27:07.438912Z",
          "latest_published_at": "2026-06-22T13:58:25.995337Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 29
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [
          {
            "date": "2026-05-20",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_stars": 1
      },
      "open_issues_and_prs": 2
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": true,
      "has_dockerfile": true,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "web/collab-worker/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 100966,
      "source_files_sampled": 452,
      "oversized_source_files": 3,
      "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": 25,
        "malicious_count": 0,
        "assessed_package": "pypi:modelforge-finance@0.12.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "pydantic",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.6"
        },
        {
          "name": "openpyxl",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.1.2"
        },
        {
          "name": "pyyaml",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=6.0.1"
        },
        {
          "name": "rich",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=13.7"
        },
        {
          "name": "click",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=8.1"
        },
        {
          "name": "formulas",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.2.7"
        },
        {
          "name": "reportlab",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.0"
        },
        {
          "name": "numpy",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.26"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "click",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "formulas",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "numpy",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "openpyxl",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pydantic",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyyaml",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "reportlab",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "rich",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "@cloudflare/kv-asset-handler",
            "direct": false,
            "version": "0.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "@cloudflare/unenv-preset",
            "direct": false,
            "version": "2.16.1",
            "ecosystem": "npm"
          },
          {
            "name": "@cloudflare/workerd-darwin-64",
            "direct": false,
            "version": "1.20260601.1",
            "ecosystem": "npm"
          },
          {
            "name": "@cloudflare/workerd-darwin-arm64",
            "direct": false,
            "version": "1.20260601.1",
            "ecosystem": "npm"
          },
          {
            "name": "@cloudflare/workerd-linux-64",
            "direct": false,
            "version": "1.20260601.1",
            "ecosystem": "npm"
          },
          {
            "name": "@cloudflare/workerd-linux-arm64",
            "direct": false,
            "version": "1.20260601.1",
            "ecosystem": "npm"
          },
          {
            "name": "@cloudflare/workerd-windows-64",
            "direct": false,
            "version": "1.20260601.1",
            "ecosystem": "npm"
          },
          {
            "name": "@cloudflare/workers-types",
            "direct": false,
            "version": "4.20260603.1",
            "ecosystem": "npm"
          },
          {
            "name": "@cspotcode/source-map-support",
            "direct": false,
            "version": "0.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "@emnapi/core",
            "direct": false,
            "version": "1.10.0",
            "ecosystem": "npm"
          },
          {
            "name": "@emnapi/runtime",
            "direct": false,
            "version": "1.10.0",
            "ecosystem": "npm"
          },
          {
            "name": "@emnapi/wasi-threads",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/aix-ppc64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-x64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-arm64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-x64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-arm64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-x64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ia32",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-loong64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-mips64el",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ppc64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-riscv64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-s390x",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-x64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-arm64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-x64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-arm64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-x64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openharmony-arm64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/sunos-x64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-arm64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-ia32",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-x64",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@img/colour",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-darwin-arm64",
            "direct": false,
            "version": "0.34.5",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-darwin-x64",
            "direct": false,
            "version": "0.34.5",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-libvips-darwin-arm64",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-libvips-darwin-x64",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-libvips-linux-arm",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-libvips-linux-arm64",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-libvips-linux-ppc64",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-libvips-linux-riscv64",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-libvips-linux-s390x",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-libvips-linux-x64",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-libvips-linuxmusl-arm64",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-libvips-linuxmusl-x64",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-linux-arm",
            "direct": false,
            "version": "0.34.5",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-linux-arm64",
            "direct": false,
            "version": "0.34.5",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-linux-ppc64",
            "direct": false,
            "version": "0.34.5",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-linux-riscv64",
            "direct": false,
            "version": "0.34.5",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-linux-s390x",
            "direct": false,
            "version": "0.34.5",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-linux-x64",
            "direct": false,
            "version": "0.34.5",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-linuxmusl-arm64",
            "direct": false,
            "version": "0.34.5",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-linuxmusl-x64",
            "direct": false,
            "version": "0.34.5",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-wasm32",
            "direct": false,
            "version": "0.34.5",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-win32-arm64",
            "direct": false,
            "version": "0.34.5",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-win32-ia32",
            "direct": false,
            "version": "0.34.5",
            "ecosystem": "npm"
          },
          {
            "name": "@img/sharp-win32-x64",
            "direct": false,
            "version": "0.34.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/resolve-uri",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/sourcemap-codec",
            "direct": false,
            "version": "1.5.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/trace-mapping",
            "direct": false,
            "version": "0.3.9",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/wasm-runtime",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "@oxc-project/types",
            "direct": false,
            "version": "0.133.0",
            "ecosystem": "npm"
          },
          {
            "name": "@poppinss/colors",
            "direct": false,
            "version": "4.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "@poppinss/dumper",
            "direct": false,
            "version": "0.6.5",
            "ecosystem": "npm"
          },
          {
            "name": "@poppinss/exception",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-android-arm64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-darwin-arm64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-darwin-x64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-freebsd-x64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-arm-gnueabihf",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-arm64-gnu",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-arm64-musl",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-ppc64-gnu",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-s390x-gnu",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-x64-gnu",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-x64-musl",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-openharmony-arm64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-wasm32-wasi",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-win32-arm64-msvc",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-win32-x64-msvc",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/pluginutils",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@sindresorhus/is",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "@speed-highlight/core",
            "direct": false,
            "version": "1.2.15",
            "ecosystem": "npm"
          },
          {
            "name": "@standard-schema/spec",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tybys/wasm-util",
            "direct": false,
            "version": "0.10.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/chai",
            "direct": false,
            "version": "5.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/deep-eql",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/estree",
            "direct": false,
            "version": "1.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/expect",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/mocker",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/pretty-format",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/runner",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/snapshot",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/spy",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/utils",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "assertion-error",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "blake3-wasm",
            "direct": false,
            "version": "2.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "chai",
            "direct": false,
            "version": "6.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "convert-source-map",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cookie",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "detect-libc",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "error-stack-parser-es",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "es-module-lexer",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "esbuild",
            "direct": false,
            "version": "0.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "estree-walker",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "expect-type",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "fdir",
            "direct": false,
            "version": "6.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "fsevents",
            "direct": false,
            "version": "2.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "isomorphic.js",
            "direct": false,
            "version": "0.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "kleur",
            "direct": false,
            "version": "4.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "lib0",
            "direct": false,
            "version": "0.2.117",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-android-arm64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-darwin-arm64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-darwin-x64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-freebsd-x64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-arm-gnueabihf",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-arm64-gnu",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-arm64-musl",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-x64-gnu",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-x64-musl",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-win32-arm64-msvc",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-win32-x64-msvc",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "magic-string",
            "direct": false,
            "version": "0.30.21",
            "ecosystem": "npm"
          },
          {
            "name": "miniflare",
            "direct": false,
            "version": "4.20260601.0",
            "ecosystem": "npm"
          },
          {
            "name": "nanoid",
            "direct": false,
            "version": "3.3.12",
            "ecosystem": "npm"
          },
          {
            "name": "obug",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-to-regexp",
            "direct": false,
            "version": "6.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "pathe",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "picocolors",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "postcss",
            "direct": false,
            "version": "8.5.15",
            "ecosystem": "npm"
          },
          {
            "name": "rolldown",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "semver",
            "direct": false,
            "version": "7.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "sharp",
            "direct": false,
            "version": "0.34.5",
            "ecosystem": "npm"
          },
          {
            "name": "siginfo",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "source-map-js",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "stackback",
            "direct": false,
            "version": "0.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "std-env",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "supports-color",
            "direct": false,
            "version": "10.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "tinybench",
            "direct": false,
            "version": "2.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "tinyexec",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "tinyglobby",
            "direct": false,
            "version": "0.2.17",
            "ecosystem": "npm"
          },
          {
            "name": "tinyrainbow",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "tslib",
            "direct": false,
            "version": "2.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "5.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "undici",
            "direct": false,
            "version": "7.24.8",
            "ecosystem": "npm"
          },
          {
            "name": "unenv",
            "direct": false,
            "version": "2.0.0-rc.24",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "8.0.16",
            "ecosystem": "npm"
          },
          {
            "name": "vitest",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "why-is-node-running",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "workerd",
            "direct": false,
            "version": "1.20260601.1",
            "ecosystem": "npm"
          },
          {
            "name": "wrangler",
            "direct": false,
            "version": "4.97.0",
            "ecosystem": "npm"
          },
          {
            "name": "ws",
            "direct": false,
            "version": "8.20.1",
            "ecosystem": "npm"
          },
          {
            "name": "y-protocols",
            "direct": false,
            "version": "1.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "yjs",
            "direct": false,
            "version": "13.6.31",
            "ecosystem": "npm"
          },
          {
            "name": "youch",
            "direct": false,
            "version": "4.1.0-beta.10",
            "ecosystem": "npm"
          },
          {
            "name": "youch-core",
            "direct": false,
            "version": "0.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "anthropic",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "fastapi",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "kiwisolver",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "mcp",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pandas",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pdf2image",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pdfplumber",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pillow",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pypdf",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pytesseract",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pytest",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "python-docx",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "python-multipart",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "python-pptx",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "requests",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "ruff",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "setuptools",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "uvicorn",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 190,
        "direct_count": 8,
        "indirect_count": 182
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 2,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "Whatsonyourmind",
          "commits": 132,
          "avatar_url": "https://avatars.githubusercontent.com/u/248369826?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.985
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "deploy.yml",
        "publish.yml",
        "security.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 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": 9,
            "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": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 4,
            "reason": "2 out of the last 5 releases have a total of 4 signed artifacts.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 9,
            "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": 0,
            "reason": "10 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "a029c9586965d3728f36778d58851b1f60f8358c",
        "ran_at": "2026-07-22T05:14:14Z",
        "aggregate_score": 4.4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-20T08:41:45Z",
      "oldest_open_prs": [
        {
          "number": 1,
          "created_at": "2026-06-20T12:08:31Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2,
          "created_at": "2026-06-22T13:56:00Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/Whatsonyourmind/modelforge",
    "host": "github.com",
    "name": "modelforge",
    "owner": "Whatsonyourmind"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 53,
      "inputs": {
        "security": 55,
        "vitality": 75,
        "community": 27,
        "governance": 34,
        "engineering": 72
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 75,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 62,
            "inputs": {
              "commits_last_year": 134,
              "human_commit_share": 1,
              "days_since_last_push": 22,
              "active_weeks_last_year": 8
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 22 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 22
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "8/52 weeks with commits",
                "points": 5.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "134 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 134
                    }
                  }
                ],
                "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": null,
            "notes": [],
            "value": 94,
            "inputs": {
              "releases_count": 5,
              "latest_release_tag": "v0.12.0",
              "releases_from_tags": false,
              "days_since_latest_release": 29,
              "mean_days_between_releases": 9.8
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "5 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 29 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 29
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~9.8 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 9.8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "2 out of the last 5 releases have a total of 4 signed artifacts.",
                "points": 4,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 27,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "at_risk",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 44,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file present, not a recognized license",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "license_custom",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "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": [
                "modelforge-finance"
              ],
              "dependents": null,
              "ecosystems": "pypi",
              "total_downloads": null,
              "monthly_downloads": 571
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "571 downloads/month across pypi",
                "points": 36.8,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 571,
                      "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": "at_risk",
        "name": "Sustainability & Governance",
        "value": 34,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 15,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.985
            },
            "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 98% of commits",
                "points": 0.3,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 98
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "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": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 36,
            "inputs": {
              "followers": 12,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "Whatsonyourmind",
              "public_repos": 20,
              "account_age_days": 226
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "12 followers of Whatsonyourmind",
                "points": 8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 12,
                      "login": "Whatsonyourmind"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "20 public repos, account ~0 yr old",
                "points": 10.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 20
                    }
                  },
                  {
                    "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": [
                "modelforge-finance"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 29
            },
            "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 29 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 29
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "7 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "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": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": [
                "credit-risk",
                "excel",
                "financial-modeling",
                "llm-tools",
                "mcp",
                "openpyxl",
                "ai-agents",
                "audit-trail",
                "data-lineage",
                "dcf",
                "lbo",
                "mcp-server",
                "valuation",
                "yaml-to-excel"
              ],
              "has_wiki": false,
              "homepage": "https://pypi.org/project/modelforge-finance/",
              "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://pypi.org/project/modelforge-finance/",
                "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": "14 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "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": 55,
        "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. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 44,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.4
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no 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.2,
                "status": "partial",
                "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 detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "2 out of the last 5 releases have a total of 4 signed artifacts.",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "10 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "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:modelforge-finance@0.12.0 runtime dependency closure — what installing the published package pulls in — 25 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:modelforge-finance@0.12.0",
                  "assessed": 25
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 25,
              "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": 25,
              "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": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 59,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "moderate",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "has_llms_txt": true,
              "legible_history_share": 1,
              "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": "llms.txt present",
                "points": 15,
                "status": "met",
                "details": [
                  {
                    "code": "llms_txt_present",
                    "params": {}
                  }
                ],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 53,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "web/collab-worker/tsconfig.json"
              ],
              "agent_commit_share": 0.68,
              "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": "web/collab-worker/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "web/collab-worker/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "68 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 68,
                      "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": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 100966,
              "source_files_sampled": 452,
              "oversized_source_files": 3
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python with type-check config (web/collab-worker/tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "web/collab-worker/tsconfig.json",
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "3/452 source files over 60KB",
                "points": 54.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 452,
                      "oversized": 3
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "moderate",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": true,
              "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": 20,
                "status": "met",
                "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": [],
  "report_type": "repository",
  "generated_at": "2026-07-22T05:14:19.660775Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/w/Whatsonyourmind/modelforge.svg",
  "full_name": "Whatsonyourmind/modelforge",
  "license_state": "custom",
  "license_spdx": null
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.26.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计PyPI.