公开记录
软件健康报告模式 0.23.0 · 指标 1.13.0 · 2026-07-21 15:50 UTC

invergent-ai / surogate

Training/Fine-tuning at the speed of light

C++ · Python · CudaApache-2.0★ 806 星标⑂ 6 复刻增长异常始于 2026年1月在 GitHub 上查看 ↗

invergent-ai/surogate 的健康指数为 100 分中的 60 分,处于「中等」区间。 其得分最高的类别是Vitality(85/100),最低的是Community & Adoption(31/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

60
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

Invergent组织
15 关注者20 个公开仓库始于 2025年9月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
npmjackalope00

按类别列示的指标

活力

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

85优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
18/36提交节奏 — 52 周中有 26 周有提交
18/18提交量 — 最近一年 1,303 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year1,303
human_commit_share1
days_since_last_push0
active_weeks_last_year26

发布纪律

90优秀
评分方式
27/27有发布版本 — 已发布 47 个发布版本
36/36发布时效 — 最近一次发布版本于 0 天前
27/27发布节奏 — 约每 9.3 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count47
latest_release_tagv1.2.8
releases_from_tags
days_since_latest_release0
mean_days_between_releases9.3

社区与采用

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

31存在风险 · 占总体的 18%

流行度与采用

34存在风险
评分方式
28.3/60星标 — 806 个星标,因非自然增长而折减:自 2026-06-03 → 2026-06-04 起 2 天内新增 617 个星标,为该仓库自身日常基线的 322 倍
3.5/25复刻 — 6 个复刻,因非自然增长而折减:自 2026-06-03 → 2026-06-04 起 2 天内新增 617 个星标,为该仓库自身日常基线的 322 倍
1.7/15关注者 — 3 位关注者
所用输入
forks6
stars806
watchers3
growth_stateanomalous
growth_signalsacquisition_burst, star_concentration, missing_decay
growth_windows2026-06-03/2026-06-04
growth_peak_days2
growth_factor_pct60
growth_peak_stars617
growth_peak_window2026-06-03 → 2026-06-04
growth_peak_multiple322
growth_top_days_share0.825
growth_baseline_per_day1
growth_history_complete
非自然增长政策将星标与复刻组成部分折减 40%。该发现描述的是公开星标与复刻事件的发生时间;它不证明关注是被购买的,也不证明维护者曾参与其中。

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(Apache-2.0)
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
评分方式
0/80月度下载量 — npm 合计每月 0 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packagesjackalope
dependents
ecosystemsnpm
total_downloads
monthly_downloads0
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

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

52中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0.6/22.5提交分布 — 头号贡献者编写了 97% 的提交
4.1/13.5贡献者广度 — 3 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 3 contributing companies or organizations -- score normalized to 10
所用输入
bus_factor1
contributors_sampled3
top_contributor_share0.974
评分方式
36.4/46.8议题解决 — 78% 的议题已关闭
34.9/38.3PR 接受 — 已裁定的 PR 中 31/34 已合并
0/15OpenSSF Scorecard:Code-Review — Found 1/11 approved changesets -- score normalized to 0
所用输入
merged_prs31
open_issues6
closed_issues21
issue_closed_ratio0.778
closed_unmerged_prs3
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
8.7/25所有者影响力 — invergent-ai 有 15 位关注者
11.3/25既往记录 — 20 个公开仓库,账户约 0 年
所用输入
followers15
owner_typeOrganization
is_verified
owner_logininvergent-ai
public_repos20
account_age_days306
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
0/35发布时效 — 无数据
4/20版本历史 — 0 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesjackalope
ecosystemsnpm
any_deprecated
min_days_since_publish
已排除计分(无数据或不适用):发布时效。 其余权重已重新归一化。

工程质量

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

84良好 · 占总体的 20%

工程实践

74良好
评分方式
24/24CI 工作流 — 4 个工作流
24/24存在测试
16/16Linter 配置
9.6/9.6Pre-commit 钩子
0/6.4.editorconfig
0/20OpenSSF Scorecard:CI-Tests — 0 out of 8 merged PRs checked by a CI test -- score normalized to 0
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

100优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://surogate.ai
10/10仓库描述
10/10主题标签 — 10 个主题标签
10/10Wiki
所用输入
topicscuda, deep-learning, fine-tuning, generative-ai, llama, llm, llms, nvidia-gpu, qwen, sft
has_wiki
homepagehttps://surogate.ai
has_readme
has_docs_dir
has_description

安全

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

40存在风险 · 占总体的 16%

安全态势

40存在风险
评分方式
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 out of 8 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 1/11 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 3 contributing companies or organizations -- score normalized to 10
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.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
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6.8/7.5Vulnerabilities — 1 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate4

AI 就绪度

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

65中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 92 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.92
agent_instruction_files
agent_instruction_max_bytes
评分方式
18/18一条命令的引导启动 — Makefile
22/22自动化测试
11/11Lint / 格式化配置
11/11静态类型检查 — jackalope/tsconfig.json
10/10可复现环境 — Dockerfile, lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 61 次由代理编写或署名代理
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_filesMakefile
has_devcontainer
has_linter_config
typecheck_configsjackalope/tsconfig.json
agent_commit_share0.61
toolchain_manifests
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — C++(静态类型)
52.4/55可控的文件大小 — 采样的 723 个源文件中有 34 个超过 60KB
所用输入
primary_languageC++
largest_source_bytes324,304
source_files_sampled723
oversized_source_files34

机器可读接口

40存在风险
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — examples, recipes
所用输入
example_dirsexamples, recipes
has_mcp_signal
api_schema_files

关键数据

806GitHub 星标
3贡献者
1,303最近 12 个月提交数
0距最近推送天数
47发布版本数
1巴士系数(bus factor)
6开放议题
npm, PyPI软件包生态系统数

数据采集警告

  • Could not fetch pypi package 'surogate' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

更多细节

Star 与 Fork 历史 806 ★ / 6 ⇿
806Star
6Fork
44发布

每颗 star 和每个 fork 的添加时间,来自 GitHub 并按天汇总。累计增长位于其构成来源——每日新增——的正上方,二者可相互对照:稳定的自然增长与短暂的突增形态截然不同。当这一差别可被衡量时,它会作为增长真实性予以报告。

阴影区域标示出非自然增长政策已确认的爆发。 了解增长真实性的评估方式

02004006008001,00080463222026-012026-042026-07
主版本 0次版本 5修订 39
OpenSSF Scorecard 4.0 / 10
4.0综合

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 8 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 1/11 approved changesets -- score normalized to 0
10Contributorsproject has 3 contributing companies or organizations -- score normalized to 10
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
9Vulnerabilities1 existing vulnerabilities detected
直接依赖 29
注册表软件包版本约束清单文件
npm@inkjs/ui^2.0.0jackalope/package.json
npm@logdna/tail-file^4.0.2jackalope/package.json
npm@resvg/resvg-js^2.6.2jackalope/package.json
npmecharts^6.1.0jackalope/package.json
npmink^7.0.6jackalope/package.json
npmreact^19.2.0jackalope/package.json
npmsixel^0.16.0jackalope/package.json
npmterminal-image^4.3.0jackalope/package.json
npmyaml^2.9.0jackalope/package.json
PyPItransformers>=5.5.0pyproject.toml
PyPIhuggingface-hub>=1.4.1pyproject.toml
PyPIhf-transfer>=0.1.9pyproject.toml
PyPIdatasets>=4.3.0pyproject.toml
PyPIaddictpyproject.toml
PyPIpeftpyproject.toml
PyPIjson_repairpyproject.toml
PyPIunique-namerpyproject.toml
PyPInanobindpyproject.toml
PyPIbinpackingpyproject.toml
PyPIrich>=13.0.0pyproject.toml
PyPIpsutilpyproject.toml
PyPImatplotlibpyproject.toml
PyPIqwen-vl-utils==0.0.14pyproject.toml
PyPIray>=2.5.0pyproject.toml
PyPIverifiers==0.1.11pyproject.toml
PyPIwandb==0.25.1pyproject.toml
PyPIjaxtypingpyproject.toml
PyPIaiolimiterpyproject.toml
PyPIopenai==2.32.0pyproject.toml
全部依赖 未采集

本报告未能采集到解析后的依赖集合:GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "cuda",
        "deep-learning",
        "fine-tuning",
        "generative-ai",
        "llama",
        "llm",
        "llms",
        "nvidia-gpu",
        "qwen",
        "sft"
      ],
      "is_fork": false,
      "size_kb": 73036,
      "has_wiki": true,
      "homepage": "https://surogate.ai",
      "languages": {
        "C": 992,
        "C++": 6743539,
        "Cuda": 1817229,
        "CMake": 29813,
        "Shell": 17052,
        "Python": 2873433,
        "Makefile": 9472,
        "JavaScript": 5651,
        "TypeScript": 421984
      },
      "pushed_at": "2026-07-21T13:05:10Z",
      "created_at": "2026-01-02T06:32:04Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-21T15:40:48Z",
      "description": "Training/Fine-tuning at the speed of light",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "C++",
      "significant_languages": [
        "C++",
        "Python",
        "Cuda"
      ]
    },
    "owner": {
      "blog": "https://invergent.ai",
      "name": "Invergent",
      "type": "Organization",
      "login": "invergent-ai",
      "company": null,
      "location": "Romania",
      "followers": 15,
      "avatar_url": "https://avatars.githubusercontent.com/u/233052289?v=4",
      "created_at": "2025-09-18T10:04:34Z",
      "is_verified": null,
      "public_repos": 20,
      "account_age_days": 306
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.2.8",
          "kind": "patch",
          "published_at": "2026-07-21T08:55:53Z"
        },
        {
          "tag": "v1.2.6",
          "kind": "patch",
          "published_at": "2026-05-20T06:10:08Z"
        },
        {
          "tag": "v1.2.5",
          "kind": "patch",
          "published_at": "2026-05-19T14:16:31Z"
        },
        {
          "tag": "v1.2.4",
          "kind": "patch",
          "published_at": "2026-05-10T11:33:31Z"
        },
        {
          "tag": "v1.2.3",
          "kind": "patch",
          "published_at": "2026-05-06T06:15:39Z"
        },
        {
          "tag": "v1.2.2",
          "kind": "patch",
          "published_at": "2026-05-04T17:19:53Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2026-04-30T16:45:44Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-04-30T05:00:53Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-04-29T13:10:12Z"
        },
        {
          "tag": "v1.0.9",
          "kind": "patch",
          "published_at": "2026-04-28T14:59:27Z"
        },
        {
          "tag": "v1.0.8",
          "kind": "patch",
          "published_at": "2026-04-28T11:09:59Z"
        },
        {
          "tag": "v1.0.7",
          "kind": "patch",
          "published_at": "2026-04-28T10:40:52Z"
        },
        {
          "tag": "v1.0.6",
          "kind": "patch",
          "published_at": "2026-04-28T09:20:57Z"
        },
        {
          "tag": "v1.0.5",
          "kind": "patch",
          "published_at": "2026-04-28T07:41:35Z"
        },
        {
          "tag": "v1.0.4",
          "kind": "patch",
          "published_at": "2026-04-26T19:51:02Z"
        },
        {
          "tag": "v1.0.3",
          "kind": "patch",
          "published_at": "2026-04-26T18:51:44Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2026-04-25T04:23:08Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-04-24T12:07:06Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-04-03T17:14:50Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-04-03T14:49:05Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-04-03T13:45:11Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-04-03T10:57:56Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-04-03T04:43:06Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-03-26T16:24:59Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-03-26T14:00:39Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-05-10T11:38:54Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-02-26T04:22:53Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-02-25T10:20:06Z"
        },
        {
          "tag": "v0.1.10",
          "kind": "patch",
          "published_at": "2026-02-25T06:47:26Z"
        },
        {
          "tag": "v0.1.9",
          "kind": "patch",
          "published_at": "2026-02-23T20:16:28Z"
        },
        {
          "tag": "v0.1.8",
          "kind": "patch",
          "published_at": "2026-02-19T16:01:57Z"
        },
        {
          "tag": "v0.1.7",
          "kind": "patch",
          "published_at": "2026-02-19T09:46:15Z"
        },
        {
          "tag": "v0.1.6",
          "kind": "patch",
          "published_at": "2026-02-18T15:59:36Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2026-02-18T14:13:23Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-02-18T13:14:18Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-02-18T05:15:11Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-02-16T08:09:07Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-02-15T04:57:25Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-02-14T09:52:10Z"
        },
        {
          "tag": "v0.0.9",
          "kind": "patch",
          "published_at": "2026-02-13T09:32:44Z"
        },
        {
          "tag": "v0.0.7",
          "kind": "patch",
          "published_at": "2026-01-27T15:12:58Z"
        },
        {
          "tag": "v0.0.6",
          "kind": "patch",
          "published_at": "2026-01-16T14:17:50Z"
        },
        {
          "tag": "v0.0.5",
          "kind": "patch",
          "published_at": "2026-01-16T09:50:46Z"
        },
        {
          "tag": "v0.0.4",
          "kind": "patch",
          "published_at": "2026-01-10T10:51:07Z"
        },
        {
          "tag": "v0.0.3",
          "kind": "patch",
          "published_at": "2026-01-09T07:32:47Z"
        },
        {
          "tag": "v0.0.2",
          "kind": "patch",
          "published_at": "2026-01-04T18:05:51Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2026-01-03T08:08:31Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "d1bfe628b488cefad5d8328873db2f50110363d4",
          "body": "* feat(dpo): dpo_dloss CUDA kernel + parity test\n\nOne block per (chosen, rejected) pair: reduce per-sample response-token logprob\nsums (policy & reference), compute -log sigmoid(beta*margin), scatter per-token\ncustom_dloss in GRPO's shifted layout. Knobs: beta, length_norm. metrics[4] =\n{loss_sum, c\n[…]\n: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n* feat(dpo): harden trainer workflows and adapter compatibility\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dpo): add native offline DPO trainer (#61)",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-21T13:03:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "04ca6a779fd8a2c4eba36355d344e62f5012cd01",
          "body": null,
          "is_bot": false,
          "headline": "clarify tokenizer transplant",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-21T10:03:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f47abcfaa3d8ebf4b2c83686e00dcf9ad84f51fb",
          "body": "fix(grpo): reap orphaned vLLM subprocesses on split-mode shutdown",
          "is_bot": false,
          "headline": "Merge pull request #59 from invergent-ai/fix/grpo-vllm-subprocess-reap",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-21T07:59:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "286c00af27df385fad0c0efe5ba54431d1b09bcc",
          "body": null,
          "is_bot": false,
          "headline": "fix installer",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-21T07:56:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "845f84aa76391bf289849159cd5f9ab7231949f3",
          "body": "feat: knowledge distillation (offline top-K logit KD + cross-tokenizer transplant)",
          "is_bot": false,
          "headline": "Merge pull request #60 from invergent-ai/feat/knowledge-distillation",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-21T07:54:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a425fc8b99b22af4ea1a612fbae67fcc511f468",
          "body": "…r transplant)\n\nNative KD training path: fused top-K teacher KL inside the LM-head CE backward\n(fused + chunked CUDA kernels), step_with_kd/get_kd_loss, .kd sidecar format\nwith native DataLoader support, distillation: config block, kd_loss metrics.\n\nTeacher capture (surogate distill-capture): local \n[…]\nfling on restore.\n\nValidated by 75 CPU tests, GPU identity/parity/descent tests, and an\nadversarial multi-agent review (12 findings, all fixed).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: knowledge distillation (offline top-K logit KD + cross-tokenize…",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-21T07:54:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a295c6935d2c0aa347ceb0b16f53a0d746a53844",
          "body": null,
          "is_bot": false,
          "headline": "remove obsolete files",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-21T04:11:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a286fe8b97bf163a863bb5f8bef3ebbfa78cfb17",
          "body": "- restrict PR_SET_CHILD_SUBREAPER to linux (ctypes.CDLL(None) raises on\n  Windows) and declare prctl argtypes/restype so ctypes doesn't pass 32-bit\n  c_int where an unsigned long is expected (undefined on LP64 arches).\n- fall back to os.kill(pid) when killpg raises ProcessLookupError, in case\n  teardown races the child's setsid() before its process group exists.\n- skip the linux-only reap tests on non-linux platforms.",
          "is_bot": false,
          "headline": "fix(grpo): guard subreaper to linux and harden vLLM signaling",
          "author_name": "Monica Girbea",
          "author_login": null,
          "committed_at": "2026-07-07T08:54:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "776985a3e86bf2c3ff93c908de5ac2e24ee556d7",
          "body": "A split-mode GRPO run could finish training successfully yet leave vLLM\nmultiprocessing/EngineCore workers alive: a spawn worker reparents to PID 1\nwhen its parent exits mid-run and sits outside the vLLM session group, so\nneither killpg on that group nor a teardown-time child-tree walk reaches it.\nT\n[…]\nurvivor and reaps it by\nPID. killpg stays as the graceful first pass so each vLLM session releases its\nGPU cleanly; the reap is the safety net. Best-effort prctl: logs and continues\nwhere unavailable.",
          "is_bot": false,
          "headline": "fix(grpo): reap orphaned vLLM subprocesses on split-mode shutdown",
          "author_name": "Monica Girbea",
          "author_login": null,
          "committed_at": "2026-07-07T08:12:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "382b7850bde5e50ce914dadca5a7c05b8c11e44c",
          "body": null,
          "is_bot": false,
          "headline": "docs(grpo): spec for reaping orphaned vLLM subprocesses on shutdown",
          "author_name": "Monica Girbea",
          "author_login": null,
          "committed_at": "2026-07-07T07:21:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b97f08f7558a771f6befc548c2fe4b6ce117d154",
          "body": "fix(framework): GDR autotuned-grid corruption + 4 training fixes",
          "is_bot": false,
          "headline": "Merge pull request #58 from invergent-ai/fix/framework-fixes",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-02T05:06:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b451e238f9d1e8921e459f7fee8d432657ae333",
          "body": "fix(qwen3.5-moe): train under fp8-hybrid + stop debuginfod trace hangs",
          "is_bot": false,
          "headline": "Merge pull request #57 from invergent-ai/fix/qwen35-moe-fp8-hybrid",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-02T05:05:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc60b3bcb5bd331f09cd82ce9c0c661612c2b52a",
          "body": "…hardcoded tiles\n\nThe gated-delta-rule dispatch hardcoded tile sizes for grid math (fwd_o BV=64,\nfwd_h/bwd_dhu BV=32, bwd_dqkwg BK=64) while the AOT autotuner bakes whichever\ntiling wins benchmarking into the cubin. At H=32 (Qwen3.5-4B, ratio-2 GQA\nlinear attention) fwd_o autotunes to BV=32: the ker\n[…]\nanged\n(4 pass + 1 pre-existing marginal tolerance miss on lin_norm_weight).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n(cherry picked from commit 63d4c164ef91762b3ee8077043dba7d91f193490)",
          "is_bot": false,
          "headline": "fix(gdr): derive launch grids from autotuned manifest constants, not …",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-02T04:52:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8c11722e389e2f017cf214c2309364fd0ca60f8f",
          "body": "(cherry picked from commit 87b784ef8c717e78cd376e5fd24caa7b29cce3f4)",
          "is_bot": false,
          "headline": "surogate: fix fused mlp growth mask",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-02T04:52:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7502e2f1a05ac37025f0f0dc2e398bbf182a760e",
          "body": "(cherry picked from commit 55ff4e83f86dd8b60e92b93a36f71f40ce881d63)",
          "is_bot": false,
          "headline": "surogate: add runtime gradient mask guard",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-02T04:52:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81c71faf9b630febe60ecd9b1ae45e4b47a6c4f3",
          "body": "CMAKE_ARGS is forwarded to scikit-build-core's CMake *configure* step,\nwhich rejects '--parallel N'. Move build parallelism to the standard\nCMAKE_BUILD_PARALLEL_LEVEL env var so 'make wheel-cuXXX' configures and\nbuilds cleanly. 'make build' was unaffected (uses cmake --build directly).\n\n(cherry picked from commit 2fe1c2bfef64dd87ae8e2475f7f5457a42efa360)",
          "is_bot": false,
          "headline": "fix(build): wheel target passed --parallel to cmake configure",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-02T04:52:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfd60620fa81d7b03c5bc6ea4f5e347d6bf8873f",
          "body": "(cherry picked from commit f1a62366b5db0a2e2e7ce71d81276a7c79f73faf)",
          "is_bot": false,
          "headline": "fix: thinking mode tokenization",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-02T04:52:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e650444ef94d05a19ef5a96500f1f5a15252983f",
          "body": "libdw — used by the backward stack-trace printer (capture_stacktrace/\nprint_stacktrace) and our dwfl resolver — blocks on network fetches from\nDEBUGINFOD_URLS while resolving each frame. On a slow/unreachable server this\nturns *any* C++ exception's stack-trace capture into a multi-minute hang\n(~1s p\n[…]\ns at module import,\nbefore any trace) so traces resolve from local symbols instantly. Opt back in\nwith SUROGATE_KEEP_DEBUGINFOD=1.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(crash-handler): disable debuginfod to stop multi-minute trace hangs",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-06-29T09:42:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "15606ded45058b8542b7c35d8d4e607f88f2e50a",
          "body": "…erts)\n\nFirst model combining a shared expert with FP8; a chain of never-exercised-path\nbugs blocked training under recipe=fp8-hybrid.\n\n- weight load: Qwen3.6 ships experts pre-stacked & gate/up-fused\n  (experts.gate_up_proj [E,2M,C], experts.down_proj [E,C,M]); the mapping used\n  per-expert stack_e\n[…]\nmple: offload_residual=true so activation memory is depth-independent\n  (the 35B-A3B OOM'd on a late-layer backward saved-tensor).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(qwen3.5-moe): train under fp8-hybrid (shared expert + batched exp…",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-06-29T09:42:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2b21eb009510a850f8b9faf55ec1a68a328a6780",
          "body": "…phase0\n\nMerge pull request #55 from invergent-ai/main",
          "is_bot": false,
          "headline": "Merge pull request #56 from invergent-ai/feature/dispatch-pp-planner-…",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-06-27T05:00:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ede38433c05a0865976876cd269c3c13a9c2a6f4",
          "body": "Merge pull request #54 from invergent-ai/feature/dispatch-pp-planner-…",
          "is_bot": false,
          "headline": "Merge pull request #55 from invergent-ai/main",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-06-27T05:00:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a04e61e36791b170c61b5cacc7575cf3dd72f5d1",
          "body": "…phase0\n\nDispatch Pipeline Parallelism (dispatch-PP): train models too large for one GPU on PCIe-only boxes",
          "is_bot": false,
          "headline": "Merge pull request #54 from invergent-ai/feature/dispatch-pp-planner-…",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-06-22T13:26:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b1164c91785deb3c2afc402387172058b3c0e8e",
          "body": "New guide docs/guides/dispatch-pp.md documenting the model-parallel mode for training models whose\nbase weights do not fit on a single GPU, on PCIe-only boxes (no NVLink/P2P): round-robin stages,\nper-stage weight streaming from pinned CPU (offload_master), host-staged boundaries, the FP8 weight\nstre\n[…]\n-PP) Options\"\nsection to the config reference (parallelism / offload_master / recipe + the microbatch math and\nSUROGATE_DISPATCH_STAGE_BLOCKS).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add Dispatch Pipeline Parallelism (dispatch-PP) guide",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T13:23:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1c2d4d38b60feb9ee2b146087c628d0613d62638",
          "body": "…udaMalloc/cudaFree)\n\napply_named_inject cudaMalloc-ed a device buffer per injected boundary tensor and\nclear_inject_named cudaFree-d it, once per dispatch stage -> ~hundreds of cudaMalloc/cudaFree\nper step, each a device-wide sync that serialized the pipeline. Boundary tensors are all\n[B,T,H] bf16 \n[…]\n~3380 -> ~3270 ms (~3-4%), loss parity (4.72->3.57).\nFirst of the boundary-handoff optimizations; pinned host buffers + async overlap are next.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(dispatch-pp): pool the cross-stage inject buffers (no per-call c…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T11:42:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e1be37dbfa6641b11c7f94c43fffc5e08045f647",
          "body": "The cost-based planner (train/dispatch_pp: planner.py / profile.py / types.py) was never wired\ninto the live path -- _dispatch_pp_plan emits uniform aligned stages sized by\nSUROGATE_DISPATCH_STAGE_BLOCKS, and nothing imports the package except its own unit tests.\n\nMeasured whether wiring it would pa\n[…]\ntep) are untouched -- they exercise the C++ binding\ndirectly, not this package. (If a cost planner is ever wanted, it is recoverable from git.)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(dispatch-pp): remove the unused cost-based stage planner",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T11:00:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2de705cee56ec82c50c8ebeb4c81a64155547d75",
          "body": "min_stages / upper_threshold / vram_budget_gb / recompute_grain were inputs for the cost-based\nstage planner (train/dispatch_pp/planner.py), which is not wired: the live planner emits uniform\naligned stages sized by SUROGATE_DISPATCH_STAGE_BLOCKS. The validator only setdefaulted these\ninto a dict th\n[…]\nig) for\nwhen it is wired (roadmap). Verified: clean config trains with loss parity; a config still\ncarrying the sub-block warns and ignores it.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(dispatch-pp): drop the vestigial dispatch_pp sub-block params",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T10:42:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e51bf084061c405d0a0ba2fc516cf5cd2f1fcd76",
          "body": "…gradient_accumulation_steps)\n\nThe chunks env predated grad-accum folding: back when dispatch ignored GA, it was the only way\nto raise the microbatch count M. Now that GA folds in, chunks and GA are identical multipliers\n(M = gpus*chunks*GA), so keeping both is redundant and a footgun (setting both \n[…]\nGA only.\n\nVerified: 0.8B dispatch + fp8, GA=4 with the old env set -> warns, ignores the env, M = gpus*GA\n= 8 (unchanged training vs the fold).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(dispatch-pp): drop SUROGATE_DISPATCH_MICROBATCH_CHUNKS (use …",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T10:31:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6d61d9ff887a70f2de356f2b98a1416ddf91e462",
          "body": "…icrobatch count)\n\ndispatch-PP ignored gradient_accumulation_steps: the fused step ran M = gpus*chunks\nmicrobatches into one optimizer step and GA only mis-sized the epoch guard. Fold GA into the\nmicrobatch count for LoRA: M = gpus * SUROGATE_DISPATCH_MICROBATCH_CHUNKS * GA, all accumulated\ninto one\n[…]\nks*GA = 8, effective batch 8\";\ntrains smoothly (lower-variance loss/norm), tps up vs M=2 as the weight stream amortizes over\nmore microbatches.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): honor gradient_accumulation_steps (fold into the m…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T10:26:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f7a44508832984b20da5edfa9cc877ac3f22810b",
          "body": "The 27B dispatch-PP step is transfer-bound: each stage streams its frozen base weights from\npinned host over PCIe. Store + stream the frozen matmul block weights as FP8-E4M3 instead of\nBF16 -> half the bytes on the wire (and half the pin RAM), fed straight to the FP8 GEMM.\n\nHow:\n- At load (finalize_\n[…]\n8 noise.\n- 27B 4-GPU gated-delta LoRA: ~3.33s/step vs ~4.8s BF16 dispatch (~1.45x), loss parity\n  (4.72->3.57), sensible norms, no OOM, no NaN.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): FP8 weight streaming (half the PCIe bytes per stage)",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T10:05:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0faf63d365c1cd0ebb026375967a501549d151da",
          "body": "Lift the BF16-only guard for dispatch_pp to also accept recipe=fp8_hybrid (NVFP4 stays\ndeferred). With this, the streamed (still BF16) stage weights are quantized to FP8 on the\ndevice per call and fed to the FP8 GEMM -- FP8 compute, but the PCIe transfer is still BF16.\nThis is the foundation for FP8\n[…]\nmpute-bound shapes.\n\nVerified: 0.8B dispatch LoRA + fp8_hybrid runs with loss/norm parity vs the BF16 recipe\n(1.36/1.09/1.50/2.12, norm ~4-10).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): allow the fp8_hybrid recipe under dispatch-PP",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T08:18:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7f946cba915655ccf7ec3597d4146002882e6dd7",
          "body": "The multi-GPU dispatch backward skips reduce_loss (the DP all-reduce would deadlock waiting\non idle GPUs), so ValidTokenCount was never populated and both the displayed loss and the\noptimizer grad-norm fell back to total-token (B*T*GradAccumSteps*world_size, incl padding)\nnormalization. On padded da\n[…]\neference (~1.0-2.0 / ~5-10); 27B 4-GPU gated-delta LoRA converges (loss 4.7->3.6) with sensible\nnorms (~5-16), no OOM, no step-time regression.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(dispatch-pp): valid-token normalization for the loss + grad norm",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T08:03:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a1b06b581ce05a5d5023c863af16dc6d23e69603",
          "body": "This reverts commit 4b749c8fd89a1c133fa3800c20bdd04e009e463e.",
          "is_bot": false,
          "headline": "Revert \"feat(dispatch-pp): show the real grad norm in the loss display\"",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T07:43:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b749c8fd89a1c133fa3800c20bdd04e009e463e",
          "body": "The dispatch-PP step hardcoded norm=0.0 in the display, even though the optimizer already\ncomputes the gradient norm for clipping. Surface it: dispatch_pp_apply_optimizer now returns\nget_norm() (the same value the non-dispatch path shows), the multi-GPU trainer stashes it\n(mDispatchPpLastGradNorm) d\n[…]\ncolumn now reports real values (~1.5e3), loss parity unchanged.\nThe extra cost is one device->host read of an already-computed scalar per step.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): show the real grad norm in the loss display",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T07:36:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8654218149fd64f9c34eaf92b8609f72fae308ea",
          "body": "…uire (+ pool foundation)\n\nMigrate every get-or-create of a persistent saved tensor (make_persistent_tensor chokepoint\nused by ~12 ops, the executor SaveForBwd persist paths, mamba, moe_permute) to\nSavedTensorCache::acquire(). allocate_moe_saved now returns null-on-arena-miss so the cache\nowns the f\n[…]\nupts the backward), and the win is marginal on the\ntransfer-bound 27B anyway. Documented in reset_saved_cache + the design doc for future work.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(executor): route saved tensors through SavedTensorCache::acq…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T07:30:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "08680dce145cdcfa46a50981ad58096290a02d73",
          "body": "…FwdStack + SaveForBwd)\n\nrecompute:false sizes the per-layer activation arenas for the WHOLE model (FwdStack ~19GB,\nSaveForBwd ~16GB at seq 1024 on the 27B) -> OOM. But dispatch runs the backward one stage at\na time per GPU (sequential on a GPU; concurrent stages are on separate GPUs/arenas), so onl\n[…]\ncache, now\nSavedTensorCache) made dispatch-aware -- see 2026-06-22-dispatch-pp-recompute-false.md; the\nexample stays recompute:true until then.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): cyclic activation sectioning for recompute:false (…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T06:44:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1afe4cee3531f4e8eda91a33a4b4d6f27af1b8bd",
          "body": "…d tensors\n\nThe persistent saved-tensor buffers (gated-delta recurrent states, rope/qk-norm caches,\nMoE expert bookkeeping, and the SaveForBwd persist fallback) lived as three loose maps\n(mMoeSavedBuffers/Sizes/ArenaBacked) + a bump offset, mutated directly by ~18 call sites\neach with its own cudaMa\n[…]\n Qwen3.5-0.8B (recompute on/off) and Qwen3.6-27B (recompute\non), dispatch-PP. Sets up the recompute:false per-stage cache reset as a one-liner.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(executor): SavedTensorCache -- one owner for persistent save…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T06:43:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8988d574bcb505469dfa52c84bf307d945b21ccc",
          "body": "…> ~3x faster load\n\nStartup was ~130-156s because each of the N per-GPU weight managers pins its OWN copy of\nthe frozen base in host memory: N x cudaHostAlloc of the full 52GB model (~208GB pinned at\nN=4, serialized on the kernel page-lock path). The base is read-only (LoRA), so all GPUs\ncan DMA-str\n[…]\n\nhost RAM 208GB+ -> 93GB. Loss parity preserved (0.8B and 27B). Only active for\noffload_master + frozen base (LoRA); all other paths unchanged.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(dispatch-pp): share frozen base across GPUs + register-on-anon -…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T05:17:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e71dfcf012fb8ed1e95359bca23416143b6017c1",
          "body": "…ions fit)\n\nStop force-enabling recompute for dispatch-PP. With it off, each stage backward saves its\nactivations during the re-forward instead of recomputing per block -- ~30% faster on\nmodels that fit (verified on 0.8B LoRA, loss parity). It still OOMs the 27B today because\nthe phase-arena sizer s\n[…]\nloc pinning+zeroing the 52GB host region (CPU/kernel-bound,\ndisk idle then a 1.4GB/s burst), not the mapped flag. Left the allocator unchanged.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): allow recompute:false (honored where stage activat…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T22:36:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "91d04471058fb94ee2fbf25440f349a7844e4afd",
          "body": "…stream\n\nThe per-step weight stream is fixed (each small stage streams once and all microbatches\nreuse it), so running more microbatches per step amortizes that fixed cost over more\ntokens and keeps the cross-stage pipeline fuller (fewer bubbles) -- at no extra peak\nmemory, since microbatches run se\n[…]\n, seq 1024: chunks=1 -> 4096 tok / 5.3s = 773 tok/s;\nchunks=2 -> 8192 tok / 8.6s = 952 tok/s (~+23 percent). Loss parity preserved at chunks=1.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): microbatches-per-step knob to amortize the weight …",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T21:35:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9075e2c667fe831010eedee7b249ff266ef453b9",
          "body": "…oss-stage pipeline\n\nReplace the microbatch-diagonal wavefront with RoundPipe's actual schedule. Each layer\nrange is now a SMALL stage (~4 blocks, _dispatch_pp_plan: num_stages > gpus) dispatched\nround-robin to GPU s%N, where its weights are held resident across all M microbatches\n(enlarged streamin\n[…]\n on 4x32 GB -- 16 stages of 4 blocks, ~5 GB resident\nbase/GPU. The earlier '27B doesn't fit' was the big-stage (num_stages=gpus) bug, now gone.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): stage-level dispatch -- small resident stages + cr…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T21:13:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "576511e9a0638849df6cde44a1df18f16230cb37",
          "body": "…oundation)\n\nMake the streaming prefetch slot count a runtime value (mNumPrefetchBuffers, arrays ->\nvectors) instead of a fixed 2. Default stays 2 (per-block double-buffer, byte-identical);\ndispatch-PP raises it via env SUROGATE_DISPATCH_PREFETCH_BLOCKS so a whole small stage's\nblocks stay cached ac\n[…]\ns (stream a stage once/step, reuse for all M microbatches). Foundation for\nthe stage-level-dispatch rewrite; no behavior change at the default.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): configurable prefetch-slot count (stage-resident f…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T20:27:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3799c47c348f52b1f57b50de583952ab9ef29321",
          "body": "…vel rewrite plan\n\nUnder offload_master, embedding/lm_head masters previously stayed resident on the GPU\n(~13 GB for a large-vocab 27B), since offload_master only offloaded block weights. For\nLoRA the non-block base is FROZEN -- its master is read once to populate the bf16 work\ncopy, then never agai\n[…]\n correction:\nthe 27B fits on 4x32 GB (235B fits on one 24 GB 4090); my earlier 'doesn't fit' was a\nbig-stage (num_stages=gpus) bug, not a wall.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): offload frozen non-block masters (LoRA) + stage-le…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T20:17:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "deffd4cb314e50da34d5b8eb6cd208ae8e937821",
          "body": "…(~2.2x on 27B)\n\nReplace the sequential stage walk with a diagonal wavefront over (stage, microbatch)\ntasks, dispatched async (dispatch_async) with a per-wave barrier. Stage s runs on GPU\ns%N; in wave w, microbatch m runs stage s=w-m (forward) / the mirror (backward), so a\nwave's tasks land on disti\n[…]\ntage-resident weights every task re-streams its stage. Stage-resident weight\ngathering (next) removes that M-fold re-stream for the larger win.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): wavefront scheduler -- overlap stages across GPUs …",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T19:21:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b249fae3803da1732773dd0b419904891d9beaba",
          "body": "…ulated)\n\ndispatch_pp_train_step_multigpu now processes M microbatches per step: each stage runs\nall M microbatches before the next stage, re-forwarding each (stage, microbatch) from a\nper-microbatch input boundary and grad-accumulating across them (start_micro_step(m, M),\nGradAccumSteps=M for the o\n[…]\n\ngathering lands -- the next piece. The machinery (and the async primitive from fb3879be)\nare the foundation the wavefront scheduler builds on.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): microbatch machinery in the stage step (grad-accum…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T18:58:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fb3879be015128fcb90e67a853458833594212d6",
          "body": "…tion)\n\nAdd dispatch_async(work, gpu) / wait_gpu(gpu): launch work on one GPU without the\nglobal barrier of run_work, and wait per-GPU later. This is the foundation for the\npipelined stage scheduler, which must run different stages/microbatches on different\nGPUs concurrently (the current synchronous\n[…]\n yet (the primitive is not wired into the step). Verified the\nresident LoRA dispatch path is byte-identical (loss 0.3945/0.2835/0.5158/0.2920).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): async per-GPU dispatch primitive (scheduler founda…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T18:24:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b703b3dcf99282ad4f906a835e0d267d9914aa53",
          "body": "Run the round-robin stage scheduler with offload_master too, instead of falling back\nto the normal streaming loop. With offload_master the base weights live in pinned CPU\nand the force-linear stage execution streams each block to the GPU on demand\n(gather_block / release_block via handle_layer_start\n[…]\nsible to hold resident --\n4 stages over 64 layers, loss descending, adapter saved. Also unchanged: resident\n0.8B LoRA/FFT (offload_master off).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): per-stage weight streaming -- 27B LoRA on 32GB GPUs",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T17:32:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5dd28f6fbdb410b42ecb00bd7fb1d7d1c948b8ec",
          "body": "The dispatch step previously rejected LoRA (BF16 full-FT only). Wire it through:\n\n- forward_stage / backward_stage no longer reject LoRA; they call\n  ensure_lora_run_state and (backward) lora_grads().start_micro_step so the per-block\n  adapters train on this GPU. The cross-GPU grad reduce stays skip\n[…]\n2 GPU) trains to completion at\nseq 512 and seq 2048, ~20x faster per step than FFT (only the small adapters are\ncollected/optimized/broadcast).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): LoRA support in the resident stage scheduler",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T17:15:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e68c6e29c7467f403b92a0bae743fc39e1f3306d",
          "body": "…leak)\n\nThe dispatch sub-range forwards/backwards run with skip_finalize so boundary tensors\nand saves survive the cross-GPU reads, but that leaves them resident on the\nbump-allocated compute stack. Nothing reset the stack between steps, so saves piled up\nstep over step (observed: ~1947 live allocat\n[…]\n\nVerified: surogate sft on Qwen3.5-0.8B (2 GPU) now runs 30 steps at seq 512 (FFT and\nLoRA) and 15 steps at seq 2048 without the stack growing.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(dispatch-pp): reset the compute stack each step (stop cross-step …",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T17:15:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4c2a6b1320128bfd8c567540574750e4173f7904",
          "body": "Two bugs made multi-stage dispatch converge worse than single-stage and, worse,\nnon-deterministically (same seed/data -> final loss varied 0.65..3.9 run to run):\n\n1. offload_residual raced the cross-stage forward handoff. The pipelined forward\n   reads block hi's residual by name to hand it to the n\n[…]\n the 64-token overfit, vs 0.77 before) and is deterministic across runs.\nsurogate sft on Qwen3.5-0.8B trains to completion at seq 512 and 2048.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(dispatch-pp): correct + deterministic multi-stage convergence",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T16:17:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "348fb8c74fca6694905e35ae87711ef1bccbac4a",
          "body": "… stage)\n\nThe dispatch step previously re-ran a WHOLE forward per stage to provide the\nbackward's activations, holding every block's saved input on the compute stack on\ntop of the per-block gated-delta backward temps -- which overflowed the stack at\nlonger sequence lengths (cannot save / std::bad_al\n[…]\nns to\ncompletion at seq 512 (both packing modes) AND seq 2048 -- previously OOMed at\nseq 512. Single-stage memory now scales to long sequences.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): pipelined per-stage forward (memory bounded to one…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T16:05:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e9b591804f8d871f9cbae3dcedc999e699a712e6",
          "body": "…-end)\n\nrun_training_loop now routes parallelism=dispatch_pp (weights resident) through\ndispatch_pp_train_step_multigpu: builds a contiguous block->stage partition over the\nGPU pool, loads one micro-batch, and runs the round-robin fused step. With\noffload_master set (large models that can't fit resi\n[…]\nerflows the compute\nstack in the gated-delta backward (whole-forward-per-stage design) -- next: pipelined\nforward + per-stage weight streaming.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): wire the stage scheduler into surogate sft (end-to…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T15:19:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b40893a6292adcd9a5eef838a4c2e73f3ac03178",
          "body": "After weight streaming fixed the weight OOM, the next OOM was the save-for-backward\nactivation arena (per-layer residuals across all blocks). Dispatch-PP now forces\nrecompute + offload_residual so activation memory is independent of network depth\n(design 1.1) -- both weights and activations are bounded, so deep models (e.g.\nQwen3.6-27B / 64 layers) fit. LoRA keeps grads/optimizer on-GPU; FFT also offloads grads.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(dispatch-pp): bound activation memory (recompute + offload_residual)",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T14:15:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ca369d3d1287e4b2dd87289f401ee592f4a405ea",
          "body": "…s load\n\nparallelism=dispatch_pp validated the config but never enabled the offload path it is\nbuilt on, so import_weights loaded every weight onto the GPU and OOM'd on any model big\nenough to need dispatch-PP (e.g. Qwen3.6-27B: 30 GB of weights resident). Mirror\ncpu_training's mapping: set offload_master (weights stream from pinned CPU per block)\nand, for full fine-tune, offload_grads. LoRA keeps its small grads/optimizer on-GPU.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(dispatch-pp): enable CPU-resident weight streaming so large model…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T13:59:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6e1f0bb40356186bd110b544ceeb1e54a256941e",
          "body": null,
          "is_bot": false,
          "headline": "fix banner",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T13:57:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0f1b56240dd86063d0b15a20be9cb2f4cac2b957",
          "body": "dispatch_pp_train_step_multigpu(..., stale=True) defers each step's optimizer update\nby one: this step's grads are collected and stashed while the *previous* step's grads\nare applied, so every step trains on weights one update behind -- the RoundPipe v1\nstaleness. dispatch_pp_flush_pending applies t\n[…]\ned update with compute needs the CPU-master + streaming\nintegration (documented). Test: test_phase3_train_step_multigpu.py::...stale_converges.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): one-step-stale optimizer mode for the multi-GPU step",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T13:57:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "682d1194de028e51b06db02573cf89b1f6977123",
          "body": "The -pp example was a plain LoRA config missing the parallelism setting. Add\nparallelism: dispatch_pp + the dispatch_pp planner block (min_stages, upper_threshold,\nvram_budget_gb, recompute_grain) with explanatory comments. Validates through\nSFTConfig._validate_dispatch_pp_config (bf16+LoRA, CUDA graphs auto-disabled).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(dispatch-pp): make qwen36 pp example actually use dispatch-PP",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T13:42:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1de5051b1d2880b442881ca547de39aa0694e97b",
          "body": "…n hooks\n\nThese executor controls (op-range / layer-range selection, named cross-GPU inject,\npreserve-layer, skip-grad-reduce, stage-base restore, grad-norm / hidden readback)\nstarted as Phase-0 parity instrumentation but are now the load-bearing dispatch-PP\nexecution mechanism -- so the debug_/mDbg\n[…]\nose debug hooks (set_debug_dump_fn, debug_print_backward,\ndebug_tensors, mDebugDump*). No behavior change; full suite green (50 + 7 multi-GPU).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(dispatch-pp): drop debug_/mDbg from the dispatch-PP executio…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T13:37:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b16e6be01f5869cf8cec181563d0c26f53b7ae2a",
          "body": "Route the backward's trailing embedding op (layer<0, after all blocks) to the lowest\nstage and the leading loss/lm-head ops to the loss-owning stage, by op-index position\nrelative to the block-op span. Grad collection routes embedding from the lowest stage\nand lm_head/final_norm from the loss stage, so every parameter now trains (previously\nthe embedding was frozen). 2-GPU convergence unchanged (17.99 -> ... -> 0.95).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): unfreeze embedding in the multi-GPU dispatch step",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T13:28:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "483ced29c314127e1974fd228697fa1218717f58",
          "body": "…p debug from names\n\nMulti-GPU fused step (dispatch_pp_train_step_multigpu): backward dispatch round-robin\nacross the pool (stages on different GPUs, boundary grads handed GPU->host->GPU) ->\ncollect every stage's grads onto the master GPU by name -> optimizer there ->\nbroadcast updated weights to ev\n[…]\n-PP entry points, not throwaway debug probes.\n\nTests: test_phase3_train_step_multigpu (2-GPU convergence); full suite green\n(50 + 7 multi-GPU).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): multi-GPU fused training step that converges + dro…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T13:18:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "528b21ea12310d65e2db450d1362b70180f3a864",
          "body": "…rges\n\ndispatch_pp_debug_train_step chains the sub-range executor's forward (loss) ->\nbackward (grad store) -> optimizer update into one real training step. Repeated on a\nfixed batch it drives the loss down monotonically (19.19 -> ... -> 1.03 over 15 steps)\nand matches the stream-driven trainer step\n[…]\nsize==1 keeps reduce_loss (populates ValidTokenCount for get_loss)\na safe local no-op. Test: tests/train/dispatch_pp/test_phase3_train_step.py.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): fused single-GPU dispatch training step that conve…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T12:48:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e0019c0308071c868268e12dcc336e2a72dabee4",
          "body": "…+ AsyncStaleAdamW)\n\nAsyncOptimizer is a worker thread draining a depth-1 queue of update closures:\nsubmit(u_N) fences on u_{N-1} completing, enqueues u_N, and returns immediately --\nso u_N overlaps the caller and at most one update is ever in flight, which is exactly\nthe one-step staleness RoundPip\n[…]\n\nRemaining: wire the worker into a fused multi-GPU dispatch step() (per-layer\nparam/grad release) + the converges-on-a-real-run staleness test.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): async 1-step-stale optimizer core (AsyncOptimizer …",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T12:26:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cabf2040c9bbbbb81d551f3ce31b46cb4ce8ce8c",
          "body": "…g test\n\nExpose DslWeightManager::gpu_prefetch_buffer_bytes / prefetch_slot_count and the\nMultiGPUPyTrainer::dispatch_pp_debug_weight_residency snapshot (total device-resident\nweight bytes, streaming block double-buffer footprint, slot count).\n\nQuantitatively pins the dispatch-PP memory invariant: w\n[…]\nger) report no slots. Test: tests/train/dispatch_pp/\ntest_phase2_memory.py (resident => 0 slots; streaming => slot_count blocks, < NUM_LAYERS).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): GPU weight-residency introspection + memory-scalin…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T12:13:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d729f18645adba78403d9102bb35498cf9826c2b",
          "body": "…rad handoff\n\nBackward stages run in reverse order (loss-owning stage first), one GPU per stage\non the full batch, handing boundary gradients GPU->host->GPU with no NCCL.\n\nStage ops are selected by their owning block layer [lo..hi], not an op-index range:\nboundary view ops (d_blocks[L].mlp_down -> .\n[…]\ng), and\nreduce_loss_on_completion on the request. The debug forward/backward also force the\neager (non-stream-driven) path for the same reason.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): multi-GPU backward dispatch parity via cross-GPU g…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T12:01:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "df83a9130eecff5cd2a80364ad1a9bc99720fb42",
          "body": "…ry handoff\n\nComplete the cross-GPU activation handoff: the fused-residual block carries two\ntensors across a stage boundary -- blocks[hi].res_att (residual after attention)\nand blocks[hi].mlp_down (x). Read both by name on the sending GPU (kept live by a\npreserve-last-block hook) and bind them by n\n[…]\nnce for 2-stage and round-robin-wrap; parity test no longer xfail.\n\nRemoves the superseded get_residual/BlockHOut inject hooks (wrong buffers).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): multi-GPU forward dispatch parity via named bounda…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T10:56:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b307f0cf6bd44e3edaad6c6faeac740b5f993406",
          "body": "…erve hook)\n\nAdd set_debug_preserve_layer to keep a stage's last block's stack live past its\nlayer-end, so the carried x (prev block's MLP output, BlockMLPDown) survives for\nthe cross-GPU boundary read; align the x read/inject to the BlockHOut->MLPDown->\nResidualAtt fallback chain. Residual accumula\n[…]\nvia a StackedBlocks\ncarried tid not materialized on a fresh executor, so full parity stays xfail with\nthe precise remaining blocker documented.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): sender-side x capture for multi-GPU boundary (pres…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T10:29:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7bc5b705287930347cdf478be616f9224409ec6c",
          "body": "…andoff)\n\nAdd the C++ runtime that dispatches contiguous block stages round-robin across the\nstateless GPU pool (stage i -> GPU i%ngpu) via run_work, handing the boundary state\nGPU->host->GPU: MultiGPUPyTrainer::dispatch_pp_debug_forward_hidden_multigpu, plus\nCompiledExecutor residual/block-output i\n[…]\nous block's output) is a transient slot not resident on a fresh executor,\nso it needs a boundary-materialization hook. Test gated on free GPUs.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): multi-GPU round-robin forward dispatch (residual h…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T10:16:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9c994978ecf6287df4f4fcc7bbfd77a93b405af7",
          "body": "…model)\n\nDerive real BlockProfiles from a checkpoint: per-block work-weight bytes from the\nsafetensors header, activation working-set from model dims + runtime shape,\nsize-proportional fwd/bwd times. plan_for_model() produces a NUMA-placed StagePlan\nwith operating-envelope warnings; resolve_vram_budget_bytes() handles the\nvram_budget_gb/auto resolution. Validated end-to-end vs Qwen3-0.6B (28 blocks).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): planner->model integration (profile.py + plan_for_…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T09:43:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "808e1eba0cd27992782d8536c06183f5e40943c1",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(dispatch-pp): record Phase-1 single-GPU streaming verdict (PASS)",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T09:37:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d4fa7156e7550bba68cdfdad85dfad58e757e9fa",
          "body": "Weights streamed per block from pinned CPU (offload_master) produce bit-identical\nforward hidden states and per-block grad norms vs resident, through the dispatch-PP\nexecutor path. Reuses the existing DslWeightManager gather/release machinery; no new\nC++. Authors the Phase-1 plan.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): Phase-1 single-GPU weight-streaming parity test",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T09:34:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2ae819730df4098141cf6747041b4ff5b62502eb",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(dispatch-pp): record Phase-0 sub-range feasibility verdict (PASS)",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T09:24:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5a0b0ec5b7f460dc7ab68c664fff67d1a1f59820",
          "body": "… gate\n\nAdd debug-only bounded op-range execution to the compiled executor (guarded,\ndefault-off) and GraphExecutor/DslModel/MultiGPUPyTrainer debug entry points.\nForward: two contiguous block sub-ranges share one executor state with the\nboundary residual round-tripped through host memory, matching \n[…]\nthe bounded forced-eager executor matches whole-graph per-block\ngrad norms (rtol 2e-2). Validated on Qwen3-0.6B/4-layer single GPU. Gate: PASS.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): Phase-0 GraphExecutor sub-range execution + parity…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T09:23:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7b77a39e57a922f6feb4dbde2dccf64dce73b1f1",
          "body": "Decision gate passes: transformer-block boundaries are cleanly separable;\nops[layer_start_indices[i], layer_end_indices[j]) is a contiguous sub-graph with\nonly the residual hidden state crossing boundaries. Documents the bounded\nop-range execution design for the sub-range parity spike.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): Phase-0 Step-1 findings header (gate verdict: PASS)",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:42:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b73151f6652cd284e5d2f277ae734fae98a23b26",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): add parallelism=dispatch_pp config + v1 validations",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:23:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "18af1197bf36f2f321968219e86212a0b6ed799d",
          "body": "…ation\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): NUMA placement assignment + LoRA needs_grad propag…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:16:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3f1e8f5d303920d89d29daa3fe34e96efbe4f209",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): PCIe token-threshold operating-envelope warning",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:15:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "045cd951737e2e906dd632e74e8670a902718818",
          "body": "…M ceiling\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): warn when a single block exceeds the per-stage VRA…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:14:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d04dc5fa517eee7c0e052665ddb6bfc919f2123c",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): cost-search plan assembly (fwd/fused-tail/bwd)",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:13:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "01b37b48e8e97c2cd01d2361b683aba80d5ec602",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): candidate stage-budget enumeration",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:11:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "be5077b9c7764d711803923eade0f8470d719240",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): greedy stage packing under workload+memory ceilings",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:09:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6dca81906a5146b7ab3688967e269312bdfb5320",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): scaffold planner package + StagePlan data types",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:06:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4ffa8d6f108986813b6b939e228b2207d7d11595",
          "body": null,
          "is_bot": false,
          "headline": "remove obsolete docs",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T07:47:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40185a63ab03c41287acde5c8181a6b29b97f6c3",
          "body": null,
          "is_bot": false,
          "headline": "nccl download link",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T07:13:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "253a3e9da362b80cb7ded596f63fe5effe91c179",
          "body": "Feature/watch ink",
          "is_bot": false,
          "headline": "Merge pull request #53 from invergent-ai/feature/watch-ink",
          "author_name": "Madalin Tatarciuc",
          "author_login": "madalintat",
          "committed_at": "2026-06-20T21:14:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "054eb9a73b9dd9e2ef07f8a07bfb9cb41e236057",
          "body": "Review fixes:\n- dstack: refuse to overwrite an existing config we can't parse, or one whose\n  projects/backends aren't lists, instead of silently discarding it (.bak kept).\n- ssh: validate the tmux session name charset before interpolating it into the\n  remote kill command.\n\nSimplify:\n- credsBackend builds the backend object directly and lets yaml handle quoting\n  and block scalars, removing the credsYaml string-build + parse round-trip and\n  the block()/q() helpers.",
          "is_bot": false,
          "headline": "fix(jackalope): dstack config safety + build backend objects directly",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-17T14:35:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9f64774e4d5c71674333598f4b7754828c0bdee",
          "body": "Parse ~/.dstack/server/config.yml and merge the chosen backend into the\n'main' project (replacing a same-type backend, preserving other backends\nand projects) rather than replacing the whole file. Adds the 'yaml' dep;\nkeeps the one-time .bak of the original as a safety net.",
          "is_bot": false,
          "headline": "fix(jackalope): merge into dstack config instead of overwriting it",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-17T14:25:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d75f0cf8f9ff77b138f0ec26b951c0eaf16075dc",
          "body": "…etch catch, dstack backup safety, output_dir trailing slash, unicode escapes, gitignore",
          "is_bot": false,
          "headline": "fix(jackalope): address PR review — non-blocking SSH stop, artifact-f…",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-17T14:21:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "93cef5830a843119dea5b1f883bbb546ad85c441",
          "body": "…intercept + startup banner)",
          "is_bot": false,
          "headline": "Merge origin/main into feature/watch-ink (resolve main.py: jackalope …",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-17T14:16:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bfa934370072a2efcd53959b69e6a23180d3dec0",
          "body": "…F auth, binary CI\n\nRename the dashboard jackrabbit -> jackalope across the package, the\n`surogate jackalope` subcommand, Dockerfiles, and install.sh.\n\nCloud launch:\n- Modal: stream the trainer log back (failures were silent), terminate the\n  sandbox by persisted id, clear the image ENTRYPOINT, fix \n[…]\n  in-UI ^T token entry; per-row detail is shallow, deep arch resolve on pick.\n\nMonitor: drop the right insights rail (content is full-width).\nDistribution: standalone per-OS Bun binary build workflow.",
          "is_bot": false,
          "headline": "feat(jackalope): rename from jackrabbit + cloud launch, GRPO/RULER, H…",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-17T14:11:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fa30fb64ea12ee6cee80db7e90f89674afd73350",
          "body": "Add gold rabbit ASCII banner to CLI startup",
          "is_bot": false,
          "headline": "Merge pull request #52 from invergent-ai/feature/startup-banner",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-06-16T16:09:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "93d52b7a2977a932146c9ff0f6dd961e41ff3afa",
          "body": "Launch mode now offers SFT / GRPO / RULER. RULER adds a 4th step (judge\nGPUs, disjoint from trainer + vLLM) and runs\n  surogate grpo --train/--infer/--orch examples/ruler/*     --trainer-gpus … --vllm-gpus … --judge-infer examples/ruler/judge.yaml --judge-gpus …\nbuildGrpoCommand/spawnGrpo/grpoConfigsExist now handle the optional judge.\nVerified end-to-end from the UI for SFT, GRPO, and RULER; 43 tests pass.",
          "is_bot": false,
          "headline": "feat(jackrabbit): RULER launch mode (GRPO + LLM judge, 3-way GPU split)",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T16:28:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9bf7b1420a3d19ec874efce069968f814660aab2",
          "body": "- Models / Datasets nav pages: search-as-you-type over the HF Hub API\n  (debounced + AbortController), results with downloads/likes, and a model\n  detail pane showing \"✓ trainable by surogate\" (matched via supported.ts),\n  architecture, ~params, applicable recipes, and gated flag.\n- Pick a model → j\n[…]\nrt/stop are now non-blocking so a missing feed file\n  (before any run writes it) shows a waiting state instead of crashing.\n\nTests: 40 pass (HF client, supported matrix, feed, + Browse render driver).",
          "is_bot": false,
          "headline": "feat(jackrabbit): HuggingFace model/dataset browser + trainable badge",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T16:19:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ce56fd14afe44f097c297d28599a1774f6831bea",
          "body": null,
          "is_bot": false,
          "headline": "chore(jackrabbit): update lockfile (sixel dep)",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T14:21:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b71fa6e9856e12ac49307c7bf183241d5bc88c0",
          "body": "- supported.ts: surogate's 14 trainable model families (llama, qwen3,\n  qwen3_moe, qwen3_5*, qwen3_vl, gemma4*, gpt_oss, lfm2, nemotron_h) with\n  MoE/vision flags + applicable recipes. checkTrainable() matches a model's\n  architectures/model_type like vLLM does.\n- hf.ts: HuggingFace Hub API client v\n[…]\ndelDetail (expand config+safetensors;\n  param count without weight download); HF_TOKEN auth; 429-aware.\n- Tests: 38 pass; verified live against the real HF API (Qwen3 trainable,\n  Mixtral not).\n\nEOF\n)",
          "is_bot": false,
          "headline": "feat(jackrabbit): HF search client + surogate trainability matrix",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T14:19:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b4cdc2c81551ebdd5c9e63e4bca1767935bdb04a",
          "body": "- Pause/resume: z suspends (SIGSTOP) / resumes (SIGCONT) the current\n  launched run's process group; top bar shows ⏸ suspended; footer hint\n  toggles suspend/resume. controls.ts: signalRun/pauseRun/resumeRun.\n  (Best-effort — freezing multi-GPU jobs can upset NCCL; noted.)\n- Flicker-safe: sync-outpu\n[…]\no inline Kitty/Sixel images present\n  atomically (no tearing). Auto-on for TTYs; --no-sync to disable.\n  Unsupported terminals ignore the private mode safely.\n\nBuild + 31 tests green; typecheck clean.",
          "is_bot": false,
          "headline": "feat(jackrabbit): pause/resume runs + flicker-safe synchronized output",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T14:15:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0b51108bf546df454b76da9e43cefa619de83d81",
          "body": "Four capability additions beyond monitor+launch:\n\n- Control: launched runs write a <feed>.pid sidecar; press x (two-press\n  confirm) to SIGTERM the run's process group from Monitor/Runs. controls.ts\n  reads/probes/stops; footer shows the hint only when controllable.\n- Compare: pin a second run on th\n[…]\ned (fires once\n  per run) → terminal bell + on-screen banner + best-effort desktop notify\n  (notify-send/osascript, error-safe).\n\nTests: 31 pass (alerts, controls, + prior); typecheck clean; build ok.",
          "is_bot": false,
          "headline": "feat(jackrabbit): control runs, compare, Sixel, alerts",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T14:06:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4db8ba5f18c9b7ffa719423189cdc32083e9150e",
          "body": "- src/tips.ts: 72 tips distilled from the surogate guides (precision/\n  recipes, qlora, offloading, memory, optimizers, performance, moe,\n  rl/grpo, long-context, multi-gpu, metrics), each context-tagged.\n- insights.ts: activeTags(state) derives live context (recipe, lora,\n  qlora, moe, grpo, hot/lo\n[…]\nd ROTATES over time → live feed.\n- Splash tips now pull grounded general tips (rotated per launch); removed\n  the terminal-specific tip.\n- Tests: 25 pass (tag filter + rotation + nvfp4/moe relevance).",
          "is_bot": false,
          "headline": "feat(jackrabbit): real-time grounded tips feed (surogate docs)",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T13:53:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "068d5d04b6693cf99a19646ecd0405db4c617657",
          "body": null,
          "is_bot": false,
          "headline": "fix(jackrabbit): rename non-TTY guard message",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T13:45:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95ae643e208637b4d34711a15e426e7c91ddfafc",
          "body": "The dashboard is now `jackrabbit` (leans into the gold-rabbit brand):\n- package name + bin → jackrabbit (run: `jackrabbit`)\n- splash subtitle, CLI help, README updated\n- dir surogate-watch/ → jackrabbit/\n\nBuild + 23 tests green.",
          "is_bot": false,
          "headline": "feat(jackrabbit): rename package/command to jackrabbit 🐇",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T13:44:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38d13a189f2f3c3fb203496aaaf0d4c640479136",
          "body": "Fixes the multi-training collision and adds RL + smarter GPU choice:\n\n- Run isolation: every launched run writes its OWN feed under\n  ~/.surogate-watch/runs/<ts>-<label>.jsonl (no more interleaving into\n  one file). App owns the feed and switches/resets state when you launch\n  or pick another run. N\n[…]\n + fits/tight/risk hints help\n  co-locate a run on a GPU that still has room.\n- Tests: 23 pass; edge-case driver verifies multi-run switching resets\n  state, Runs listing, GRPO mode + estimate render.",
          "is_bot": false,
          "headline": "feat(watch-ink): run isolation, Runs picker, GRPO mode, GPU headroom",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T13:38:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "63b48680f3c75e66313b68111732ed1b1682a6a8",
          "body": "- Brand: Surogate gold palette (#ffd15c→#e4961c) across UI + chart\n  (gold loss line/area, blue eval diamonds, warm-dark bg).\n- Splash/menu: full leaping-rabbit mascot + SUROGATE wordmark in gold,\n  detected GPUs (nvidia-smi), tips, feed status, \"press ⏎ to open\".\n  Mascot shows ONLY on the launch s\n[…]\napped.\n- Chart sharpness: render at panel aspect with 2× supersample and\n  resolution-scaled line/markers/fonts (fixes pixelation).\n- Tests: 17 pass (+ splash→dashboard transition), --test-force-exit.",
          "is_bot": false,
          "headline": "feat(watch-ink): gold brand, rabbit splash menu, nav fix, sharper chart",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T13:26:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 47,
      "commits_last_year": 1303,
      "latest_release_at": "2026-07-21T08:55:53Z",
      "latest_release_tag": "v1.2.8",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 26,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 9.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "jackalope",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": null,
          "registry_url": "https://www.npmjs.com/package/jackalope",
          "is_deprecated": false,
          "latest_version": null,
          "repository_url": null,
          "versions_count": 0,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 0,
          "first_published_at": "2013-02-25T21:10:09.793000Z",
          "latest_published_at": null,
          "latest_version_yanked": null,
          "days_since_latest_publish": null
        }
      ]
    },
    "popularity": {
      "forks": 6,
      "stars": 806,
      "watchers": 3,
      "fork_history": {
        "days": [
          {
            "date": "2026-01-15",
            "count": 1
          },
          {
            "date": "2026-01-16",
            "count": 1
          },
          {
            "date": "2026-03-09",
            "count": 1
          },
          {
            "date": "2026-04-26",
            "count": 1
          },
          {
            "date": "2026-06-04",
            "count": 1
          },
          {
            "date": "2026-07-08",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 6,
        "total_forks": 6
      },
      "star_history": {
        "days": [
          {
            "date": "2026-01-06",
            "count": 7
          },
          {
            "date": "2026-01-07",
            "count": 1
          },
          {
            "date": "2026-01-14",
            "count": 7
          },
          {
            "date": "2026-01-15",
            "count": 1
          },
          {
            "date": "2026-01-16",
            "count": 1
          },
          {
            "date": "2026-01-19",
            "count": 1
          },
          {
            "date": "2026-01-20",
            "count": 1
          },
          {
            "date": "2026-02-02",
            "count": 4
          },
          {
            "date": "2026-02-03",
            "count": 4
          },
          {
            "date": "2026-02-04",
            "count": 2
          },
          {
            "date": "2026-02-05",
            "count": 3
          },
          {
            "date": "2026-02-06",
            "count": 7
          },
          {
            "date": "2026-02-08",
            "count": 1
          },
          {
            "date": "2026-02-09",
            "count": 1
          },
          {
            "date": "2026-02-15",
            "count": 1
          },
          {
            "date": "2026-02-16",
            "count": 13
          },
          {
            "date": "2026-02-17",
            "count": 9
          },
          {
            "date": "2026-02-18",
            "count": 9
          },
          {
            "date": "2026-02-19",
            "count": 15
          },
          {
            "date": "2026-02-20",
            "count": 2
          },
          {
            "date": "2026-02-21",
            "count": 1
          },
          {
            "date": "2026-02-22",
            "count": 1
          },
          {
            "date": "2026-02-23",
            "count": 1
          },
          {
            "date": "2026-02-24",
            "count": 3
          },
          {
            "date": "2026-02-25",
            "count": 2
          },
          {
            "date": "2026-02-27",
            "count": 2
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-04",
            "count": 2
          },
          {
            "date": "2026-03-05",
            "count": 3
          },
          {
            "date": "2026-03-06",
            "count": 1
          },
          {
            "date": "2026-03-08",
            "count": 1
          },
          {
            "date": "2026-03-15",
            "count": 1
          },
          {
            "date": "2026-03-23",
            "count": 2
          },
          {
            "date": "2026-03-24",
            "count": 18
          },
          {
            "date": "2026-03-25",
            "count": 10
          },
          {
            "date": "2026-03-26",
            "count": 9
          },
          {
            "date": "2026-03-27",
            "count": 1
          },
          {
            "date": "2026-03-29",
            "count": 1
          },
          {
            "date": "2026-03-31",
            "count": 3
          },
          {
            "date": "2026-04-01",
            "count": 2
          },
          {
            "date": "2026-04-04",
            "count": 5
          },
          {
            "date": "2026-04-07",
            "count": 1
          },
          {
            "date": "2026-04-10",
            "count": 1
          },
          {
            "date": "2026-04-11",
            "count": 1
          },
          {
            "date": "2026-04-19",
            "count": 1
          },
          {
            "date": "2026-04-21",
            "count": 2
          },
          {
            "date": "2026-04-28",
            "count": 1
          },
          {
            "date": "2026-05-07",
            "count": 1
          },
          {
            "date": "2026-05-14",
            "count": 2
          },
          {
            "date": "2026-05-21",
            "count": 1
          },
          {
            "date": "2026-06-01",
            "count": 1
          },
          {
            "date": "2026-06-03",
            "count": 295
          },
          {
            "date": "2026-06-04",
            "count": 322
          },
          {
            "date": "2026-06-19",
            "count": 3
          },
          {
            "date": "2026-06-20",
            "count": 1
          },
          {
            "date": "2026-06-21",
            "count": 3
          },
          {
            "date": "2026-06-22",
            "count": 1
          },
          {
            "date": "2026-06-25",
            "count": 1
          },
          {
            "date": "2026-07-02",
            "count": 1
          },
          {
            "date": "2026-07-06",
            "count": 1
          },
          {
            "date": "2026-07-07",
            "count": 2
          },
          {
            "date": "2026-07-08",
            "count": 1
          },
          {
            "date": "2026-07-18",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 804,
        "total_stars": 806
      },
      "open_issues_and_prs": 6
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples",
        "recipes"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "jackalope/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 324304,
      "source_files_sampled": 723,
      "oversized_source_files": 34,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "jackalope/package.json",
        "pyproject.toml"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "@inkjs/ui",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.0"
        },
        {
          "name": "@logdna/tail-file",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.2"
        },
        {
          "name": "@resvg/resvg-js",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.6.2"
        },
        {
          "name": "echarts",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.1.0"
        },
        {
          "name": "ink",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.6"
        },
        {
          "name": "react",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.0"
        },
        {
          "name": "sixel",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.16.0"
        },
        {
          "name": "terminal-image",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.3.0"
        },
        {
          "name": "yaml",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.9.0"
        },
        {
          "name": "transformers",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=5.5.0"
        },
        {
          "name": "huggingface-hub",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.4.1"
        },
        {
          "name": "hf-transfer",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.1.9"
        },
        {
          "name": "datasets",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.3.0"
        },
        {
          "name": "addict",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "peft",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "json_repair",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "unique-namer",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "nanobind",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "binpacking",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "rich",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=13.0.0"
        },
        {
          "name": "psutil",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "matplotlib",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "qwen-vl-utils",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "==0.0.14"
        },
        {
          "name": "ray",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.5.0"
        },
        {
          "name": "verifiers",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "==0.1.11"
        },
        {
          "name": "wandb",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "==0.25.1"
        },
        {
          "name": "jaxtyping",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "aiolimiter",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "openai",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "==2.32.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 31,
        "open_issues": 6,
        "closed_ratio": 0.778,
        "closed_issues": 21,
        "closed_unmerged_prs": 3
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "flaviusburca",
          "commits": 1214,
          "avatar_url": "https://avatars.githubusercontent.com/u/30172978?v=4"
        },
        {
          "type": "User",
          "login": "madalintat",
          "commits": 23,
          "avatar_url": "https://avatars.githubusercontent.com/u/73785144?v=4"
        },
        {
          "type": "User",
          "login": "1danchirila",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/33685954?v=4"
        }
      ],
      "contributors_sampled": 3,
      "top_contributor_share": 0.974
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "build.yml",
        "docker.yml",
        "jackalope.yml",
        "wheel.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": true
    },
    "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": 0,
            "reason": "0 out of 8 merged PRs checked by a CI test -- score normalized to 0",
            "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 1/11 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 3 contributing companies or organizations -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow 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": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 9,
            "reason": "1 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "d1bfe628b488cefad5d8328873db2f50110363d4",
        "ran_at": "2026-07-21T15:50:07Z",
        "aggregate_score": 4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/invergent-ai/surogate",
    "host": "github.com",
    "name": "surogate",
    "owner": "invergent-ai"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 60,
      "inputs": {
        "security": 40,
        "vitality": 85,
        "community": 31,
        "governance": 52,
        "engineering": 84
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 85,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "commits_last_year": 1303,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 26
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "26/52 weeks with commits",
                "points": 18,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 26
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1303 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1303
                    }
                  }
                ],
                "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": 90,
            "inputs": {
              "releases_count": 47,
              "latest_release_tag": "v1.2.8",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 9.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "47 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 47
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~9.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 9.3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 31,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": "Inorganic Growth Policy discounts the stars and forks components by 40%. The finding describes the timing of public star and fork events; it does not establish that attention was purchased, or that the maintainers were involved.",
            "notes": [
              {
                "code": "growth_policy_discount",
                "params": {
                  "pct": 40
                }
              }
            ],
            "value": 34,
            "inputs": {
              "forks": 6,
              "stars": 806,
              "watchers": 3,
              "growth_state": "anomalous",
              "growth_signals": [
                "acquisition_burst",
                "star_concentration",
                "missing_decay"
              ],
              "growth_windows": [
                "2026-06-03/2026-06-04"
              ],
              "growth_peak_days": 2,
              "growth_factor_pct": 60,
              "growth_peak_stars": 617,
              "growth_peak_window": "2026-06-03 → 2026-06-04",
              "growth_peak_multiple": 322,
              "growth_top_days_share": 0.825,
              "growth_baseline_per_day": 1,
              "growth_history_complete": true
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "806 stars, discounted for inorganic growth: 617 stars over 2 day(s) from 2026-06-03 → 2026-06-04, 322× the repository's own daily baseline",
                "points": 28.3,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 806
                    }
                  },
                  {
                    "code": "discounted_for_inorganic_growth",
                    "params": {
                      "days": 2,
                      "stars": 617,
                      "window": "2026-06-03 → 2026-06-04",
                      "multiple": 322
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "6 forks, discounted for inorganic growth: 617 stars over 2 day(s) from 2026-06-03 → 2026-06-04, 322× the repository's own daily baseline",
                "points": 3.5,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 6
                    }
                  },
                  {
                    "code": "discounted_for_inorganic_growth",
                    "params": {
                      "days": 2,
                      "stars": 617,
                      "window": "2026-06-03 → 2026-06-04",
                      "multiple": 322
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "3 watchers",
                "points": 1.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "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": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "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": "critical",
            "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": 1,
            "inputs": {
              "packages": [
                "jackalope"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 0
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "0 downloads/month across npm",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 0,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 52,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 24,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 3,
              "top_contributor_share": 0.974
            },
            "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 97% of commits",
                "points": 0.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 97
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "3 contributors",
                "points": 4.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "merged_prs": 31,
              "open_issues": 6,
              "closed_issues": 21,
              "issue_closed_ratio": 0.778,
              "closed_unmerged_prs": 3
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "78% of issues closed",
                "points": 36.4,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 78
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "31/34 decided PRs merged",
                "points": 34.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 31,
                      "decided": 34
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 1/11 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "followers": 15,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "invergent-ai",
              "public_repos": 20,
              "account_age_days": 306
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "15 followers of invergent-ai",
                "points": 8.7,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 15,
                      "login": "invergent-ai"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "20 public repos, account ~0 yr old",
                "points": 11.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 20
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "good",
            "name": "Package maintenance",
            "note": "Excluded from scoring (no data or not applicable): Publish recency. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "publish_recency"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 75,
            "inputs": {
              "packages": [
                "jackalope"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": null
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "0 published versions",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "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": 84,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": true
            },
            "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": 16,
                "status": "met",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 9.6,
                "status": "met",
                "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": "0 out of 8 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "cuda",
                "deep-learning",
                "fine-tuning",
                "generative-ai",
                "llama",
                "llm",
                "llms",
                "nvidia-gpu",
                "qwen",
                "sft"
              ],
              "has_wiki": true,
              "homepage": "https://surogate.ai",
              "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://surogate.ai",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "10 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 40,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 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": "0 out of 8 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "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 1/11 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "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": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "1 existing vulnerabilities detected",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "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": 65,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.92,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "92 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 92,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "jackalope/tsconfig.json"
              ],
              "agent_commit_share": 0.61,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "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": 11,
                "status": "met",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "jackalope/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "jackalope/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": "61 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 61,
                      "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": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 97,
            "inputs": {
              "primary_language": "C++",
              "largest_source_bytes": 324304,
              "source_files_sampled": 723,
              "oversized_source_files": 34
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "C++ (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C++"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "34/723 source files over 60KB",
                "points": 52.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 723,
                      "oversized": 34
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples",
                "recipes"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples, recipes",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples, recipes"
                    }
                  }
                ],
                "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": [
    "Could not fetch pypi package 'surogate' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-21T15:50:26.018639Z",
  "schema_version": "0.23.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/i/invergent-ai/surogate.svg",
  "full_name": "invergent-ai/surogate",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

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