公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-23 16:20 UTC

specfuse / loop

Local-first executor for the Specfuse Plan + Work Unit gate-cycle methodology.

PythonApache-2.0★ 0 星标⑂ 0 复刻始于 2026年5月在 GitHub 上查看 ↗

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

58
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

specfuse组织
0 关注者4 个公开仓库始于 2026年4月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
PyPIspecfuse-loop0.3.24-260 天前specfuseagentsplanningralphgate-cycle

按类别列示的指标

活力

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

76良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
5.5/36提交节奏 — 52 周中有 8 周有提交
18/18提交量 — 最近一年 201 次提交
0/10OpenSSF Scorecard:Maintained — project was created within the last 90 days. Please review its contents carefully
所用输入
commits_last_year201
human_commit_share0.95
days_since_last_push0
active_weeks_last_year8

发布纪律

100优秀
评分方式
27/27有发布版本 — 已发布 15 个发布版本
36/36发布时效 — 最近一次发布版本于 13 天前
27/27发布节奏 — 约每 1.8 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count15
latest_release_tagv0.3.12
releases_from_tags
days_since_latest_release13
mean_days_between_releases1.8
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

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

43存在风险 · 占总体的 18%
评分方式
0/60星标 — 0 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 0 位关注者
所用输入
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

92优秀
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(Apache-2.0)
18/18CONTRIBUTING 指南
13.5/13.5行为准则
0/7.2议题模板
6.3/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template

可持续性与治理

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

53中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0/22.5提交分布 — 头号贡献者编写了 100% 的提交
1.4/13.5贡献者广度 — 1 位贡献者
0/10OpenSSF Scorecard:Contributors — project has 0 contributing companies or organizations -- score normalized to 0
所用输入
bus_factor1
contributors_sampled1
top_contributor_share1
评分方式
45.3/46.8议题解决 — 97% 的议题已关闭
38/38.3PR 接受 — 已裁定的 PR 中 156/157 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/29 approved changesets -- score normalized to 0
所用输入
merged_prs156
open_issues2
closed_issues65
issue_closed_ratio0.97
closed_unmerged_prs1
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
0/25所有者影响力 — specfuse 有 0 位关注者
5.6/25既往记录 — 4 个公开仓库,账户约 0 年
所用输入
followers0
owner_typeOrganization
is_verified
owner_loginspecfuse
public_repos4
account_age_days97
评分方式
25/25已发布且可解析 — pypi 上有 1 个软件包
35/35发布时效 — 最近一次发布于 0 天前
20/20版本历史 — 26 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesspecfuse-loop
ecosystemspypi
any_deprecated
min_days_since_publish0

工程质量

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

67中等 · 占总体的 20%

工程实践

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

文档

65中等
评分方式
30/30README
25/25文档目录
0/15文档 / 主页站点
10/10仓库描述
0/10主题标签
0/10Wiki
所用输入
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

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

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

安全态势

49存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — 无数据
2.5/2.5CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/29 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
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
2/5Security-Policy — security policy file detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4.9
已排除计分(无数据或不适用):branch_protection, signed_releases。 其余权重已重新归一化。

AI 就绪度

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

59中等 · 占总体的 0%
评分方式
45/45代理指令 — .claude/CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 95 次人类提交中有 95 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_files.claude/CLAUDE.md
agent_instruction_max_bytes454
评分方式
0/18一条命令的引导启动
22/22自动化测试
0/11Lint / 格式化配置
0/11静态类型检查
0/10可复现环境
10/10已体现的代理实践 — 最近 100 次提交中有 93 次由代理编写或署名代理
8/8自动化维护 — 最近 100 次提交中有 5 次为自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.93
toolchain_manifests
dependency_bot_commit_share0.05
评分方式
0/45可类型检查的代码 — Python,未配置类型检查
54.6/55可控的文件大小 — 采样的 148 个源文件中有 1 个超过 60KB
所用输入
primary_languagePython
largest_source_bytes246,031
source_files_sampled148
oversized_source_files1

关键数据

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

数据采集警告

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index pypi:specfuse-loop@0.3.24; advisories assessed against the repository dependency graph instead

更多细节

OpenSSF Scorecard 4.9 / 10
4.9综合

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

10Binary-Artifactsno binaries found in the repo
不适用Branch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/29 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
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
4Security-Policysecurity policy file detected
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
全部依赖 未采集

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 2901,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Shell": 35281,
        "Python": 1562824,
        "Vim Snippet": 924
      },
      "pushed_at": "2026-07-23T16:01:39Z",
      "created_at": "2026-05-30T17:39:19Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-23T15:47:04Z",
      "description": "Local-first executor for the Specfuse Plan + Work Unit gate-cycle methodology.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "specfuse",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/276717733?v=4",
      "created_at": "2026-04-16T20:05:25Z",
      "is_verified": null,
      "public_repos": 4,
      "account_age_days": 97
    },
    "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": "v0.3.12",
          "kind": "patch",
          "published_at": "2026-07-10T15:10:05Z"
        },
        {
          "tag": "v0.3.11",
          "kind": "patch",
          "published_at": "2026-07-10T15:10:04Z"
        },
        {
          "tag": "v0.3.10",
          "kind": "patch",
          "published_at": "2026-07-10T15:10:03Z"
        },
        {
          "tag": "v0.3.9",
          "kind": "patch",
          "published_at": "2026-07-10T15:10:02Z"
        },
        {
          "tag": "v0.3.8",
          "kind": "patch",
          "published_at": "2026-07-10T15:10:01Z"
        },
        {
          "tag": "v0.3.7",
          "kind": "patch",
          "published_at": "2026-07-04T19:26:34Z"
        },
        {
          "tag": "v0.3.6",
          "kind": "patch",
          "published_at": "2026-07-03T12:22:34Z"
        },
        {
          "tag": "v0.3.5",
          "kind": "patch",
          "published_at": "2026-06-25T02:21:29Z"
        },
        {
          "tag": "v0.3.4",
          "kind": "patch",
          "published_at": "2026-06-24T14:50:22Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2026-06-24T13:15:54Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2026-06-23T16:09:15Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-06-22T15:00:09Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-06-22T13:08:12Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-07-10T15:10:00Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-06-07T12:18:32Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "4d4854a1efe8374a5337b43ff28c594836b5ed94",
          "body": "* chore(loop): sync scaffold to 0.2.0\n\n* chore(release): bump specfuse-loop to 0.3.24\n\nShips the `blocked` roadmap feature status + /block-feature skill (#224):\nnew status distinct from `deferred`, driver non-dispatch handling, and the\nauto-archive orphan-anchor fix.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.24 (#225)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T15:46:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b0979394ab547c87be967a1e021a009f676a4e6f",
          "body": "…224)\n\n* feat(roadmap): add `blocked` feature status + /block-feature skill\n\nSupport a `blocked` roadmap feature status distinct from `deferred`. A\nblocked feature names an unmet dependency — an ADR awaiting approval or\nan upstream FEAT-ID — and links to it from a `**Blocked by.**` block in\nits deta\n[…]\nrphaned).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(roadmap): add `blocked` feature status + /block-feature skill (#…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T15:41:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2081b5d41ad2e91300dea87dd954eed93c0f10bb",
          "body": "* chore(loop): sync scaffold to 0.2.0\n\n* chore(release): bump specfuse-loop to 0.3.23\n\nShips the FEAT-2026-0049 follow-through set: planning-discipline\nsection-presence lint (#216), manifest-scoped upgrade prune + clobber\nwarnings (#217), close-discipline rule with the three substantive-close\nobliga\n[…]\nctions/setup-python 7 CI bump (#174).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.23 (#222)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T01:37:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2c8f44ada4e914670ab87861ccfb043816882024",
          "body": "…) (#221)\n\ngate_spent_usd summed cost only for done WUs, so a WU sitting\nblocked_human across re-arms contributed $0 to the per-gate brake no\nmatter how much it had burned — FEAT-2026-0049/WU-06 accumulated $30.29\nacross 9 attempts while blocked/re-armed, invisible to cost_budget_usd;\nmost of the fe\n[…]\n— is fully visible to the brake while still\nblocked. Full suite 1282 tests OK; ruff clean.\n\nCloses #219.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): budget brake counts recorded cost on every WU status (#219…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T01:35:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b82d3de21617182450301f5e563214e4c00a6d99",
          "body": "…d arm-gate (#209 item 6) (#220)\n\nThe lint checks (#216) verify artifacts after the fact; these lines put\nthe discipline at the decision points themselves:\n\n- draft-feature §4: run the existing-mechanism search before drafting any\n  WU that designs enforcement or measurement (planning-discipline §1)\n[…]\n confirm flag-introducing drafts carry their flag-scope table (§3).\n\nCanonical + vendored copies synced.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skills): planning-discipline flow references in draft-feature an…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T01:34:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6741c424eda871dd4b6d4e107fcedc18eec02a7e",
          "body": "…se obligations (#218)\n\n* chore(loop): sync scaffold to 0.2.0\n\n* feat(scaffold): close-discipline rule — the three generic substantive-close obligations (#215)\n\nFEAT-2026-0049's substantive-close contract surfaced three checks that are\ngeneric — every project's close should do them — but that no shi\n[…]\n; bats 5/5; ruff clean.\n\nCloses #215.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(scaffold): close-discipline rule — three generic substantive-clo…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T01:32:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9f047c53f945a2af9c673921271c725dabc1ef71",
          "body": "…g unknown files (#214) (#217)\n\nupgrade_specfuse deleted ANY file under a versioned dir that the shipped\nseed didn't carry, and silently overwrote name collisions — a project-\nauthored rule dropped into .specfuse/rules/ was destroyed on the next\nupgrade with no trace. Layer 1 (rules-local/, 0.3.22) \n[…]\nkeeps\nunknown files and suppresses clobber warnings. Full suite 1284 tests OK;\nruff clean.\n\nCloses #214.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(scaffold): prune only manifest-owned files; warn before clobberin…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T01:30:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e5cccbe04b832b38ccc3860d6fe0ed44ce559685",
          "body": "Second half of #201, unblocked by the FEAT-2026-0049 planning-discipline\ndrop (#211) which made the section names canonical. check_planning_sections\nWARNs when:\n\n- PLAN.md lacks an 'Existing-mechanism search' or 'Escalation-predicate\n  satisfiability' section (presence only — the template's explicit\n[…]\n satisfies, passed\ngates and sealed features exempt. Full suite 1287 tests OK; ruff clean.\n\nCloses #201.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(lint): planning-discipline section-presence WARNs (#201) (#216)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T01:27:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1382ea6b909773916d62d51d0b029ce83e5ae9aa",
          "body": "Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6 to 7.\n- [Release notes](https://github.com/actions/setup-python/releases)\n- [Commits](https://github.com/actions/setup-python/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-python\n  dependency-\n[…]\nd-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: Christian Labonté <clabonte@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/setup-python from 6 to 7 (#174)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-23T01:25:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b65d5e3e2397d910d4f7fe425678202734755d87",
          "body": "* chore(loop): sync scaffold to 0.2.0\n\n* chore(release): bump specfuse-loop to 0.3.22\n\nShips the FEAT-2026-0049 planning-discipline scaffold drop (#211):\nplanning-discipline rule, result-contract closing obligations,\n'observe behavior, not source' verification bullet, PLAN/WU/GATE\ntemplate sections,\n[…]\n it on their next\n`specfuse upgrade`.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.22 (#213)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T00:31:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "919ef945d6d2ca01fa02ec3e0aedd26cbe6b4972",
          "body": "…ligations (#211)\n\n* feat(scaffold): planning-discipline rule + result-contract closing obligations\n\nEncode the FEAT-2026-0049 retrospective into the scaffold for loop-agent review.\n\n- rules/planning-discipline.md (NEW): 5 planning-time checks — existing-mechanism\n  search, escalation-predicate sati\n[…]\ncal python suite skips.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(scaffold): planning-discipline rule + result-contract closing ob…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T00:25:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2b5191d59f35f0cd73625e9fdeec0116bbfacbeb",
          "body": "* chore(loop): sync scaffold to 0.2.0\n\n* chore(release): bump specfuse-loop to 0.3.21\n\nFEAT-2026-0049 retrospective fixes: verdict-first terminal flips (#195),\nproduces-vs-squash-diff cross-check (#198), lifetime attempts/cost\naccounting + task_completed telemetry (#199), spinning re-arm\nreproductio\n[…]\nefire failing-test extraction (#207).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.21 (#210)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T23:19:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "21e0e2658245f18c61babca59c40126cc0141574",
          "body": "…erpt (#207) (#208)\n\nThe tests-class signature pattern matched only pytest/unittest\n('FAIL: test_*'). Maven surefire failures ('[ERROR] ClassTest.method:123\n...') fell through to the first-informative-line heuristic and collapsed\nonto a generic Maven line identical across distinct failing-test sets;\n[…]\n0 boilerplate lines,\nno-surefire order preservation. Full suite 1249 tests OK; ruff clean.\n\nCloses #207.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): extract surefire failing-test names into signature and exc…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T23:12:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "60e5253e766e0d5fde12525bae5cce82171a2b24",
          "body": "close/close-intermediate/plan-next WUs ran 2.8-5.2x over their $2-3\nplanned_cost_usd estimates across FEAT-2026-0049 (clabonte/generator),\npoisoning every calibration built on those plans. check_planned_cost now\nWARNs when a non-sealed ceremony-type WU declares a positive\nplanned_cost_usd below CERE\n[…]\nent at/above floor, ceremony-types-\nonly, sealed skip. Full suite 1248 tests OK; ruff clean.\n\nRefs #201.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(lint): planned-cost floor WARN for ceremony WU types (#201) (#206)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T23:10:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "599eefdf65254e993271328b2ef0817047515ba7",
          "body": "…d WUs (#200) (#205)\n\nAfter a spinning_signature_repeat escalation the driver re-dispatched a\nre-armed WU with no evidence the escalated failure was ever reproduced in\nfull. FEAT-2026-0049 (clabonte/generator): WU-06 was re-armed twice on\ntest-subset diagnoses; the third re-arm — the first to reprod\n[…]\n dispatch; reproduced re-arm dispatches and passes).\nFull suite 1254 tests OK; ruff clean.\n\nCloses #200.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(loop): reproduction gate before re-dispatch of spinning-escalate…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T23:08:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7f20bd842a1bbb0bd7b25fe6da59fd494f3c0088",
          "body": "…204)\n\nWU frontmatter attempts/cost_usd are per-dispatch-cycle values that reset\non re-arm, but every consumer read them as lifetime totals. FEAT-2026-0049\n(clabonte/generator): WU-06 frontmatter recorded attempts: 1 / $2.75 while\nevents.jsonl recorded 9 attempts / $30.29 across its re-arms — GATE-0\n[…]\nration run asserting every new\ntask_completed field. Full suite 1250 tests OK; ruff clean.\n\nCloses #199.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): lifetime attempts/cost accounting across re-arms (#199) (#…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T23:07:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e5201f8477a74906aea4c61a3402cc2ebe066c74",
          "body": "…ting done (#198) (#203)\n\nThe deliverable-presence gate (FEAT-2026-0022/T02, reused by auto-close\nsince #192) is presence-only: path exists and is non-empty. A WU whose\nproduces: paths are pre-existing files it was supposed to MODIFY passes it\nwithout touching them — the FEAT-2026-0049/T06 shape, wh\n[…]\n modify of a\npre-existing deliverable still passes). Full suite 1251 tests OK; ruff\nclean.\n\nCloses #198.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): cross-check produces: against the squash diff before accep…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T23:05:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fc44b4dd24dab2f9fcf2c4e949610f432c665824",
          "body": "…#195) (#202)\n\nA terminal close passing with a hedged verdict (met_locally/partially_met/\nnot_met) previously ended in a split state: the driver reverted PLAN.md to\nactive but left the roadmap row done when the agent's close ceremony had\nflipped both. The two surfaces then disagreed about feature co\n[…]\n — a blocked WU's\ngit reset would revert the roadmap anyway and mask a broken revert path.\n\nCloses #195.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): evaluate close verdict before any terminal surface write (…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T23:03:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d2042c619bceb96aa11c58a067673a4b0a8376b4",
          "body": "Move the FEAT-2026-0032 (Non-WSL Windows execution) detail section from\nroadmap.md to roadmap-archive.md now that the feature is done, per the\nroadmap-archive convention: anchor `<a id=\"feat-2026-0032\"></a>` +\nheading in the archive (inserted newest-first, before 0031), Detail cell\nin roadmap.md rep\n[…]\nt-2026-0032)`.\nStale \"Status: planned.\" in the moved section corrected to \"Status: done.\".\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(roadmap): archive FEAT-2026-0032 detail (done) (#197)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T12:26:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "99523f7deb4a7a88eff9279d0b3ff7b0f332f944",
          "body": "…ct (#196)\n\nClose-out bookkeeping for FEAT-2026-0032 (Non-WSL Windows execution).\nThe feature's code merged to main via #155; all 11 WUs are done and the\nterminal close ran (verdict: partially_met), but the terminal flips never\nfired because the verdict was not `met` — so gate 2 stayed\nawaiting_revi\n[…]\nerged (#155); the stale\npre-squash branch feat/FEAT-2026-0032-windows-native is redundant.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(FEAT-2026-0032): finalize — accept partially_met terminal verdi…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T12:21:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "17fbedb489feadaf9174a159a6a740fd467b3149",
          "body": "…d) (#194)\n\nParks the multi-components-in-one-repo evolution: an optional per-feature\n`component:` selector + per-gate cwd/component tags so one repo can host\nN deliverables without splitting the tree, keeping .specfuse/ at repo root\n(one lock, one roadmap). Backward-compatible (selector defaults to\n[…]\nmigration. Records the rejected\nmultiple-.specfuse/-dirs approach and the promote-trigger.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(roadmap): add FEAT-2026-0033 sub-repo component scoping (deferre…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T01:21:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c32aa15109d1a42ca4647c99df207b51cfc9ab35",
          "body": "Ships two auto-close hollow-pass fixes landed since 0.3.19:\n- #189 (#191): per-WU auto_close_disabled opt-out for substantive closes.\n- #190 (#192): auto-close verifies declared deliverables exist, not just\n  that a WU reported done.\n\nBumps the five version surfaces in step.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.20 (#193)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T23:27:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cf2bd68b3efc813997fc0e674560e84afffd0b40",
          "body": "…done (#192)\n\nCloses #190. The auto-close predicate keyed on cost, plan-conformance,\nand no escalations, trusting each implementation WU's `done` status — it\nnever verified the WU produced what it declared. So a WU that reported\n`done` with its `produces:` paths absent from the tree still read as a\n\n[…]\n suite (1244 tests) passes; ruff clean; bandit 0 medium+;\n  coverage 93%; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): auto-close verifies declared deliverables exist, not just …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T23:25:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3c019e6a0ff6420407c60b48bbc8318cbd99d163",
          "body": "… (#191)\n\nCloses #189. The auto-close predicate keys on the implementation WUs'\ncost and plan-conformance; it has no signal for what the CLOSE WU itself\nis contracted to verify. A close whose acceptance criteria assert on the\nsource tree, reconcile prior gates, or observe runtime behaviour is, to\nth\n[…]\nruff clean; bandit 0 medium+;\n  coverage 93%; leak-scan clean; scaffold drift guard green.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(loop): per-WU auto_close_disabled opt-out for substantive closes…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T22:58:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b1fb38a8dbcc036d2f41efab16dfa34bcc850afd",
          "body": "Ships four fixes landed since 0.3.18:\n- #182 (#184): files_changed_mismatch — (no diff)/(missing) labels,\n  populated failure_class/signature/excerpt, actionable retry guidance.\n- #183 (#186): honour deferred feature status — refuse explicit dispatch.\n- #185 (#187): linter validates feature/gate sta\n[…]\nSION,\nspecfuse/loop/data/VERSION, pyproject.toml, the plugin manifest, and\nDRIVER_VERSION.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.19 (#188)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T19:45:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "46becf781f6b4d0b9472e27bcca670de8afb93a7",
          "body": "…abulary (#187)\n\nCloses #185. The linter already validated WU type and WU status against\nfixed enums, but not FEATURE status (PLAN.md) or GATE status — so a value\nthe driver does not recognize passed lint clean and then behaved\ndifferently at dispatch. That is the class #183 exposed: `status:\ndeferr\n[…]\n suite (1237 tests) passes; ruff clean; bandit 0 medium+;\n  coverage 93%; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(lint): validate feature and gate status against the driver's voc…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T19:43:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0045601266d11b7bf36a19253952f6298835f816",
          "body": "…(#186)\n\nCloses #183. The gate-status skill, the PLAN template, methodology.md,\nand the roadmap template all document `deferred` as a parked,\nnon-dispatchable status. The driver dispatched it anyway: find_feature's\nexplicit `--feature` branch returned any dir with a PLAN.md with no\nstatus check, so \n[…]\n suite (1234 tests) passes; ruff clean; bandit 0 medium+;\n  coverage 93%; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): honour deferred feature status — refuse explicit dispatch …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T19:27:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "428e75c2f3c803be4d46c0afe617f47bc3771a91",
          "body": "… (#184)\n\nCloses #182. The files_changed guard is correct to reject an attempt that\nclaims to have edited a file it did not touch, but three things around a\nlegitimate rejection made it hard to act on and cost a WU three attempts\n(~$11) before escalating.\n\nP1 — accurate path labels. The rejection no\n[…]\n suite (1232 tests) passes; ruff clean; bandit 0 medium+;\n  coverage 93%; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): diagnosable, convergable files_changed_mismatch rejections…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T19:17:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2af72fd62116615211555a51b61db0c4efb3114d",
          "body": "Ships seven fixes landed since 0.3.17:\n- #167 (#169): non-informative failure signatures no longer false-fire\n  spinning_signature_repeat.\n- #168 (#171): rejected-attempt verify output + diff persisted before reset.\n- #166 (#170): fixture disables commit signing (trustworthy local gates).\n- #165 (#1\n[…]\nSION,\nspecfuse/loop/data/VERSION, pyproject.toml, the plugin manifest, and\nDRIVER_VERSION.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.18 (#181)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T14:48:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca7ecaa5bca0c7ea4e7871505ca632ec7e4c3b22",
          "body": "…s #176) (#180)\n\n* fix(loop): accept explicit YAML null and diagnose bad frontmatter by path\n\nCloses #177. `key: null` (and `~`/`Null`/`NULL`) is valid YAML, but\n_miniyaml raised on it, and the error surfaced as an unhandled traceback\ninside find_feature — so a malformed marker in one (possibly comp\n[…]\nrd green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(lint): warn when a WU omits an opt-in must-reference gate (close…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T13:28:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4668b86b7a59c833178f470f21d20eab3cddba4e",
          "body": "…path (#179)\n\nCloses #177. `key: null` (and `~`/`Null`/`NULL`) is valid YAML, but\n_miniyaml raised on it, and the error surfaced as an unhandled traceback\ninside find_feature — so a malformed marker in one (possibly completed,\nunrelated) feature's PLAN.md crashed dispatch of a DIFFERENT feature,\nwit\n[…]\n\n  _miniyaml 100% coverage; ruff clean; bandit 0 medium+; coverage 93%;\n  leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): accept explicit YAML null and diagnose bad frontmatter by …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T12:22:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "82c267f0ff5020a8444e6bf7c8d383e424acfcf0",
          "body": "Closes #175. When a gate's remediation is a command over the attempt's\nown output (formatters, linters), the retry cycle could not converge:\nthe driver discards the failed attempt's work, then re-dispatches with\nthe raw gate output attached — output that names files the reset already\nremoved and rea\n[…]\n suite (1218 tests) passes; ruff clean; bandit 0 medium+;\n  coverage 93%; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): make mechanical gate failures learnable across retries (#178)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T12:13:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "92fa9bacb7f430aa8a40264376aaf64e0c21763e",
          "body": "Ships four fixes landed since 0.3.16:\n- #167 (PR #169): non-informative failure signatures (bare fences,\n  whitespace, ANSI) no longer false-fire spinning_signature_repeat.\n- #168 (PR #171): rejected-attempt verify output + working-tree diff are\n  persisted to work/<wu>/attempt-N.md before git reset\n[…]\nSION,\nspecfuse/loop/data/VERSION, pyproject.toml, the plugin manifest, and\nDRIVER_VERSION.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.17 (#173)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-20T19:47:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "83990e3301026e228ab89c779241c61c9c40ca58",
          "body": "…grade (closes #165) (#172)\n\n* fix(loop): persist rejected-attempt evidence before git reset on block\n\nCloses #168. Only the exhausted-attempts `for-else` path wrote\nper-attempt notes to work/<wu>/attempt-N.md; the earlier\n`spinning_signature_repeat` halt reset the tree and committed\nbookkeeping WIT\n[…]\nan clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(scaffold): warn on unmanaged legacy scripts/ or skills/ during up…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-20T19:37:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e2afaffe02a27f8f539667a504c09d492725dbd8",
          "body": "…k (#171)\n\nCloses #168. Only the exhausted-attempts `for-else` path wrote\nper-attempt notes to work/<wu>/attempt-N.md; the earlier\n`spinning_signature_repeat` halt reset the tree and committed\nbookkeeping WITHOUT persisting anything. And neither path captured the\nrejected working-tree diff — only a \n[…]\n8 tests) passes; ruff clean; bandit 0 medium+;\n  coverage 93% (floor 90); leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): persist rejected-attempt evidence before git reset on bloc…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-20T19:24:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "39e7079ab686e0a9890327fec6963e499168e811",
          "body": "…e (#170)\n\nCloses #166. TestUntrackedPathsHelper.setUp created a git repo and\ncommitted without disabling commit signing. When the operator's global\nconfig enables SSH commit signing (commit.gpgsign=true, gpg.format=ssh)\nand no SSH agent socket is available — e.g. a sandboxed session — the\nfixture's\n[…]\nover -s tests` now passes with no\n  errors under SSH signing enabled; previously 3 errors.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(loop): disable commit signing in TestUntrackedPathsHelper fixtur…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-20T19:16:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "05175075d8adc9d0e409cb1b018fea2b9030b575",
          "body": "…(#169)\n\nCloses #167. `parse_gate_failure_signature`'s per-gate `_SIG_PATTERNS`\nare Python-toolchain-specific (unittest `FAIL: test_*`, ruff codes,\nbandit `B\\d+`, `.py` coverage rows). A non-Python gate — e.g. a\nTypeScript `tests` gate — matches none, so extraction fell through to\n\"first non-empty l\n[…]\n6 tests in the touched file pass; ruff clean; bandit 0 medium+;\n  coverage 93% (floor 90).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): don't spin-escalate on non-informative failure signatures …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-20T19:09:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "459679b384756a39203c8f397813b81137529f75",
          "body": "Ships the #162 fix (PR #163): `reset_preserving_events` now clears the\nfailed attempt's untracked output, closing the path where attempt N+1\ncould pass on attempt N's leftovers without writing anything.\n\nBumps the five version surfaces in step: .specfuse/VERSION,\nspecfuse/loop/data/VERSION, pyproject.toml, the plugin manifest, and\nDRIVER_VERSION.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.16 (#164)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-19T18:07:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cb132138a5498d60d6bcdd5b00b48651cfcdaac9",
          "body": "Closes #162. `reset_preserving_events` performed a bare `git reset --hard\nhead_before`, which rolls back tracked content but leaves untracked files\non disk. Because `untracked_before` is snapshotted once per WU (loop.py\n:3767) while the attempt loop runs beneath it (:3827), a failed attempt's\nnewly-\n[…]\nxtures omit git user.email, so `git commit` exits 128\n  locally where CI has an identity).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): clear the attempt's untracked output on reset (#163)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-19T17:55:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b02726d090de91918624455494a1be00215e15f3",
          "body": "* chore(loop): sync scaffold to 0.2.0\n\n* chore(release): bump specfuse-loop to 0.3.15\n\nSince 0.3.14:\n- FEAT-2026-0032: native Windows execution (no WSL) via Git-Bash (#155)\n- fix: core.hooksPath conflict — consolidate git hooks (#154, closes #153)\n- fix(loop): internal driver commits use --no-verify\n[…]\nat break.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.15 (#160)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T21:34:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f53e42eacba311986c60da93d8e171bba6809f76",
          "body": "… (#159)\n\nCloses #157. When the auto-close predicate fires, the driver marks the\nclose/close-intermediate WU done and writes a short stub retrospective WITHOUT\ndispatching the WU body — so the mandatory `## What the loop did NOT verify`\ndeferral list (the methodology's artifact-vs-real-state honesty\n[…]\nproof: both fail on HEAD.\n\nVerification: full suite OK; coverage 93%; ruff + bandit clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): auto-close stubs flag the deferred-verification gap (#157)…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T21:32:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eee5c94b169cb99315e3be1224e3c017ced8f430",
          "body": "Closes #156. The driver's squash_commit, commit_bookkeeping, and the --prepare\nscaffold commit ran `git commit` WITHOUT --no-verify, so the active\ncore.hooksPath pre-commit hook (leak_scan.py --staged, which includes the\nstructural regexes) ran on every internal driver commit. An agent-authored WU\nd\n[…]\nage 93%; ruff + bandit clean. Red proof: the\ntwo bypass tests fail on HEAD before the fix.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): commit internal driver commits with --no-verify (#156) (#158)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T21:24:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "91c1d53f5c13417d2a975d930351a73b2c1bc9ac",
          "body": "…(#155)\n\n* chore: scaffold feature FEAT-2026-0032 (native Windows execution)\n\nGate-cycle scaffold for FEAT-2026-0032 — PLAN, gates, gate-1 WUs, and the\ngate-2 terminal close placeholder. Roadmap row flipped to active.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n* feat: Mak\n[…]\nrunnable.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "FEAT-2026-0032: Non-WSL Windows execution (native driver + Git-Bash) …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T19:54:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7949f7360f80928183d9f5c0107ac0fdd7dfd638",
          "body": "Closes #153. core.hooksPath is single-valued, but scripts/install-hooks.sh\nset it to .githooks (pre-push / smoke-test) while scripts/setup.sh set it to\n.specfuse/hooks (pre-commit / leak-scan). The two dirs held disjoint hook\ntypes, so whichever installer ran last silently disabled the other's hook \n[…]\n prose in CONTRIBUTING that leak_scan.py --all\n  (the CI backstop) allows; --all is clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hooks): consolidate git hooks under one core.hooksPath dir (#154)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T15:31:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6e1b78dec42dc77b08a5b7ae05b00b69d1cc885c",
          "body": "One feature and two driver fixes since 0.3.13.\n\nFEAT-2026-0031 — configurable integration branch (#148). A feature can declare\n`base:` once in PLAN.md frontmatter; branch creation, the staleness guard, and\nPR creation all resolve it. Unblocks teams working off a long-lived integration\nor release bra\n[…]\n tool covers four of the five). MIN_SCAFFOLD_VERSION untouched — no\nscaffold-format break.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.14 (#152)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T14:29:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "77fa8602a9623351fb7e4714ab7f1b9e3b0e96bf",
          "body": "…es (#151)\n\nCloses #150. `squash_commit` staged the whole tree with `git add -A`, while\nthe dirty-tree guard (`_tracked_dirty_paths`) deliberately ignores untracked\nfiles on the premise — stated in its own docstring — that they \"carry\nharmlessly\". They did not: `add -A` committed them. Any untracked\n[…]\n before the fix, 14 exposed after)\n- ruff clean; bandit no issues; coverage 93% (floor 90)\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): squash_commit no longer absorbs pre-existing untracked fil…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T14:19:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5b02b6c2349a859b4ff066fc0c66a99653bfdd91",
          "body": "…l config) (#149)\n\nBoth are operator WIP for a different agent harness, not part of this repo's\nscaffold. Neither should ever be committed here.\n\nPreventive: untracked files are invisible to the driver's dirty-tree guard\n(`_expected_flip_paths` / `_tracked_dirty_paths` inspect TRACKED paths only),\nb\n[…]\ner than guard\ninspection — remains unfiled and will still absorb any other untracked file.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(gitignore): ignore AGENTS.md and .codex/ (other harnesses' loca…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T13:39:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f0af2e5f16c65c96e9c31b1650a3e25a11ed16f5",
          "body": "… frontmatter) (#148)\n\n* chore: scaffold feature FEAT-2026-0031\n\n* feat: Add the `base` frontmatter key and the base resolver\n\nFeature: FEAT-2026-0031/T01\n\n* feat: Cut the feature branch from the resolved base and re-anchor the staleness guard\n\nFeature: FEAT-2026-0031/T02\n\n* feat: Target the PR at t\n[…]\n finding.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "FEAT-2026-0031: configurable integration branch (base: key in PLAN.md…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T13:37:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "66210049e88a117ae0f03a6d7e49a2099a952dea",
          "body": "* chore(loop): sync scaffold to 0.2.0\n\n* chore(release): bump specfuse-loop to 0.3.13\n\nShips #146 (closes #145): a close WU's own failed attempt no longer arms the\nfailure-class-breakdown guard against the RETROSPECTIVE it authors, so a gate\nwhose substantive WUs all passed no longer spins to blocke\n[…]\ned table.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.13 (#147)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-12T13:29:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3b719a844c1e938664633c953eb12ec55ac448bd",
          "body": "…d against it (closes #145) (#146)\n\nCloses #145. `assert_failure_class_breakdown_when_failures_present` counted ALL\nnon-passing attempts in the gate — including the close WU's own. Because the\nclose WU is the one authoring the RETROSPECTIVE the guard inspects, its malformed\nfirst attempt retroactive\n[…]\nfication:\n- 1124 tests pass; ruff clean; bandit -ll exit 0; coverage 93%; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): a close WU's own failure no longer arms the breakdown guar…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-12T13:24:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "078965d03230606e50c3362ce5d467600f3e3b80",
          "body": "* chore(loop): sync scaffold to 0.2.0\n\n* chore(release): bump specfuse-loop to 0.3.12\n\nShips #143: auto_sync's scaffold upgrade no longer poisons the same run's\n--prepare. The overlay is committed on a non-default branch (clean tree) or\ncarried onto the feature branch on the default branch; --prepar\n[…]\nraceback.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.12 (#144)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-09T16:17:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dcc3046a639f7a8d534a9e2bd503fac1dc9e38e9",
          "body": "…n's --prepare (#143)\n\n`specfuse-loop --prepare` crashed with a FeatureBranchError traceback whenever\nthe installed scaffold was newer than the project's: auto_sync overlays the new\nscaffold (dirtying .specfuse/VERSION, .scaffold-manifest, docs/, templates/) and\nleft it uncommitted, then ensure_feat\n[…]\nfication:\n- 1119 tests pass; ruff clean; bandit -ll exit 0; coverage 93%; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): auto_sync's scaffold upgrade no longer poisons the same ru…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-09T16:15:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a1fb775b6c821a20cb0bbea11da7fed3e0b1e330",
          "body": "Ships #141 (closes #140): resolves two vendored-scaffold doc defects that\ntrip IntelliJ Markdown inspections — broken `../methodology.md` relative\nlinks in docs/concepts/, and a \"Bad character\" em-dash in WU.template.md.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.11 (#142)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-09T15:19:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4d9ea924a2cd3ccc70e6e254d17383e4ae428384",
          "body": "…nspections (closes #140) (#141)\n\nCloses #140. Vendored scaffold docs carried two genuine defects that\nIntelliJ Markdown inspections flag after `init`. (1) Three links to\n`methodology.md` from `docs/concepts/*.md` used a same-directory path,\nbut `methodology.md` lives one level up in `docs/` — the l\n[…]\nfication:\n- 1112 tests pass; ruff clean; bandit -ll exit 0; coverage 93%; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(docs): resolve scaffold doc/template defects that trip Markdown i…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-09T15:17:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5151173c10bb4ca703efdeb1ea183250d50641ae",
          "body": "Ships two loop-driver changes merged since 0.3.9:\n- fix(loop): verify() fails a gate whose oracle silently degraded — a\n  green gate whose analyzer measured a subset of the real check (e.g.\n  flutter analyze dropping custom_lint when the plugin can't load in the\n  sandbox) is now an honest FAIL, not\n[…]\n WU title as a summary line\n  so the log says what each unit does, not just its id (#138).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.10 (#139)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-06T11:33:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca841b36fade906060fd3fbd907f5310071ec2b2",
          "body": "The dispatch header showed only the WU id, type, model, and effort:\n  [07:13:49] -- FEAT-2026-0055/G3-CLOSE [close] model=opus effort=high\nso the log said which unit ran but not what it does. Print the WU's\ntitle beneath it:\n  [07:13:49] -- FEAT-2026-0055/G3-CLOSE [close] model=opus effort=high\n    \n[…]\ne id (the parse default for a WU\nwith no `# Title` heading), so no redundant line appears.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(loop): print the WU title as a dispatch summary line (#138)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-06T11:30:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7948c526ff42a836de05e157d9de096bf78c9202",
          "body": "…34) (#137)\n\nCloses #134. A gate command could exit 0 while its analyzer measured a\nstrict subset of the real check, so verify() — which trusts only the exit\ncode — certified a hollow pass. Observed: `flutter analyze --fatal-warnings`\ncannot build a custom_lint plugin in the loop sandbox (pub.dev bl\n[…]\nVerification:\n- 1110 tests pass; ruff clean; bandit -ll exit 0; coverage 93% (>=90 floor).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): fail the gate when its oracle silently degraded (closes #1…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-06T11:29:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "17baaef54a7992f5e187315e2f8c8ba969fcd63e",
          "body": "Ships the #16 fix — roadmap-add/draft-feature next-ID scan now includes source (d):\nGitHub issue/PR-reserved FEAT IDs (#135), so a plugin release carries it to the\nmarketplace. The notify-marketplace dispatch wiring (#133) also becomes active.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.9 (#136)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-06T03:10:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "69166a0d5dadce90c445f2ffe465a3b6d03f6f1b",
          "body": "…rce d) (#135)\n\nFixes specfuse/specfuse#16. roadmap-add's next-ID scan (reused by draft-feature)\ncomputed the next FEAT-YYYY-NNNN from three LOCAL sources only — roadmap table,\nPLAN.md, LEARNINGS/RETROSPECTIVE — and never inspected GitHub. Teams also reserve\nFEAT IDs directly on issue/PR titles that\n[…]\n% (floor 90);\n  leak-scan + all bats green. Canonical skill == vendored copy (diff clean).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(skills): next-ID scan adds GitHub issue/PR-reserved FEAT IDs (sou…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-05T18:52:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d7ca095b25e97c72435dc2e3ed5162fda14e8a66",
          "body": "…133)\n\nAdd a notify-marketplace job mirroring the orchestrator's: after a successful\nPyPI publish on a v* tag, fire a plugin-release repository_dispatch to\nspecfuse/specfuse with {plugin: specfuse, version}. Completes the auto-publish\ntrigger for this plugin. No-ops if MARKETPLACE_DISPATCH_TOKEN is unset.\n\nRefs #23.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci(release): dispatch marketplace publish after PyPI release (#23) (#…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-05T15:39:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fd0c8096979aad4d11e7372e2ac4df145b7f942b",
          "body": "* chore(release): bump specfuse-loop to 0.3.8\n\nRelease capturing the canonical plugins/specfuse/ layout (loop restructure #131):\nthe gate-cycle plugin now lives at plugins/specfuse/ as the single source, with\n.specfuse/skills/ vendored from it. Cutting this release publishes plugins/specfuse/\nunder \n[…]\nee; the initial commit only bumped pyproject. Re-sync via\nthe canonical helper.\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.8 (#132)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-05T14:41:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e40908405dcf2268ee9e700bcfbcbcff426f8795",
          "body": "…fuse/skills/ from it (#131)\n\nAligns the loop with the marketplace's uniform plugins/<name>/ sourcing model\n(specfuse/specfuse docs/plan-unify-plugin-sourcing.md). Previously the loop was\nthe odd one out: its gate-cycle skills lived only in .specfuse/skills/ and were\npushed OUTBOUND to the umbrella \n[…]\nce (only canonical + vendored;\n  .agents/skills is the unrelated external caveman plugin).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(loop): make plugins/specfuse/ the canonical plugin; vendor .spec…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-05T14:35:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "45725f8584d1e8d16da17894d31024c236eea790",
          "body": "…-repo path dep (#130)\n\n* feat(loop): vendor shared substrate from methodology core; drop cross-repo path dep\n\nRepoints the loop to a single source of truth for the shared Specfuse substrate.\n\nvalidate_event.py previously resolved the event schema from an absolute\ncross-repo path (orchestrator/share\n[…]\nng links.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(loop): vendor shared substrate from methodology core; drop cross…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-05T00:24:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9375f57b6cefff0c8b89378ed341c93713e1f0ef",
          "body": "…x (#129)\n\nFollow-up to #127. When the terminal-close invariant finds no roadmap row for\nthe feature, the message now points at the recovery — restore the row and\nre-commit, and dispatch via `specfuse-loop --prepare` so the row is folded into\nthe scaffold commit and survives the per-attempt reset — \n[…]\nnd names --prepare.\n\nVerification:\n- 1095 tests pass; ruff clean; coverage 93% (floor 90).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(loop): terminal-close roadmap_row_not_done message names the fi…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T23:36:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3f8e9d40f703a573a5089eb9b14c7fee4fabb456",
          "body": "…old commit (#128)\n\nCloses #127. /draft-feature writes the feature folder AND a roadmap row but\nruns no git, so at dispatch time the roadmap edit is an uncommitted working-tree\nchange. prepare_feature staged only the feature folder in its `chore: scaffold`\ncommit, leaving the roadmap row dirty. The \n[…]\n% (floor 90);\n  leak-scan clean; leak-scan-hook / sync-scaffold / init-sh-shim bats green.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): --prepare folds the uncommitted roadmap row into the scaff…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T21:13:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "65945dd905cb19c48286ce2ea2c8491c0ba9b78e",
          "body": "…on (#125)\n\nBumps all four version sources to 0.3.7 (via scripts/bump_version.py).\n\nShipped driver change since v0.3.6:\n- feat(loop): `_redact_home_paths` at the `flush_events` chokepoint redacts\n  absolute home-directory paths (macOS /Users/<x>/, Linux /home/<x>/) from\n  every event-payload string \n[…]\nship via the plugin / repo-internal scripts;\ntest + CI hardening (#120, #121) is dev-only.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): 0.3.7 — driver-side events.jsonl home-path sanitizati…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T19:24:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "92c395b5ad1e2ee16a7471441b5beae587859985",
          "body": "…e (#124)\n\nA multi-gate feature drafted with every later gate's `work_units` empty\nfails `lint_plan.py`: the linter treats the last NON-EMPTY gate as\nterminal, so with gates 2..N empty, gate 1 is misread as terminal and its\n`close-intermediate → plan-next` sequence is rejected\n(\"terminal gate must u\n[…]\n (skill markdown); lower-risk than relaxing the\nlinter's terminal detection.\n\nCloses #120.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(#120): draft-feature — pre-declare the final gate's terminal clos…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T19:09:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ba6c35a8b7ff5dfbefa7106c581e2f62655fcf17",
          "body": "…I (#123)\n\ntests/init_skills_idempotent.bats tests 1 & 2 asserted `init.sh` deploys\n`.specfuse/skills/` into a target. That has been false — and the tests\nsilently red — since FEAT-2026-0026 made init.sh a thin shim to\n`specfuse init` and skill delivery moved to the Claude Code plugin\n(docs/getting-\n[…]\niver gate set\n  (.specfuse/verification.yml) so it can't rot silently again.\n\nCloses #121.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(#121): retire stale init-skills bats tests + wire the file into C…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T19:08:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8d952566eb645c2f5c3c360603322b925dccce94",
          "body": "* feat: LEARNINGS entry parser + stdlib BM25 ranker\n\nFeature: FEAT-2026-0025/T01\n\n* feat: CLI wrapper + load-whole threshold fallback\n\nFeature: FEAT-2026-0025/T02\n\n* chore(loop): FEAT-2026-0025/G1-CLOSE-INTERMEDIATE auto-closed (predicate=v1)\n\nFeature: FEAT-2026-0025\n\n* feat: Gate 1 plan-next — draf\n[…]\n\n* chore(loop): FEAT-2026-0025/G2-CLOSE terminal flips\n\nFeature: FEAT-2026-0025\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(FEAT-2026-0025): LEARNINGS indexed retrieval (#122)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T19:01:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0ef64229b8c19d393eb3553a026f6ce2aecdd3c4",
          "body": "Dispatchable 2-gate feature folder for goal (4) of roadmap FEAT-2026-0025\n(active): indexed retrieval over LEARNINGS.md so planning consumers load\nonly the relevant slice, not the whole ~1700-line file. Autonomy review.\n\nScope pinned in PLAN: goals 1-3 (the /learnings-curate skill + rule\npromotion) \n[…]\nno-verify\n(WU prose references path-shaped examples the structural pre-commit hook flags).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(feature): draft FEAT-2026-0025 — LEARNINGS indexed retrieval (#119)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T16:57:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eb0be9d51463de0a14408e212acfef074455e93c",
          "body": "…al (#118)\n\nFlip status planned -> active via /pick-feature. Roadmap row only (no\nfolder) — /draft-feature next. Sole remaining planned item. Draft-time\nnote: a /learnings-curate skill already exists; scope-check built vs\nstill-needed (archive file + curation moves + rule promotion) first.\n\nCo-authored-by: Test <test@example.com>",
          "is_bot": false,
          "headline": "chore(roadmap): activate FEAT-2026-0025 — LEARNINGS curation + archiv…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T16:33:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d9c33089b5eb19ca13178cda7b51e5a6bdd0280",
          "body": "… (#117)\n\n* feat: Redact absolute home paths from event payloads at the flush chokepoint\n\nFeature: FEAT-2026-0030/T01\n\n* chore(loop): FEAT-2026-0030/G1-CLOSE auto-closed (predicate=v1)\n\nFeature: FEAT-2026-0030\n\n* chore(loop): gate 1 awaiting_review\n\nFeature: FEAT-2026-0030\n\n* chore(loop): FEAT-2026-\n[…]\noad scan.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(FEAT-2026-0030): driver-side events.jsonl home-path sanitization…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T16:31:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "769f5d6e6d23d311b891f3acba65c415aa3ca8e0",
          "body": "T01 as originally drafted would halt the gate on its own commit: the driver\ncommits WU work through the pre-commit structural leak-scan (no --no-verify),\nwhich flags /Users/<seg>/ anywhere in the staged diff. A naive redaction regex\n(r\"/Users/[^/\\s]+/\" self-matches) or a literal home-path test fixtu\n[…]\nt example de-literalised.\n\nCommitted --no-verify (WU prose documents the flagged pattern).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(FEAT-2026-0030): add commit-safe-source constraint to T01 (#116)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T15:34:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "05e8bf6bdd7d8acbf1c585109b687e2fdd4206a5",
          "body": "…tion (#115)\n\nDispatchable feature folder for the driver-side events.jsonl sanitize fix\n(roadmap FEAT-2026-0030, active). Single gate, terminal close, autonomy auto.\n\nGate 1:\n- T01: add driver-local `_redact_home_paths` applied at `flush_events`\n  (loop.py) — recursively redact absolute home paths f\n[…]\nylist) + payload\nscan, both of which pass. Lint clean; dry-run dispatches T01 -> G1-CLOSE.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(feature): draft FEAT-2026-0030 — events.jsonl home-path sanitiza…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T14:14:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7088631635cd69f51779f766701635d659e4e028",
          "body": "…ation (#114)\n\nFlip status planned -> active via /pick-feature. Roadmap row only (no\nfolder yet) — /draft-feature next. Directly de-risks the loop halts hit\nrepeatedly during FEAT-2026-0029 (agent-authored paths in blocked-reason\nnotes tripping the pre-commit leak-scan).\n\nCo-authored-by: Test <test@example.com>",
          "is_bot": false,
          "headline": "chore(roadmap): activate FEAT-2026-0030 — driver events.jsonl sanitiz…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T13:21:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e8eea81a03df04efbddd25554a536b0284a183a",
          "body": "* chore(loop): bookkeeping for FEAT-2026-0029/T01 attempt (blocked)\n\nDriver-staged gate/WU status flips + events.jsonl audit for the T01\nattempt that escalated blocked_human. Absolute local paths in the\nagent's blocked_reason were redacted before commit so the repo leak-scan\npasses (issue #76 patter\n[…]\n\n* chore(loop): FEAT-2026-0029/G1-CLOSE terminal flips\n\nFeature: FEAT-2026-0029\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(FEAT-2026-0029): one-command scaffold-upgrade skill (#113)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T12:47:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "73555d3f0573977036b8d96d8eba88691e63dcc9",
          "body": "…tion (#112)\n\nPlanned driver-hardening feature. The loop writes agent-authored free-text\n(blocked reasons, failure notes) into events.jsonl then stages/commits it;\nwhen that text contains a token the structural leak-scan flags (e.g. an\nabsolute home-directory path the agent mentioned), the pre-commi\n[…]\nptured FINDINGS. Fix: one driver-side sanitization chokepoint\nbefore events.jsonl staging.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(roadmap): add FEAT-2026-0030 — driver-side events.jsonl sanitiza…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T01:13:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "31e57181b388f941fdc60cd21c63d22b9408efe5",
          "body": "Flip status planned -> active on the roadmap row and PLAN.md frontmatter.\nPick-feature selection; the feature's gate-1 folder is already drafted and\nlint-clean, so it is dispatchable via loop.py.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(roadmap): activate FEAT-2026-0029 — scaffold-upgrade skill (#111)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T00:33:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c04f62159fb729c71f7dbb2c24e36eb6e3599be5",
          "body": "Dispatchable feature folder for the one-command scaffold-upgrade skill\n(roadmap FEAT-2026-0029). Single gate, terminal close, autonomy review,\nstatus planned.\n\nGate 1 work units:\n- T01: merge-safety gate helper (.specfuse/scripts/upgrade_merge_gate.py)\n  — decide(ci, health_report) -> merge/halt; re\n[…]\nepo is operator-verified).\n\nLint clean (0 warns); dry-run dispatches T01→T02→T03→G1-CLOSE.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(feature): draft FEAT-2026-0029 — scaffold-upgrade skill (#110)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-03T23:49:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "caf58c533311fc55cc94ce1c69497814b0aaf150",
          "body": "…l (#109)\n\nPlanned feature: a Claude Code skill that wraps the existing\n`specfuse upgrade [--dry-run]` CLI in the git choreography humans repeat\nby hand — dry-run reports what would change; live mode branches off fresh\norigin/main, runs the upgrade, commits, pushes, opens a PR, and merges.\n\nMerge is\n[…]\nnversion rather than landing a broken scaffold. Orchestration\nonly — no new upgrade logic.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(roadmap): add FEAT-2026-0029 — one-command scaffold upgrade skil…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-03T22:49:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "af6c79da73c73e046561ade75ebc6cdc12cef728",
          "body": "…tus (#108)\n\nBumps all four version sources to 0.3.6 (via scripts/bump_version.py).\n\nSince v0.3.5:\n- fix(loop): terminal-close invariant parses the roadmap row's status by\n  header name, not column position — no more false roadmap_row_not_done\n  escalation on tables with a Priority column (#104 / #1\n[…]\neckout v7, setup-python v6,\n  download-artifact v8, upload-artifact v7 (#91–#94). CI-only.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): 0.3.6 — roadmap-parser fix + first-class deferred sta…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-03T12:20:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2fab2aeea3aea318c48f4faac7f2d5ea193cd059",
          "body": "Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 7.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/v5...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifac\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/upload-artifact from 5 to 7 (#94)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-03T11:59:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fd0d5a81eedb9113d466873f2a88b5bd01c849f7",
          "body": "Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 5 to 8.\n- [Release notes](https://github.com/actions/download-artifact/releases)\n- [Commits](https://github.com/actions/download-artifact/compare/v5...v8)\n\n---\nupdated-dependencies:\n- dependency-name: actions/downlo\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/download-artifact from 5 to 8 (#92)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-03T11:55:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "27b44552e98b6de77b9e13ac3d56ea4fc5f86e8c",
          "body": "Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.\n- [Release notes](https://github.com/actions/setup-python/releases)\n- [Commits](https://github.com/actions/setup-python/compare/v5...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-python\n  dependency-\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/setup-python from 5 to 6 (#91)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-03T11:53:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "42983dadde27c833dc845803b80e56a81a606b9b",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v4...v7)\n\n---\nupdated-dependenc\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/checkout from 4 to 7 (#93)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-03T11:51:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fed659873a55a2dc9ad2019d06a240a9fd0e1a36",
          "body": "`deferred` was being used as a roadmap status in practice (two dogfood\nfeatures parked on external dependencies) but wasn't a recognized part\nof the status model — accepted as free text on the roadmap, disallowed\nin the PLAN.template legend, and unmodeled by pick-feature / gate-status.\n\nThe driver a\n[…]\nted, does not count as a second active, and is\nstill selectable by explicit --feature arg.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(status): first-class `deferred` roadmap/PLAN status (#106) (#107)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-03T10:53:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "385dee48a90ceaf487a203f792d0231f4fe8b06f",
          "body": "…(#104) (#105)\n\nassert_terminal_flips_fired read the roadmap row's status by column\nposition (regex group(2) == 3rd column), assuming the canonical shape\n`| ID | Title | Status | ... |`. A project whose roadmap table has an\nextra column before Status (e.g. `Priority`) shifted Status to column 4,\nso \n[…]\nrity column present, and\nfail-still-reports-the-real-Status-cell (not the Priority token).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): header-name roadmap-row parse in terminal-close invariant …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-02T12:01:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4978397c8c8e68d4c1a5013f9ef8afd27c597b80",
          "body": "…== '—' (#103)\n\nCloses #102. `/roadmap-archive --auto` collected only `done`/`abandoned` rows\nwhose `Detail` cell was exactly `—`. A done feature whose `Detail` holds a\nfolder path (e.g. `features/FEAT-…/`, an older convention) was silently\nskipped even when it still carried an inline `## FEAT-… —` \n[…]\nder-path rows.\n\nThe skill is synced to the specfuse/specfuse plugin in a companion commit.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(roadmap-archive): --auto eligibility by inline prose, not Detail …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-26T19:56:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "90ab67be48854e0c9ec6ad838e7e972a78016d3f",
          "body": "…(#101)\n\nCloses #100. The plan-next hook imported lint_plan_next_draft with a flat\ntop-level import that only resolved when the scripts were copied side-by-side\n(pre-pip). In the installed package it raised `No module named 'lint_plan'`, so\nthe plan-next gate logged `WARN (plan-next-draft lint): … N\n[…]\nr from outside the repo root.\n\nVerification: 1050 tests pass; ruff clean; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): package-relative import for the plan-next-draft lint hook …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-25T02:19:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "38e227a51f9bbc7cb15383ea1813c9b9913bc9a8",
          "body": "- `--prepare-only`: like --prepare (create the feature branch + commit the\n  folder) but STOPS afterwards without dispatching, so you can review the\n  commit before the loop runs. `--prepare` still prepares-then-runs.\n- ensure_feature_branch's diverged-branch refusal now prints the three concrete\n  \n[…]\nonly.\n\nBumped 0.3.3 -> 0.3.4.\n\nVerification: 1048 tests pass; ruff clean; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(loop): --prepare-only + actionable diverged-branch message (#99)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-24T14:49:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c4c57987a80291c18a3efcfc8ec7e89ce8ca0bd8",
          "body": "… (#98)\n\nAfter /draft-feature (which writes the feature folder but neither commits nor\nswitches branches), running specfuse-loop refused to start (#71/#74 guards) and\nthe suggested fix was incomplete: it said `git add && commit` but, on the\ndefault branch, you must FIRST create the feature's branch \n[…]\nxisting projects on next run.\n\nVerification: 1047 tests pass; ruff clean; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(loop): --prepare creates the feature branch + commits the folder…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-24T13:12:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "50825de22d39a1178a524660545e32725404440f",
          "body": "…er fix (#97)\n\nCarries two changes since 0.3.1:\n- #96 — the driver stamps resolved model / effort / gate_set / driver_version /\n  started_at into each WU's frontmatter at dispatch, so what a WU ran with is\n  visible in the .md (not only console / events.jsonl).\n- #95 — the feature templates (WU/PLAN\n[…]\nN_SCAFFOLD_VERSION stays 0.2.0.\n\nVerification: 1044 tests pass; version-consistency green.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): 0.3.2 — WU execution metadata + feature-template head…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-23T16:05:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "55fce1f75c241f8e5f101013419814cb36fd4a48",
          "body": "…dispatch (#96)\n\nA WU's `.md` showed what it cost (cost_usd, duration, tokens) but not what it\nran with: model/effort default-resolved at load and were never written, so you\nhad to know the type→default mapping (or read the console / events.jsonl) to\nsee them.\n\nThe driver now stamps five resolved fi\n[…]\neffort\noverride is preserved.\n\nVerification: 1044 tests pass; ruff clean; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(loop): stamp resolved execution metadata into WU frontmatter at …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-23T16:03:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "622621ddd6bdfcd2138332e95fb03bf5bef5db00",
          "body": "…mplates (#95)\n\nThe WU/PLAN/GATE templates carried a `<!-- Copyright 2026 Specfuse\nContributors / Licensed under the Apache License 2.0 -->` block after the\nfrontmatter, so every feature file `draft-feature` (or by-hand authoring)\ngenerated inherited it. Inside this repo that's fine, but in a downst\n[…]\nfuse, Apache-licensed); only newly-generated files change.\n\nVerification: 1042 tests pass.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(templates): drop hardcoded Specfuse/Apache header from feature te…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-23T15:34:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1d9c31f5990518910693f6da8460680a4a0c7ab7",
          "body": "Patch release carrying the new-project install/use fixes (PR #89): the shipped\nverification.yml plan-next gate now calls `specfuse-lint` (was a missing\n`.specfuse/scripts/lint_plan.py`); driver/lint/skills run-command hints use the\nconsole scripts; the roadmap seed ships the 5-column header `/roadma\n[…]\nN_SCAFFOLD_VERSION stays 0.2.0.\n\nVerification: 1042 tests pass; version-consistency green.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): 0.3.1 — fresh-project install/run fixes (#90)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-22T14:30:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "81dd55150b8b05b393c8da414479343af24f22ad",
          "body": "Four bugs hit when scaffolding a brand-new project from the published\npackages (none surfaced in-repo because this dogfood repo still carries the\nlegacy .specfuse/scripts/ shims):\n\n1. The shipped verification.yml `plannext` gate ran\n   `python .specfuse/scripts/lint_plan.py {feature_dir}` — a script\n[…]\nrows.\n\nVerification:\n- 1038 tests pass (4 new); ruff clean; bandit clean; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: make a fresh pip/pipx-installed project actually runnable (#89)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-22T14:23:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca6a670943cf34a0f0a863c007b27a640d80476e",
          "body": "…fuse-loop) (#88)\n\nThe user-facing docs still described the pre-pip flow — `./init.sh /path` to\ncopy a scaffold in, and `python .specfuse/scripts/loop.py` to run — which is\nwrong for anyone installing from PyPI: a `specfuse init`-scaffolded project has\nno `.specfuse/scripts/loop.py` (the driver is t\n[…]\nords.\n\nVerification:\n- 1038 tests pass (scaffold docs/data parity green); leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update install/run flow to pip + umbrella (specfuse init / spec…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-22T13:47:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b2c46f957195c0607aac23a8d8c6f147c434576f",
          "body": "The package version lives in four sources that must agree: pyproject\n[project] version, DRIVER_VERSION (loop.py), the canonical .specfuse/VERSION,\nand the synced specfuse/loop/data/VERSION seed. The 0.3.0 release required\nediting all four by hand; release.yml's tag/version-agreement check covers\nonl\n[…]\n a temp tree.\n\nVerification:\n- 1038 tests pass; ruff clean; bandit clean; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: guard version-source agreement + add bump helper (#87)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-22T13:02:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c88f41c55e5542b6e2718a52e3fe75fe9f416cb6",
          "body": "…2.0 (#86)\n\nMinor bump: v0.2.0..HEAD added new functionality, not just fixes.\n\nFeatures:\n- FEAT-2026-0026 — pip package ships the full scaffold (specfuse/loop/data/);\n  `specfuse init/upgrade`.\n- FEAT-2026-0027 — self-provisioning driver: auto-syncs .specfuse/ + plugin\n  config on run.\n- FEAT-2026-0\n[…]\n entry quotes a\n'@test.com' example token by design. CI leak-scan gate (scan_repo) passes.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): prep 0.3.0 — three features + six bug fixes since v0.…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-22T12:24:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "153255d93bb47fa93ee741a43979577f62806b1b",
          "body": "…patch (#84)\n\nCloses #74. arm-gate (and any manual WU-body revision at a gate boundary)\nwrites UNCOMMITTED working-tree changes: WU status flips (draft → pending),\nthe completed gate's flip (awaiting_review → passed), and edited acceptance\ncriteria. If the operator then runs loop.py and the first di\n[…]\nrefuses); the complementary\narm-gate-commits change (option 1) is a separate skill update.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): refuse uncommitted arm-gate / WU-revision edits before dis…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-20T21:23:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 15,
      "commits_last_year": 201,
      "latest_release_at": "2026-07-10T15:10:05Z",
      "latest_release_tag": "v0.3.12",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 8,
      "days_since_latest_release": 13,
      "mean_days_between_releases": 1.8
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 87,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "specfuse-loop",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "specfuse",
            "agents",
            "planning",
            "ralph",
            "gate-cycle",
            "Intended Audience :: Developers",
            "License :: OSI Approved :: Apache Software License",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3 :: Only",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Topic :: Software Development"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/specfuse-loop/",
          "is_deprecated": false,
          "latest_version": "0.3.24",
          "repository_url": "https://github.com/specfuse/loop",
          "versions_count": 26,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-06-19T00:29:56.272452Z",
          "latest_published_at": "2026-07-23T16:03:16.477415Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 2
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 246031,
      "source_files_sampled": 148,
      "oversized_source_files": 1,
      "agent_instruction_files": [
        ".claude/CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 454
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml",
        "requirements.txt"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [],
      "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": 156,
        "open_issues": 2,
        "closed_ratio": 0.97,
        "closed_issues": 65,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "clabonte",
          "commits": 206,
          "avatar_url": "https://avatars.githubusercontent.com/u/3989686?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "leak-scan-content.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/29 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "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": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "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": 4,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "4d4854a1efe8374a5337b43ff28c594836b5ed94",
        "ran_at": "2026-07-23T16:19:47Z",
        "aggregate_score": 4.9,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-23T16:03:25Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-23T15:46:29Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 209,
          "created_at": "2026-07-22T23:00:52Z",
          "last_comment_at": "2026-07-23T01:24:01Z",
          "last_comment_author": "clabonte"
        },
        {
          "number": 223,
          "created_at": "2026-07-23T12:12:07Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/specfuse/loop",
    "host": "github.com",
    "name": "loop",
    "owner": "specfuse"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 58,
      "inputs": {
        "security": 49,
        "vitality": 76,
        "community": 43,
        "governance": 53,
        "engineering": 67
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 76,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "commits_last_year": 201,
              "human_commit_share": 0.95,
              "days_since_last_push": 0,
              "active_weeks_last_year": 8
            },
            "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": "8/52 weeks with commits",
                "points": 5.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "201 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 201
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 15,
              "latest_release_tag": "v0.3.12",
              "releases_from_tags": false,
              "days_since_latest_release": 13,
              "mean_days_between_releases": 1.8
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "15 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 13 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 13
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.8 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 43,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "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": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "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": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 53,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "merged_prs": 156,
              "open_issues": 2,
              "closed_issues": 65,
              "issue_closed_ratio": 0.97,
              "closed_unmerged_prs": 1
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "97% of issues closed",
                "points": 45.3,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 97
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "156/157 decided PRs merged",
                "points": 38,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 156,
                      "decided": 157
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/29 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "followers": 0,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "specfuse",
              "public_repos": 4,
              "account_age_days": 97
            },
            "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": "0 followers of specfuse",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "specfuse"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "4 public repos, account ~0 yr old",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 4
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "specfuse-loop"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "26 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 26
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 67,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "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": null,
                "points": 0,
                "status": "missed",
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 49,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 49,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.9
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "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 0/29 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "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": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "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 detected",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 59,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                ".claude/CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 454
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".claude/CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".claude/CLAUDE.md"
                    }
                  }
                ],
                "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": "95 of 95 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 95,
                      "sampled": 95
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.93,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.05
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "93 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 93,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "5 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 5,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 246031,
              "source_files_sampled": 148,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/148 source files over 60KB",
                "points": 54.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 148,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index pypi:specfuse-loop@0.3.24; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T16:20:05.705541Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/specfuse/loop.svg",
  "full_name": "specfuse/loop",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

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