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

Chemaclass / agnostic-ai

One source of truth for AI agents, skills, rules, and hooks. Transpile to every AI CLI you use.

GoMIT★ 11 星标⑂ 3 复刻始于 2026年5月在 GitHub 上查看 ↗

Chemaclass/agnostic-ai 的健康指数为 100 分中的 65 分,处于「中等」区间。 其得分最高的类别是Engineering Quality(89/100),最低的是Security(40/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

65
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

227 关注者147 个公开仓库始于 2013年8月@kombohq

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/chemaclass/agnostic-aiv0.43.0-483 天前

按类别列示的指标

活力

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

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

发布纪律

90优秀
评分方式
27/27有发布版本 — 已发布 48 个发布版本
36/36发布时效 — 最近一次发布版本于 3 天前
27/27发布节奏 — 约每 4.9 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count48
latest_release_tagv0.43.0
releases_from_tags
days_since_latest_release3
mean_days_between_releases4.9

社区与采用

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

53中等 · 占总体的 18%
评分方式
16.2/60星标 — 11 个星标
2.5/25复刻 — 3 个复刻
0/15关注者 — 0 位关注者
所用输入
forks3
stars11
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

92优秀
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
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

可持续性与治理

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

65中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
2.1/22.5提交分布 — 头号贡献者编写了 90% 的提交
5.4/13.5贡献者广度 — 4 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 5 contributing companies or organizations
所用输入
bus_factor1
contributors_sampled4
top_contributor_share0.905
评分方式
46.5/46.8议题解决 — 100% 的议题已关闭
37.6/38.3PR 接受 — 已裁定的 PR 中 287/292 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/28 approved changesets -- score normalized to 0
所用输入
merged_prs287
open_issues1
closed_issues215
issue_closed_ratio0.995
closed_unmerged_prs5
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
17/25所有者影响力 — Chemaclass 有 227 位关注者
25/25既往记录 — 147 个公开仓库,账户约 12 年
所用输入
followers227
owner_typeUser
is_verified
owner_loginChemaclass
public_repos147
account_age_days4,722
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 3 天前
20/20版本历史 — 48 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/chemaclass/agnostic-ai
ecosystemsgo
any_deprecated
min_days_since_publish3

工程质量

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

89优秀 · 占总体的 20%

工程实践

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

文档

90优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://chemaclass.github.io/agnostic-ai/
10/10仓库描述
10/10主题标签 — 5 个主题标签
0/10Wiki
所用输入
topicsagentic-ai, claude, codex, gemini, agnostic-ai
has_wiki
homepagehttps://chemaclass.github.io/agnostic-ai/
has_readme
has_docs_dir
has_description

安全

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

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

安全态势

40存在风险
评分方式
6.8/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.2/2.5CI-Tests — 26 out of 28 merged PRs checked by a CI test -- score normalized to 9
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/28 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 5 contributing companies or organizations
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
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 20 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate4

AI 就绪度

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

86优秀 · 占总体的 0%
评分方式
45/45代理指令 — internal/adapters/aider/testdata/kitsink/.aider.conf.yml, tests/integration/fixtures/golden/amp/AGENTS.md, tests/integration/fixtures/golden/antigravity/.agent/AGENTS.md, tests/integration/fixtures/golden/claude/CLAUDE.md, tests/integration/fixtures/golden/cline/AGENTS.md, tests/integration/fixtures/golden/codex/AGENTS.md, tests/integration/fixtures/golden/crush/AGENTS.md, tests/integration/fixtures/golden/gemini/GEMINI.md, tests/integration/fixtures/golden/junie/AGENTS.md, tests/integration/fixtures/golden/kiro/AGENTS.md, tests/integration/fixtures/golden/opencode/.opencode/AGENTS.md, tests/integration/fixtures/golden/trae/AGENTS.md, tests/integration/fixtures/golden/warp/AGENTS.md, tests/integration/fixtures/golden/zed/AGENTS.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 97 次人类提交中有 97 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_filesinternal/adapters/aider/testdata/kitsink/.aider.conf.yml, tests/integration/fixtures/golden/amp/AGENTS.md, tests/integration/fixtures/golden/antigravity/.agent/AGENTS.md, tests/integration/fixtures/golden/claude/CLAUDE.md, tests/integration/fixtures/golden/cline/AGENTS.md, tests/integration/fixtures/golden/codex/AGENTS.md, tests/integration/fixtures/golden/crush/AGENTS.md, tests/integration/fixtures/golden/gemini/GEMINI.md, tests/integration/fixtures/golden/junie/AGENTS.md, tests/integration/fixtures/golden/kiro/AGENTS.md, tests/integration/fixtures/golden/opencode/.opencode/AGENTS.md, tests/integration/fixtures/golden/trae/AGENTS.md, tests/integration/fixtures/golden/warp/AGENTS.md, tests/integration/fixtures/golden/zed/AGENTS.md
agent_instruction_max_bytes1,966
评分方式
18/18一条命令的引导启动 — Makefile, Taskfile.yml
22/22自动化测试
11/11Lint / 格式化配置 — .golangci.yml
11/11静态类型检查 — editors/vscode/tsconfig.json
10/10可复现环境 — Dockerfile, lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 9 次由代理编写或署名代理
8/8自动化维护 — 最近 100 次提交中有 3 次为自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilesgo.sum, package-lock.json
has_dockerfile
typed_language
bootstrap_filesMakefile, Taskfile.yml
has_devcontainer
has_linter_config
typecheck_configseditors/vscode/tsconfig.json
agent_commit_share0.09
toolchain_manifestseditors/jetbrains/build.gradle.kts, go.mod
dependency_bot_commit_share0.03
评分方式
45/45可类型检查的代码 — Go(静态类型)
55/55可控的文件大小 — 采样的 389 个源文件中有 0 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes49,046
source_files_sampled389
oversized_source_files0
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
20/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

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

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

更多细节

Star 与 Fork 历史 0 ★ / 3 ⇿
0Star
3Fork
29发布

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

12233312026-052026-052026-05
主版本 0次版本 26修订 3
OpenSSF Scorecard 4.0 / 10
4.0综合

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

9Binary-Artifactsbinaries present in source code
0Branch-Protectionbranch protection not enabled on development/release branches
9CI-Tests26 out of 28 merged PRs checked by a CI test -- score normalized to 9
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/28 approved changesets -- score normalized to 0
10Contributorsproject has 5 contributing companies or organizations
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
10Security-Policysecurity policy file detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities20 existing vulnerabilities detected
直接依赖 8
注册表软件包版本约束清单文件
Gogithub.com/BurntSushi/tomlv1.6.0go.mod
Gogithub.com/charmbracelet/huhv1.0.0go.mod
Gogithub.com/charmbracelet/x/termv0.2.2go.mod
Gogithub.com/fsnotify/fsnotifyv1.10.1go.mod
Gogithub.com/invopop/jsonschemav0.14.0go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogolang.org/x/syncv0.15.0go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
全部依赖 未采集

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "agentic-ai",
        "claude",
        "codex",
        "gemini",
        "agnostic-ai"
      ],
      "is_fork": false,
      "size_kb": 2791,
      "has_wiki": false,
      "homepage": "https://chemaclass.github.io/agnostic-ai/",
      "languages": {
        "Go": 2062014,
        "Shell": 25802,
        "Kotlin": 23685,
        "Makefile": 3484,
        "Dockerfile": 558,
        "TypeScript": 10255
      },
      "pushed_at": "2026-07-23T10:28:06Z",
      "created_at": "2026-05-03T18:47:55Z",
      "owner_type": "User",
      "updated_at": "2026-07-23T10:36:33Z",
      "description": "One source of truth for AI agents, skills, rules, and hooks. Transpile to every AI CLI you use.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "https://chemaclass.com",
      "name": "Jose M. Valera Reales",
      "type": "User",
      "login": "Chemaclass",
      "company": "@kombohq",
      "location": "E51B 5BF4 5F85 D160",
      "followers": 227,
      "avatar_url": "https://avatars.githubusercontent.com/u/5256287?v=4",
      "created_at": "2013-08-18T17:44:23Z",
      "is_verified": null,
      "public_repos": 147,
      "account_age_days": 4722
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.43.0",
          "kind": "minor",
          "published_at": "2026-07-20T05:25:52Z"
        },
        {
          "tag": "v0.42.0",
          "kind": "minor",
          "published_at": "2026-07-03T07:11:38Z"
        },
        {
          "tag": "v0.41.0",
          "kind": "minor",
          "published_at": "2026-06-19T06:33:21Z"
        },
        {
          "tag": "v0.40.0",
          "kind": "minor",
          "published_at": "2026-06-17T09:48:39Z"
        },
        {
          "tag": "v0.39.0",
          "kind": "minor",
          "published_at": "2026-06-16T19:51:47Z"
        },
        {
          "tag": "v0.38.0",
          "kind": "minor",
          "published_at": "2026-06-16T18:34:40Z"
        },
        {
          "tag": "v0.37.0",
          "kind": "minor",
          "published_at": "2026-06-14T18:01:07Z"
        },
        {
          "tag": "v0.36.0",
          "kind": "minor",
          "published_at": "2026-06-12T07:36:03Z"
        },
        {
          "tag": "v0.35.0",
          "kind": "minor",
          "published_at": "2026-06-09T19:19:45Z"
        },
        {
          "tag": "v0.34.0",
          "kind": "minor",
          "published_at": "2026-06-05T23:32:09Z"
        },
        {
          "tag": "v0.33.0",
          "kind": "minor",
          "published_at": "2026-06-05T08:57:39Z"
        },
        {
          "tag": "v0.32.1",
          "kind": "patch",
          "published_at": "2026-06-04T05:27:52Z"
        },
        {
          "tag": "v0.32.0",
          "kind": "minor",
          "published_at": "2026-06-03T11:46:17Z"
        },
        {
          "tag": "v0.31.0",
          "kind": "minor",
          "published_at": "2026-06-03T06:23:59Z"
        },
        {
          "tag": "v0.30.0",
          "kind": "minor",
          "published_at": "2026-06-02T13:17:29Z"
        },
        {
          "tag": "v0.29.0",
          "kind": "minor",
          "published_at": "2026-06-02T13:00:54Z"
        },
        {
          "tag": "v0.28.0",
          "kind": "minor",
          "published_at": "2026-06-01T09:22:16Z"
        },
        {
          "tag": "v0.27.0",
          "kind": "minor",
          "published_at": "2026-05-29T19:34:26Z"
        },
        {
          "tag": "v0.26.1",
          "kind": "patch",
          "published_at": "2026-05-27T19:24:55Z"
        },
        {
          "tag": "v0.26.0",
          "kind": "minor",
          "published_at": "2026-05-25T06:12:38Z"
        },
        {
          "tag": "v0.25.0",
          "kind": "minor",
          "published_at": "2026-05-23T19:33:27Z"
        },
        {
          "tag": "v0.24.0",
          "kind": "minor",
          "published_at": "2026-05-19T09:22:17Z"
        },
        {
          "tag": "v0.23.0",
          "kind": "minor",
          "published_at": "2026-05-17T00:49:31Z"
        },
        {
          "tag": "v0.22.0",
          "kind": "minor",
          "published_at": "2026-05-16T22:25:21Z"
        },
        {
          "tag": "v0.21.0",
          "kind": "minor",
          "published_at": "2026-05-16T20:57:04Z"
        },
        {
          "tag": "v0.20.0",
          "kind": "minor",
          "published_at": "2026-05-15T23:11:36Z"
        },
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-05-15T22:48:02Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-05-15T22:02:54Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-05-15T19:44:48Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-05-15T16:46:45Z"
        },
        {
          "tag": "v0.15.1",
          "kind": "patch",
          "published_at": "2026-05-15T14:18:15Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-05-15T14:09:46Z"
        },
        {
          "tag": "v0.14.2",
          "kind": "patch",
          "published_at": "2026-05-15T12:37:40Z"
        },
        {
          "tag": "v0.14.1",
          "kind": "patch",
          "published_at": "2026-05-15T11:35:45Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-05-15T10:52:37Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-05-14T23:52:24Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-05-14T21:43:56Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-05-14T20:59:10Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-05-14T20:15:22Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-05-14T18:53:18Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-05-13T15:37:56Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-05-13T12:45:42Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-05-11T22:55:44Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-05-07T17:12:54Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-05-05T15:55:48Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-05-04T14:40:52Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-05-04T08:11:10Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-05-04T06:07:11Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "3409f8b0b6acbc76c9ade8c075078aa9b26fbe8a",
          "body": "* feat(cli): preview new scaffolds and surface completion in init\n\nnew --dry-run prints the destination path and rendered spec body without\nwriting, so users can check the shape before it lands on disk. init's\npost-scaffold next steps now point at `agnostic-ai completion <shell>`,\nmaking the existin\n[…]\n completion <shell>`, getting-started\ndocuments `new --dry-run`, and CHANGELOG records the new flag. Smooths the\nfirst five minutes: install, scaffold, preview, and enable completion.\n\nRelated to #495",
          "is_bot": false,
          "headline": "docs: onboarding polish (install, completion, new --dry-run) (#510)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-23T10:28:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "511f3dd82ca6a40b1fbb8d5e0952160ebbb9351f",
          "body": "sync emits 18 targets but import accepted only 16: kiro and crush were\ndeferred when #474 added them, so a project configured for either could\nnot migrate its existing config into agnostic specs. Close the gap so\nevery emitted target can also be imported.\n\nkiro reverses the steering layout: `.kiro/s\n[…]\nme>/SKILL.md`, and the crush.json `mcp` map.\nBoth reuse the shared MCP, skill-folder, and entry-point helpers so the\nimporters live in internal/cli and honor no-cross-adapter-imports.\n\nRelated to #494",
          "is_bot": false,
          "headline": "feat(import): kiro and crush importers for round-trip parity (#509)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-23T10:15:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d2d8c6a3fe9f4dd2957782bb391401c861e59a6",
          "body": "Only one test file called t.Parallel(); every other test was serialized\nby shared process state. Add t.Parallel() to tests that touch neither the\nworking directory nor a package global, so -race runs them concurrently.\n\nDrop testutil.Chdir from the aider adapter tests by rooting their\nconfigured out\n[…]\nobal (logOut/verbosity, emit provenance and\ncoverage-note state, config legacy-warn cache) stay serial. Parallelizing\nthose needs a production signature change, which is out of scope.\n\nRelated to #493",
          "is_bot": false,
          "headline": "test: parallelize cwd-independent tests to cut race-suite time (#508)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-23T09:51:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9f8ff19cd65709309b71d216ec8ec7de04cfd707",
          "body": "TestWatchSync_IncrementalReSyncsOnlyAffectedTarget failed on\nmacos-latest under -race: the poll/debounce/re-sync chain can take\nseconds on a loaded runner, exceeding the 4s context and 2s poll\ndeadline. Widen the ceilings; the waits break early on success, so the\ncommon path still finishes in under a second.",
          "is_bot": false,
          "headline": "test(cli): deflake incremental watch test on loaded CI (#507)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-23T09:11:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47068979f2928a6f90c6ec07301eca797b024834",
          "body": "Drift detection reads every candidate's full body off disk to byte-compare\nit, even when a cheaper signal already settles the verdict. When the on-disk\nsize differs from the candidate length the file is provably stale, so that\nread is wasted I/O, and it grows with the tree.\n\nAdd CompareToDisk to the\n[…]\ns\nthe permanent decision artifact: the fast path saves 8 to 13 μs per\nsize-differing drift file and costs about 1.2 μs extra per read-anyway file,\ncrossing over near 10 percent drift.\n\nRelated to #492",
          "is_bot": false,
          "headline": "perf(emit): capture-compare fast-path via size pre-check (#506)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-23T09:07:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d02f99ebe9052ce0ce9474cfafef34f391c7b3d5",
          "body": "A cold sync can run far slower than a warm one with no way to see where\nthe time goes. Add two opt-in, stdlib-only hooks so users and maintainers\ncan diagnose a slow sync in the field.\n\n- --profile <file> (or AGNOSTIC_AI_PROFILE) writes a runtime/pprof CPU\n  profile of the run. Profiling starts in t\n[…]\ntarget wall time to each target line, so cost\n  attributes to a specific adapter. The stopwatch wraps the existing emit\n  call; the emission loop and the top-line total are unchanged.\n\nRelated to #491",
          "is_bot": false,
          "headline": "feat(cli): sync perf observability (--profile, per-target timing) (#505)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-23T08:50:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e4a746f0431b3ef1bd1c88424a447bfbf6ee3a2f",
          "body": "* feat(sync): incremental --watch re-emits only affected targets\n\nsync --watch re-ran a full sync of every target on every change, so\nediting one rule re-emitted all targets and buried the real change in\nnoise. Attribute each debounced change to a spec kind and re-sync only\nthe targets that emit it,\n[…]\nat\nglobal at levelQuiet, so without pinning it the assertion could see an\nempty buffer under some test orderings. Save and restore verbosity like\nlogOut so the test is self-contained.\n\nRelated to #490",
          "is_bot": false,
          "headline": "feat(sync): incremental --watch (re-emit only affected targets) (#504)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-23T08:32:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5606f7c766cc78cd1f68e9c5f44eb0bb289e8ba1",
          "body": "The #488 drift-output helpers left five fmt.Fprint calls unchecked;\ngolangci-lint errcheck failed on main. Discard the writer errors with\nthe same _, _ = idiom used elsewhere for stderr/stdout writes.\n\nRelated to #488",
          "is_bot": false,
          "headline": "fix(cli): guard writer errors in --check drift output (#503)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-23T07:36:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1033169d787769d674584c74f8c74e58bab1a93",
          "body": "…int) (#502)\n\nA red `sync --check` reported only per-target drift counts, so the user\nhad to re-run sync locally and diff by hand to see what changed, and the\nfailure never named the command that fixes it.\n\nMake a failing check self-explanatory:\n- --diff prints a unified diff per drifted file (on-di\n[…]\nlus the config-error hints point at\n  `agnostic-ai doctor` for a full diagnosis.\n\nPresentation only: no change to what counts as drift, the emission, exit\ncodes, or the --json schema.\n\nRelated to #488",
          "is_bot": false,
          "headline": "feat(sync): actionable --check output (--diff, --format=github, fix h…",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-23T07:30:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a1201192d379597e81c44073a91d7ff43cb10c3d",
          "body": "A self-contained why/what/how landing page for the project site. The\nPages workflow now assembles the landing at the root and moves the WASM\nplayground under /playground/. Monospace-forward identity, theme-aware,\nno external assets. README points at both the landing page and the\nrelocated playground.",
          "is_bot": false,
          "headline": "docs: add visual landing page, deploy via Pages (#501)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-23T06:33:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c82dc005b19280527e902f2ba76e69d237d43f2a",
          "body": "The tagline read \"and 9 more\" (14 targets) but there are 18; correct\nto \"13 more\". Note on the stateless-adapters bullet that emission is\nsafe to run in parallel via sync --jobs (#487), the one user-facing\ncapability added since the last README pass that was not surfaced here.",
          "is_bot": false,
          "headline": "docs: correct README target count and surface parallel emission (#500)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-23T06:19:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04c1ad5810d89a74240bd4ae89a3af20f4f06e3e",
          "body": "Emit each target on its own emit.Session with bounded parallelism, behind\na --jobs flag (0 = one worker per CPU, 1 = serial). Adapters are\nindependent, so per-target emission fans out; the post-emission phase\n(entry points, shared-skill links, ledger, orphan sweep) stays serial and\nordered.\n\nOutput \n[…]\n00 specs, with no crossover where serial wins. The win is modest because\nthe path is I/O- and GC-bound with a serial tail, so the flag's first value\nis correctness and opt-in control.\n\nRelated to #487",
          "is_bot": false,
          "headline": "feat(sync): parallel target emission with --jobs (#499)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-23T05:43:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d57dd8392163e38b051aff538af5412269f60724",
          "body": "…(#498)\n\n* ref(emit): thread emit session state instead of package globals\n\nThe emit layer kept capture, recording, counting, detailed-recording,\nbackup, and transaction buffers in one package-global `state` struct, so\nevery emission pass in a process shared them. That blocked running two\nsyncs conc\n[…]\ner #486\n\nThe two ledger-sweep comments still named the old package-level\n`emit.RemoveGenerated`; the sweep now runs through the per-run emit\nsession. Comment-only; no behavior change.\n\nRelated to #486",
          "is_bot": false,
          "headline": "refactor(emit): thread emit session state instead of package globals …",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-22T22:15:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5842b23a6ac23ecec6e95631306b7c7759e1eba5",
          "body": "The bench-before-perf-refactor rule blocks refactoring any hot path\nwithout a permanent benchmark to measure against, and the repo had no\nBenchmark* functions. That self-blocked the queued perf work (capture\nfast-path, parallel emission, render memoization): the rule forbids the\nchange and there was\n[…]\naive baseline) so a future proposal slots in a\nthird subject. Wire a make bench target and document the suite under\ndocs/internal/. Test and infra only, no production behavior change.\n\nRelated to #485",
          "is_bot": false,
          "headline": "perf: add benchmark suite for sync hot paths (#497)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-22T21:25:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aa6f99600b6e01e7a8daa14f1adef07ce376e331",
          "body": "Dedup the three per-target sync emission loops (non-dry, dry-run, JSON)\ninto one emitTarget helper, fold the near-identical non-dry and dry-run\nloops into one, and replace the hand-repeated StopRecording cleanup with\na defer per path. Behavior-neutral; internal to internal/cli/sync_run.go.\n\nCloses #489",
          "is_bot": false,
          "headline": "ref(cli): dedup sync emission loops and defer recording cleanup",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-22T21:01:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f8f2f6a2dfc4aa4544ef63b3b977dc0e2249635f",
          "body": "The junie/kiro/crush/trae batch (#474) landed in the prose counts but\nleft several inline examples and per-target claims stale: the default\nlist showed 12, the built-in and collision lists omitted the four new\ntargets, and the amp/zed/warp rules-parity notes still said three tools\ncoexist at the roo\n[…]\nt (opencode writes its own\n.opencode/AGENTS.md, not the root), generalize the pointer-body tree\ncomments so they stop rotting, and add the claudehooks helper package\nto the internal architecture tree.",
          "is_bot": false,
          "headline": "docs: sync target lists and counts with the 18-adapter registry (#484)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-22T19:24:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "70fc9f3b38c3952412296630efceea0382a46e8f",
          "body": "* ref(cli): document intentional swallow in readStateFile\n\nreadStateFile drops a corrupt-cache parse on purpose, but unlike its\nsibling lastSyncTimestamp the intent was undocumented. Add a comment so\nthe swallow reads as deliberate self-healing, not an oversight.\n\n* ref(adapters): remove unused faca\n[…]\nA variadic\nskip argument on CopyEmittedTree folds the claude/codex divergence into the\ncall site, preserving each adapter's exact behavior. Test bodies stay put,\nso comparison semantics are unchanged.",
          "is_bot": false,
          "headline": "ref: code-quality cleanup pass (dedup, dead code, shared schema) (#483)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-20T21:23:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fa06aeddc763931c2200844705be4be719abbf3d",
          "body": "Several pages still described pre-v0.43.0 output: windsurf paths before\nthe Devin Desktop rename, Zed's retired .rules document, Copilot and\nOpenCode flattened agents/skills, the 12-target default set, and MCP\ncoverage counts. The scoped-rules table also showed the layout inverted\n(scope outside the\n[…]\n) and the\nx-<target> passthrough table predated the shared SKILL.md renderer.\nThe why-not-symlinks page now explains how sync.shared-skills relates\nto its own argument.\n\nRelated to #437 #439 #473 #474",
          "is_bot": false,
          "headline": "docs: sync README and guides with v0.43.0 behavior (#480)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-20T05:38:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0b68f8dea81bd9652a83e23054c3bc39807f96ca",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.43.0",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-20T05:17:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4d5c207302f719bb90754a083a8ea15da3ef8fb",
          "body": "* feat(adapters): add junie, kiro, crush, and trae targets\n\nFour widely used tools had no adapter: JetBrains Junie (.junie/rules\nconcatenated + .junie/mcp/mcp.json), AWS Kiro (.kiro/steering with\ninclusion-mode frontmatter: rules always/fileMatch, agents manual,\nskills auto + .kiro/settings/mcp.json\n[…]\no them; the\ndefault target set grows to 16 and import junie/trae capture their\nrules dirs.\n\nRelated to #474\n\n* ref(kiro): align filename-prefix consts with sibling adapters after #474\n\nRelated to #474",
          "is_bot": false,
          "headline": "feat(adapters): add junie, kiro, crush, and trae targets (#478)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-19T23:27:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bb94f04d0eca774dcc42d4ccde97b3d0ad3907f7",
          "body": "Windsurf became Devin Desktop; its docs now prefer .devin/rules with\n.windsurf/rules kept only as a backward-compat fallback. Emitting to\nthe fallback left new projects on the deprecated tree. The target keeps\nits windsurf name so existing configs and x-windsurf meta still work,\nmanaged leftovers at the pre-rename path are swept (hand-authored files\nsurvive), and import windsurf reads whichever tree exists.\n\nRelated to #473",
          "is_bot": false,
          "headline": "feat(windsurf): emit rules to .devin/rules for Devin Desktop (#477)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-19T23:01:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4cfa11b7cee32abd9348c8392050a0fe316da315",
          "body": "…opilot (#476)\n\n* feat(adapters): native skills and agents for gemini, zed, opencode, copilot\n\nEach tool gained a native surface the adapters still bypassed: Gemini\nscans .gemini/skills/, Zed 1.4.2 replaced its rules library with\n.agents/skills plus AGENTS.md, OpenCode reads .opencode/agents/ and\n.o\n[…]\nparity invariant now lives in one function\n(emit.SkillMarkdown / emit.WriteSkillFolder) instead of being re-proven\nper adapter. Cursor and Claude keep their wider-allowlist renderers.\n\nRelated to #439",
          "is_bot": false,
          "headline": "feat(adapters): native skills and agents for gemini, zed, opencode, c…",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-19T17:21:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0daf259dc359a01bcbc5272c0c25498e3c1cda15",
          "body": "* feat(sync): shared-skills opt-in links identical skill trees\n\nTargets sharing the Agent Skills layout each materialized a full real\ncopy of every skill folder. With sync.shared-skills enabled, sync keeps\none canonical tree (.agents/skills preferred) and swaps byte-identical\nfolders on other target\n[…]\n there is never\ndeleted, extract the repeated strictly-inside-dir prefix check into\nunderDir, and stop scanning further roots once a captured file matched\nits non-nested skill folder.\n\nRelated to #437",
          "is_bot": false,
          "headline": "feat(sync): shared-skills opt-in links identical skill trees (#475)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-19T15:52:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "37ea0048f2ef018c008db2c76a5ccee8d797bca1",
          "body": "* feat(codex): emit skills to .agents/skills and gate deprecated prompts\n\nCodex CLI scans .agents/skills (cwd up to repo root); the .codex/skills\ndefault was a dead path the CLI never read. Sync now sweeps the stale\nmanaged tree. Project prompts move behind outputs.codex.commands-dir:\nCodex loads cu\n[…]\nhers\n(PermissionRequest, Subagent*, PreCompact, SessionStart). Dead mdc\nparameter removed. Tests cover commandWindows, asyncRewake and once;\nstale skill-flattening prose in the symlinks doc corrected.",
          "is_bot": false,
          "headline": "feat: sync adapters with current Claude, Codex and Cursor formats (#472)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-19T14:49:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "41ea814473991ab82661c9c36582b0dbe1708500",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.42.0",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-03T07:09:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea172f940a403eea2a5d5c881c915e97b29b1d29",
          "body": null,
          "is_bot": true,
          "headline": "chore(deps): bump actions/checkout from 6 to 7 (#467)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-03T06:29:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe31906e29099750642a4f43266135013e863a43",
          "body": "The managed .gitignore block listed generated paths but never said they\nare absent from a fresh clone or new git worktree until sync runs. Add a\nsecond header comment line pointing at a post-checkout hook, so a reader\nstaring at .gitignore learns how the outputs reappear.",
          "is_bot": false,
          "headline": "feat(gitignore): warn managed block outputs are not committed (#459)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-03T06:29:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e630cc0edad0a797178bfbf6eb50133c7ea449bd",
          "body": "Bumps [actions/cache](https://github.com/actions/cache) from 5 to 6.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/v5...v6)\n\n---\nupdated-dependencies:\n- 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/cache from 5 to 6 (#468)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-03T06:28:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5278be1109faa776f84c8f813d744370d9946c5b",
          "body": "* feat(gitignore): ignore Claude local artifacts in managed block\n\nClaude Code writes .claude/agent-memory/ and .claude/settings.local.json\nlocally; agnostic-ai never emits them, so they had to be added by hand\noutside the managed block and a sync could drop the hand-added lines.\n\nAdd an optional gi\n[…]\n sync folds them into the managed\nblock for every enabled claude target. Target-scoped: a codex-only\nproject never sees them.\n\nCloses #469\n\n* fix(gitignore): forward-slash Claude hint paths on Windows",
          "is_bot": false,
          "headline": "feat(gitignore): ignore Claude local artifacts in managed block (#471)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-03T04:38:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "361cf5731ee31a70b4c209783e1527bf6fd2ae3f",
          "body": null,
          "is_bot": false,
          "headline": "docs: add why-not-symlinks comparison guide (#470)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-07-03T04:26:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3642494090eada502e7c4672dda4bf89236e9c80",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.41.0",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-19T06:31:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "870ef64cffc8e8d2c0af413d798cd1d49aa00d8a",
          "body": "…#466)\n\n* fix(sync): read merge-target files in capture mode to stop key loss\n\ndoctor, sync --check, and status run adapters in capture mode to compute\nthe would-be output. The JSON, YAML, and claude-settings readers skipped\nthe existing file while capturing, so the captured content held the\nmanaged\n[…]\nml, and .claude/settings.json.\n\nRelated to #465\n\n* ref(emit): tighten capture-read comment after #465\n\nDrop a filler word and reflow the MergeJSONFile doc comment. No behavior\nchange.\n\nRelated to #465",
          "is_bot": false,
          "headline": "fix(sync): read merge-target files in capture mode to stop key loss (…",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-19T04:08:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a5646c1bf69298516725dcb2602c1a7400b6ae75",
          "body": "commandTOML read only the top-level description and excluded it from the\nx-gemini pass-through keys, so an x-gemini.description override was\nsilently dropped and the Claude-side description emitted instead.\nResolve through emit.ResolveMeta first, matching codex skillMarkdown.",
          "is_bot": false,
          "headline": "fix(gemini): honor x-gemini.description override in command TOML (#464)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-18T17:46:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58787c0577627b68a763d8271aed52a6ff4358f6",
          "body": "…#463)\n\nA spec `name:` is used verbatim as a filename or directory segment by\nevery adapter, so a value like `../../../tmp/pwned` made sync write a\nfile outside the project tree (path traversal). Reject names that are\nnot a single safe path segment at load, with a clear error. As\ndefense-in-depth, emit.WriteFile now refuses any project-relative path\nthat climbs above the project root.\n\nAdds loader and emit-level regression tests.",
          "is_bot": false,
          "headline": "fix(spec): reject path-traversal spec names (write outside project) (…",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-18T17:40:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0c0fae416d8efeca12d36e667a2599ed344fc8a",
          "body": "ResolveMetaOrdered appended unhinted top-level keys and keys introduced\nby an x-<target> block in Go map-iteration order, despite documenting\nalphabetical order. The randomized order reached the emitted frontmatter\nbytes, so a spec with a multi-key x-<target> block could produce a\ndifferent byte order each run and make sync --check report false drift.\n\nSort both key sets before appending. Adds a determinism regression test.",
          "is_bot": false,
          "headline": "fix(emit): emit x-<target> and unhinted meta keys in stable order (#462)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-18T17:33:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aef4cb1165f6de5bb98de2c77059489689e57b77",
          "body": "* feat(sync): add opt-in per-target dropped summary\n\nsync.dropped-summary prints, per target, what the run could not fully\nemit: kinds with no native surface (dropped) and kinds reachable only\nbehind an opt-in key or source-dir only (downgraded). It regroups the\nexisting kind-grouped capability warn\n[…]\n441\n\n* fix(sync): satisfy staticcheck QF1001 in dropped-summary guard\n\nHoist the negated condition into a dropsChanged bool instead of\n!(a && b), per staticcheck De Morgan suggestion.\n\nRelated to #441",
          "is_bot": false,
          "headline": "feat(sync): add opt-in per-target dropped summary (#461)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-18T17:16:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "be5262b6255cc55093acb091d221a742b978526b",
          "body": "A new git worktree or fresh clone has no generated config until sync\nruns. Point adopters who gitignore outputs at worktree bootstrap or a\npost-checkout hook so AI sessions never start without their config.",
          "is_bot": false,
          "headline": "docs: warn gitignored outputs miss fresh worktrees (#457)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-17T11:30:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9bd5c035997d2f2eadaf0c1836a9ca87fb6b34dd",
          "body": "git-hooks.md only covered pre-commit drift. Add a post-checkout recipe\n(lefthook + plain git) so adopters who gitignore outputs auto-regenerate\nthem on clone, branch switch, and worktree add.",
          "is_bot": false,
          "headline": "docs: add post-checkout recipe to regenerate gitignored outputs (#458)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-17T11:30:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99823f5795584dad1b8b2e9a80e184efb6814c6b",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.40.0",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-17T09:46:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c738813bf546c8fe42f162fcfe4eda085e5ef5a",
          "body": "Cursor hooks are now native (#438), so flip its matrix cell and the\nhooks summary. Note the command kind's native targets and the five\nnewer kinds. Correct the docs index: ten kinds, fourteen tools.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: refresh target/kind coverage for onboarding accuracy",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-17T09:45:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2eefee681a0cf643719a9d12dd4203c619b06519",
          "body": "Rewrite the [Unreleased] entries in the terse one-line style the older\nreleases use, and trim the wordier doc passages added this cycle to the\nessential facts.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: tighten unreleased changelog and cursor/doctor/validate notes",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-17T09:35:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "544602ce1cafa7a3f7f6edddcd4a9c31a9dc8d6a",
          "body": "agnostic-ai.yaml can declare sources.<kind> paths whose directories\nnever get created. sync silently skipped them and validate/doctor\nreported success, so a config could advertise coverage (skills, hooks,\nmcps) it never emitted with no signal to the user.\n\nvalidate now warns per declared-but-missing\n[…]\nlooking scaffolds still validate. The check also\nruns when no specs load, the case where every source is missing.\n\nRelated to #444\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(validate): warn on declared source dirs that don't exist (#456)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-17T09:31:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1a076b01900bc21987ce8df69125d7528bf8a656",
          "body": "Emitting a rule to .cursor/rules/*.mdc rewrote frontmatter cosmetically:\nempty globs on an alwaysApply:true rule became globs: \"**/*\", scalar\nglobs were double-quoted, and an empty description carried a trailing\nspace. Adopting agnostic-ai on a repo with existing Cursor rules thus\ntouched every rule\n[…]\niption: key. The alwaysApply:false broad\nauto-attach default (**/*) is kept since it is behavioral, not cosmetic.\n\nRelated to #443\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cursor): preserve .mdc frontmatter on round-trip (#455)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-17T09:26:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "49d5d037c2502af19be468977ec9f281f7be82eb",
          "body": "To reach full single-sourcing users need to see what is still\nhand-managed. doctor now scans known agentic config files (entry-points,\n.cursor/rules, per-tool agent/command/skill files) and lists any that\nexist without the agnostic-ai provenance marker, grouped with the import\ncommand that would adopt each. Advisory: does not affect exit code.\nJSON config is merge-managed and left to the drift block.\n\nRelated to #440\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(doctor): report agentic config on disk not single-sourced (#454)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-17T09:17:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "df261302ee9f7fca1ce958441f5dfbb2e27a9306",
          "body": "Cursor shipped lifecycle hooks (Cursor 1.7), but the matrix marked the\nkind unsupported, so hook specs skipped cursor with a warning. Emit the\nnative config (version + per-event {command, matcher?} arrays) from the\nexisting hook specs, closing the parity gap with Claude/Codex/Gemini.\nEvent names pas\n[…]\nrough verbatim per the project convention; cursor's\ncamelCase vocabulary is registered so validate recognizes it.\n\nRelated to #438\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cursor): emit hook specs as native .cursor/hooks.json (#453)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-17T09:09:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "da1bf7e3d64a00ea4629b9374c06eac7390475b3",
          "body": "…#452)\n\n#436 added command emission to gemini, opencode, amp, and cursor but\nleft the orphan-kind validator map listing only claude and codex, so a\nproject enabling just one of the new targets was wrongly told its\ncommand specs were dead weight.\n\nRelated to #436\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(validate): list all command-emitting targets in orphan-kind map (…",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-17T08:59:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "951d8ac187dac447e7ed1b0e8849d0b2cea7c860",
          "body": "Slash commands and saved prompts were only reachable on Claude and\nCodex; other targets required opt-in flags or had no command surface at\nall. Wire the existing command kind into every target with a native\ncommand/prompt format so one source drives them: Gemini TOML, OpenCode\nand Amp markdown, and Cursor Custom Commands (opt-in commands-dir).\n\nRelated to #436\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(command): emit command kind to gemini, opencode, amp, cursor (#451)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-17T08:39:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "624ff7b2849e0e3ca764a91c0f505e662520ba5b",
          "body": "Single-source agent ignore patterns via a new ignore spec kind\n(.agnostic-ai/ignore/*.md, body is gitignore syntax). One list fans out\nto each tool's native ignore file: Cursor .cursorignore, Gemini\n.aiexclude, Aider .aiderignore, each written with a shell-style\nprovenance header. Multiple specs concatenate; path overridable per\ntarget via outputs.<target>.ignore-file.\n\nRelated to #435",
          "is_bot": false,
          "headline": "feat(spec): add ignore kind for agent ignore patterns (#450)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-17T07:12:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75ba34b21bfcf037a87ee51b1d70809826168d28",
          "body": "Single-source dev-env bootstrap (install, services, ports, terminals)\nvia a new environment spec kind (.agnostic-ai/environments/*.yaml).\nCursor emits it as .cursor/environment.json: the spec passes through\nafter x-<target> resolution, minus agnostic routing fields, with\nmultiple specs merging by top-level key (last wins). Other targets\nreport it unsupported.\n\nRelated to #434",
          "is_bot": false,
          "headline": "feat(spec): add environment kind for dev-env bootstrap (#449)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-17T06:46:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45bcba86d9a5faf4c811ef7407fc6a8f7746c250",
          "body": "Single-source code-review-bot guidance via a new review spec kind\n(.agnostic-ai/reviews/*.md). Cursor emits it as scope-located BUGBOT.md\nfiles (repo root plus per-directory), honoring scope like rules and\nconcatenating same-scope specs. Other targets report it unsupported.\n\nA scope that escapes the repo root is skipped so a BUGBOT.md never\nlands outside the project tree.\n\nRelated to #433",
          "is_bot": false,
          "headline": "feat(spec): add review kind for code-review bot guidance (#448)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-17T06:24:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70af0518246273f6b220b3663748633a5c465cfa",
          "body": "* feat(spec): add settings kind for permissions and model\n\nSingle-source agent permissions (allow/deny/ask) and the default model\nacross tools via a new settings spec kind (.agnostic-ai/settings/*.yaml).\nClaude maps them into .claude/settings.json; targets with no settings\nsurface report the kind as\n[…]\naude): seed only non-list keys in permissions merge\n\nMake the \"sibling keys carry through, lists are recomputed\" invariant\nexplicit instead of copying then overwriting allow/deny/ask.\n\nRelated to #432",
          "is_bot": false,
          "headline": "feat(spec): add settings kind for permissions and model (#447)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-17T06:04:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4c4626e55c53ff9c72f492ed7fda936aa7872880",
          "body": "…(#446)\n\nA non-SKILL.md markdown file inside a folder-based skill was loaded as\nits own skill, spawning a phantom top-level skill whose body was the\nasset content. Skip such files during the load walk; they remain copied\nverbatim by the adapters.\n\nRelated to #431",
          "is_bot": false,
          "headline": "fix(spec): treat extra markdown in a skill folder as a bundled asset …",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T21:15:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8bc0902faa2ad51a8f52b071f95d959612d44b06",
          "body": "Cursor flattens each skill to a single .mdc rule, so a skill that\nbundles sibling files (scripts, assets) lost them with no signal.\nSurface a coverage note per affected skill instead of dropping the\npayloads silently.\n\nRelated to #430",
          "is_bot": false,
          "headline": "fix(cursor): note bundled skill payloads Cursor cannot emit (#445)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T21:08:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d6639131b7df7b5e7378b505ac8b45ec286f9a8",
          "body": null,
          "is_bot": false,
          "headline": "fix(import): strip provenance header and catch-all globs on seed (#442)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T20:58:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e4521f433651ff995eb3eb7359f9d4e3acc6418",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.39.0",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T19:49:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af7c7f1a88b68b118ac55c2e5ea8003290894fdb",
          "body": "…428)\n\nA release shipped scaffolding headings (### Changed with nothing under\nit) whenever a cycle touched only some categories. prune the empty\n### subsections from [Unreleased] before promoting it to the dated\nsection; subsections with at least one entry survive untouched.\n\nUpdates the cut-release skill and release-cutter agent specs to match.",
          "is_bot": false,
          "headline": "feat(release): prune empty Unreleased subsections before promoting (#…",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T19:46:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f1f81ef61b11fd7106e5c84c9b100b50a2a044f",
          "body": "…ts (#427)\n\n* feat(sync): add resolve-imports for @-import lines in shared body\n\n@path file-import lines in AGNOSTIC_AI.md were copied verbatim to every\ntarget. Only Claude resolves them; codex and the rest carried dead\nreference lines and never received the referenced content.\n\nsync.resolve-imports\n[…]\nnes is only used inside StripGeneratedAppendices, so it\ndoes not need to be exported. Correct the re-export comment to say the\nfunction reverses sync's edits, not just removes blocks.\n\nRelated to #425",
          "is_bot": false,
          "headline": "feat(sync): resolve @-import lines per target with sync.resolve-impor…",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T19:40:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "22da84bd99bcbf176280b78284e0b2c64945be04",
          "body": "… (#426)\n\n* feat(claude): add rules-mode import to wire .claude/rules into CLAUDE.md\n\nClaude Code does not auto-load .claude/rules/, so the emitted per-rule\nfiles were inert unless the user hand-added imports or fell back to the\nlegacy concatenated layout (which drops the canonical pointer body).\n\no\n[…]\nnel framing across both rules appendices\n\nExtract wrapRulesBlock so the inline-body and @-import renderers keep the\nrules markers and heading in one place instead of duplicating them.\n\nRelated to #424",
          "is_bot": false,
          "headline": "feat(claude): wire .claude/rules into CLAUDE.md via rules-mode import…",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T19:30:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b59f642f196899c33cffbded975e25fae2b3ceb8",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.38.0",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T18:32:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a132ed8a1c2c4521c23882e2d9c94ead9a7d466",
          "body": "…#423)\n\nsync now emits scoped rules under .claude/rules/<scope>/ and\n.github/instructions/<scope>/, but the claude and copilot importers read\nonly the top level, dropping nested files on round-trip. Walk both rule\ntrees recursively and preserve the subdirectory as scope, matching the\ncursor importer (#411).\n\nRelated to #411",
          "is_bot": false,
          "headline": "fix(import): walk nested rule subdirectories for claude and copilot (…",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T18:12:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc2be3290893c31290cd03ffcac3d2c44f598d45",
          "body": "Source specs flipped to disable-model-invocation: false and re-synced so\nthe generated .claude copies match, resolving the source/generated drift.",
          "is_bot": false,
          "headline": "chore: enable model invocation for gh-issue and gh-issues skills (#422)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T18:10:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b59a39fb7457a954931823676f6b4d69b63bfdc4",
          "body": "…t (#421)\n\nimport mirrors one source entry-point into AGNOSTIC_AI.md. A project with\na distinct, hand-authored AGENTS.md alongside CLAUDE.md lost the AGENTS.md\ncontent on the next sync with no notice. Scan every target entry-point and\nwarn when a hand-authored sibling diverges from the captured body, so the\nuser can merge it before syncing.\n\nRelated to #415",
          "is_bot": false,
          "headline": "feat(import): warn when a sibling entry-point holds uncaptured conten…",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T17:26:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5470977a1a8bd227d7b52e1ed33be099d9838bcc",
          "body": "The managed block folded every emitted path into the tool's top-level\ndir (/.claude/), which also ignored hand-authored siblings like\nsettings.json or a hooks/ tree. Stop the collapse at the generated\nsubdirectory (/.claude/rules/) and keep files that sit directly under\nthe tool dir precise, so only generated output is ignored.\n\nRelated to #414",
          "is_bot": false,
          "headline": "fix(gitignore): collapse managed entries at the generated subdir (#420)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T17:18:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fe8e5634cab24c9c2c6d60188d69009419f6a76",
          "body": "…#419)\n\n* fix(import): quote description frontmatter that needs YAML escaping\n\nA description carrying a colon-space, quotes, or surrounding whitespace\nwas written as a bare YAML scalar, so the imported spec failed the tool's\nown validate. Encode the value through yaml.v3 so it is quoted or\nblock-folded when needed.\n\nRelated to #413\n\n* ref(import): drop unreachable encode-error branch in YAML scalar helper\n\nRelated to #413",
          "is_bot": false,
          "headline": "fix(import): quote description frontmatter that needs YAML escaping (…",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T17:09:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c78c776edf5de086ba7820d5f7f063377078c79",
          "body": "scopedDir built <scope>/<dir>, so a rule at rules/backend/auth.md\nemitted to backend/.cursor/rules/auth.mdc at the repo root. Flip it to\n<dir>/<scope> so output stays under the tool dir (.cursor/rules/backend/\nauth.mdc). Claude rule emission ignored scope entirely; nest it too.\n\nRelated to #412",
          "is_bot": false,
          "headline": "fix(emit): nest scoped specs under the rules directory (#418)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T17:01:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a4320657327dc24cdbe7dad4325b9f554666117",
          "body": "Cursor reads rules recursively, but the importer only scanned the top\nlevel and silently dropped nested .mdc files. Walk the tree and mirror\neach rule into the source dir, preserving its subdirectory path.\n\nRelated to #411",
          "is_bot": false,
          "headline": "fix(import): walk nested .cursor/rules subdirectories (#416)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T15:52:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17583b497510d05cdf76ddb1d0677f71eba6b7c5",
          "body": "The install endpoint now returns a 301, so curl without -L piped the\nredirect HTML into bash and the Shell tests job failed at setup. Add\n-sSL so the real script is fetched.",
          "is_bot": false,
          "headline": "fix(ci): follow redirects when installing bashunit (#417)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T15:49:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ccf0a8351b8631c352a0b8ce248969e72134f93f",
          "body": "Set rules-file, emit-skills-as-commands, and tasks-file so agents,\nskills, and hooks reach targets that gate them behind output keys.\nThis clears the coverage notes sync reported for the dogfood config.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore: enable opt-in outputs for aider, gemini, opencode, zed",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-16T15:27:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9dde529ed84ad1efd7d6abe79bd98b2b4da37b09",
          "body": "Match the runtime hint (upgrade.go) and README; GoReleaser ships a cask.",
          "is_bot": false,
          "headline": "docs: add --cask to brew upgrade hint in cli-reference (#410)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-14T18:27:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4be1a344cea46fce9dc7525916dfe73f7c47848",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.37.0",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-14T17:59:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66008fa01878e8197378a2645185bd39cd1042b8",
          "body": "* fix(init): offer Antigravity target; correct lint exit-code help\n\ninit's canonical target list omitted Antigravity, so the interactive\nprompt and --all never enabled it. Add it.\n\nlint --help claimed exit code 2 for warnings, but lint always exits 1.\nAlign the help text with the behavior.\n\n* docs: \n[…]\nys.\n- adding-adapters: default-target list lives in init_interactive.go.\n- architecture: list external/ and header/ adapter dirs; add Entry.Layer.\n- roadmap: Antigravity also lacks project-scoped MCP.",
          "is_bot": false,
          "headline": "fix: offer Antigravity in init, correct lint help, fix doc drift (#409)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-14T17:56:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c909b068f2393d14399500a56b67419826705fff",
          "body": null,
          "is_bot": true,
          "headline": "chore(deps): bump codecov/codecov-action from 6 to 7 (#396)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-14T16:56:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ae4629fb91baa036859b09de3db7d3b8a39a9f6",
          "body": null,
          "is_bot": false,
          "headline": "docs(changelog): tighten unreleased entries",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-14T16:11:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dbf0c9b74b75b1cc8a65c98404c32e9802a0f5a7",
          "body": "explain and why diff only adapter Emit output, but rule bodies inlined\ninto entry-point files (AGENTS.md, GEMINI.md, CONVENTIONS.md, ...) are\nwritten by sync's entry-point distribution, not by any adapter. So\nexplain omitted the codex/gemini/aider/amp/warp/opencode contributions\nand why reported ent\n[…]\neach inlining target as a section contribution; why\nrecognizes an entry-point file and lists the inlined rule specs as\nsection sources, attributing the file to the first consuming target.\n\nCloses #405",
          "is_bot": false,
          "headline": "fix(explain): credit entry-point-inlined rule contributions (#408)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-14T15:58:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0b5eb40eb6d6605afb53812eedc02101adf7018e",
          "body": "A target may declare support for a kind yet emit it only behind an\noutputs.<target>.* key (or source-dir only). Those specs were skipped\nwith no signal. Sync now buffers a note: line per gap and flushes it\nafter the capability warnings, with the same sticky cross-run\nsuppression. Covers gemini/opencode skills, warp agents+skills,\naider agents+skills, and zed hooks.\n\nCloses #404",
          "is_bot": false,
          "headline": "feat(sync): note opt-in coverage gaps instead of silent skips (#407)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-14T15:49:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ac14dc7477b01964d53eafbc8bd279cb241075b",
          "body": "Always-on rules (no globs/scope) were skipped by isAlwaysOn and reached\nno Copilot file unless outputs.copilot.rules-file was set, dropping user\ncontent with no warning. Emit them as applyTo:\"**\" instruction files,\nthe same shape agents and skills already use, so they apply by default.\nThe legacy concatenated layout still suppresses per-file emission.\n\nCloses #403",
          "is_bot": false,
          "headline": "fix(copilot): emit always-on rules as catch-all instructions (#406)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-14T15:28:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6648d0e5e059248bdcf92eaed97ab5ca9896283f",
          "body": "Always-on rules (no globs) are not emitted by default for Copilot; only\npath-scoped rules get a dedicated instructions file.",
          "is_bot": false,
          "headline": "docs(readme): flag copilot always-on rules need rules-file",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-14T14:21:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4df8831cd0fbbd7c934dabf8739a952687f3754b",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.36.0",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-12T07:34:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37509403974a9de761d3511c56ca2ed4b1f55971",
          "body": null,
          "is_bot": false,
          "headline": "docs(readme): tighten prose, drop verbosity",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-12T07:32:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30fbdd0350cde036c24e8d447ed4d0b6bf3f830a",
          "body": null,
          "is_bot": false,
          "headline": "docs(changelog): simplify unreleased notes",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-12T07:22:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3c2c688932b0a3aee15beced3a7338f4c332521",
          "body": "… Unreleased",
          "is_bot": false,
          "headline": "docs(changelog): revert premature v0.36.0 section, keep changes under…",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-12T07:22:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fe336476b56df52e2bc8d4fdaf7d2608b076a21",
          "body": null,
          "is_bot": false,
          "headline": "docs(changelog): cut v0.36.0 release section",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-12T07:21:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e2802735889e71961f1818b3bfced3e69139fda6",
          "body": "…ed block (#402)\n\nThe local-override config, sync-state file, and packs dir were written as\nloose lines outside the managed block by init and packs add, while sync\nwrote a separate block that also listed .sync-state. Result: a duplicated\n.sync-state, inconsistent anchoring (loose lines bare, managed\n[…]\n/packs-add. init seeds the block\neven with gitignore disabled, since these paths must never be committed;\npacks add ensures the block exists without clobbering sync's generated\nlines.\n\nRelated to #401",
          "is_bot": false,
          "headline": "feat(gitignore): consolidate fixed agnostic-ai entries into the manag…",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-12T07:14:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "44e7a7bcbeb021d3ece55719e91a0dbd08aaf1ad",
          "body": null,
          "is_bot": false,
          "headline": "docs: simplify unreleased changelog entry for #399",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-11T22:04:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ac368a6d361bd5c867708bcc0557079f45f93ce",
          "body": "…s dir (#400)\n\ncodex, amp, warp, gemini, aider, and opencode advertised KindRule support\nbut emitted no rule content on a default sync: their adapters only wrote\nthe legacy concatenated rules-file (opt-in), so AGENTS.md/GEMINI.md/\nCONVENTIONS.md carried just the pointer body and rule specs reached t\n[…]\n across targets sharing a path (AGENTS.md), so the\ndedup holds. render and graph reconstruct the contribution; import strips\nthe block so the AGNOSTIC_AI.md round-trip stays lossless.\n\nRelated to #399",
          "is_bot": false,
          "headline": "fix(sync): inline rule bodies into entry-point targets without a rule…",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-11T21:24:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5f9f78ef4c022a118de22f7706737be361b4c48b",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.35.0",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-09T19:17:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e6487b7b4f6b484bfc6de017d27fce2f2d2a20c6",
          "body": "* feat(sync): add target-overview appendix to entry-point files\n\nEach target entry-point (CLAUDE.md, AGENTS.md, ...) can now carry a\ngenerated, sentinel-marked appendix listing where that tool's generated\nartifacts live, gated behind sync.target-overview (off by default).\n\nThe canonical pointer body\n[…]\nl-cfg guard and the redundant\nseen pre-seed in renderEntryPointFiles, unexport the overview interface\n(only NativeArtifactsFor asserts it), and document that external\nadapters get no appendix section.",
          "is_bot": false,
          "headline": "feat(sync): add target-overview appendix to entry-point files (#398)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-09T19:05:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5e7891f01d6123239fcbc0004177db00660e5266",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.34.0",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-05T23:30:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bbb906679167e0aac6838cf2b662b1acea3feabb",
          "body": "…ind> (#395)\n\n* feat(config): make sources block optional, default to .agnostic-ai/<kind>\n\nAn omitted source kind now defaults to `.agnostic-ai/<kind>` (e.g.\n`.agnostic-ai/agents`), matching the tree `init` scaffolds. The bare\ntop-level default (`agents/`) never matched that tree, so every config\nha\n[…]\nsources:` to compensate. Drop the block from the\nrepo's own config to dogfood the default.\n\n* docs: add missing commands source to example config\n\n* docs: simplify changelog entry for optional sources",
          "is_bot": false,
          "headline": "feat(config): make sources block optional, default to .agnostic-ai/<k…",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-05T23:25:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2fa027a50df772c26c5702ce04305208db0e1d7b",
          "body": "sync enables 12 targets by default; amp and warp share the root AGENTS.md\nentry-point with codex and add no new one, so they need explicit selection.\nREADME and targets docs implied all 14 sync out of the box.",
          "is_bot": false,
          "headline": "docs: flag amp and warp as opt-in targets",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-05T09:55:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4894fc37bb30c23eecbf1c63ec481e2d64da8e09",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.33.0",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-05T08:55:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e230dd35181569054e18e0cb596922a2510134f",
          "body": "cleanup walked the whole tree and deleted every *.bak, destroying\nunrelated user backups (vim saves, manual copies). Derive the emitted\npath set the way check and revert do, then remove only <path>.bak for\nthose paths plus the entry-point files.\n\nRelated to #390",
          "is_bot": false,
          "headline": "fix(cleanup): scope .bak removal to sync-written backups (#394)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-05T08:47:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4d6dc97a25991a71896bd73eb4a06ad4a549dcd",
          "body": "sync writes the entry-point files (CLAUDE.md, AGENTS.md, ...) outside\nadapter emission, but revert only replayed adapter emission, so a\nsync --backup then revert round-trip orphaned the user's content in .bak\nand --force left the generated files behind. Revert the entry-point\nfiles on the same terms via a shared entryPointPaths helper.\n\nRelated to #389",
          "is_bot": false,
          "headline": "fix(revert): restore and force-delete entry-point files (#393)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-05T08:41:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49ba68809234c0f8a747a296cfcc747e81a86f2b",
          "body": "* feat(gitignore): add allow list for managed-block re-allow lines\n\nThe managed block emits only root-anchored ignores, so a project that\nships fixtures named like adapter outputs had no way to keep them tracked\nwithout hand-editing. Add gitignore.allow: a list of glob patterns\nemitted as !-prefixed\n[…]\nres above them.\n\nRelated to #388\n\n* ref(gitignore): reuse sortedKeys for allow normalization\n\nDrop the duplicated set-to-sorted-slice loops in favor of the existing\nsortedKeys helper.\n\nRelated to #388",
          "is_bot": false,
          "headline": "feat(gitignore): add allow list for managed-block re-allow lines (#392)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-05T08:34:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a409f9c924c5ddcd515221f6ac512d2e3fb94b26",
          "body": "…(#391)\n\n* fix(skills): stop flat-file skills leaking siblings into each folder\n\nFlat-file skills share one source directory, so copying every sibling\nfile mirrored each skill's body into all the others' emitted folders.\nPropagate sibling assets only for folder-based skills, which own their\ndirector\n[…]\nre SKILL.md skip predicate, drop single-use wrappers\n\nLift the repeated SKILL.md skip into emit.SkipSKILLMd and inline the\nper-adapter propagate wrappers now that emit owns the logic.\n\nRelated to #387",
          "is_bot": false,
          "headline": "fix(skills): stop flat-file skills leaking siblings into each folder …",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-05T08:25:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "da094e3b0c13210476b43f595388372fa880825a",
          "body": "Fresh scaffolds now write gitignore.enabled: true, so init keeps the\nemitted target files (.claude/, .codex/, CLAUDE.md, AGENTS.md, ...) out of\ngit and .agnostic-ai/ stays the single committed source. The TTY confirm\nprompt defaults to yes and non-interactive (CI, piped stdin) runs take the\ndefault without prompting; pass --gitignore=false to commit outputs instead.\n\nExisting configs without a gitignore key keep the absent-key default (false),\nso this only affects newly scaffolded projects.",
          "is_bot": false,
          "headline": "feat(init): ignore generated outputs by default (#386)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-05T08:04:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a583494fd40dfe10183ad20152aecf9fcf1f1ce1",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.32.1",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-04T05:26:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf26e3a8e9b7ea697a4b56f9d1863d244fe4106d",
          "body": "Audit of all 14 adapters: every target syncs correctly, but the README,\ntargets.md, configuration.md, spec-format.md, and two code comments had\ndrifted from the working code. No behavior change.\n\n- README: replace 3-state capability glyph with a 4-level support-depth\n  scale (native / bundled / opt-\n[…]\nared-subagents default, the Claude rules import note, and the\n  MCP type note.\n- config.go / collision.go: codex+amp+warp share an identical AGENTS.md\n  pointer body via auto-dedup and do not collide.",
          "is_bot": false,
          "headline": "docs: align target docs and matrices with actual adapter behavior (#385)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-04T05:15:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "026e529360770cea90941ee99d9cdacef59b1aa2",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.32.0",
          "author_name": "Chemaclass",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-03T11:44:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8bfdebdf84de9ad97f0d515f1712b09c0c66e9b9",
          "body": "One line per change, lead with effect, drop how-it-works detail per the\nfile's own entry-style convention. Replace verbose [#NNN](url) markdown\nlinks with bare (#NNN) / Closes #NNN across the whole file.",
          "is_bot": false,
          "headline": "docs(changelog): tighten Unreleased notes and use bare issue refs (#384)",
          "author_name": "Jose M. Valera Reales",
          "author_login": "Chemaclass",
          "committed_at": "2026-06-03T11:23:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 48,
      "commits_last_year": 556,
      "latest_release_at": "2026-07-20T05:25:52Z",
      "latest_release_tag": "v0.43.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 10,
      "days_since_latest_release": 3,
      "mean_days_between_releases": 4.9
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 100,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/chemaclass/agnostic-ai",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/chemaclass/agnostic-ai",
          "is_deprecated": false,
          "latest_version": "v0.43.0",
          "repository_url": "https://github.com/chemaclass/agnostic-ai",
          "versions_count": 48,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-20T05:17:10Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 3
        }
      ]
    },
    "popularity": {
      "forks": 3,
      "stars": 11,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-05-04",
            "count": 1
          },
          {
            "date": "2026-05-06",
            "count": 1
          },
          {
            "date": "2026-05-26",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 3,
        "total_forks": 3
      },
      "star_history": null,
      "open_issues_and_prs": 3
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": true,
      "bootstrap_files": [
        "Makefile",
        "Taskfile.yml"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "editors/vscode/tsconfig.json"
      ],
      "toolchain_manifests": [
        "editors/jetbrains/build.gradle.kts",
        "go.mod"
      ],
      "largest_source_bytes": 49046,
      "source_files_sampled": 389,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "internal/adapters/aider/testdata/kitsink/.aider.conf.yml",
        "tests/integration/fixtures/golden/amp/AGENTS.md",
        "tests/integration/fixtures/golden/antigravity/.agent/AGENTS.md",
        "tests/integration/fixtures/golden/claude/CLAUDE.md",
        "tests/integration/fixtures/golden/cline/AGENTS.md",
        "tests/integration/fixtures/golden/codex/AGENTS.md",
        "tests/integration/fixtures/golden/crush/AGENTS.md",
        "tests/integration/fixtures/golden/gemini/GEMINI.md",
        "tests/integration/fixtures/golden/junie/AGENTS.md",
        "tests/integration/fixtures/golden/kiro/AGENTS.md",
        "tests/integration/fixtures/golden/opencode/.opencode/AGENTS.md",
        "tests/integration/fixtures/golden/trae/AGENTS.md",
        "tests/integration/fixtures/golden/warp/AGENTS.md",
        "tests/integration/fixtures/golden/zed/AGENTS.md"
      ],
      "agent_instruction_max_bytes": 1966
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "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": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/BurntSushi/toml",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/charmbracelet/huh",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.0"
        },
        {
          "name": "github.com/charmbracelet/x/term",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.2.2"
        },
        {
          "name": "github.com/fsnotify/fsnotify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.1"
        },
        {
          "name": "github.com/invopop/jsonschema",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.14.0"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "golang.org/x/sync",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.15.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        }
      ],
      "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": 2,
        "merged_prs": 287,
        "open_issues": 1,
        "closed_ratio": 0.995,
        "closed_issues": 215,
        "closed_unmerged_prs": 5
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "Chemaclass",
          "commits": 503,
          "avatar_url": "https://avatars.githubusercontent.com/u/5256287?v=4"
        },
        {
          "type": "User",
          "login": "Lacsw",
          "commits": 50,
          "avatar_url": "https://avatars.githubusercontent.com/u/12248879?v=4"
        },
        {
          "type": "User",
          "login": "SchoolyB",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/110133622?v=4"
        },
        {
          "type": "User",
          "login": "SauronBot",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/82400622?v=4"
        }
      ],
      "contributors_sampled": 4,
      "top_contributor_share": 0.905
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "playground.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 9,
            "reason": "binaries present in source code",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 9,
            "reason": "26 out of 28 merged PRs checked by a CI test -- score normalized to 9",
            "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/28 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 5 contributing companies or organizations",
            "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": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "20 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "3409f8b0b6acbc76c9ade8c075078aa9b26fbe8a",
        "ran_at": "2026-07-23T20:31:12Z",
        "aggregate_score": 4,
        "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-23T10:29:58Z",
      "oldest_open_prs": [
        {
          "number": 481,
          "created_at": "2026-07-20T08:35:05Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 482,
          "created_at": "2026-07-20T08:35:09Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-23T10:28:05Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 479,
          "created_at": "2026-07-19T23:26:02Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/Chemaclass/agnostic-ai",
    "host": "github.com",
    "name": "agnostic-ai",
    "owner": "Chemaclass"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 65,
      "inputs": {
        "security": 40,
        "vitality": 73,
        "community": 53,
        "governance": 65,
        "engineering": 89
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 73,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "commits_last_year": 556,
              "human_commit_share": 0.97,
              "days_since_last_push": 0,
              "active_weeks_last_year": 10
            },
            "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": "10/52 weeks with commits",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 10
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "556 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 556
                    }
                  }
                ],
                "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": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 48,
              "latest_release_tag": "v0.43.0",
              "releases_from_tags": false,
              "days_since_latest_release": 3,
              "mean_days_between_releases": 4.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "48 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 48
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 3 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4.9 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "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": "moderate",
        "name": "Community & Adoption",
        "value": 53,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 19,
            "inputs": {
              "forks": 3,
              "stars": 11,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "11 stars",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 11
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "3 forks",
                "points": 2.5,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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 (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "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": 65,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 26,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 4,
              "top_contributor_share": 0.905
            },
            "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 90% of commits",
                "points": 2.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 90
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "4 contributors",
                "points": 5.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 5 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "merged_prs": 287,
              "open_issues": 1,
              "closed_issues": 215,
              "issue_closed_ratio": 0.995,
              "closed_unmerged_prs": 5
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.5,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "287/292 decided PRs merged",
                "points": 37.6,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 287,
                      "decided": 292
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/28 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 65,
            "inputs": {
              "followers": 227,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "Chemaclass",
              "public_repos": 147,
              "account_age_days": 4722
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "227 followers of Chemaclass",
                "points": 17,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 227,
                      "login": "Chemaclass"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "147 public repos, account ~12 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 147
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 12
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/chemaclass/agnostic-ai"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 3
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 3 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "48 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 48
                    }
                  }
                ],
                "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": "excellent",
        "name": "Engineering Quality",
        "value": 89,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 88,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "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": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "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": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "26 out of 28 merged PRs checked by a CI test -- score normalized to 9",
                "points": 18,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "agentic-ai",
                "claude",
                "codex",
                "gemini",
                "agnostic-ai"
              ],
              "has_wiki": false,
              "homepage": "https://chemaclass.github.io/agnostic-ai/",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://chemaclass.github.io/agnostic-ai/",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "5 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "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": 40,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 4
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "26 out of 28 merged PRs checked by a CI test -- score normalized to 9",
                "points": 2.2,
                "status": "partial",
                "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/28 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 5 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "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": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "20 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 6
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "excellent",
        "name": "AI Readiness",
        "value": 86,
        "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": [
                "internal/adapters/aider/testdata/kitsink/.aider.conf.yml",
                "tests/integration/fixtures/golden/amp/AGENTS.md",
                "tests/integration/fixtures/golden/antigravity/.agent/AGENTS.md",
                "tests/integration/fixtures/golden/claude/CLAUDE.md",
                "tests/integration/fixtures/golden/cline/AGENTS.md",
                "tests/integration/fixtures/golden/codex/AGENTS.md",
                "tests/integration/fixtures/golden/crush/AGENTS.md",
                "tests/integration/fixtures/golden/gemini/GEMINI.md",
                "tests/integration/fixtures/golden/junie/AGENTS.md",
                "tests/integration/fixtures/golden/kiro/AGENTS.md",
                "tests/integration/fixtures/golden/opencode/.opencode/AGENTS.md",
                "tests/integration/fixtures/golden/trae/AGENTS.md",
                "tests/integration/fixtures/golden/warp/AGENTS.md",
                "tests/integration/fixtures/golden/zed/AGENTS.md"
              ],
              "agent_instruction_max_bytes": 1966
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "internal/adapters/aider/testdata/kitsink/.aider.conf.yml, tests/integration/fixtures/golden/amp/AGENTS.md, tests/integration/fixtures/golden/antigravity/.agent/AGENTS.md, tests/integration/fixtures/golden/claude/CLAUDE.md, tests/integration/fixtures/golden/cline/AGENTS.md, tests/integration/fixtures/golden/codex/AGENTS.md, tests/integration/fixtures/golden/crush/AGENTS.md, tests/integration/fixtures/golden/gemini/GEMINI.md, tests/integration/fixtures/golden/junie/AGENTS.md, tests/integration/fixtures/golden/kiro/AGENTS.md, tests/integration/fixtures/golden/opencode/.opencode/AGENTS.md, tests/integration/fixtures/golden/trae/AGENTS.md, tests/integration/fixtures/golden/warp/AGENTS.md, tests/integration/fixtures/golden/zed/AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "internal/adapters/aider/testdata/kitsink/.aider.conf.yml, tests/integration/fixtures/golden/amp/AGENTS.md, tests/integration/fixtures/golden/antigravity/.agent/AGENTS.md, tests/integration/fixtures/golden/claude/CLAUDE.md, tests/integration/fixtures/golden/cline/AGENTS.md, tests/integration/fixtures/golden/codex/AGENTS.md, tests/integration/fixtures/golden/crush/AGENTS.md, tests/integration/fixtures/golden/gemini/GEMINI.md, tests/integration/fixtures/golden/junie/AGENTS.md, tests/integration/fixtures/golden/kiro/AGENTS.md, tests/integration/fixtures/golden/opencode/.opencode/AGENTS.md, tests/integration/fixtures/golden/trae/AGENTS.md, tests/integration/fixtures/golden/warp/AGENTS.md, tests/integration/fixtures/golden/zed/AGENTS.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": "97 of 97 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 97,
                      "sampled": 97
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "excellent",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile",
                "Taskfile.yml"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "editors/vscode/tsconfig.json"
              ],
              "agent_commit_share": 0.09,
              "toolchain_manifests": [
                "editors/jetbrains/build.gradle.kts",
                "go.mod"
              ],
              "dependency_bot_commit_share": 0.03
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile, Taskfile.yml",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile, Taskfile.yml"
                    }
                  }
                ],
                "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": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "editors/vscode/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "editors/vscode/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "9 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 9,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "3 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 3,
                      "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": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 49046,
              "source_files_sampled": 389,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/389 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 389,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "moderate",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T20:31:30.814224Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/Chemaclass/agnostic-ai.svg",
  "full_name": "Chemaclass/agnostic-ai",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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