公开记录
软件健康报告模式 0.27.0 · 指标 2.5.0 · 2026-07-29 00:41 UTC

zendev-sh / goai

Go AI SDK, the Go way. One unified API across 21+ providers. Streaming, structured output, MCP support, stdlib only. Go AI SDK for AI applications inspired by Vercel AI SDK.

GoMIT★ 171 星标⑂ 24 复刻始于 2026年3月在 GitHub 上查看 ↗
类型如何判定

zendev-sh/goai 的健康指数为 100 分中的 78 分,处于「良好」区间。 其得分最高的类别是Vitality(86/100),最低的是Security(37/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

78
总分 / 100
良好

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均,再依据公开记录的分布进行校准,使各等级具有百分位含义;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 34(存在风险)的上限。

78
卓越93-100公开记录中的最高层级(约前 5%);基本满足所有检验标准
优秀80-92各方面均表现强劲;仅有少量不足
良好65-79健康;不足之处有限且可控
中等50-64可接受,但存在明显不足;建议进行审查
薄弱35-49多个领域存在实质性薄弱环节
存在风险20-34存在重大薄弱环节;采用时应保持审慎
危急1-19问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

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

加权总体分 67 经校准后在公布的指数量表上为 78(记录校准 2026-08-02)。

所有权

zendev.sh组织
5 关注者3 个公开仓库始于 2026年2月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/zendev-sh/goaiv0.9.2-460 天前

按类别列示的指标

活力

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

86优秀 · 占总体的 21%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
11.8/36提交节奏 — 52 周中有 17 周有提交
18/18提交量 — 最近一年 224 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year224
human_commit_share0.84
days_since_last_push0
active_weeks_last_year17

发布纪律

100卓越
评分方式
27/27有发布版本 — 已发布 46 个发布版本
36/36发布时效 — 最近一次发布版本于 0 天前
27/27发布节奏 — 约每 5.8 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count46
latest_release_tagv0.9.2
releases_from_tags
days_since_latest_release0
mean_days_between_releases5.8
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

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

62中等 · 占总体的 17%
评分方式
36.2/60星标 — 171 个星标
11.3/25复刻 — 24 个复刻
0/15关注者 — 0 位关注者
所用输入
forks24
stars171
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

77良好
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
18/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
6.3/6.3PR 模板
所用输入
has_readme
has_license
readme_badges
has_contributing
has_issue_template
has_code_of_conduct
readme_badge_services
has_pull_request_template

可持续性与治理

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

59中等 · 占总体的 23%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
2.5/22.5提交分布 — 头号贡献者编写了 89% 的提交
13.5/13.5贡献者广度 — 10 位贡献者
0/10OpenSSF Scorecard:Contributors — project has 0 contributing companies or organizations -- score normalized to 0
所用输入
bus_factor1
contributors_sampled10
top_contributor_share0.89
评分方式
42/42议题解决 — 100% 的议题已关闭
26.7/30PR 接受 — 已裁定的 PR 中 97/109 已合并
0/13Newcomer PR acceptance — 30 天内没有首次贡献者的 PR 得到裁决
6/15OpenSSF Scorecard:Code-Review — Found 12/30 approved changesets -- score normalized to 4
所用输入
merged_prs97
open_issues0
closed_issues21
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio1
closed_unmerged_prs12
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
已排除计分(无数据或不适用):newcomer_pr_acceptance。 其余权重已重新归一化。
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
5.6/25所有者影响力 — zendev-sh 有 5 位关注者
5.3/25既往记录 — 3 个公开仓库,账户约 0 年
所用输入
followers5
owner_typeOrganization
is_verified
owner_loginzendev-sh
public_repos3
account_age_days165
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 0 天前
20/20版本历史 — 46 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/zendev-sh/goai
ecosystemsgo
any_deprecated
min_days_since_publish0

工程质量

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

81优秀 · 占总体的 19%

工程实践

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

文档

100卓越
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://goai.sh/
10/10仓库描述
10/10主题标签 — 19 个主题标签
10/10Wiki
所用输入
topicsai, ai-agents, ai-tools, llm, sdk-go, ai-sdk, anthropic, azure-op, bedro, cerebra, gemini, minimax, openai, openrouter, vercel, vertex-ai, go-ai-sdk, goai, zenflow
has_wiki
homepagehttps://goai.sh/
has_readme
has_docs_dir
has_description

安全

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

37薄弱 · 占总体的 16%

安全态势

37薄弱
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 22 out of 22 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
3/7.5Code-Review — Found 12/30 approved changesets -- score normalized to 4
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
0/10Dangerous-Workflow — 无数据
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — 无数据
0/5Pinned-Dependencies — 无数据
0/5SAST — 无数据
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — 无数据
0.8/7.5Vulnerabilities — 9 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate3.7
已排除计分(无数据或不适用):dangerous_workflow, packaging, pinned_dependencies, sast, signed_releases, token_permissions。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?权重刻意设小(4%):代理工具链是一项真实的维护信号,但完全不具备的仓库仍可达到 100/100。

79良好 · 占总体的 4%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md
15/15机器可读文档(llms.txt) — 存在 llms.txt
40/40可读的提交历史 — 84 次人类提交中有 84 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes4,968
评分方式
18/18一条命令的引导启动 — Makefile, bench/Makefile
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — lockfile
2/10已体现的代理实践 — 最近 100 次提交中有 1 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — 无数据
所用输入
has_nix
has_tests
lockfilesgo.sum, package-lock.json
has_dockerfile
typed_language
bootstrap_filesMakefile, bench/Makefile
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.01
toolchain_manifestsbench/go/go.mod, examples/langfuse/go.mod, examples/otel/go.mod, go.mod, observability/langfuse/go.mod, observability/otel/go.mod
dependency_bot_commit_share0
已排除计分(无数据或不适用):OpenSSF Scorecard:Pinned-Dependencies。 其余权重已重新归一化。
评分方式
45/45可类型检查的代码 — Go(静态类型)
51.6/55可控的文件大小 — 采样的 210 个源文件中有 13 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes212,337
source_files_sampled210
oversized_source_files13
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

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

数据采集警告

  • 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 ★ / 24 ⇿
0Star
24Fork
43发布

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

048121620242422026-032026-052026-07
主版本 0次版本 5修订 38
OpenSSF Scorecard 3.7 / 10
3.7综合

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests22 out of 22 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
4Code-ReviewFound 12/30 approved changesets -- score normalized to 4
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
不适用Dangerous-Workflowinternal error: internal error: invalid GitHub workflow: :67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
不适用Packaginginternal error: internal error: invalid GitHub workflow: :67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]
不适用Pinned-Dependenciesinternal error: internal error: invalid GitHub workflow: :67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]
不适用SASTinternal error: internal error: invalid GitHub workflow: :67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
不适用Token-Permissionsinternal error: internal error: invalid GitHub workflow: :67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]
1Vulnerabilities9 existing vulnerabilities detected
直接依赖 3
注册表软件包版本约束清单文件
Gogo.uber.org/goleakv1.3.0go.mod
Gogolang.org/x/oauth2v0.36.0go.mod
npmlucide-vue-next^0.577.0package.json
全部依赖 未采集

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "ai",
        "ai-agents",
        "ai-tools",
        "llm",
        "sdk-go",
        "ai-sdk",
        "anthropic",
        "azure-op",
        "bedro",
        "cerebra",
        "gemini",
        "minimax",
        "openai",
        "openrouter",
        "vercel",
        "vertex-ai",
        "go-ai-sdk",
        "goai",
        "zenflow"
      ],
      "is_fork": false,
      "size_kb": 23178,
      "has_wiki": true,
      "homepage": "https://goai.sh/",
      "languages": {
        "Go": 3209182,
        "Shell": 19464,
        "Makefile": 1829,
        "TypeScript": 9056
      },
      "pushed_at": "2026-07-28T21:02:32Z",
      "created_at": "2026-03-17T21:57:16Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-28T21:03:18Z",
      "description": "Go AI SDK, the Go way.  One unified API across 21+ providers. Streaming, structured output, MCP support, stdlib only. Go AI SDK for AI applications inspired by Vercel AI SDK.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": "zendev.sh",
      "type": "Organization",
      "login": "zendev-sh",
      "company": null,
      "location": null,
      "followers": 5,
      "avatar_url": "https://avatars.githubusercontent.com/u/261401316?v=4",
      "created_at": "2026-02-13T10:32:24Z",
      "is_verified": null,
      "public_repos": 3,
      "account_age_days": 165
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-07-28T21:00:18Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-07-27T11:34:10Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-20T10:30:49Z"
        },
        {
          "tag": "v0.8.6",
          "kind": "patch",
          "published_at": "2026-07-08T10:07:27Z"
        },
        {
          "tag": "v0.8.5",
          "kind": "patch",
          "published_at": "2026-06-20T12:26:55Z"
        },
        {
          "tag": "v0.8.4",
          "kind": "patch",
          "published_at": "2026-06-12T03:54:31Z"
        },
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2026-06-08T01:47:52Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-06-07T12:29:24Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-06-07T09:23:23Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-06-07T02:09:05Z"
        },
        {
          "tag": "v0.7.11",
          "kind": "patch",
          "published_at": "2026-05-30T23:02:10Z"
        },
        {
          "tag": "v0.7.10",
          "kind": "patch",
          "published_at": "2026-05-28T23:57:13Z"
        },
        {
          "tag": "v0.7.9",
          "kind": "patch",
          "published_at": "2026-05-28T23:20:54Z"
        },
        {
          "tag": "v0.7.8",
          "kind": "patch",
          "published_at": "2026-05-27T23:25:40Z"
        },
        {
          "tag": "v0.7.7",
          "kind": "patch",
          "published_at": "2026-05-16T23:03:17Z"
        },
        {
          "tag": "v0.7.6",
          "kind": "patch",
          "published_at": "2026-05-08T10:24:59Z"
        },
        {
          "tag": "v0.7.5",
          "kind": "patch",
          "published_at": "2026-05-07T10:10:13Z"
        },
        {
          "tag": "v0.7.4",
          "kind": "patch",
          "published_at": "2026-05-03T11:01:24Z"
        },
        {
          "tag": "v0.7.3",
          "kind": "patch",
          "published_at": "2026-04-27T05:43:17Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2026-04-23T03:18:30Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-04-19T01:35:06Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-04-19T00:13:58Z"
        },
        {
          "tag": "v0.6.7",
          "kind": "patch",
          "published_at": "2026-04-15T03:50:47Z"
        },
        {
          "tag": "v0.6.6",
          "kind": "patch",
          "published_at": "2026-04-13T23:47:15Z"
        },
        {
          "tag": "v0.6.5",
          "kind": "patch",
          "published_at": "2026-04-12T09:39:26Z"
        },
        {
          "tag": "v0.6.4",
          "kind": "patch",
          "published_at": "2026-04-10T03:46:59Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-04-09T03:09:02Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-04-08T21:44:27Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-04-07T08:26:40Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-04-05T07:21:09Z"
        },
        {
          "tag": "v0.5.10",
          "kind": "patch",
          "published_at": "2026-04-04T10:24:32Z"
        },
        {
          "tag": "v0.5.9",
          "kind": "patch",
          "published_at": "2026-04-04T08:46:22Z"
        },
        {
          "tag": "v0.5.8",
          "kind": "patch",
          "published_at": "2026-04-02T07:51:00Z"
        },
        {
          "tag": "v0.5.7",
          "kind": "patch",
          "published_at": "2026-04-02T02:21:38Z"
        },
        {
          "tag": "v0.5.6",
          "kind": "patch",
          "published_at": "2026-04-02T02:02:18Z"
        },
        {
          "tag": "v0.5.5",
          "kind": "patch",
          "published_at": "2026-04-01T23:38:12Z"
        },
        {
          "tag": "v0.5.4",
          "kind": "patch",
          "published_at": "2026-03-31T01:59:28Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2026-03-30T09:11:23Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-03-29T12:22:01Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-03-27T02:51:06Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-03-26T11:19:05Z"
        },
        {
          "tag": "v0.4.4",
          "kind": "patch",
          "published_at": "2026-03-25T10:49:57Z"
        },
        {
          "tag": "v0.4.3",
          "kind": "patch",
          "published_at": "2026-03-24T05:39:41Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-03-23T07:57:02Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-03-23T03:59:41Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-03-17T22:06:48Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "9ee1031a674c6d636bfe941212f76941c473a7d7",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.9.2",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-28T21:02:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f84e7c70598a22d7f948056786ae0e0f4ef34f64",
          "body": "DiscoverAuth now follows the full MCP authorization discovery chain:\n- reads the resource_metadata pointer from the WWW-Authenticate 401 challenge (RFC 9728 §5.1)\n- probes the path-aware protected-resource well-known (.../oauth-protected-resource/{path})\n- fetches AS metadata from openid-configurati\n[…]\nn, the openid-configuration\nfallback in both forms, and the non-answers that must fall through: a\nProtected Resource document with no authorization_servers, and an empty array.\nPackage coverage 95.9%.",
          "is_bot": false,
          "headline": "feat(mcp): follow the full OAuth discovery chain",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-28T20:59:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3291adcaa7b2d90477f5237a09f9381f59b66671",
          "body": "Responses can return several summary segments under one reasoning item,\ntold apart by summary_index. The deltas of each segment carry no separator:\nthe boundary exists only in that index. Concatenating them therefore runs two\nsummaries together, and since each one tends to open with a bold title, th\n[…]\ny, a lone\nsummary, a second reasoning item starting clean, a first index that is not\nzero, deltas with no reasoning item to track, and that reasoningId still\nreports the index. Package coverage 98.8%.",
          "is_bot": false,
          "headline": "fix(openai): keep the boundary between reasoning summaries",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-28T20:59:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "17765c647bcf82980d08bf44697f6d2b9a3303cb",
          "body": "Gemini's function_declarations validator rejects \"const\", so it was dropped\nalong with the other unsupported keywords. Dropping it also drops the\nconstraint: a schema that pinned a field to one value now accepts anything of\nthat type, and the model is free to fill it in wrongly.\n\n\"const\" has an exac\n[…]\n a type gets \"string\", which Gemini requires alongside an enum.\n\nThis shows up with MCP tool schemas and discriminated unions, where a const\ntag is what tells the model which variant it is filling in.",
          "is_bot": false,
          "headline": "fix(gemini): rewrite schema \"const\" to a single-value \"enum\"",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-28T04:10:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c9efb630eac0183bad974253e8c2a5f02cef43d8",
          "body": "response.function_call_arguments.delta finalized the call as soon as the\naccumulated buffer parsed as JSON, and then reset that buffer. This assumes\nthe delta that completes the object is the last one for the call. It usually\nis, but nothing guarantees it: any delta that follows -- down to a trailin\n[…]\nbeing dropped.\n\nThe added test drives a delta after the arguments already parse: it emitted\ntwo calls before this change and one after, plus the cancellation path of the\nflush. Package coverage 98.8%.",
          "is_bot": false,
          "headline": "fix(openai): emit a Responses tool call once, not per valid buffer",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-28T04:10:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "686527a4def192da6228645fcd9cad99f2e60921",
          "body": "The Gemini API reports thinking separately in thoughtsTokenCount, and\ntotalTokenCount is prompt + candidates + thoughts. Subtracting thoughts from\ncandidatesTokenCount double-counts them: once thoughts outgrow the answer the\nsubtraction goes negative and OutputTokens clamps to 0, so a reasoning-heavy\nturn reports no output at all.\n\nOutput now maps to candidatesTokenCount directly. ReasoningTokens already\ncarries thoughtsTokenCount, so nothing is lost.",
          "is_bot": false,
          "headline": "fix(google): count output tokens as candidatesTokenCount",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-28T04:10:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33aea297efcca5a356bd97cbb3a7a39a8c47f82a",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.9.1",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-27T11:36:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c9b39b8d22bb87de3ad586480ce1e9795c0b428",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.10.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-27T11:33:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f67a9929bab8afa06dae73dbadadbccd1c1ffad",
          "body": "Anthropic's prompt caching accepts a `ttl` on the ephemeral cache_control\nmarker, selecting a 5-minute or 1-hour cache lifetime. The SDK always\nemitted the bare marker, so callers were pinned to the 5m default and had\nno way to opt into the 1h TTL, which is the better trade for long-lived\nsystem pro\n[…]\ncaching.go propagation,\nthe option-to-params plumbing, and an end-to-end mock-server check that\nthe TTL reaches the wire. Patch coverage 100%; package coverage unchanged\n(root 97.6%, anthropic 98.0%).",
          "is_bot": false,
          "headline": "feat(anthropic): configurable ephemeral cache TTL (5m/1h)",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-27T11:24:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "42ed186f1e6e4624919bf9af22920cf42d242cb5",
          "body": "A single SSE delta can carry both reasoning and content fields at the\nreasoning-to-answer transition (observed with GLM via NVIDIA NIM).\nParseStream processed content first, which inverts the logical order:\nreasoning must always precede the answer it produces.\n\nThe result is a corrupted chunk order \n[…]\ned for deltas\ncarrying only one of the two fields, which is the common case.\n\nAdds TestParseStream_ReasoningBeforeTextInCombinedDelta, which fails on\nthe previous ordering and passes with this change.",
          "is_bot": false,
          "headline": "fix(openaicompat): emit reasoning before text within a combined delta",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-27T11:24:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "869e50543b0451f66064583d7091c96bce45aaaa",
          "body": "- Add v0.9.0 (file upload) to README, docs/index, ROADMAP, homepage\n- Add FileUpload/RemoteRef to API types docs and capabilities tables\n- Add file upload notes to OpenAI/Anthropic/Google/Compat provider docs\n- Fix '22+ providers' → '25+ providers' in LLM context files\n- Add .vibeflow, *.out, docs/drift-report to .gitignore\n\nCo-authored-by: Anh Nguyen Viet <AnhNV16@vibeflow.local>",
          "is_bot": false,
          "headline": "fix: docs drift audit — file upload docs, homepage, gitignore (#116)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-07-20T21:00:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eea8799e3421b1d03480970e92edb4ac5017ea3a",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.9.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-20T10:32:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b790921317a3875c19a04531fade2fbab0df1396",
          "body": "…enAI, Anthropic, Gemini) (#115)\n\n- Add FileUpload, RemoteFileRef, FileUploader, FileUploadCapableModel to provider/types.go\n- Add Part.RemoteRef and ModelCapabilities.FileUpload\n- Add ErrFileUploadUnsupported sentinel error\n- OpenAI: multipart upload to /v1/files, RemoteRef → file_id in Responses A\n[…]\nm RemoteRef.Data → inline base64 (no behavioral change)\n- 100% coverage on all new code (unreachable Go stdlib multipart error paths excluded)\n\nCo-authored-by: Anh Nguyen Viet <AnhNV16@vibeflow.local>",
          "is_bot": false,
          "headline": "feat: add provider-neutral file upload and remote file references (Op…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-07-20T10:28:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d023d6cda69eff78edd5624bf0fedbd2f42e88d",
          "body": "…tion (#112) (#113)",
          "is_bot": false,
          "headline": "fix: OpenRouter reasoning dropped (#111) and server-tool loop termina…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-07-08T10:03:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40eb6dfff92b007e2388aab234e0485ccd3fefeb",
          "body": "…tion (#112)\n\n#111: Add reasoning field fallback to openaicompat for OpenRouter\n- Add Reasoning field to streaming Delta and non-streaming Message structs\n- Fall back to delta.reasoning / message.reasoning when reasoning_content is empty\n- OpenRouter emits reasoning under reasoning, not reasoning_co\n[…]\nlel for server-executed tools (nothing to execute)\n- Preserve reasoning in continuation messages for server-tool steps\n- Enter streamWithToolLoop when provider-defined tools exist even without Execute",
          "is_bot": false,
          "headline": "fix: OpenRouter reasoning dropped (#111) and server-tool loop termina…",
          "author_name": "Dev Admin",
          "author_login": null,
          "committed_at": "2026-07-08T07:29:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a0ff039ca03ba71159ab7569de53382bd302c056",
          "body": null,
          "is_bot": false,
          "headline": "docs: update README and roadmap for v0.8.5",
          "author_name": "B",
          "author_login": "vietanh85",
          "committed_at": "2026-06-21T08:18:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4920e1a14b239303b1816d43055838465e22f596",
          "body": null,
          "is_bot": false,
          "headline": "feat(errors): enhance error handling for embedded error messages (#110)",
          "author_name": "Nehme Roumani",
          "author_login": "nehmeroumani",
          "committed_at": "2026-06-20T21:46:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b48faf7d22a370ab892e04fd5078866ef96a71e",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.5",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-20T12:26:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8563bccfc795b13558f089e9d3b913cbcc8de56e",
          "body": "…07) (#109)\n\nBuffer.com MCP server rejects tools/call when the arguments field is\nabsent. CallTool now initializes nil args to an empty map and always\nserializes arguments as an object.\n\nAlso fixes a flaky test (race/mid-loop-error-monotonic-step) that\nasserted pollers must observe every intermediate step value, which is\nnot guaranteed when the error path completes synchronously.\n\nCo-authored-by: Anh Nguyen Viet <AnhNV16@vibeflow.local>",
          "is_bot": false,
          "headline": "fix: ensure CallTool sends arguments as {} instead of omitting it (#1…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-20T12:23:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "053026ccdb7c154d4a2577924052e06dea066e7d",
          "body": "…Max/default from schemas (#108)\n\nGemini's function_declarations API rejects JSON Schema keywords like\npropertyNames, patternProperties, const, exclusiveMinimum,\nexclusiveMaximum, and default. MCP tool schemas (e.g. firecrawl) commonly\ncarry these, causing 'Unknown name' errors.\n\nAdd all six to the existing strip list in sanitizeImpl alongside\nadditionalProperties and format.\n\nFixes zendev-sh/zenflow#14\n\nCo-authored-by: Anh Nguyen Viet <AnhNV16@vibeflow.local>",
          "is_bot": false,
          "headline": "fix(gemini): strip propertyNames/patternProperties/const/exclusiveMin…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-20T11:55:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0108fb761bb688c8348fd987a2bf842e428102a1",
          "body": "Requesty (https://requesty.ai) is an OpenAI-compatible LLM gateway. This adds a\nnative provider package mirroring the existing openrouter provider, built on\ninternal/openaicompat -- a /chat/completions endpoint at\nhttps://router.requesty.ai/v1, provider/model model naming, and the same\noptional HTTP\n[…]\nrified: go build ./..., go test ./... (100% coverage on the new package),\ngo vet, golangci-lint (0 issues), gofmt clean. Also live-tested against\nhttps://router.requesty.ai/v1 with openai/gpt-4o-mini.",
          "is_bot": false,
          "headline": "feat: add Requesty provider (#106)",
          "author_name": "Thibault Jaigu",
          "author_login": "Thibaultjaigu",
          "committed_at": "2026-06-20T11:05:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dd18d60a359a5bf940910ff04bd446ce497c09b1",
          "body": "… (#105)\n\nNative structured-output mode (structuredOutputMode=\"outputFormat\")\nemitted the schema as the top-level output_format request field, which\nthe Messages API now rejects: \"output_format: This field is deprecated.\nUse 'output_config.format' instead.\"\n\nbuildRequest now nests the schema under o\n[…]\ntptest handlers use only non-fatal\nassertions so a missing field can no longer panic the handler goroutine\ninto a client-side EOF.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(anthropic): send native structured output as output_config.format…",
          "author_name": "Claudiu",
          "author_login": "claudiunicolaa",
          "committed_at": "2026-06-19T12:32:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e6e2fc69c7ce90ac0624d7e69af14824386dbd47",
          "body": null,
          "is_bot": false,
          "headline": "Add Reasoning field to stepResult (#103)",
          "author_name": "Kadir Gün",
          "author_login": "kadirgun",
          "committed_at": "2026-06-15T07:38:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54c8c5dcd64db58b519bb3a738ffdbfdb7e8f0a8",
          "body": null,
          "is_bot": false,
          "headline": "fix: correct YAML indentation in zenflow-review workflow (#100)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-13T05:59:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7294c6817f7c35a4b982fe572355c3c75cf24583",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.4",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-12T03:54:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "016e5f7156d9caf38fd38b486e45af73935d09ce",
          "body": "Replace GEMINI_API_KEY with FPT_API_KEY for the zenflow-review action.\nModel changed from gemini-2.0-flash to Qwen3.6-27B.",
          "is_bot": false,
          "headline": "chore: switch zenflow-review to FPT provider (Qwen3.6-27B) (#99)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-12T03:51:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf9e3608f37d33e57e6dab88a8faa9bf9442aab9",
          "body": "Add WithRetryObserver callback that fires before each retry attempt,\nallowing callers to log or observe retry progress (attempt, error, delay).\n\n- New RetryObserver type and WithRetryObserver option\n- Observer invoked in withRetry loop before sleep\n- All call sites in generate, object, embed pass observer through\n- Tests for observer invocation and GenerateText integration",
          "is_bot": false,
          "headline": "feat: expose retry steps via RetryObserver (#95) (#98)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-12T03:51:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4358effc4344ef2a39e4900fdf05681b628ea77",
          "body": "Add tests for the branches introduced in #96 that codecov/patch flagged:\n- complete valid-JSON args buffered before the name, flushed on start\n- the four TrySend context-cancel early-return paths in ParseStream\n\nBrings patch coverage of the streamed tool-call refactor to 100%.",
          "is_bot": false,
          "headline": "test(openaicompat): cover split tool-call stream patch lines (#97)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-11T12:51:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc66bec53741da19136f738da073268810f9cfc5",
          "body": "* fix: preserve split tool call stream metadata\n\n* fix: stabilize streamed tool call IDs",
          "is_bot": false,
          "headline": "fix: preserve split tool call stream metadata (#96)",
          "author_name": "Sebastian Legarraga",
          "author_login": "slegarraga",
          "committed_at": "2026-06-11T11:57:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "74908a92ff793f54490e668b1a3c0b20fc49e98c",
          "body": "Add a redacted_thinking case to the Anthropic streaming switch so the encrypted block (delivered whole in content_block_start) is surfaced as a ChunkReasoning with redactedData metadata and can be replayed on the next turn. Also passes through the adaptive thinking display option.\n\nOriginal work by Nehme Roumani (@nehmeroumani), superseding #93. Adds a coverage test for the context-cancel branch.",
          "is_bot": false,
          "headline": "fix(anthropic): capture redacted_thinking blocks in streaming (#94)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-08T22:56:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f1d8092da460a021b4ba84414f0126228ee4d54",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.3",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-08T01:47:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7d93751f8d83277f73b24462d12e0ddf0d13405",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.3",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-06-08T01:45:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8466eedbdf233f44829836f298abb4bd10d5f243",
          "body": "Replace the compat layer with a native /api/chat and /api/embed implementation using net/http. Adds think mode, JSON mode via the format field, reasoning via the native thinking field, bounded reads, and typed HTTP errors. No third-party Ollama SDK; go.mod stays at 1.25.",
          "is_bot": false,
          "headline": "provider/ollama: native API with think mode, no third-party SDK (#92)",
          "author_name": "Bruno Clermont",
          "author_login": "bclermont",
          "committed_at": "2026-06-08T01:30:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df831fb3420f24ce7d3ef95b37db21c388457021",
          "body": "Validate tool name uniqueness in buildToolMap across all tools and all four entry points (GenerateText, StreamText, GenerateObject, StreamObject); transition AgentState to idle on the StreamText validation error.",
          "is_bot": false,
          "headline": "fix: detect duplicate tool names across tool entry points (#91)",
          "author_name": "Bruno Clermont",
          "author_login": "bclermont",
          "committed_at": "2026-06-08T01:30:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b82078ae915f2a59b7842091d35ba9d85a2ebb71",
          "body": "The codecov-action uploader aborts before uploading because importing\nCodecov's PGP public key returns no data (\"no valid OpenPGP data found\"),\nso the SHA256SUM signature check fails with \"No public key\". This is an\nupstream issue in the uploader's key fetch, unrelated to coverage or the\ntoken, and it fails CI on every PR.\n\nSet skip_validation: true so the uploader skips the binary integrity\ncheck and proceeds to upload. Uploads remain authenticated via\nCODECOV_TOKEN.",
          "is_bot": false,
          "headline": "ci: skip codecov uploader GPG validation",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T21:59:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f48788632eb8bb4c9d6a5df6b8202e72d1d80ec",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.2",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-07T12:29:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ccbf1bc6b8c0a512c45b9d005d3a786a12325af1",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.2",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T12:27:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e104924c9a0ec299f16c3723c236a7bfeaccedd",
          "body": "…… (#90)\n\n* fix(provider): populate ToolName on synthetic orphan tool results for Google AI\n\n* fix(provider): add synthetic orphan tool result test and cloneMessages function for improved message handling\n\n* fix(provider): preserve Message.ProviderOptions in cloneMessages\n\ncloneMessages rebuilt Mess\n[…]\ny message lost ProviderOptions, breaking\nanthropic message-level cache control. Copy the whole struct, then clone\nthe Content slice.\n\n---------\n\nCo-authored-by: vietanh85 <vietanh.nguyen.it@gmail.com>",
          "is_bot": false,
          "headline": "fix(provider): populate ToolName on synthetic orphan tool results for…",
          "author_name": "Nehme Roumani",
          "author_login": "nehmeroumani",
          "committed_at": "2026-06-07T12:25:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2af4a72277e7e216630835053707cc87a3cf2974",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.1",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-07T09:23:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0be968d8ce773f9fb4ff15c72702a49d131023a7",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.1",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T09:21:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72481862b459b81e7b3683dddcb605e24b270426",
          "body": "…(#89)\n\nThe Responses API error-event handler overwrote the flat message/code\nwith the nested error object unconditionally, so a partial nested object\n(e.g. a nested code with no message) clobbered a flat message with an\nempty string and lost the detail. Fall back per-field with cmp.Or:\nprefer nested when set, otherwise keep the flat value. Follow-up to #88.",
          "is_bot": false,
          "headline": "fix(openai): preserve flat error fields when nested error is partial …",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T09:11:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c6afa81146919d88042a375ec0a5eb9780979a1",
          "body": "… events (#88)",
          "is_bot": false,
          "headline": "fix(openai): handle nested error fields in Responses API stream error…",
          "author_name": "Nehme Roumani",
          "author_login": "nehmeroumani",
          "committed_at": "2026-06-07T08:10:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03a4ab94972b9e0ea5400ec3321035d6ccf27d3f",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-07T02:09:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a13785d92f353e8c56a73e61d6936cff05b795b",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.0",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T02:06:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f82a2e5c89d440893343c2243df66e568e5ae600",
          "body": "… (#87)\n\nNewTool[In](name, description, execute) builds a Tool from a typed input\nstruct: the JSON Schema is generated via SchemaFrom and the model's raw\narguments are unmarshaled into In before execute runs, so callers no\nlonger hand-write JSON Schema or unmarshal input (issue #83).\n\nMigrate all ex\n[…]\n NewTool, keeping the raw goai.Tool struct form\ndocumented for hand-written schemas and provider-defined tools. Also bump\nexample model ids from gemini-2.0-flash to gemini-3-flash-preview.\n\nCloses #83",
          "is_bot": false,
          "headline": "feat: add NewTool typed constructor and adopt it across examples/docs…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T01:56:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ab9a84e0af9d390f59eda1e412c73e6c0e8b84e8",
          "body": "* feat: surface hook and predicate panics instead of swallowing them\n\nLifecycle hooks and the StopWhen predicate previously ran inside a\nrecover that printed the panic to stderr and discarded it, so callers\ncould not intercept it and observability handlers never saw it.\n\nAdd an OnPanic observability\n[…]\nl\") and reported to OnPanic instead of being\nre-raised as an uncaught panic, so a panic carrying sensitive data is not\nprinted to stderr as a crash dump. Threads o.OnPanic through the five\ncall sites.",
          "is_bot": false,
          "headline": "feat: surface hook and predicate panics instead of swallowing them (#85)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T01:18:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f8e46fe59897d0e4e53059426c29c9b4fdc00ad3",
          "body": "…#86)\n\nThe FPT Smart Cloud key for Qwen3.6-27B is rejected (401 Invalid API\nKey), so the review step failed on every run. Switch the reviewer model\nto google/gemini-3-flash-preview, reading GEMINI_API_KEY.",
          "is_bot": false,
          "headline": "ci: switch zenflow-review to Google Gemini (gemini-3-flash-preview) (…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T00:24:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c30bd4542c1dd6cdf34b8b2a9e8bb52804d5ef16",
          "body": "Delete the compiled example executables (agent-loop, chat, tools,\nstreaming) that were accidentally committed to the repo root, ignore\nthem in .gitignore, and add a pre-commit check that rejects any staged\nfile whose content is a compiled executable or shared library.\n\nCloses #81",
          "is_bot": false,
          "headline": "fix: remove committed binaries and block them in pre-commit (#84)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-06T22:52:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "336ba79ea944da2761e19c3cf267c0a455d50c91",
          "body": null,
          "is_bot": false,
          "headline": "feat(mcp): native OAuth 2.1 + PKCE for remote MCP servers (#80)",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-06-06T07:08:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01ed3e19f80d9ff5b7db831659619c1aacf71720",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.11",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-30T23:01:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3c1f3327c778052731adef8e8f13adac946fb030",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.11",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-30T22:57:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "537d60512b969c5907864a7e238b29c8f91f5a6a",
          "body": "* feat: add llama.cpp server provider\n\nAdd provider/llamacpp package for connecting to llama.cpp server\n(OpenAI-compatible API at http://localhost:8080).\n\n- Chat() and Embedding() constructors\n- Options: WithBaseURL, WithHeaders, WithHTTPClient\n- 12 unit tests, 100% coverage\n- Follows ollama/vllm convenience wrapper pattern\n\n* fix: validate URL scheme is http or https in WithBaseURL",
          "is_bot": false,
          "headline": "feat: add llama.cpp server provider (#77)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-30T22:51:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d3820e117af8fba4c253b2b62e059fdd3b0093f",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.10",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-28T23:55:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1979fdff8ca82eadee36990a780c7c7032a2a6da",
          "body": "…#74) (#76)\n\nPer MCP Streamable HTTP spec (2025-03-26), the GET-for-SSE channel is\nOPTIONAL; a server that does not offer it SHOULD return 405. Our\nHTTPTransport.Start treated any non-200 as fatal, so servers like Zoho\nMCP failed with \"SSE connection failed: HTTP 405\". Treat 405 and 404\nas \"POST-only\" and keep the transport usable; POST responses already\ndispatch inline JSON-RPC / SSE results.",
          "is_bot": false,
          "headline": "fix(mcp): HTTPTransport tolerates POST-only Streamable HTTP servers (…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-28T23:53:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73abb9e287a839e2af1571abeffb6c147aa978de",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.9",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-28T23:18:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "523097c2f495df5187199a5815ca278c82536c11",
          "body": "The Responses API stream used bufio.Scanner with a 1MiB cap, so very\nlong output_text.delta or reasoning events still failed with\n\"bufio.Scanner: token too long\" after #73 (which only fixed\ninternal/sse). Switch streamResponses to sse.Scanner and add a\nNextLine method that returns raw event-typed SSE lines while keeping\nthe 16MiB MaxLineSize bound.",
          "is_bot": false,
          "headline": "fix(openai): handle Responses API SSE lines larger than 1MiB (#70) (#75)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-28T23:14:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b57bd142c85a25aac30600bbe34fb9738dbbda3",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.8",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-27T23:23:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d51745caa057e8f1ec5711c63f7b12c9deb9bcbd",
          "body": "* fix(sse): handle SSE lines larger than 1MiB\n\nSwitch the SSE scanner from bufio.Scanner (capped at 1MiB) to\nbufio.Reader.ReadString, which grows as needed. Long data lines (e.g.\nlarge tool-call argument deltas or reasoning blocks) no longer fail\nwith \"bufio.Scanner: token too long\". Also strip trai\n[…]\ncious or buggy upstream to force unbounded client allocation. Add\na 16 MiB hard limit (large enough for real-world tool-call argument\ndeltas and reasoning blocks) and surface oversize lines via Err().",
          "is_bot": false,
          "headline": "fix(sse): handle SSE lines larger than 1MiB (#70) (#73)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-27T23:08:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "331a3af59548d7fa7ee5d0c080274392a303e929",
          "body": "…k thinking-mode multi-turn round-trips (#72)",
          "is_bot": false,
          "headline": "openaicompat: echo reasoning_content on assistant messages so DeepSee…",
          "author_name": "tenjinfactory",
          "author_login": "tenjinfactory",
          "committed_at": "2026-05-27T22:03:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88e9647d29e21d68865218e932acfb74e9c9a117",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.7",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-16T23:03:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fa1f4a0c9c9fa97ab1215da403088eff656efb3",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.7",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-16T23:01:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1a5b4c19f1221fdd418442ec8494eea2d09c16d",
          "body": "* fix(openai): rename max_tokens by model, not reasoning_effort\n\nReasoning models (o-series, gpt-5+, codex) reject the max_tokens\nparameter and require max_completion_tokens. The rename was gated on a\nreasoning_effort provider option being present, so a caller that set\nWithMaxOutputTokens without re\n[…]\nreview on #69 flagged isReasoningModel being duplicated in\ninternal/openaicompat and provider/openai. Export it as\nopenaicompat.IsReasoningModel and have provider/openai consume the\nsingle definition.",
          "is_bot": false,
          "headline": "fix(openai): rename max_tokens by model, not reasoning_effort (#69)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-16T23:00:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e7020860f6ea14626f0fe9c8fff622b8657fddbb",
          "body": "One-line note under \"Submit a PR\" so contributors know maintainers\ncan run the AI code review on demand, pointing at the workflow file\nfor details.",
          "is_bot": false,
          "headline": "docs(contributing): mention /zenflow-review trigger (#65)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-14T10:07:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e86c5a6b5818b21aab941f7febc9d720a7eb68a9",
          "body": "Without --sandbox, --yolo, or --allow, zenflow denies every tool call\non a non-interactive terminal. First smoke test (issue_comment run\n25853651887 on PR #65) failed because:\n\n- review-idioms and review-security could not call `read` (warning\n  only; their diff is also injected via contextFiles so \n[…]\ned and the \"Post review comment\" step exited 1\n\n--sandbox pre-allows the safe tool set (read, write, grep, glob) and\nexplicitly blocks bash, which matches what the three reviewer agents\nactually need.",
          "is_bot": false,
          "headline": "fix(zenflow-review): pass --sandbox to grant tool permissions (#66)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-14T09:59:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8666ce44f544bbf08f4a1eefd2692e906c2c9e18",
          "body": "Adds a two-reviewer (Go idiomatics + security) AI code review\nworkflow powered by zenflow v0.1.5 and FPT Smart Cloud's Qwen3.6-27B\n(JP region, 262K context).\n\nTrigger: a maintainer (OWNER / MEMBER / COLLABORATOR) posts a\n`/zenflow-review` comment on the PR. The action fetches the diff,\nruns two revi\n[…]\nrtifacts (diff.patch, events.ndjson, review.md)\n\nSetup: requires `FPT_API_KEY` org-level secret (FPT Smart Cloud JP\nmarketplace API key). Default GITHUB_TOKEN covers diff fetch and PR\ncomment posting.",
          "is_bot": false,
          "headline": "ci(zenflow-review): add comment-triggered AI PR review workflow (#64)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-14T09:48:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6f5f1daa5eaf6155d69968fa5029820bbbb6bc48",
          "body": null,
          "is_bot": false,
          "headline": "docs: point README Orchestration link to zenflow repo",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-11T10:18:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "220bb077b379e04dad4351ca354fc323a2c34a94",
          "body": "…ME header",
          "is_bot": false,
          "headline": "docs: promote zenflow to top-level Orchestration link in nav and READ…",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-11T10:17:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "926612fcb0a4c43114624357c358329a90d35bf5",
          "body": "Add zenflow to the GoAI homepage and README so readers building agents\nhave a natural next step beyond a single MaxSteps loop. Two touchpoints:\na one-line bullet in the features list and a Companion Projects section.\nREADME links target the zenflow repo; docs site links the zenflow site.",
          "is_bot": false,
          "headline": "docs: introduce zenflow as companion project on home and README",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-11T09:50:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "123bbffbdd0915ba5d451de0cc9f479762cc3138",
          "body": null,
          "is_bot": false,
          "headline": "chore: gitignore .zencode and testdata, drop tracked artifacts",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-08T10:47:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "479c787e0b74477dc5be012d390566b497566076",
          "body": "* chore: roadmap entry for v0.7.6\n\n* chore: update versions.json for v0.7.6",
          "is_bot": false,
          "headline": "chore: release v0.7.6 (#63)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-08T10:19:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1fdf10c4fa561c54ae645e0320cf68cf29def2f",
          "body": "Mirrors the goai SDK link that zenflow's docsite already exposes.",
          "is_bot": false,
          "headline": "docs: add zenflow link to nav Links menu (#62)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-08T07:53:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5bb120c8ddee006bcd2a4ce09ba6612e5971394f",
          "body": "…alls (#61)\n\n* fix(anthropic,openai,bedrock,core): round-trip server-executed tool calls\n\nProvider-executed tools (Anthropic web_search/code_execution/web_fetch/mcp,\nOpenAI Responses web_search_call/file_search_call/code_interpreter_call/\nimage_generation_call/local_shell_call/mcp_call/computer_call\n[…]\nat:\n\n- Default base URL when WithBaseURL is omitted.\n- Cross-region inference profile region override.\n- base.RoundTrip error propagation.\n- Body sent without anthropic_beta when no betas are present.",
          "is_bot": false,
          "headline": "fix(anthropic,openai,bedrock,core): round-trip server-executed tool c…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-08T03:51:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3543cdf0d81bf067e4e578f57981542dc7bcce55",
          "body": "…#58)\n\nThe ChunkToolCallDelta TrySend cancel branch added in #57 lacked\ntest coverage. Add nested cancel tests that exercise the new return\npath in both adapters, and (for openai-responses) a test that lets\nthe delta succeed and cancels at the final ChunkToolCall TrySend.",
          "is_bot": false,
          "headline": "test(openai,cohere): cover cancel path on streaming tool-call delta (…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-07T10:17:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6dfd32443e949d18e42feea017e1bcc501776cc8",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.5",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-07T10:10:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99d8f3160b29275a5e81df9394e2ac73cc290fe1",
          "body": null,
          "is_bot": false,
          "headline": "chore: roadmap entry for v0.7.5",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-07T10:08:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9df2503ca913ba5c42ec9ecae2d14f578bf1ac1e",
          "body": "…ming (#57)\n\nThe openai-responses and cohere streaming adapters buffered tool-call\nargument fragments internally and only emitted ChunkToolCall once the\naccumulated buffer parsed as JSON (or at done/end). Consumers wanting\nprogressive rendering of large tool inputs (e.g. write/edit content)\nsaw a lo\n[…]\ning consumers are unaffected and new ones can render progress.\n\nAligns these two adapters with anthropic, bedrock-converse, and the\nshared openaicompat codec, which already forward deltas. Closes #56.",
          "is_bot": false,
          "headline": "fix(openai,cohere): forward ChunkToolCallDelta during tool-call strea…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-07T10:01:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d352b962310b05cf1f9f9ab0428b3921668ed3b3",
          "body": "Consumers importing observability/langfuse and observability/otel as\nseparate Go modules need per-submodule tags (<path>/vX.Y.Z) for go get\nto resolve. Tag every sub-module with its own go.mod at the root tag's\ncommit, excluding internal-only paths (examples/*, bench/*).",
          "is_bot": false,
          "headline": "ci(release): tag Go sub-modules at root tag commit (#55)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-03T23:40:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64a791349dd797956e2093239e3323de16784461",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.4",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-03T11:01:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72a32a9bc656cb4924b8e54ba63fbd7bd2b8643e",
          "body": null,
          "is_bot": false,
          "headline": "chore: roadmap entry for v0.7.4",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-03T10:59:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc0938adbfb723d44bdc8e8ecb014242135749e0",
          "body": "* fix(azure): drop api-version query on v1 GA path\n\nAzure's v1 GA spec removed the dated `api-version` parameter; sending\nit on `/openai/v1{path}` is rejected by spec-strict resources with\n\"API version not supported\" (observed on gpt-5.5). The legacy\ndeployment-based path still requires it, so api-v\n[…]\n legacy\n  deployment-based path\n- URL Format section spells out the v1 GA contract, the api-version\n  rejection from spec-strict resources, and when to opt back into the\n  legacy deployment-based path",
          "is_bot": false,
          "headline": "fix(azure): drop api-version query on v1 GA path (#54)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-03T10:59:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e308dc447951187ab631071818ddaec2cc8f8dc5",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.3",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-04-27T07:00:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb7cf6772ef5655dc9fa7a41c6a4e630e0727268",
          "body": null,
          "is_bot": false,
          "headline": "chore: roadmap entry for v0.7.3",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-27T07:00:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "512eb7c69fb0da06473de55903181a01b8cc585f",
          "body": "* feat: surface reasoning text on TextResult and StepResult\n\nAdds a Reasoning field to provider.GenerateResult, goai.StepResult,\nand goai.TextResult so callers can render extended-thinking output\nwithout digging into ProviderMetadata. Wired through Bedrock's\nnon-streaming Converse parser and through\n[…]\nult_ReasoningSummary to lock the\nnon-streaming path that concatenates reasoning.summary entries into\nGenerateResult.Reasoning. Closes the patch-coverage gap reported by\ncodecov on the previous commit.",
          "is_bot": false,
          "headline": "feat: surface reasoning text on TextResult and StepResult (#53)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-27T07:00:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b2ae1739b938c8ae517cfd28ee0e7436b281be36",
          "body": "- update 24+ to 25+ across README, compare, architecture, getting-started, providers index, vitepress meta\n- dedupe NVIDIA NIM row in README; mark nvidia E2E as Full; add NVIDIA to providers-and-models list\n- types.md: add StopCause, ToolResult; add ToolResults to StepResult; add StoppedBy to StreamChunk; reorder TextResult/ObjectResult/Embed fields to match code\n- nvidia.md: note 100-value embedding batch limit",
          "is_bot": false,
          "headline": "docs: bump provider count to 25+ and refresh type/nvidia docs (#52)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-24T04:36:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3bdb3c67fe05181f03a115c9188aad8c9f892c7",
          "body": null,
          "is_bot": false,
          "headline": "chore: remove accidental binary file nvidia.test",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:36:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1cca8932ecd93ff278b28c232da7486355f88a6c",
          "body": "docs: update homepage for v0.7.2",
          "is_bot": false,
          "headline": "Merge pull request #51 from zendev-sh/docs/homepage-v0.7.2",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:35:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab969885ddf3e5f58eab9fa722fd6a96101af05d",
          "body": null,
          "is_bot": false,
          "headline": "docs: update homepage for v0.7.2 and add NVIDIA logo",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:34:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d93bad98e224e9268cc5f14a3a8adc358f61927",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.2",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-04-23T03:20:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5fba307c5cb2ce32c4d2db57c3e1718b4c311fe",
          "body": "feat: add NVIDIA NIM provider (v0.7.2)",
          "is_bot": false,
          "headline": "Merge pull request #50 from zendev-sh/feat/nvidia-provider",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:15:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77b8d521345da4b8b72136735201fae471f06d59",
          "body": null,
          "is_bot": false,
          "headline": "merge: resolve conflicts with main",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:09:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac54ca942bf28c79285628a1312a7d86b82ce2d8",
          "body": "…thropic, add nvidia tests",
          "is_bot": false,
          "headline": "fix: test failures - env vars in Google tests, ProviderMetadata in An…",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:08:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14210a1c9355177b84000be1e4e67e2ad24eeae9",
          "body": null,
          "is_bot": false,
          "headline": "feat: add NVIDIA NIM provider (v0.7.2)",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T01:29:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62348ff6f40b3fd6f8e55ae30675783ff43b7387",
          "body": null,
          "is_bot": false,
          "headline": "fix: test failures",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T01:25:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32a80270afbc59d216f671043a85a028979db337",
          "body": "Adds a concepts page covering the full tool-loop lifecycle: StepKind\nprogression (Starting → LLMInFlight → StepFinished → ToolExecuting →\nIdle, plus terminal Done/Cancelled/Error), Observe polling, safe sync\npoints for StreamText vs GenerateText, the SetTerminal CAS protocol,\nand WithStopWhen semant\n[…]\nafety, aliasing\ncontract, stream StoppedBy).\n\nAdds WithStopWhen and WithStateRef entries to the options reference\nwith pointers into the concepts page. Adds the new page to the\nsidebar under Concepts.",
          "is_bot": false,
          "headline": "docs: document AgentState, WithStateRef, WithStopWhen (#49)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T23:37:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d8d7f70f9358d549a51b07d6fa7b8e64306cf91e",
          "body": "* feat: add terminal StepKinds and SetTerminal CAS on AgentState\n\nIntroduce StepDone/StepCancelled/StepError as sticky terminal states\ndistinct from StepIdle. SetTerminal(kind) uses CAS so the first caller\nwins and the step counter is preserved across the transition. Intended\nfor consumers (e.g. zen\n[…]\ns IsTerminal() helper and covers: per-kind transition, stickiness,\nnil receiver no-op, panic on non-terminal arg, and concurrent single-\nwinner race.\n\n* test: cover String() for new terminal StepKinds",
          "is_bot": false,
          "headline": "feat: add terminal StepKinds and SetTerminal CAS on AgentState (#48)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T23:33:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9e56d09f06f04df31612e453899f362982bf0f5d",
          "body": "* feat: add AgentState, WithStopWhen, ToolResult, and StopCause\n\n- AgentState + WithStateRef: race-free, atomically-packed (kind, step)\n  observable into the tool loop lifecycle, with a monotonic step counter\n  preserved across error paths.\n- WithStopWhen: Vercel-parity StopCondition evaluated after\n[…]\nAllBranches mirrors the StateRef test\n  to cover the StreamObject and default switch arms.\n- ToolResult.UnmarshalJSON gains a type-mismatch case that exercises\n  the inner json.Unmarshal error return.",
          "is_bot": false,
          "headline": "feat: add AgentState, WithStopWhen, ToolResult, StopCause (#47)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T10:03:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d89a1e93f1e004849072b3d91e7f98c155bc9c9a",
          "body": null,
          "is_bot": false,
          "headline": "chore: update versions.json and roadmap for v0.7.1",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T01:34:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a846a8ee13472d2b9f843c6a9f638a06912f40c8",
          "body": "… (#46)\n\n* refactor(openaicompat): extract NewChatModel / NewEmbeddingModel factories\n\nAbsorbs the common boilerplate (options wiring, HTTP dispatch, token\nresolution, env-var fallback plumbing) from 14 OpenAI-compat provider\npackages into shared factories in internal/openaicompat.\n\nPer-provider fil\n[…]\nactory has direct tests in internal/openaicompat/factory_test.go.\nAll 14 refactored providers at 100% statement coverage; factory at 99%.\n\n* test(openaicompat): cover io.ReadAll error paths in factory",
          "is_bot": false,
          "headline": "refactor(openaicompat): extract shared factories for chat + embedding…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T01:34:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9aa01ed8fd07095c0ba139d95d69ff53068d1129",
          "body": null,
          "is_bot": false,
          "headline": "fix(homepage): nested anchor in v0.7.0 release card breaking layout",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T00:23:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a5687653b17bef8ce51ab8538a8c078edc6ec3a",
          "body": "* feat: add Cloudflare Workers AI and FPT Smart Cloud providers\n\nBoth providers use the OpenAI-compatible Chat Completions and Embeddings\nendpoints with full unit test coverage (92% and 94%) and E2E verification\nagainst real APIs.\n\n- provider/cloudflare: chat + embeddings, builds URL from CLOUDFLARE\n[…]\n\nAdds tests for uncovered branches flagged by codecov/patch: embedding WithHeaders, connection errors, invalid JSON parsing, stream HTTP error, stream PromptCaching branch, and embeddingModel.ModelID.",
          "is_bot": false,
          "headline": "feat: add Cloudflare Workers AI and FPT Smart Cloud providers (#45)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T00:13:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 46,
      "commits_last_year": 224,
      "latest_release_at": "2026-07-28T21:00:18Z",
      "latest_release_tag": "v0.9.2",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 17,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 5.8
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 75,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/zendev-sh/goai",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/zendev-sh/goai",
          "is_deprecated": false,
          "latest_version": "v0.9.2",
          "repository_url": "https://github.com/zendev-sh/goai",
          "versions_count": 46,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-28T20:59:57Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 24,
      "stars": 171,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-03-19",
            "count": 2
          },
          {
            "date": "2026-03-26",
            "count": 1
          },
          {
            "date": "2026-04-01",
            "count": 1
          },
          {
            "date": "2026-04-05",
            "count": 1
          },
          {
            "date": "2026-04-08",
            "count": 1
          },
          {
            "date": "2026-05-22",
            "count": 1
          },
          {
            "date": "2026-05-23",
            "count": 1
          },
          {
            "date": "2026-05-27",
            "count": 2
          },
          {
            "date": "2026-05-29",
            "count": 1
          },
          {
            "date": "2026-06-05",
            "count": 1
          },
          {
            "date": "2026-06-07",
            "count": 1
          },
          {
            "date": "2026-06-08",
            "count": 1
          },
          {
            "date": "2026-06-11",
            "count": 1
          },
          {
            "date": "2026-06-13",
            "count": 1
          },
          {
            "date": "2026-06-15",
            "count": 1
          },
          {
            "date": "2026-06-18",
            "count": 1
          },
          {
            "date": "2026-06-19",
            "count": 1
          },
          {
            "date": "2026-06-24",
            "count": 1
          },
          {
            "date": "2026-07-10",
            "count": 1
          },
          {
            "date": "2026-07-16",
            "count": 1
          },
          {
            "date": "2026-07-19",
            "count": 1
          },
          {
            "date": "2026-07-25",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 24,
        "total_forks": 24
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": true,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile",
        "bench/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "bench/go/go.mod",
        "examples/langfuse/go.mod",
        "examples/otel/go.mod",
        "go.mod",
        "observability/langfuse/go.mod",
        "observability/otel/go.mod"
      ],
      "largest_source_bytes": 212337,
      "source_files_sampled": 210,
      "oversized_source_files": 13,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 4968
    },
    "dependencies": {
      "manifests": [
        "go.mod",
        "package.json"
      ],
      "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",
        "npm"
      ],
      "dependencies": [
        {
          "name": "go.uber.org/goleak",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.0"
        },
        {
          "name": "golang.org/x/oauth2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.36.0"
        },
        {
          "name": "lucide-vue-next",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.577.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 97,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 21,
        "closed_unmerged_prs": 12
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "vietanh85",
          "commits": 170,
          "avatar_url": "https://avatars.githubusercontent.com/u/547198?v=4"
        },
        {
          "type": "User",
          "login": "DevLumuz",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/124409412?v=4"
        },
        {
          "type": "User",
          "login": "nehmeroumani",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/10393081?v=4"
        },
        {
          "type": "User",
          "login": "oscarbc96",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/4248262?v=4"
        },
        {
          "type": "User",
          "login": "bclermont",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/474302?v=4"
        },
        {
          "type": "User",
          "login": "claudiunicolaa",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/15197275?v=4"
        },
        {
          "type": "User",
          "login": "kadirgun",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/1864516?v=4"
        },
        {
          "type": "User",
          "login": "slegarraga",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/64795732?v=4"
        },
        {
          "type": "User",
          "login": "Thibaultjaigu",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/84420566?v=4"
        },
        {
          "type": "User",
          "login": "tenjinfactory",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/250921212?v=4"
        }
      ],
      "contributors_sampled": 10,
      "top_contributor_share": 0.89
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "docs.yml",
        "release.yml",
        "zenflow-review.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 4,
            "reason": "Found 12/30 approved changesets -- score normalized to 4",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": null,
            "reason": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": null,
            "reason": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 1,
            "reason": "9 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "9ee1031a674c6d636bfe941212f76941c473a7d7",
        "ran_at": "2026-07-29T00:40:43Z",
        "aggregate_score": 3.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-28T21:02:34Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-28T20:59:58Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/zendev-sh/goai",
    "host": "github.com",
    "name": "goai",
    "owner": "zendev-sh"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": "The weighted overall 67 is calibrated to 78 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 67,
            "calibrated": 78,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 78,
      "inputs": {
        "security": 37,
        "vitality": 86,
        "community": 62,
        "governance": 59,
        "calibration": "2026-08-02",
        "engineering": 81,
        "ai_readiness": 79,
        "weighted_overall_raw": 67
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 224,
              "human_commit_share": 0.84,
              "days_since_last_push": 0,
              "active_weeks_last_year": 17
            },
            "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": "17/52 weeks with commits",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 17
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "224 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 224
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "exceptional",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 46,
              "latest_release_tag": "v0.9.2",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 5.8
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "46 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 46
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~5.8 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 5.8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "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": 62,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "weak",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "forks": 24,
              "stars": 171,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "171 stars",
                "points": 36.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 171
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "24 forks",
                "points": 11.3,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 24
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": null,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 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": 59,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 10,
              "top_contributor_share": 0.89
            },
            "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 89% of commits",
                "points": 2.5,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 89
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "10 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 86,
            "inputs": {
              "merged_prs": 97,
              "open_issues": 0,
              "closed_issues": 21,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 12,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 42,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "97/109 decided PRs merged",
                "points": 26.7,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 97,
                      "decided": 109
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 12/30 approved changesets -- score normalized to 4",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "weak",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 41,
            "inputs": {
              "followers": 5,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "zendev-sh",
              "public_repos": 3,
              "account_age_days": 165
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "5 followers of zendev-sh",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 5,
                      "login": "zendev-sh"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "3 public repos, account ~0 yr old",
                "points": 5.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 3
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/zendev-sh/goai"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "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 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "46 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 46
                    }
                  }
                ],
                "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": 81,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "exceptional",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "ai",
                "ai-agents",
                "ai-tools",
                "llm",
                "sdk-go",
                "ai-sdk",
                "anthropic",
                "azure-op",
                "bedro",
                "cerebra",
                "gemini",
                "minimax",
                "openai",
                "openrouter",
                "vercel",
                "vertex-ai",
                "go-ai-sdk",
                "goai",
                "zenflow"
              ],
              "has_wiki": true,
              "homepage": "https://goai.sh/",
              "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://goai.sh/",
                "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": "19 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 19
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "weak",
        "name": "Security",
        "value": 37,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "weak",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Dangerous-Workflow, Packaging, Pinned-Dependencies, SAST, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "sast",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 37,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 3.7
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 12/30 approved changesets -- score normalized to 4",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "9 existing vulnerabilities detected",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "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"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 79,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "exceptional",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "has_llms_txt": true,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 4968
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": "llms.txt present",
                "points": 15,
                "status": "met",
                "details": [
                  {
                    "code": "llms_txt_present",
                    "params": {}
                  }
                ],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "84 of 84 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 84,
                      "sampled": 84
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 70,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile",
                "bench/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.01,
              "toolchain_manifests": [
                "bench/go/go.mod",
                "examples/langfuse/go.mod",
                "examples/otel/go.mod",
                "go.mod",
                "observability/langfuse/go.mod",
                "observability/otel/go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile, bench/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile, bench/Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "1 of the last 100 commits agent-authored or agent-credited",
                "points": 2,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 97,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 212337,
              "source_files_sampled": 210,
              "oversized_source_files": 13
            },
            "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": "13/210 source files over 60KB",
                "points": 51.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 210,
                      "oversized": 13
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "weak",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "top": [
        "library"
      ],
      "labels": [
        "library"
      ],
      "scores": {
        "library": 5
      },
      "primary": "library",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:go",
          "weight": 3
        },
        {
          "tier": "description",
          "label": "library",
          "source": "description:library",
          "weight": 2
        }
      ],
      "artifacts": [],
      "confidence": "low",
      "host_extension": false,
      "runs_as_process": false,
      "consumed_by_code": true
    },
    "metrics_version": "2.5.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-29T00:41:00.380446Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/z/zendev-sh/goai.svg",
  "full_name": "zendev-sh/goai",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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