公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-28 06:34 UTC

openabdev / openab

A lightweight, secure, cloud-native ACP harness that bridges Discord and any ACP-compatible coding CLI.

RustMIT★ 717 星标⑂ 184 复刻始于 2026年4月在 GitHub 上查看 ↗

openabdev/openab 的健康指数为 100 分中的 69 分,处于「中等」区间。 其得分最高的类别是Vitality(82/100),最低的是Security(46/100)。 最近一次更新在 3 天前。 近期的大部分工作由 2 位贡献者完成。

69
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

openabdev组织
32 关注者5 个公开仓库始于 2026年4月

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

按类别列示的指标

活力

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

82良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 3 天前
11.8/36提交节奏 — 52 周中有 17 周有提交
18/18提交量 — 最近一年 1,480 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 19 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year1,480
human_commit_share0.9
days_since_last_push3
active_weeks_last_year17

发布纪律

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

社区与采用

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

72良好 · 占总体的 18%
评分方式
46.3/60星标 — 717 个星标
18.9/25复刻 — 184 个复刻
2.7/15关注者 — 4 位关注者
所用输入
forks184
stars717
watchers4
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
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template

可持续性与治理

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

65中等 · 占总体的 24%
评分方式
25.2/54巴士系数 — 2 位贡献者贡献了半数提交
11.6/22.5提交分布 — 头号贡献者编写了 48% 的提交
13.5/13.5贡献者广度 — 49 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 6 contributing companies or organizations
所用输入
bus_factor2
contributors_sampled49
top_contributor_share0.483
评分方式
45.1/46.8议题解决 — 96% 的议题已关闭
28.5/38.3PR 接受 — 已裁定的 PR 中 769/1,032 已合并
15/15OpenSSF Scorecard:Code-Review — all changesets reviewed
所用输入
merged_prs769
open_issues15
closed_issues396
issue_closed_ratio0.964
closed_unmerged_prs263
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
10.9/25所有者影响力 — openabdev 有 32 位关注者
6.3/25既往记录 — 5 个公开仓库,账户约 0 年
所用输入
followers32
owner_typeOrganization
is_verified
owner_loginopenabdev
public_repos5
account_age_days112

工程质量

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

77良好 · 占总体的 20%

工程实践

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

文档

90优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://openabdev.github.io/openab/
10/10仓库描述
0/10主题标签
10/10Wiki
所用输入
topics
has_wiki
homepagehttps://openabdev.github.io/openab/
has_readme
has_docs_dir
has_description

安全

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

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

安全态势

46存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
3/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
7.5/7.5Code-Review — all changesets reviewed
2.5/2.5Contributors — project has 6 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 19 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0.8/7.5Vulnerabilities — 9 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate4.6

AI 就绪度

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

74良好 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, agentcore/runtimes/kiro/steering/agent.md, docs/gemini.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 90 次人类提交中有 89 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.989
agent_instruction_filesAGENTS.md, agentcore/runtimes/kiro/steering/agent.md, docs/gemini.md
agent_instruction_max_bytes6,568
评分方式
12.6/18一条命令的引导启动 — Cargo.toml, agy-acp/Cargo.toml, crates/openab-core/Cargo.toml(工具链约定,无任务运行器)
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — Rust(静态类型)
10/10可复现环境 — Dockerfile, lockfile
8/10已体现的代理实践 — 最近 100 次提交中有 4 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilesCargo.lock
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.04
toolchain_manifestsCargo.toml, agy-acp/Cargo.toml, crates/openab-core/Cargo.toml, crates/openab-gateway/Cargo.toml, crates/openab-mcp/Cargo.toml, crates/platform-schema/Cargo.toml, openab-agent/Cargo.toml, openab-auth-proxy/Cargo.toml, operator/Cargo.toml
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — Rust(静态类型)
46.5/55可控的文件大小 — 采样的 103 个源文件中有 16 个超过 60KB
所用输入
primary_languageRust
largest_source_bytes958,227
source_files_sampled103
oversized_source_files16
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
20/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

717GitHub 星标
49贡献者
1,480最近 12 个月提交数
3距最近推送天数
100发布版本数
2巴士系数(bus factor)
15开放议题
crates.io软件包生态系统数

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Could not fetch crates package 'openab' from its registry
  • Could not fetch crates package 'agy-acp' from its registry
  • Could not fetch crates package 'oabctl' from its registry
  • Could not fetch crates package 'openab-agent' from its registry
  • Could not fetch crates package 'openab-auth-proxy' from its registry
  • Could not fetch crates package 'openab-mcp' from its registry
  • Could not fetch crates package 'openab-core' from its registry
  • Could not fetch crates package 'openab-gateway' from its registry
  • Could not fetch crates package 'platform-schema' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

更多细节

Star 与 Fork 历史 0 ★ / 184 ⇿
0Star
184Fork
98发布

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

04080120160200182152026-042026-052026-07
主版本 0次版本 0修订 0
OpenSSF Scorecard 4.6 / 10
4.6综合

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

10Binary-Artifactsno binaries found in the repo
4Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
10Code-Reviewall changesets reviewed
10Contributorsproject has 6 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 19 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
1Vulnerabilities9 existing vulnerabilities detected
直接依赖 173
注册表软件包版本约束清单文件
crates.ioopenab-coreCargo.toml
crates.ioopenab-gatewayCargo.toml
crates.ioopenab-mcpCargo.toml
crates.iotokio1Cargo.toml
crates.iotracing0.1Cargo.toml
crates.iotracing-subscriber0.3Cargo.toml
crates.ioclap4Cargo.toml
crates.ioanyhow1Cargo.toml
crates.ioaxum0.8Cargo.toml
crates.ioreqwest0.12Cargo.toml
crates.ioserde1Cargo.toml
crates.ioserde_json1Cargo.toml
crates.ioasync-trait0.1Cargo.toml
crates.ioserenity0.12Cargo.toml
crates.iotokio1agy-acp/Cargo.toml
crates.ioserde1agy-acp/Cargo.toml
crates.ioserde_json1agy-acp/Cargo.toml
crates.iouuid1agy-acp/Cargo.toml
crates.iofs20.4.3agy-acp/Cargo.toml
crates.iorusqlite=0.31.0agy-acp/Cargo.toml
crates.ioshell-words1.1.0agy-acp/Cargo.toml
crates.ioopenab-mcpopenab-agent/Cargo.toml
crates.iotokio1openab-agent/Cargo.toml
crates.ioserde1openab-agent/Cargo.toml
crates.ioserde_json1openab-agent/Cargo.toml
crates.ioreqwest0.12openab-agent/Cargo.toml
crates.ioanyhow1openab-agent/Cargo.toml
crates.ioasync-trait0.1openab-agent/Cargo.toml
crates.iouuid1openab-agent/Cargo.toml
crates.ioclap4openab-agent/Cargo.toml
crates.iotracing0.1openab-agent/Cargo.toml
crates.iotracing-subscriber0.3openab-agent/Cargo.toml
crates.iobase640.22.1openab-agent/Cargo.toml
crates.iourl2.5.8openab-agent/Cargo.toml
crates.iormcp1.7openab-agent/Cargo.toml
crates.iotokio1.44openab-auth-proxy/Cargo.toml
crates.ioaxum0.8openab-auth-proxy/Cargo.toml
crates.iohyper1.6openab-auth-proxy/Cargo.toml
crates.iohyper-util0.1openab-auth-proxy/Cargo.toml
crates.iorustls0.23openab-auth-proxy/Cargo.toml
crates.iohyper-rustls0.27openab-auth-proxy/Cargo.toml
crates.iohttp-body-util0.1openab-auth-proxy/Cargo.toml
crates.ioreqwest0.12openab-auth-proxy/Cargo.toml
crates.ioserde1openab-auth-proxy/Cargo.toml
crates.ioserde_json1openab-auth-proxy/Cargo.toml
crates.iotoml0.8openab-auth-proxy/Cargo.toml
crates.ioclap4openab-auth-proxy/Cargo.toml
crates.iosha20.10openab-auth-proxy/Cargo.toml
crates.iobase640.22openab-auth-proxy/Cargo.toml
crates.iorand0.8openab-auth-proxy/Cargo.toml
crates.iouuid1openab-auth-proxy/Cargo.toml
crates.iourl2openab-auth-proxy/Cargo.toml
crates.iourlencoding2openab-auth-proxy/Cargo.toml
crates.iodirs6openab-auth-proxy/Cargo.toml
crates.ioanyhow1openab-auth-proxy/Cargo.toml
crates.iotracing0.1openab-auth-proxy/Cargo.toml
crates.iotracing-subscriber0.3openab-auth-proxy/Cargo.toml
crates.ioopen5openab-auth-proxy/Cargo.toml
crates.iotower0.5openab-auth-proxy/Cargo.toml
crates.iotower-http0.6openab-auth-proxy/Cargo.toml
crates.ioaws-config1.5operator/Cargo.toml
crates.ioaws-sdk-ecs1.53operator/Cargo.toml
crates.ioaws-sdk-ec21operator/Cargo.toml
crates.ioaws-sdk-iam1operator/Cargo.toml
crates.ioaws-sdk-s31.65operator/Cargo.toml
crates.ioaws-sdk-scheduler1.98operator/Cargo.toml
crates.ioaws-sdk-ssm1.52operator/Cargo.toml
crates.ioaws-sdk-sts1operator/Cargo.toml
crates.ioaws-sdk-cloudwatchlogs1operator/Cargo.toml
crates.ioaws-sdk-secretsmanager1operator/Cargo.toml
crates.ioaws-sdk-apigatewayv21operator/Cargo.toml
crates.ioaws-sdk-servicediscovery1operator/Cargo.toml
crates.ioecsctloperator/Cargo.toml
crates.ioclap4.5operator/Cargo.toml
crates.iochrono0.4operator/Cargo.toml
crates.ioserde1.0operator/Cargo.toml
crates.ioserde_json1operator/Cargo.toml
crates.ioserde_yaml0.9operator/Cargo.toml
crates.iotokio1.40operator/Cargo.toml
crates.iotoml0.8operator/Cargo.toml
crates.ioanyhow1.0operator/Cargo.toml
crates.iodirs6operator/Cargo.toml
crates.iorpassword7operator/Cargo.toml
crates.ioreqwest0.12operator/Cargo.toml
crates.iotokio1crates/openab-core/Cargo.toml
crates.ioserde1crates/openab-core/Cargo.toml
crates.ioserde_json1crates/openab-core/Cargo.toml
crates.iotoml0.8crates/openab-core/Cargo.toml
crates.iotoml_edit0.22crates/openab-core/Cargo.toml
crates.iotracing0.1crates/openab-core/Cargo.toml
crates.iotracing-subscriber0.3crates/openab-core/Cargo.toml
crates.ioserenity0.12crates/openab-core/Cargo.toml
crates.iouuid1crates/openab-core/Cargo.toml
crates.ioregex1crates/openab-core/Cargo.toml
crates.ioanyhow1crates/openab-core/Cargo.toml
crates.ioasync-trait0.1crates/openab-core/Cargo.toml
crates.iofutures-util0.3crates/openab-core/Cargo.toml
crates.iorand0.8crates/openab-core/Cargo.toml
crates.ioclap4crates/openab-core/Cargo.toml
crates.iorpassword7crates/openab-core/Cargo.toml
crates.ioreqwest0.12crates/openab-core/Cargo.toml
crates.iobytes1crates/openab-core/Cargo.toml
crates.iobase640.22crates/openab-core/Cargo.toml
crates.ioimage0.25crates/openab-core/Cargo.toml
crates.iounicode-width0.2crates/openab-core/Cargo.toml
crates.iounicode-segmentation1crates/openab-core/Cargo.toml
crates.iopulldown-cmark0.13crates/openab-core/Cargo.toml
crates.iotokio-tungstenite0.21crates/openab-core/Cargo.toml
crates.iorustls0.22crates/openab-core/Cargo.toml
crates.iotokio-rustls0.25crates/openab-core/Cargo.toml
crates.iowebpki-roots0.26crates/openab-core/Cargo.toml
crates.iocron0.16.0crates/openab-core/Cargo.toml
crates.iochrono0.4.44crates/openab-core/Cargo.toml
crates.iochrono-tz0.10.4crates/openab-core/Cargo.toml
crates.ioemojis0.8crates/openab-core/Cargo.toml
crates.iosha20.10crates/openab-core/Cargo.toml
crates.iotempfile3.27.0crates/openab-core/Cargo.toml
crates.ioaws-sdk-secretsmanager1crates/openab-core/Cargo.toml
crates.ioaws-sdk-s31crates/openab-core/Cargo.toml
crates.ioaws-config1crates/openab-core/Cargo.toml
crates.iozip2crates/openab-core/Cargo.toml
crates.ioflate21crates/openab-core/Cargo.toml
crates.iotar0.4.45crates/openab-core/Cargo.toml
crates.ioaws-sigv41crates/openab-core/Cargo.toml
crates.ioaws-credential-types1crates/openab-core/Cargo.toml
crates.iourlencoding2crates/openab-core/Cargo.toml
crates.iohex0.4crates/openab-core/Cargo.toml
crates.iohttp1crates/openab-core/Cargo.toml
crates.iotokio1crates/openab-gateway/Cargo.toml
crates.ioaxum0.8crates/openab-gateway/Cargo.toml
crates.iotokio-tungstenite0.21crates/openab-gateway/Cargo.toml
crates.iofutures-util0.3crates/openab-gateway/Cargo.toml
crates.ioserde1crates/openab-gateway/Cargo.toml
crates.ioserde_json1crates/openab-gateway/Cargo.toml
crates.ioreqwest0.12crates/openab-gateway/Cargo.toml
crates.iotracing0.1crates/openab-gateway/Cargo.toml
crates.iotracing-subscriber0.3crates/openab-gateway/Cargo.toml
crates.ioanyhow1crates/openab-gateway/Cargo.toml
crates.iouuid1crates/openab-gateway/Cargo.toml
crates.iochrono0.4crates/openab-gateway/Cargo.toml
crates.iohmac0.12crates/openab-gateway/Cargo.toml
crates.iosha20.10crates/openab-gateway/Cargo.toml
crates.iobase640.22crates/openab-gateway/Cargo.toml
crates.iojsonwebtoken9crates/openab-gateway/Cargo.toml
crates.ioaes0.8crates/openab-gateway/Cargo.toml
crates.iocbc0.1crates/openab-gateway/Cargo.toml
crates.ioprost0.13crates/openab-gateway/Cargo.toml
crates.iosubtle2crates/openab-gateway/Cargo.toml
crates.iosha10.10crates/openab-gateway/Cargo.toml
crates.ioquick-xml0.37crates/openab-gateway/Cargo.toml
crates.ioimage0.25crates/openab-gateway/Cargo.toml
crates.ioparking_lot0.12crates/openab-gateway/Cargo.toml
crates.iourlencoding2crates/openab-gateway/Cargo.toml
crates.iotokio1crates/openab-mcp/Cargo.toml
crates.ioserde1crates/openab-mcp/Cargo.toml
crates.ioserde_json1crates/openab-mcp/Cargo.toml
crates.ioreqwest0.12crates/openab-mcp/Cargo.toml
crates.ioreqwest0130.13crates/openab-mcp/Cargo.toml
crates.ioanyhow1crates/openab-mcp/Cargo.toml
crates.ioasync-trait0.1crates/openab-mcp/Cargo.toml
crates.iotracing0.1crates/openab-mcp/Cargo.toml
crates.iobase640.22.1crates/openab-mcp/Cargo.toml
crates.iosha20.11.0crates/openab-mcp/Cargo.toml
crates.iogetrandom0.4.2crates/openab-mcp/Cargo.toml
crates.iourlencoding2.1.3crates/openab-mcp/Cargo.toml
crates.ioopen5.3.5crates/openab-mcp/Cargo.toml
crates.iourl2.5.8crates/openab-mcp/Cargo.toml
crates.iooauth25crates/openab-mcp/Cargo.toml
crates.iojsonschema0.46crates/openab-mcp/Cargo.toml
crates.iormcp1.7crates/openab-mcp/Cargo.toml
crates.ioaxum0.8crates/openab-mcp/Cargo.toml
crates.ioserde1crates/platform-schema/Cargo.toml
crates.iotoml0.8crates/platform-schema/Cargo.toml
全部依赖 未采集

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 20123,
      "has_wiki": true,
      "homepage": "https://openabdev.github.io/openab/",
      "languages": {
        "HCL": 3269,
        "Ruby": 1763,
        "Rust": 3987471,
        "Shell": 2766,
        "Python": 19135,
        "Dockerfile": 5061,
        "Go Template": 7499
      },
      "pushed_at": "2026-07-25T05:00:08Z",
      "created_at": "2026-04-03T12:15:54Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-27T22:00:06Z",
      "description": "A lightweight, secure, cloud-native ACP harness that bridges Discord and any ACP-compatible coding CLI.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Rust",
      "significant_languages": [
        "Rust"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "openabdev",
      "company": null,
      "location": null,
      "followers": 32,
      "avatar_url": "https://avatars.githubusercontent.com/u/274127192?v=4",
      "created_at": "2026-04-06T22:44:46Z",
      "is_verified": null,
      "public_repos": 5,
      "account_age_days": 112
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "oabctl-pre-beta",
          "kind": "other",
          "published_at": "2026-07-25T04:32:04Z"
        },
        {
          "tag": "openab-0.10.0-beta.2",
          "kind": "other",
          "published_at": "2026-07-23T23:36:37Z"
        },
        {
          "tag": "openab-0.10.0-beta.1",
          "kind": "other",
          "published_at": "2026-07-22T02:25:48Z"
        },
        {
          "tag": "openab-0.9.0",
          "kind": "other",
          "published_at": "2026-07-20T02:47:46Z"
        },
        {
          "tag": "openab-0.9.0-beta.12",
          "kind": "other",
          "published_at": "2026-07-19T18:55:10Z"
        },
        {
          "tag": "openab-0.9.0-beta.11",
          "kind": "other",
          "published_at": "2026-07-18T13:33:58Z"
        },
        {
          "tag": "openab-0.9.0-beta.10",
          "kind": "other",
          "published_at": "2026-07-14T03:15:43Z"
        },
        {
          "tag": "openab-0.9.0-beta.9",
          "kind": "other",
          "published_at": "2026-07-11T10:30:11Z"
        },
        {
          "tag": "openab-0.9.0-beta.8",
          "kind": "other",
          "published_at": "2026-07-06T21:01:57Z"
        },
        {
          "tag": "openab-0.9.0-beta.7",
          "kind": "other",
          "published_at": "2026-07-04T03:45:03Z"
        },
        {
          "tag": "pre-seed-utils-v2.35.13-ghp0.3.2",
          "kind": "other",
          "published_at": "2026-07-01T01:42:42Z"
        },
        {
          "tag": "openab-0.9.0-beta.6",
          "kind": "other",
          "published_at": "2026-06-30T04:08:56Z"
        },
        {
          "tag": "pre-seed-utils-v2.35.12-ghp0.3.2",
          "kind": "other",
          "published_at": "2026-06-29T21:43:12Z"
        },
        {
          "tag": "openab-0.9.0-beta.5",
          "kind": "other",
          "published_at": "2026-06-29T13:07:39Z"
        },
        {
          "tag": "openab-0.9.0-beta.4",
          "kind": "other",
          "published_at": "2026-06-28T04:47:04Z"
        },
        {
          "tag": "openab-0.9.0-beta.3",
          "kind": "other",
          "published_at": "2026-06-25T20:56:48Z"
        },
        {
          "tag": "openab-0.9.0-beta.2",
          "kind": "other",
          "published_at": "2026-06-23T22:51:11Z"
        },
        {
          "tag": "openab-0.9.0-beta.1",
          "kind": "other",
          "published_at": "2026-06-21T03:06:29Z"
        },
        {
          "tag": "openab-0.8.5",
          "kind": "other",
          "published_at": "2026-06-20T22:12:38Z"
        },
        {
          "tag": "openab-0.8.5-beta.13",
          "kind": "other",
          "published_at": "2026-06-19T17:17:13Z"
        },
        {
          "tag": "openab-line-0.1.0",
          "kind": "other",
          "published_at": "2026-06-18T00:33:30Z"
        },
        {
          "tag": "openab-0.8.5-beta.12",
          "kind": "other",
          "published_at": "2026-06-18T00:33:28Z"
        },
        {
          "tag": "openab-0.8.5-beta.11",
          "kind": "other",
          "published_at": "2026-06-16T18:04:19Z"
        },
        {
          "tag": "openab-0.8.5-beta.10",
          "kind": "other",
          "published_at": "2026-06-16T11:39:20Z"
        },
        {
          "tag": "gateway-v0.6.0-rc.9",
          "kind": "other",
          "published_at": "2026-06-15T04:04:08Z"
        },
        {
          "tag": "gateway-v0.6.0-rc.8",
          "kind": "other",
          "published_at": "2026-06-15T03:59:44Z"
        },
        {
          "tag": "gateway-v0.6.0-rc.7",
          "kind": "other",
          "published_at": "2026-06-15T03:53:40Z"
        },
        {
          "tag": "gateway-v0.6.0-rc.6",
          "kind": "other",
          "published_at": "2026-06-15T03:48:54Z"
        },
        {
          "tag": "gateway-v0.6.0-rc.5",
          "kind": "other",
          "published_at": "2026-06-15T03:42:17Z"
        },
        {
          "tag": "gateway-v0.6.0-rc.4",
          "kind": "other",
          "published_at": "2026-06-15T03:34:24Z"
        },
        {
          "tag": "gateway-v0.6.0-rc.3",
          "kind": "other",
          "published_at": "2026-06-15T03:32:09Z"
        },
        {
          "tag": "gateway-v0.6.0-rc.2",
          "kind": "other",
          "published_at": "2026-06-15T03:11:44Z"
        },
        {
          "tag": "gateway-v0.6.0-rc.1",
          "kind": "other",
          "published_at": "2026-06-15T01:33:33Z"
        },
        {
          "tag": "gateway-vpr1106",
          "kind": "other",
          "published_at": "2026-06-14T15:31:14Z"
        },
        {
          "tag": "openab-0.8.5-beta.9",
          "kind": "other",
          "published_at": "2026-06-13T13:15:17Z"
        },
        {
          "tag": "openab-0.8.5-beta.8",
          "kind": "other",
          "published_at": "2026-06-11T05:50:03Z"
        },
        {
          "tag": "openab-0.8.5-beta.7",
          "kind": "other",
          "published_at": "2026-06-10T22:20:48Z"
        },
        {
          "tag": "openab-0.8.5-beta.6",
          "kind": "other",
          "published_at": "2026-06-09T01:11:10Z"
        },
        {
          "tag": "openab-0.8.5-beta.5",
          "kind": "other",
          "published_at": "2026-06-08T03:57:53Z"
        },
        {
          "tag": "openab-0.8.5-beta.4",
          "kind": "other",
          "published_at": "2026-06-08T00:24:04Z"
        },
        {
          "tag": "gateway-v0.5.4",
          "kind": "other",
          "published_at": "2026-06-07T20:01:43Z"
        },
        {
          "tag": "gateway-v0.5.3",
          "kind": "other",
          "published_at": "2026-06-06T14:20:51Z"
        },
        {
          "tag": "openab-0.8.5-beta.3",
          "kind": "other",
          "published_at": "2026-06-06T14:12:20Z"
        },
        {
          "tag": "openab-0.8.5-beta.2",
          "kind": "other",
          "published_at": "2026-06-06T04:36:30Z"
        },
        {
          "tag": "openab-0.8.5-beta.1",
          "kind": "other",
          "published_at": "2026-06-03T21:41:41Z"
        },
        {
          "tag": "gateway-v0.5.2",
          "kind": "other",
          "published_at": "2026-06-03T19:06:07Z"
        },
        {
          "tag": "openab-0.8.4",
          "kind": "other",
          "published_at": "2026-06-02T02:17:04Z"
        },
        {
          "tag": "openab-0.8.4-beta.11",
          "kind": "other",
          "published_at": "2026-06-02T00:51:43Z"
        },
        {
          "tag": "openab-0.8.4-beta.10",
          "kind": "other",
          "published_at": "2026-06-01T16:20:54Z"
        },
        {
          "tag": "openab-0.8.4-beta.9",
          "kind": "other",
          "published_at": "2026-05-31T20:27:43Z"
        },
        {
          "tag": "openab-0.8.4-beta.8",
          "kind": "other",
          "published_at": "2026-05-31T14:15:06Z"
        },
        {
          "tag": "openab-0.8.4-beta.7",
          "kind": "other",
          "published_at": "2026-05-28T04:02:13Z"
        },
        {
          "tag": "openab-0.8.4-beta.6",
          "kind": "other",
          "published_at": "2026-05-27T21:32:46Z"
        },
        {
          "tag": "openab-0.8.4-beta.5",
          "kind": "other",
          "published_at": "2026-05-26T21:41:53Z"
        },
        {
          "tag": "openab-feishu-0.1.0",
          "kind": "other",
          "published_at": "2026-05-26T01:51:02Z"
        },
        {
          "tag": "openab-0.8.4-beta.4",
          "kind": "other",
          "published_at": "2026-05-26T01:51:01Z"
        },
        {
          "tag": "openab-0.8.4-beta.3",
          "kind": "other",
          "published_at": "2026-05-22T23:11:56Z"
        },
        {
          "tag": "openab-0.8.4-beta.2",
          "kind": "other",
          "published_at": "2026-05-22T03:56:47Z"
        },
        {
          "tag": "openab-telegram-0.1.0",
          "kind": "other",
          "published_at": "2026-05-21T21:49:53Z"
        },
        {
          "tag": "openab-0.8.4-beta.1",
          "kind": "other",
          "published_at": "2026-05-21T21:49:51Z"
        },
        {
          "tag": "openab-0.8.3",
          "kind": "other",
          "published_at": "2026-05-20T23:21:30Z"
        },
        {
          "tag": "openab-0.8.3-beta.13",
          "kind": "other",
          "published_at": "2026-05-20T23:04:51Z"
        },
        {
          "tag": "gateway-v0.5.1",
          "kind": "other",
          "published_at": "2026-05-20T22:46:52Z"
        },
        {
          "tag": "openab-0.8.3-beta.12",
          "kind": "other",
          "published_at": "2026-05-19T23:51:21Z"
        },
        {
          "tag": "gateway-v0.5.0",
          "kind": "other",
          "published_at": "2026-05-19T23:56:17Z"
        },
        {
          "tag": "openab-0.8.3-beta.11",
          "kind": "other",
          "published_at": "2026-05-17T03:26:47Z"
        },
        {
          "tag": "openab-0.8.3-beta.10",
          "kind": "other",
          "published_at": "2026-05-16T06:39:51Z"
        },
        {
          "tag": "openab-0.8.3-beta.9",
          "kind": "other",
          "published_at": "2026-05-13T20:28:55Z"
        },
        {
          "tag": "openab-0.8.3-beta.8",
          "kind": "other",
          "published_at": "2026-05-11T18:04:24Z"
        },
        {
          "tag": "openab-0.8.3-beta.7",
          "kind": "other",
          "published_at": "2026-05-11T01:50:14Z"
        },
        {
          "tag": "openab-0.8.3-beta.6",
          "kind": "other",
          "published_at": "2026-05-09T18:20:28Z"
        },
        {
          "tag": "openab-0.8.3-beta.5",
          "kind": "other",
          "published_at": "2026-05-09T14:30:39Z"
        },
        {
          "tag": "openab-0.8.3-beta.4",
          "kind": "other",
          "published_at": "2026-05-06T20:54:01Z"
        },
        {
          "tag": "gateway-v0.4.0",
          "kind": "other",
          "published_at": "2026-05-06T01:31:40Z"
        },
        {
          "tag": "openab-0.8.3-beta.3",
          "kind": "other",
          "published_at": "2026-05-05T21:58:15Z"
        },
        {
          "tag": "openab-0.8.3-beta.2",
          "kind": "other",
          "published_at": "2026-05-03T23:22:56Z"
        },
        {
          "tag": "openab-0.8.3-beta.1",
          "kind": "other",
          "published_at": "2026-05-03T04:40:14Z"
        },
        {
          "tag": "openab-0.8.2",
          "kind": "other",
          "published_at": "2026-05-01T22:39:53Z"
        },
        {
          "tag": "openab-0.8.2-beta.8",
          "kind": "other",
          "published_at": "2026-05-01T16:30:06Z"
        },
        {
          "tag": "openab-0.8.2-beta.7",
          "kind": "other",
          "published_at": "2026-05-01T04:55:56Z"
        },
        {
          "tag": "openab-0.8.2-beta.6",
          "kind": "other",
          "published_at": "2026-05-01T01:40:17Z"
        },
        {
          "tag": "openab-0.8.2-beta.5",
          "kind": "other",
          "published_at": "2026-04-30T21:37:57Z"
        },
        {
          "tag": "openab-0.8.2-beta.4",
          "kind": "other",
          "published_at": "2026-04-30T13:21:10Z"
        },
        {
          "tag": "openab-0.8.2-beta.3",
          "kind": "other",
          "published_at": "2026-04-29T00:37:21Z"
        },
        {
          "tag": "openab-0.8.2-beta.2",
          "kind": "other",
          "published_at": "2026-04-28T20:04:11Z"
        },
        {
          "tag": "openab-0.8.2-beta.1",
          "kind": "other",
          "published_at": "2026-04-27T20:24:44Z"
        },
        {
          "tag": "openab-0.8.1",
          "kind": "other",
          "published_at": "2026-04-26T14:49:22Z"
        },
        {
          "tag": "openab-0.8.1-beta.8",
          "kind": "other",
          "published_at": "2026-04-26T07:07:44Z"
        },
        {
          "tag": "openab-0.8.1-beta.7",
          "kind": "other",
          "published_at": "2026-04-25T18:56:18Z"
        },
        {
          "tag": "openab-0.8.1-beta.6",
          "kind": "other",
          "published_at": "2026-04-25T05:58:36Z"
        },
        {
          "tag": "openab-0.8.1-beta.5",
          "kind": "other",
          "published_at": "2026-04-24T22:54:42Z"
        },
        {
          "tag": "gateway-v0.3.0",
          "kind": "other",
          "published_at": "2026-04-24T20:34:34Z"
        },
        {
          "tag": "gateway-v0.2.0",
          "kind": "other",
          "published_at": "2026-04-24T18:38:08Z"
        },
        {
          "tag": "gateway-v0.1.0",
          "kind": "other",
          "published_at": "2026-04-24T17:21:59Z"
        },
        {
          "tag": "openab-0.8.1-beta.4",
          "kind": "other",
          "published_at": "2026-04-24T05:36:57Z"
        },
        {
          "tag": "openab-0.8.1-beta.3",
          "kind": "other",
          "published_at": "2026-04-23T06:45:17Z"
        },
        {
          "tag": "openab-0.8.1-beta.2",
          "kind": "other",
          "published_at": "2026-04-22T07:32:51Z"
        },
        {
          "tag": "openab-0.8.1-beta.1",
          "kind": "other",
          "published_at": "2026-04-21T17:42:46Z"
        },
        {
          "tag": "openab-0.8.0",
          "kind": "other",
          "published_at": "2026-04-20T11:28:33Z"
        },
        {
          "tag": "openab-0.8.0-beta.1",
          "kind": "other",
          "published_at": "2026-04-20T11:22:30Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "53061d696148106b2b7529f9d6c5dd802dff4545",
          "body": "* docs(adr): define OAB MCP adapter MVP\n\n* docs(adr): clarify OAB MCP facade boundary\n\n* docs(adr): use ASCII architecture diagrams\n\n* docs(adr): show MCP and plugin capability paths\n\n* docs(adr): clarify OpenWork capability vision\n\n* docs(adr): show OAB pod boundary\n\n* docs(adr): make pod boundary \n[…]\n— shipped outcomes vs §5/§10 assumptions\n\n---------\n\nCo-authored-by: chaodu-agent <274062505+chaodu-agent@users.noreply.github.com>\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": true,
          "headline": "docs(adr): OAB MCP adapter (#1446)",
          "author_name": "chaodu-obk[bot]",
          "author_login": "chaodu-obk[bot]",
          "committed_at": "2026-07-25T05:00:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0e8b10e0cb09fd1be781cae1b4c6905e466cb00e",
          "body": "Google issues a client secret to Desktop-type clients and requires it at\nthe token endpoint (it is merely not treated as confidential) — a\nsecret-less exchange fails with invalid_request. The validated path is\nWeb application + secret; Desktop works only with both env vars set.\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs(gmail-native): correct the Desktop OAuth client claim (#1455)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-25T04:41:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "28a87177825623e2bb9724b30cf79f7ce8b49c53",
          "body": "* feat(facade): session-aware in-process capability sources\n\n- sources module: CapabilitySource trait (optional SessionCtx per call,\n  requires_session gating), SessionTokens registry (broker mints one\n  opaque token per agent session, constant-time resolve, revoke on\n  evict), per-request identity \n[…]\nnes now carry args_sha256 like the meta_tool\n  dispatcher's — one audit shape across both dispatch paths.\n\n* style: fmt\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(facade): session-aware in-process capability sources (#1454)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-25T04:11:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f93ad9c51010a92f3926d8f12406ecf327cb7bf",
          "body": "…for subsystems (#1452)\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs: CLI conventions — top-level verbs for the bot, noun namespaces …",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-25T02:02:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "10d0463b1f93efaf03041b0d903ad39be84b26b3",
          "body": "* docs: OAB MCP Facade operator guide\n\nDocuments the #1448 feature: enablement (broker [mcp] / standalone),\nthe two-tool surface, audit lines, client registration (incl. the kiro\n--agent config gotcha), trust model, and the pod-vs-fleet positioning\nrelative to octobroker (ADR §4.1).\n\n* docs: add mer\n[…]\nhitecture diagram to the facade guide\n\n* docs: describe facade-only run mode (replaces removed openab-agent mcp-facade)\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs: OAB MCP Facade operator guide (#1450)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-25T02:01:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ee49aae66b3493c0889afb776e4729d4cb58c4ad",
          "body": "…alid (#1453)\n\nCloses #1451. An adapter-less config with [mcp] present now runs just the\nOAB MCP Facade listener in the foreground (one entrypoint, config-driven)\ninstead of bailing with 'no adapter configured'. The bail message now\nmentions the [mcp] option. Removes the openab-agent mcp-facade\nsubc\n[…]\nserving surfaces do not belong on the coding-agent binary\n(nothing shipped depends on it; #1449 established the openab-side home).\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(mcp): facade-only run mode — adapter-less config with [mcp] is v…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-25T02:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "189c12d4c1e06848b6f4abd7bb4777664959bcc2",
          "body": "…MCP server (#1449)\n\n* feat(mcp): native Gmail adapter — six-tool §6.5 profile over Gmail REST as stdio MCP server\n\nCapability Plugin per ADR §5.3/§6.1 and rollout step 5, motivated by live\nvalidation (PR #1448): hosted Gmail MCP gates tools/call behind Workspace\nDeveloper Preview enrollment and its\n[…]\nonfig-driven\n([mcp] + openab run). Standalone/dev serving and interactive logins are\nthe namespace's job.\n\n* style: fmt\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(mcp): native Gmail adapter — §6.5 profile over GA REST as stdio …",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-25T01:56:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3149c1d327bb1e59111fb8dab93cf18acef9c9b6",
          "body": "…back HTTP server (#1448)\n\n* feat(agent): OAB MCP Facade MVP — mcp-facade stdio server + tool_filter enforcement\n\nImplements the OAB MCP Adapter ADR (#1446) MVP slice in openab-agent:\n\n- New 'openab-agent mcp-facade' subcommand: inbound stdio MCP server\n  exposing exactly search_capabilities / execu\n[…]\nre (incl.\nDockerfile.gateway/builder/native/agentcore, which share the pattern\nbut are outside this PR's smoke matrix).\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(mcp): OAB MCP Facade MVP — shared openab-mcp crate + broker loop…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-24T22:39:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "967270087ab74b32bcba9f6bc89a402e7abc3aca",
          "body": "Co-authored-by: openab-app[bot] <274185012+openab-app[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "release: v0.10.0-beta.2 (#1445)",
          "author_name": "openab-app[bot]",
          "author_login": "openab-app[bot]",
          "committed_at": "2026-07-23T23:36:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c5b549245f59ee3cae1b5dafafe04e9afef8283",
          "body": "* feat(acp): revive ACP server over WebSocket (#1260)\n\nRestore the ACP server adapter from the auto-closed #1260, rebased onto\nmain. Exposes OAB as an ACP server over WebSocket at `GET /acp`, gated by\nthe `acp` feature + `OPENAB_ACP_ENABLED`. Prompts are bridged to\n`GatewayEvent` and replies streame\n[…]\nan id -> -32600 (no empty-success frame); notification -> no frame + fires.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(acp): ACP server over WebSocket (revives #1260) (#1418)",
          "author_name": "Brett Chien",
          "author_login": "brettchien",
          "committed_at": "2026-07-23T23:11:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "421f3ce27c84376c7a5f9f6d954e78e8221f985f",
          "body": "* fix(feishu): start websocket in unified mode\n\n(cherry picked from commit a248a33381e6433a4e6cdcacfa0dac38aad2922a)\n\n* fix(review): address Feishu lifecycle and docs findings\n\n* fix(feishu): bound unified identity resolution\n\n* refactor(feishu): name identity timeout\n\n* fix(feishu): cfg-gate timeout constant\n\n---------\n\nCo-authored-by: SunnyYYLin <sunnylinyy@outlook.com>\nCo-authored-by: chaodu-agent <274062505+chaodu-agent@users.noreply.github.com>",
          "is_bot": true,
          "headline": "fix(feishu): start websocket in unified mode (#1443)",
          "author_name": "chaodu-obk[bot]",
          "author_login": "chaodu-obk[bot]",
          "committed_at": "2026-07-23T20:43:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "136554ed1bcf90caae3a7a894d769e97f94f5cae",
          "body": "* docs: document maintainer take-over of fork PRs\n\nApp installation tokens cannot push to fork branches, so maintainers\nmay take over a reviewed fork PR: cherry-pick to preserve authorship,\ncredit @username in the replacement PR description, finish remaining\nnits, merge, and close the original with \n[…]\nholder instead of real username in take-over example\n\n* docs: use noreply-email form for Co-authored-by trailer example\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs: document maintainer take-over of fork PRs (#1444)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-23T19:05:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fc22758322eee87ad2cd9cd26d4ae7427882500a",
          "body": "…s (#1442)\n\npull_request_review runs triggered by fork PRs get a read-only\nGITHUB_TOKEN, so the label add/remove calls fail with 403\n\"Resource not accessible by integration\" (e.g. every review\nsubmitted on #1440).\n\nGuard the job: only handle pull_request_review when the PR head\nrepo is this repo. Fork PR labels stay eventually-consistent via\nthe hourly schedule / workflow_dispatch reconciliation, which runs\nwith a full token.\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(ci): skip pending-maintainer label writes on fork PR review event…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-23T18:27:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "685973307bf79d6848c21b33a5bd55b6aea1c433",
          "body": "Co-authored-by: openab-app[bot] <274185012+openab-app[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "release: v0.10.0-beta.1 (#1433)",
          "author_name": "openab-app[bot]",
          "author_login": "openab-app[bot]",
          "committed_at": "2026-07-22T02:25:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a79f5e803432532a9ae812d79b11dff24c75f9f9",
          "body": "PR #1429 added the kimi agent to Dockerfile.unified and to the pre-beta\nworkflow's ALL_AGENTS, but Dockerfile.package (used by pre-beta-build.yml)\nnever got the stage. Every pre-beta run since then fails both kimi build\njobs with 'target stage \"kimi\" could not be found', so\nghcr.io/openabdev/openab:\n[…]\nPY --from=bins instead of the builder stage).\n\nFixes the failed kimi jobs in runs 29776844194, 29791564121, 29830138174.\n\nCo-authored-by: chaodu-agent <274062505+chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(build): add missing kimi stage to Dockerfile.package (#1432)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-21T22:09:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3ac3e31df66a9a504818b9aae4d89d6ff51b2aeb",
          "body": null,
          "is_bot": false,
          "headline": "chore: upgrade Grok CLI to version 0.2.106 and update checksums (#1430)",
          "author_name": "Eric Chen",
          "author_login": "fshiori",
          "committed_at": "2026-07-21T11:32:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8d4bf15ca9a6e7380a5683a87527b93f527badb",
          "body": "* chore: bump safe coding CLI pins\n\n* chore: bump Devin CLI to 3000.2.17\n\n* fix: close CLI pin review gaps\n\n* fix: resolve Copilot package dynamically in smoke test\n\n* fix(ci): harden CLI version smoke assertions\n\n* chore: bump kiro-cli 2.8.1 -> 2.13.0\n\nVerified on Linux x86_64 headless (Ubuntu 24.0\n[…]\ninstalled Kiro CLI version in standalone and unified images\n\n---------\n\nCo-authored-by: chaodu-agent <274062505+chaodu-agent@users.noreply.github.com>\nCo-authored-by: thepagent <hehsieh1010@gmail.com>",
          "is_bot": false,
          "headline": "chore: bump safe Coding CLI pins (#1427)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-21T00:52:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "654bf977f89cfcd3bf0bc1a3011e263451cf605d",
          "body": "* feat: add Kimi Code CLI backend\n\n* docs: add Kimi to runtime diagrams\n\n* fix: use 'kimi login' as auth command\n\n* fix: address review findings F1-F3\n\n- align standalone Kimi image packages with unified target (add bubblewrap, socat, git)\n- correct OAuth ADR agent variant inventory (16 variants, add devin)\n- fix Kimi credential guidance: config.toml only, no shell env fallback\n\n---------\n\nCo-authored-by: chaodu-agent <274062505+chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat: add Kimi Code CLI backend (#1429)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-20T20:18:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "359001e532ba04a2c8aa07737c09d4028aafb5a8",
          "body": "Co-authored-by: openab-app[bot] <274185012+openab-app[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "release: v0.9.0 (#1426)",
          "author_name": "openab-app[bot]",
          "author_login": "openab-app[bot]",
          "committed_at": "2026-07-20T02:47:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a88aba1ebba6a32c235e846eddad4edf9970ecb",
          "body": "Co-authored-by: openab-app[bot] <274185012+openab-app[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "release: v0.9.0-beta.12 (#1425)",
          "author_name": "openab-app[bot]",
          "author_login": "openab-app[bot]",
          "committed_at": "2026-07-19T18:51:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7faa937220fea9004542c2422579dc331faef4e2",
          "body": "…a device-code OAuth (#1424)\n\n* feat(openab-agent): xAI subscription login via OAuth device-code vendor\n\nAdds SuperGrok / X Premium subscription sign-in to openab-agent:\n\n- auth.rs: XaiVendor descriptor (namespace xai-oauth) + a generic\n  RFC 8628 device-code login driver shared by all DeviceCode-gr\n[…]\nl auth command\n\n* refactor: remove xai-device auth alias\n\n* fix(openab-agent): apply rustfmt to xAI auth test\n\n---------\n\nCo-authored-by: chaodu-agent <274062505+chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(openab-agent): xAI subscription login (SuperGrok / X Premium) vi…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-19T18:50:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f8e91565a4e044892515067532be9ad3100dd2b6",
          "body": "Co-authored-by: chaodu-agent <274062505+chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs(review): add Review Contract policy (#1422)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-18T15:07:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4727ddb3d0e819ddb366bc17c94b7f4da879da19",
          "body": "Co-authored-by: openab-app[bot] <274185012+openab-app[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "release: v0.9.0-beta.11 (#1421)",
          "author_name": "openab-app[bot]",
          "author_login": "openab-app[bot]",
          "committed_at": "2026-07-18T13:33:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e3292bc3e3e01f0fb203dc38003ad4c9afc7ca5",
          "body": "…ge (#1419)\n\n* docs(claude-code): add troubleshooting for OAuth login 400 error\n\n* build(claude): bump claude-agent-acp 0.59.0 + claude-code 2.1.212\n\n* fix(claude): default OPENAB_AGENT_COMMAND to claude-agent-acp\n\nBare `claude` is the interactive REPL — it has no ACP mode and replies\nto the JSON-RP\n[…]\nefault and document --sso as an explicit\nopt-in via OPENAB_AGENT_AUTH_COMMAND override for SSO organizations.\n\n---------\n\nCo-authored-by: chaodu-agent <274062505+chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(claude): ACP default command, version bumps, auth docs, CI covera…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-18T02:36:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7bead66b1de39c3e90ff011b2e69ad64317e4173",
          "body": "* ci(issues)!: close unlinked stale issues instead of report-only\n\nMaintainer decision: an open issue with no linked PR after 14 days\nsignals insufficient priority. Replace the report-only triage scan\nwith comment-and-close (state_reason: not_planned).\n\n- Comment tells the reporter to reopen or file\n[…]\nad of warning.\n\n* fix(ci): roll back cancelled stale closes\n\n* fix(ci): direct stale follow-ups to new issues\n\n---------\n\nCo-authored-by: chaodu-agent <274062505+chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "ci(issues)!: close unlinked stale issues instead of report-only (#1417)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-18T02:04:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "30bc145233a202754d205b21e8529491d97b1a7c",
          "body": "* ci(issues): auto-close open issues >14d old with no linked PR\n\nDaily scheduled workflow using the search qualifier\n'is:issue state:open -linked:pr created:<@today-14d'. Each match gets\na closing comment and is closed as not_planned. Safety cap of 50\ncloses per run; workflow_dispatch for manual runs.\n\n* fix(ci): make stale issue scan report-only\n\n---------\n\nCo-authored-by: chaodu-agent <274062505+chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "ci(issues): report stale issues with no linked PR (#1414)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-16T22:21:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a6bc8f147b25f0d76304817dd4c1b84722fb2ad",
          "body": "…1413)\n\nThe 👀 ack on /review comments 403s with pull-requests: read\n(gh: Resource not accessible by integration) because reactions on PR\ncomments are pull-request scope. Verified in run 29466027132 — the\nreview pipeline itself worked; only the ack was silently dropped via\n|| true.",
          "is_bot": false,
          "headline": "fix(pr-review): grant pull-requests write for /review ack reaction (#…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-16T02:16:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a36b1ef95adf0a71fe94d48390080f908d8b583a",
          "body": "…412)\n\nThe event-driven pull_request path is skipped for fork PRs (read-only\nGITHUB_TOKEN), leaving them dependent on the */5 cron schedule — which\nGitHub does not guarantee to run on time (or at all under load).\n\nAdd an issue_comment trigger: a maintainer (OWNER/MEMBER/COLLABORATOR)\ncomments \"/revi\n[…]\ner-PR concurrency group so commands don't cancel the poller\n- comment body is never interpolated into shell; only the numeric\n  issue number is used\n\nThe cron schedule remains as a catch-all backstop.",
          "is_bot": false,
          "headline": "ci(pr-review): add /review comment command for targeted PR review (#1…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-16T02:12:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9940337c18311e15bec55477fabd59ededde7b70",
          "body": "* refactor(oabctl): split operator into library + thin CLI binary\n\nExpose the operator's provisioning primitives as a library crate so\ndownstream control planes can reuse them in-process instead of shelling\nout to the CLI:\n\n- src/lib.rs: pub mods (apply, bootstrap, config, create, delete, get,\n  ing\n[…]\n(operator): preserve cleanup diagnostics\n\n---------\n\nCo-authored-by: chaodu-agent <274062505+chaodu-agent@users.noreply.github.com>\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "refactor(oabctl): split operator into library + thin CLI binary (#1404)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-15T20:15:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9e1fd2f8f5b587eb4c43d0ac9342385f851ac2bd",
          "body": "Co-authored-by: masami-agent <masami-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs: add openab-dashboard to AWESOME.md (#1406)",
          "author_name": "Masami",
          "author_login": "masami-agent",
          "committed_at": "2026-07-15T20:11:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dab9be027b8e618f9ca5e226d2be9cbe364048d6",
          "body": "…(#1408)\n\n* docs(teams): add Unified Mode section to enterprise deployment guide\n\nAdds the recommended v0.9.0+ Unified Mode deployment path:\n- No separate gateway container needed\n- OAB pod serves /webhook/teams directly on :8080\n- Helm configToml format with [teams] section\n- User trust configurati\n[…]\n(teams): fix device auth command quoting\n\n---------\n\nCo-authored-by: masami-agent <masami-agent@users.noreply.github.com>\nCo-authored-by: chaodu-agent <274062505+chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs(teams): add Unified Mode section to enterprise deployment guide …",
          "author_name": "Masami",
          "author_login": "masami-agent",
          "committed_at": "2026-07-15T20:06:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3686694ab68d93cb51595209c725b4bbaef17131",
          "body": "… (#1397)\n\n* fix(slack): collapse consecutive duplicate tool lines in Full display\n\nWhen claude-agent-acp calls the same tool several times in a row (e.g.\n`ToolSearch` three times to look up related MCP tools), `compose_display`\nin `ToolDisplay::Full` mode rendered one line per invocation, so Slack\n\n[…]\ncs-only. PR body updated\nseparately via the GitHub API to match the current implementation\n(`group_entries` / `render_group` split, 15 `compose_display` tests, v3\nimage digest) rather than v1 wording.",
          "is_bot": false,
          "headline": "fix(slack): collapse consecutive duplicate tool lines in Full display…",
          "author_name": "Yen",
          "author_login": "antigenius0910",
          "committed_at": "2026-07-15T11:26:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f26f99a93bf624e2b26ea2bf947cce6e22ddb594",
          "body": "* docs: add Kiro defined agents reference architecture\n\n* docs: add Kiro multi-agent delegation pattern\n\n* docs(kiro): add GPT-5.6 named agents\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs: add Kiro defined agents reference architecture (#1403)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-14T20:51:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42053108e3b7259d17c1656e384d451464f89c84",
          "body": "Co-authored-by: openab-app[bot] <274185012+openab-app[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "release: v0.9.0-beta.10 (#1399)",
          "author_name": "openab-app[bot]",
          "author_login": "openab-app[bot]",
          "committed_at": "2026-07-14T03:15:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2eb5ce1f71e8afa3f9f5dbcde2fca9b46ae98543",
          "body": "…cap (#1398)\n\nDiscord rejects the entire interaction response with Invalid Form Body\nwhen any select menu option label or description exceeds 100 characters,\nsurfacing to users as 'The application did not respond'. Hit in the wild\non /models when a backend model description (claude-fable-5, ~140 cha\n[…]\nxt is cut. Applied to both label\nand description. Regression tests cover the exact in-the-wild case plus\nCJK char-boundary safety.\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(discord): truncate select menu option text to Discord's 100-char …",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-14T02:50:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d85f454a87cd3e5e466329c559de85f2f3dacf63",
          "body": "The reusable workflow interpolated ${{ inputs.pr_number }} and\n${{ inputs.decision }} directly into the github-script JS source:\n\n    const prNumber = ${{ inputs.pr_number }};\n    const decision = '${{ inputs.decision }}';\n\ninputs.decision is a free-form string (only documented by a comment as\n\"main\n[…]\n process.env values are never eval'd as code regardless\nof content, closing the injection regardless of the input's declared\ntype.\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(ci): eliminate script injection in pending-decision.yml (#1395)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-13T23:25:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "65cad17090dad77305df992760ee93bceccd964b",
          "body": "Found during a follow-up audit after #1393. Pins the five third-party\n(non-actions/*, non-docker/*) GitHub Actions used across this repo's\nworkflows to the commit SHA their mutable tag currently resolves to:\n\n- dtolnay/rust-toolchain@stable -> @4be7066a (branch, not a tag)\n- azure/setup-helm@v4 -> @\n[…]\n audit, verified via the GitHub API tags list\nendpoint (returns commit SHA directly, avoiding annotated-tag object\nSHA confusion).\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "ci: pin third-party actions to commit SHA (#1396)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-13T23:23:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dd5ae46f763a4c084fd4fc11250df7a1380a9c30",
          "body": "* fix(ci): harden release-pr workflow against expression injection\n\nThe `Resolve version` step directly interpolated the free-form\n`inputs.version` string into a shell script via `${{ inputs.version }}`.\nBecause GitHub Actions expands `${{ }}` before bash sees the script, a\ncrafted version input suc\n[…]\n with actionlint (only pre-existing\nfinding remains) and a scanner asserting zero tainted interpolations\nin run blocks.\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(ci): harden release-pr workflow against expression injection (#1393)",
          "author_name": "Yen",
          "author_login": "antigenius0910",
          "committed_at": "2026-07-13T22:19:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4f981966791be5a8e5c3cce63599193084102f9f",
          "body": "…query (#1392)\n\n* feat(discord): add /usage slash command backed by kiro-cli ACP usage query\n\nAdds a Discord /usage slash command that reports the backend agent's\naccount-level usage and billing (plan, credits consumed vs limit,\noverage charges, billing cycle reset).\n\n- protocol.rs: UsageReport/Usag\n[…]\nimal embed as the green/red color strip with the billing-cycle\nfooter. Pinned by usage_reply_body_in_content_not_embed.\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(discord): add /usage slash command backed by kiro-cli ACP usage …",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-13T22:01:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ef12dcd1fdf7a4c179565f7237489ffdb803784d",
          "body": "…e (#1391)\n\n* feat(gateway)!: route standalone WS path through the shared trust gate\n\nPhase 1c prerequisite (#1356): the standalone-gateway WebSocket path\n(run_gateway_adapter) now enforces L2 (channel scope) and L3 (identity)\nvia the same per-platform trust registry as the unified path, instead\nof \n[…]\nied path (axum/bridge task context) awaits it directly as\nbefore. Rationale documented on the enum and both call sites.\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(gateway)!: route standalone WS path through the shared trust gat…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-13T19:33:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f89e9feee60a4ca82b9aa94a7e39935c87c8f73b",
          "body": null,
          "is_bot": false,
          "headline": "fix(googlechat): enable config-only startup (#1390)",
          "author_name": "Can",
          "author_login": "canyugs",
          "committed_at": "2026-07-13T18:28:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1aaabf1dd61a0626c9e881b5484b542ae5c75b7",
          "body": null,
          "is_bot": false,
          "headline": "fix(wecom): enable config-only unified startup (#1389)",
          "author_name": "Can",
          "author_login": "canyugs",
          "committed_at": "2026-07-13T16:36:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a249d0dd9a6bc7b1cf4963d77b47e9c4e3c96b7",
          "body": "* feat(cron): support Google Chat platform for scheduled messages\n\n* fix(cron): googlechat enablement check is config-first\n\nThe platform-configured check read only the GOOGLE_CHAT_ENABLED env\nvar, so a deployment enabling the platform via `[googlechat] enabled =\ntrue` (first-class section, #1383) w\n[…]\nilure is pre-existing on main, unrelated.)\n\n---------\n\nCo-authored-by: shaun-agent <265093149+shaun-agent@users.noreply.github.com>\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(cron): support Google Chat platform for scheduled messages (#1374)",
          "author_name": "shaun-agent",
          "author_login": "shaun-agent",
          "committed_at": "2026-07-13T12:05:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "024666498b538bf6b6127991c72c5e68df347307",
          "body": "* docs(adr): first-class per-platform config & trust-none default\n\nPropose promoting all gateway-connected platforms (Telegram, LINE,\nFeishu, WeCom, Google Chat, MS Teams) to top-level config sections,\nmatching the existing [discord] and [slack] structure.\n\nKey decisions:\n- Per-platform [telegram], \n[…]\ns-platform-config.md link in\nthe already-merged identity-trust-none ADR.\n\n---------\n\nCo-authored-by: 超渡法師 <chaodu-agent@openab.dev>\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs(adr): first-class per-platform configuration (#1263)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-13T11:13:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "024f98930ed71ebefcb242be4c1463ff5d31fadd",
          "body": "* docs(adr): revise identity-trust-none to three-layer architecture\n\nReceiver → Trust Gate → Handler replaces the previous\n'gate at handle_message()' design. Addresses all findings\nfrom the PR #1263 mob review (howie + 3 LLM reviewers).\n\nKey changes:\n- §4.2: Trust Gate is a dedicated ingress layer u\n[…]\ntandalone WS path still on should_skip_event, tracked on #1356).\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@openab.dev>\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs(adr): revise identity-trust-none — three-layer architecture (#1291)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-13T11:12:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bb335d1f8dda1eefb3fc35dec5aee95385520543",
          "body": "* test(gateway): config-first conformance guard (#1375)\n\nCloses the last open item on the config-first parity umbrella: a\nsource-scan conformance test (same pattern as the platform-schema\nsuite) asserting every platform env var referenced in this crate is in\nthe canonical covered set — i.e. has a co\n[…]\nents flag conservatively, prose fails the charset\n   filter, escaped-quote mis-pairs produce garbage that is filtered).\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "test(gateway): config-first conformance guard (#1375) (#1387)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-13T10:59:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e1c1a276d6d5b3853dc0eca1666d0598e0a4f6cc",
          "body": "…id formats, is_bot no-op (#1386)\n\nThree findings from canyugs/openab#18, all verified:\n\n- Callback mode is DM-only (channel_type always \"direct\", per-user\n  channel id) — L2 scoping via allowed_channels is meaningless for\n  WeCom; verified at wecom.rs:1059-1071.\n- allowed_users format caveat: plain\n[…]\nrs for WeCom; SenderInfo.is_bot is the ready source when bot\n  detection lands.\n\nRefs #1358 (tracked follow-ups). Credit: canyugs.\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs(platforms): wecom quirks from external review — DM-only L2, ISV …",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-13T04:09:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ea79608afa631a8e2c4387cf29a516430a4a57ce",
          "body": "* feat(feishu): full [feishu] section — all settings config-first\n\nFinal platform slice of the config-first parity umbrella (#1375):\nFeishu had no section at all — 21 settings were env-only. The new\n[feishu] section covers credentials, connection, behavior, and L3\nidentity trust, resolving each fiel\n[…]\n exercised end-to-end by\napply_feishu_config_requires_credentials.\n\n* style(feishu): last rustfmt spot in resolve_pairs\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(feishu): full [feishu] section — all settings config-first (#1385)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-13T03:29:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a5a33b2a40df1520d49ca5ed3e49cad991e5b1c2",
          "body": "…irst (#1384)\n\n* feat(teams): full [teams] section — credentials + connection config-first\n\nFourth platform slice of the config-first parity umbrella (#1375):\n[teams] graduates from the shared PlatformTrustConfig to a dedicated\nTeamsConfig carrying app_id, app_secret, allowed_tenants,\noauth_endpoint\n[…]\n.md\n\nCloses #1380. Refs #1375. Stacked on #1383.\n\n* docs(config): PlatformTrustConfig is now the shared trust-view type\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(teams): full [teams] section — credentials + connection config-f…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-13T02:43:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "51ff4d2c621fab4d5e325da858d28af034e9613e",
          "body": "…n config-first (#1383)\n\n* feat(googlechat): full [googlechat] section — credentials + connection config-first\n\nThird platform slice of the config-first parity umbrella (#1375):\n[googlechat] graduates from the shared PlatformTrustConfig to a\ndedicated GoogleChatConfig carrying enabled, sa_key_json, \n[…]\n\n\nCloses #1379. Refs #1375. Stacked on #1382.\n\n* docs(config): drop graduated [googlechat] from PlatformTrustConfig doc\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(googlechat): full [googlechat] section — credentials + connectio…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-13T02:22:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dc87565049591e05a775df814866595297c856a2",
          "body": "…irst (#1382)\n\n* feat(wecom): full [wecom] section — credentials + connection config-first\n\nSecond platform slice of the config-first parity umbrella (#1375):\n[wecom] graduates from the shared PlatformTrustConfig to a dedicated\nWecomConfig carrying corp_id, secret, token, encoding_aes_key,\nagent_id,\n[…]\ns #1378. Refs #1375. Stacked on #1381.\n\n* docs(config): drop graduated [wecom] from PlatformTrustConfig doc (review F1)\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(wecom): full [wecom] section — credentials + connection config-f…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-13T01:46:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fb46840144c6073fd223ebe42511b9511f159914",
          "body": "…st (#1381)\n\n* feat(line): full [line] section — credentials + connection config-first\n\nFirst platform slice of the config-first parity umbrella (#1375):\n[line] now carries channel_secret, channel_access_token, and\nwebhook_path alongside the trust fields, resolving each field\nconfig → LINE_* env → d\n[…]\nlosing code fence had prose on the same line, so the block never\nclosed and the following paragraph rendered inside it.\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(line): full [line] section — credentials + connection config-fir…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-13T01:00:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9af9fcde9c86a565e6f8abffc7c65604a8228df6",
          "body": "…e 1) (#1373)\n\n* feat(gateway): warn when webhook L1 auth is unenforceable (#1356 Phase 1)\n\nAudit finding (contributor suggestion on #1356): webhook platforms skip\nL1 transport authentication when their secret is unconfigured, and in\nthat state the per-platform allowed_users (L3) allowlist is forgea\n[…]\non, the unified binary passes true. Tests updated; inactive\nstate stays unflagged even with the route reported mounted.\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(gateway): warn when webhook L1 auth is unenforceable (#1356 Phas…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-12T20:29:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6338ec5bbfb694d33d684459ce3af97e1f1fe560",
          "body": "…(Phase 1) (#1366)\n\n* feat(trust): [wecom]/[googlechat]/[teams] first-class trust sections (Phase 1)\n\nClone the [line] pattern to the three remaining gateway platforms via a\nshared PlatformTrustConfig (allow_all_users/allowed_users with\n{PREFIX}_ALLOW_ALL_USERS / {PREFIX}_ALLOWED_USERS env fallbacks\n[…]\nthe LINE override stays\nbespoke instead of using platform_trust_override (group-policy fields\nland on LineConfig next).\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(trust): [wecom]/[googlechat]/[teams] first-class trust sections …",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-12T12:39:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b68c17d9d07f7ba0eb43a42810b624b8abc5ea0b",
          "body": "Release notes highlights relevant to OpenAB:\n- fixed 'agy -p' hanging when run inside a subprocess by no longer\n  reading stdin when a prompt is provided via flag\n- fixed print mode silently exiting 0 with empty output on server-side\n  failures; errors now go to stderr with a non-zero exit code\n- --\n[…]\n4}.tar.gz); no breaking\nchanges for the OAB integration.\n\nhttps://github.com/google-antigravity/antigravity-cli/releases/tag/1.1.1\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "build(antigravity): bump agy CLI 1.0.10 -> 1.1.1 (#1371)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-12T01:53:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8cd545ccb653669bc5e30987394258db5d32ff8e",
          "body": "* fix(acp): map legacy Codex mode ids\n\nPreserve existing default_config_options values when an ACP agent advertises the renamed Codex modes. Leave other agents and custom values unchanged.\n\nRefs #1352\n\n* build(codex)!: migrate ACP adapter\n\nInstall agentclientprotocol/codex-acp 1.1.2 with Codex 0.144\n[…]\nAstra | VixenClaws Leader <268079781+vixenclawsastraagent@users.noreply.github.com>\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>\nCo-authored-by: chaodufashi <pahudev@gmail.com>",
          "is_bot": false,
          "headline": "feat(codex)!: migrate ACP adapter (#1353)",
          "author_name": "九尾 Astra | VixenClaws Leader",
          "author_login": "vixenclawsastraagent",
          "committed_at": "2026-07-12T00:08:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "367fcfc05c406962c2bbc53feb318f8f0bfe67e3",
          "body": "* docs(readme): refresh architecture diagram and platform list\n\nThe README predates several shipped features. Update the intro,\narchitecture diagram, and features list to document:\n\n- WeCom and Microsoft Teams platform edges\n- gateway adapters running standalone or embedded in the unified build\n- cu\n[…]\ny: chaodu-agent <chaodu-agent@users.noreply.github.com>\nCo-authored-by: vixenclawsastraagent <268079781+vixenclawsastraagent@users.noreply.github.com>\nCo-authored-by: thepagent <hehsieh1010@gmail.com>",
          "is_bot": false,
          "headline": "docs(readme): refresh architecture diagram and platform list (#1370)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-12T00:06:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d89e63582eaba4b9cf3679d49f7dae6e5b8cffa5",
          "body": "* docs: canary testing guide + fork-PR preview build workflow\n\nExtracted from #1353 to keep that PR scoped to the Codex adapter\nmigration. Content authored on #1353 by @vixenclawsastraagent:\n\n- docs/canary-tests.md: complete canary workflow — preview builds,\n  safety requirements, acceptance criteri\n[…]\ns an\nindependent change.\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>\nCo-authored-by: vixenclawsastraagent <268079781+vixenclawsastraagent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs: canary testing guide + fork-PR preview workflow (#1369)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-12T00:03:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6cf869d75201998de51a643d09eef0177b071729",
          "body": "Add a [line] config section for L3 identity trust, replacing the\nuniform GATEWAY_ALLOW_ALL_USERS/GATEWAY_ALLOWED_USERS env vars for\nLINE. First slice of #1355, mirroring the [telegram] pattern (#1297).\n\n- config.rs: LineConfig { allow_all_users, allowed_users } with\n  LINE_ALLOW_ALL_USERS / LINE_ALL\n[…]\nnarios).\n\nGroup policy (open/members) and Reply-API deny-echo are follow-ups on\nthe issue.\n\nRefs #1355, umbrella #1356, ADR #1291.\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(line): first-class [line] trust section (Phase 1) (#1365)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-11T16:17:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "06416b17f28735f6b3c7e132131379fc47587526",
          "body": "* feat(trust): Phase 1 (slack) — L3 identity via shared gate\n\nWire Slack into the PlatformTrustConfigs registry and call the shared\ningress trust gate from the Slack message path, mirroring the Discord\nwiring from #1270. Slack was the only configured platform absent from\nthe registry — the gate woul\n[…]\nscord.toml's phrasing) and the Native-trust-divergence\nquirk. Conformance suite passes against this branch's code refs.\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(trust): Phase 1 (slack) — L3 identity via shared gate (#1363)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-11T16:16:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f0342b244d546a0c8c3d63261c9e3ef61e26392",
          "body": "…conformance (#1295)\n\n* docs(platforms): add capability matrix skeleton\n\n* docs(platforms): seed LINE notes from ADR #1291 review\n\n* docs(platforms): docs/platforms/wecom.md (schema v1)\n\n* docs(platforms): docs/platforms/discord.md (schema v1)\n\n* docs(platforms): docs/platforms/_template.md (schema \n[…]\nred-by: luffy-aiagent <luffy-aiagent@users.noreply.github.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs(platforms): schema-driven platform facts knowledge base with CI …",
          "author_name": "luffy-aiagent",
          "author_login": "luffy-aiagent",
          "committed_at": "2026-07-11T12:17:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7b83a41efe106766f79733b401fa0370296b56c0",
          "body": "Co-authored-by: openab-app[bot] <274185012+openab-app[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "release: v0.9.0-beta.9 (#1354)",
          "author_name": "openab-app[bot]",
          "author_login": "openab-app[bot]",
          "committed_at": "2026-07-11T10:29:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca64f87d806f3e8fa7314a1c75af2532c770bfed",
          "body": "* chore(filestore): hardening and cleanup follow-ups from #1348 review\n\nCode Quality:\n- Extract TEXT_INLINE_LIMIT constant (replace 512*1024 magic numbers in 8 locations)\n- Replace e_tag.unwrap_or_default() with proper error handling (3 locations)\n\nSecurity Hardening:\n- Sanitize filenames in all err\n[…]\nnt Content-Disposition: attachment and filename sanitization\n  (S3 keys and agent-visible text) in the Security section\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "chore(filestore): hardening and cleanup follow-ups (#1351)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-11T04:04:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bea2d39321786f5725dd5673ab880a75fccab1cb",
          "body": "…ng multipart upload (#1348)\n\n* feat(filestore): S3/R2-compatible object store for large text attachments\n\nWhen a text file exceeds the 512 KB inline limit and a [filestore] section\nis configured, OAB now:\n\n1. Downloads the file using the platform token (solving the Slack auth gap)\n2. Uploads it to \n[…]\nis file exceeds\nthe configured upload limit and could not be stored.\"\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>\nCo-authored-by: thepagent <hehsieh1010@gmail.com>",
          "is_bot": false,
          "headline": "feat(filestore): S3/R2 object store for file attachments with streami…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-11T02:46:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "af5718fc1f5900ba4c7edcbe6e9f54157d823b92",
          "body": "…timeouts (#1334)\n\n* fix(slack): bound reconnect-path network calls with a 30s timeout\n\nget_socket_mode_url and connect_async in the Socket Mode reconnect loop had\nno timeout, unlike the post-connect idle watchdog or SlackAdapter::new's Web\nAPI client. A stalled TLS handshake or apps.connections.ope\n[…]\nred-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01A9qJD9nYio1iRyuC5DKE2w\n\n---------\n\nCo-authored-by: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(slack): bound reconnect-path and socket-write network calls with …",
          "author_name": "howie",
          "author_login": "howie",
          "committed_at": "2026-07-10T23:41:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "461be9e6a15329af77756805d4c0206431032744",
          "body": null,
          "is_bot": false,
          "headline": "docs: add Traditional Chinese README (#1347)",
          "author_name": "Eric Huang",
          "author_login": "ijbhxhu",
          "committed_at": "2026-07-10T18:25:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9dd5f5810ecd646446c953833d495a40162d801c",
          "body": "Co-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(ci): accept discordapp.com URLs in PR discussion check (#1345)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-10T16:20:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7d23605bf61814f7a4a39ee4750da22b43ae1c2",
          "body": "* docs: add AWESOME.md with openab-control-plane\n\n* docs: add AIOps first-responder bot article to AWESOME.md\n\n---------\n\nCo-authored-by: chaodu[bot] <bot@openab.dev>",
          "is_bot": false,
          "headline": "docs: add AWESOME.md with openab-control-plane (#1342)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-10T00:58:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a97d80145031649be09f011a5a1479e1580fa02d",
          "body": "* docs: add GitHub App token vending machine refarch\n\n* docs: replace architecture diagram with detailed ASCII block diagram\n\n* docs: add ECS Fargate / EKS Pod architecture variant diagram\n\n* docs: add Design Goals section\n\n* fix(review): address F1/F2/F3 from code review\n\n- F1: mask internal error \n[…]\nring\n- F3: add note that AWS no longer validates OIDC thumbprint for GitHub provider\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu@openab.dev>\nCo-authored-by: chaodu-agent <chaodu-agent@openab.dev>",
          "is_bot": false,
          "headline": "docs: add GitHub App token vending machine refarch (#1341)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-10T00:50:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5d70dac6b0563721c63b1e6d00b493dbde9bd284",
          "body": "…t-ecsctl-library\n\nrefactor(oabctl): move --with-schedule to independent schedule create subcommand",
          "is_bot": false,
          "headline": "Merge pull request #1336 from openabdev/fix/remove-with-schedule-adop…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-09T04:41:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8cdb728fc79afefd474833c901e24a95306c0d9",
          "body": null,
          "is_bot": false,
          "headline": "fix: Scale help text — use 'Agent name (OAB service)' consistently",
          "author_name": "chaodu-agent",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-09T03:40:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e51368e0e68f06c942582587727fb772412256bd",
          "body": null,
          "is_bot": false,
          "headline": "fix: align doc comments and docs with 0..=1 size range",
          "author_name": "chaodu-agent",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-09T03:39:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9802025bada3013167ac4752c9b9072fd917bec8",
          "body": "…nce)",
          "is_bot": false,
          "headline": "fix: restrict clap size range to 0..=1 (OAB services are single-insta…",
          "author_name": "chaodu-agent",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-09T03:37:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44d1f2b38a0e80fe6978da994960186900e39ada",
          "body": null,
          "is_bot": false,
          "headline": "fix: correct help text — use 'Agent name' not 'ecsctl alias'",
          "author_name": "chaodu-agent",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-09T02:52:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8e94b914bf8efa28d9ec4b0d4e8c0b043c227137",
          "body": null,
          "is_bot": false,
          "headline": "fix: align doc comment with actual size range (0-100)",
          "author_name": "chaodu-agent",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-09T02:51:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c351dddb945d29907b417a9dc9b87dcfba391bd",
          "body": "… subcommand\n\nAligns with ecsctl v0.10.0 design where scale and schedule are\nindependent commands. This keeps 'scale' pure (immediate-only) and\ngives 'schedule' its own lifecycle (create/list/delete).\n\nChanges:\n- Remove --with-schedule and --timezone flags from 'scale' command\n- Add 'schedule create\n[…]\n\n- Update suggestion messages in scale.rs\n\nMigration:\n  OLD: oabctl scale my-bot 0 --with-schedule 'cron(0 22 * * ? *)'\n  NEW: oabctl schedule create my-bot 0 --expr 'cron(0 22 * * ? *)'\n\nCloses #1335",
          "is_bot": false,
          "headline": "refactor(oabctl): move --with-schedule to independent schedule create…",
          "author_name": "chaodu-agent",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-09T02:46:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "56ed6eb73335296a161a3c9ab2ee8eec44a83123",
          "body": "* docs: add AWS Secrets Manager path for GitHub token setup\n\n- New Option A: aws-sm:// secret ref, wired into [agent].env as\n  GITHUB_TOKEN, inherited by the agent process so gh CLI picks it\n  up with no separate auth step\n- Explains the three-part model: centralized PAT storage in Secrets\n  Manager\n[…]\nverify sections updated to cover both GH_TOKEN\n  and GITHUB_TOKEN\n\n* docs: clarify OAuth device flow vs PAT distinction\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs: add AWS Secrets Manager path for GitHub token setup (#1333)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-08T22:49:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "342f76dba25fd128be6debcbe78295ef9f430e00",
          "body": "* fix(oabctl): restrict scale to oabctl-managed services only\n\n- Remove ecsctl alias resolution from scale command\n- Only resolve against oab cluster services (oab-{namespace}-{name})\n- Throw clear error if service not found with hint to use 'oabctl get oabservice'\n- Scheduled scaling IAM policy (oa\n[…]\nff) or 1 (on) with a clear error message.\n\n* docs(oabctl): document scale restrictions (0/1 only, oabctl services only)\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(oabctl): restrict scale to oabctl-managed services only (#1327)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-08T03:55:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "669d6cc3149e6ed671ea3cc1ff690053bae0bf4a",
          "body": "…a commit' (#1326)\n\nPushing commits alone does not remove the closing-soon label.\nThe author MUST add a new comment to signal activity.\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(ci): closing-soon comment must say 'add a new comment' not 'push …",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-08T00:58:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72b9c9a7725fdc716b63938aada65a49e3417977",
          "body": "- stale-contributor.yml: tag @author in the comment so they get notified\n- stale-issue.yml: add a comment (was missing entirely) with @author tag\n\nBoth now clearly state the author must add a new comment to remove the\nclosing-soon label and keep the PR/issue open.\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(ci): mention PR/issue author when adding closing-soon label (#1325)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-08T00:54:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7a40c26878d26f10c25aec02060d4c227456308",
          "body": "* feat(cron): support telegram platform for scheduled messages\n\n- Add \"telegram\" to VALID_PLATFORMS in cron validator\n- Register telegram in configured_platforms when [telegram] or\n  TELEGRAM_BOT_TOKEN is present\n- Share unified adapter with cron scheduler so fire_cronjob can\n  dispatch to telegram \n[…]\ndd Platform Prerequisites section with feature flag requirements\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>\nCo-authored-by: chaodu-agent <chaodu-agent@openab.dev>",
          "is_bot": false,
          "headline": "feat(cron): support telegram platform for cronjob (#1315)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-08T00:48:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a3df7f0983433bbc42e47e4e19d02db916e14c56",
          "body": "…ng (#1324)\n\n* fix(oabctl): resolve cluster from config instead of hardcoding\n\napply.rs and delete.rs (run_from_file) hardcoded the ECS cluster name\nas \"oab\". When users bootstrap with --cluster to import an existing\ncluster with a different name, apply/delete -f operations would fail\nwith ClusterNo\n[…]\n automatically\n- Malformed config fails with error (no silent fallback)\n- Commands with/without --cluster flag behavior\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(oabctl): resolve cluster from bootstrap state instead of hardcodi…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-08T00:21:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "859c34c43b8df566acec8b7a5a5d227e1a448f83",
          "body": "…1321)\n\n* feat(oabctl): add scale command with EventBridge Scheduler support\n\nAdd `oabctl scale ALIAS SIZE` for immediate ECS service scaling and\n`--with-schedule` flag for cron-based scaling via EventBridge Scheduler.\n\nNew commands:\n- `oabctl scale <alias> <size>` — immediate UpdateService\n- `oabct\n[…]\ntching uses .message() and .code() on\nCreateScheduleError, which require the ProvideErrorMetadata trait\nto be in scope.\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(oabctl): add scale command with EventBridge Scheduler support (#…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-08T00:17:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "afcdcda8ee8069b9d83bede1e5ae5526ba6f0e2f",
          "body": "* feat(oabctl): support per-service taskRoleArn in manifest\n\nAdd optional `taskRoleArn` field to EcsRuntime spec. When set, it\noverrides the bootstrap-provided shared task role, enabling per-service\nIAM isolation.\n\nResolution order:\n1. manifest `runtime.taskRoleArn` (explicit per-service role)\n2. bo\n[…]\nmanifest > bootstrap) and requirements\n- Distinguish taskRoleArn (container identity) from executionRoleArn (ECS agent)\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(oabctl): support per-service taskRoleArn in manifest (#1316)",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-07T23:31:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bfe18640f602d706bbf378538c7881f9693fdf77",
          "body": "… \"(no response)\" (#1320)\n\n* fix(agy-acp): surface agy's swallowed backend errors instead of \"(no response)\"\n\n`agy --print` exits 0 with empty stdout/stderr when the model backend fails\n(e.g. quota 429 / RESOURCE_EXHAUSTED), recording the cause only in its own\ncli.log and never in the trajectory DB'\n[…]\n://claude.ai/code/session_01ANHjz7TXsqjhoDk6SiJiGd\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(agy-acp): surface swallowed backend errors (quota 429) instead of…",
          "author_name": "howie",
          "author_login": "howie",
          "committed_at": "2026-07-07T18:26:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5e6c81d54628696e70eab34a3b91b0999e383061",
          "body": "fix(acp): use integer protocolVersion in agentcore bridge per latest ACP spec",
          "is_bot": false,
          "headline": "Merge pull request #1323 from FakeRocket543/fix/protocol-version-integer",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-07T18:20:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52160a5e0b54db45ca7b547e98f92acaf4d14339",
          "body": "The @agentclientprotocol/sdk@1.2.0 defines ProtocolVersion as integer\n(uint16), not string. The agentcore bridge was still sending the old\nstring format \"2024-11-05\" which causes agents using the latest SDK\n(e.g. OpenCode 1.17.11) to reject the initialize request.\n\nconnection.rs already uses integer 1 — this aligns agentcore.rs.\n\nFixes #1318",
          "is_bot": false,
          "headline": "fix(acp): use integer protocolVersion per latest ACP spec",
          "author_name": "FakeRocket543",
          "author_login": "FakeRocket543",
          "committed_at": "2026-07-07T17:55:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd1ce74a7a8eff0ea5e2940f83cc5eb9d32f9061",
          "body": "docs: add refarch for running Telegram/LINE bots on AWS",
          "is_bot": false,
          "headline": "Merge pull request #1274 from smallgun01/docs/refarch-telegram-line-aws",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-07T15:13:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "704abf390339d0df16b59b291e428f6314fe77b2",
          "body": "Verified oabctl ingress on us-east-1 (2026-07-07):\n- One  provisions the full stack in ~2.5min\n- Replaces all 7 manual AWS CLI steps\n- Two pitfalls documented: us-east-1e AZ unsupported, configFrom required\n\nSwitches from 'automation tip' to 'Recommended' callout at Option 1 top.",
          "is_bot": false,
          "headline": "docs: strengthen oabctl recommendation in Option 1 after live E2E",
          "author_name": "smallgun01",
          "author_login": "smallgun01",
          "committed_at": "2026-07-07T12:53:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "315f02124feee6f2dce97e31af3da6c52d9a03b5",
          "body": "fix(oabctl): always enable execute command on ECS services",
          "is_bot": false,
          "headline": "Merge pull request #1314 from openabdev/fix/oabctl-enable-exec-command",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-07T02:10:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "142b9c399c56c0ed8869146e412611aed181fc8a",
          "body": "fix(oabctl): read cluster/namespace defaults from config file",
          "is_bot": false,
          "headline": "Merge pull request #1312 from openabdev/fix/oabctl-get-config-cluster",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-07T01:02:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a9b2933d64e5f11cba6075f05625c6ea404a47b",
          "body": "oabctl apply was creating/updating services without\nenableExecuteCommand, requiring a manual aws ecs update-service\ncall before `oabctl exec` or `ecsh` would work.\n\nNow both create_service and update_service always set\nenable_execute_command(true) — all OAB services need it for\ndebugging and there's no reason to ever leave it off.",
          "is_bot": false,
          "headline": "fix(oabctl): always enable execute command on ECS services",
          "author_name": "chaodu-agent",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-07T00:46:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a20ee1f786bbe733ef717c41afdb45373ea37c89",
          "body": "Document that --namespace default comes from ~/.oabctl/config.toml,\nconsistent with the --cluster flag's help text.",
          "is_bot": false,
          "headline": "fix(review): align --namespace help text with --cluster",
          "author_name": "chaodu-agent",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-06T23:38:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ae6644d93c2c49fddf12ad23defb73d770264c2",
          "body": "- main.rs: Replace unwrap_or_default() with .context() for proper error\n  propagation (malformed config.toml now fails early instead of silently\n  falling through to production defaults)\n- apply.rs: Extract DRAIN_RETRY_ATTEMPTS/DRAIN_RETRY_INTERVAL constants;\n  remove dead post-loop code by returnin\n[…]\n delete.rs: Extract DRAIN_POLL_ATTEMPTS/DRAIN_POLL_INTERVAL constants\n\nResolves merge conflicts by rebasing onto current main (which already has\ntyped error codes and proper transient error handling).",
          "is_bot": false,
          "headline": "fix(review): address PR review findings",
          "author_name": "chaodu-agent",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-06T23:33:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "83fbc899151ad9d795aa9e0e8a12dfb010fd92ae",
          "body": "feat(telegram): auto-disable table code-block wrapping for native rendering",
          "is_bot": false,
          "headline": "Merge pull request #1313 from openabdev/feat/telegram-native-tables",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-06T23:22:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e1684a8bf55504102b3759669d14dbc3dc5ecf2",
          "body": "…dalone rich_messages check\n\n- Add platform parameter to ChatAdapter::renders_native_tables() trait method\n  so unified adapter can make per-platform decisions (fixes regression where\n  all platforms would skip table wrapping when telegram_rich_messages=true)\n- UnifiedGatewayAdapter now checks platf\n[…]\nonfig/GatewayParams)\n- Update all call sites (AdapterRouter, Slack, tests) to pass platform arg\n\nFixes: unified mode multi-platform regression (F1)\nFixes: standalone mode Rich Messages assumption (F2)",
          "is_bot": false,
          "headline": "fix(review): add platform context to renders_native_tables() and stan…",
          "author_name": "chaodu-agent",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-06T23:06:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0ff4a2f607b1bee8b4c0fd6e693d869856a2515f",
          "body": "…dering\n\nTelegram Rich Messages render markdown tables natively, but OAB's default\ntable mode wraps them in code blocks — requiring every Telegram deployment\nto manually set [markdown] tables = \"off\" in config.toml.\n\nNow both adapters (unified and standalone gateway) implement\nrenders_native_tables(\n[…]\ntewayAdapter: returns true when telegram_rich_messages is enabled\n- GatewayAdapter: returns true when platform_name == \"telegram\"\n- Updated docs/telegram.md to remove the manual [markdown] requirement",
          "is_bot": false,
          "headline": "feat(telegram): auto-disable table code-block wrapping for native ren…",
          "author_name": "chaodu-agent",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-06T22:38:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a4668150a01b7f14034bbed521c97c6032d7232a",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into docs/refarch-telegram-line-aws",
          "author_name": "thepagent",
          "author_login": "thepagent",
          "committed_at": "2026-07-06T21:03:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f28c2dfb36b8f6083756b2b04f6202443d136e9",
          "body": "Co-authored-by: openab-app[bot] <274185012+openab-app[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "release: v0.9.0-beta.8 (#1311)",
          "author_name": "openab-app[bot]",
          "author_login": "openab-app[bot]",
          "committed_at": "2026-07-06T21:01:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3eda3f748f58b4679cd0c170b47196c75eae31b",
          "body": "… (#1308)\n\n* feat(oabctl): add architecture field for ARM64/X86_64 task scheduling\n\nAdd optional `architecture` field to ECS runtime spec (default: X86_64).\nThis sets `runtimePlatform` on task definitions so ECS Fargate can\nschedule on Graviton (ARM64) for ~20% cost savings.\n\n- Add `architecture` fi\n[…]\n:\n  accepts ARM64, accepts X86_64, defaults to X86_64 when omitted,\n  rejects invalid (MIPS), rejects lowercase (arm64)\n\n---------\n\nCo-authored-by: chaodu-agent <chaodu-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(oabctl): add architecture field for ARM64/X86_64 task scheduling…",
          "author_name": "chaodufashi",
          "author_login": "chaodu-agent",
          "committed_at": "2026-07-06T20:58:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 100,
      "commits_last_year": 1480,
      "latest_release_at": "2026-07-25T04:32:04Z",
      "latest_release_tag": "oabctl-pre-beta",
      "releases_from_tags": false,
      "days_since_last_push": 3,
      "active_weeks_last_year": 17,
      "days_since_latest_release": 3,
      "mean_days_between_releases": 2.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 62,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 184,
      "stars": 717,
      "watchers": 4,
      "fork_history": {
        "days": [
          {
            "date": "2026-04-04",
            "count": 7
          },
          {
            "date": "2026-04-05",
            "count": 5
          },
          {
            "date": "2026-04-06",
            "count": 11
          },
          {
            "date": "2026-04-07",
            "count": 15
          },
          {
            "date": "2026-04-08",
            "count": 5
          },
          {
            "date": "2026-04-09",
            "count": 4
          },
          {
            "date": "2026-04-10",
            "count": 5
          },
          {
            "date": "2026-04-11",
            "count": 3
          },
          {
            "date": "2026-04-12",
            "count": 4
          },
          {
            "date": "2026-04-13",
            "count": 8
          },
          {
            "date": "2026-04-14",
            "count": 1
          },
          {
            "date": "2026-04-15",
            "count": 4
          },
          {
            "date": "2026-04-16",
            "count": 3
          },
          {
            "date": "2026-04-17",
            "count": 1
          },
          {
            "date": "2026-04-18",
            "count": 2
          },
          {
            "date": "2026-04-21",
            "count": 2
          },
          {
            "date": "2026-04-22",
            "count": 2
          },
          {
            "date": "2026-04-24",
            "count": 2
          },
          {
            "date": "2026-04-25",
            "count": 1
          },
          {
            "date": "2026-04-26",
            "count": 2
          },
          {
            "date": "2026-04-27",
            "count": 1
          },
          {
            "date": "2026-04-28",
            "count": 3
          },
          {
            "date": "2026-05-03",
            "count": 2
          },
          {
            "date": "2026-05-04",
            "count": 2
          },
          {
            "date": "2026-05-05",
            "count": 2
          },
          {
            "date": "2026-05-07",
            "count": 5
          },
          {
            "date": "2026-05-10",
            "count": 1
          },
          {
            "date": "2026-05-12",
            "count": 2
          },
          {
            "date": "2026-05-14",
            "count": 4
          },
          {
            "date": "2026-05-15",
            "count": 2
          },
          {
            "date": "2026-05-18",
            "count": 1
          },
          {
            "date": "2026-05-19",
            "count": 2
          },
          {
            "date": "2026-05-20",
            "count": 3
          },
          {
            "date": "2026-05-21",
            "count": 1
          },
          {
            "date": "2026-05-23",
            "count": 3
          },
          {
            "date": "2026-05-24",
            "count": 1
          },
          {
            "date": "2026-05-26",
            "count": 2
          },
          {
            "date": "2026-05-27",
            "count": 3
          },
          {
            "date": "2026-05-28",
            "count": 3
          },
          {
            "date": "2026-05-30",
            "count": 1
          },
          {
            "date": "2026-05-31",
            "count": 1
          },
          {
            "date": "2026-06-01",
            "count": 1
          },
          {
            "date": "2026-06-02",
            "count": 1
          },
          {
            "date": "2026-06-03",
            "count": 1
          },
          {
            "date": "2026-06-04",
            "count": 3
          },
          {
            "date": "2026-06-05",
            "count": 2
          },
          {
            "date": "2026-06-07",
            "count": 1
          },
          {
            "date": "2026-06-09",
            "count": 1
          },
          {
            "date": "2026-06-10",
            "count": 2
          },
          {
            "date": "2026-06-11",
            "count": 1
          },
          {
            "date": "2026-06-13",
            "count": 1
          },
          {
            "date": "2026-06-17",
            "count": 1
          },
          {
            "date": "2026-06-18",
            "count": 2
          },
          {
            "date": "2026-06-20",
            "count": 1
          },
          {
            "date": "2026-06-25",
            "count": 1
          },
          {
            "date": "2026-06-26",
            "count": 1
          },
          {
            "date": "2026-06-27",
            "count": 1
          },
          {
            "date": "2026-06-30",
            "count": 1
          },
          {
            "date": "2026-07-01",
            "count": 1
          },
          {
            "date": "2026-07-02",
            "count": 3
          },
          {
            "date": "2026-07-03",
            "count": 1
          },
          {
            "date": "2026-07-04",
            "count": 1
          },
          {
            "date": "2026-07-06",
            "count": 2
          },
          {
            "date": "2026-07-07",
            "count": 1
          },
          {
            "date": "2026-07-09",
            "count": 1
          },
          {
            "date": "2026-07-10",
            "count": 1
          },
          {
            "date": "2026-07-11",
            "count": 2
          },
          {
            "date": "2026-07-13",
            "count": 1
          },
          {
            "date": "2026-07-14",
            "count": 1
          },
          {
            "date": "2026-07-15",
            "count": 2
          },
          {
            "date": "2026-07-16",
            "count": 2
          },
          {
            "date": "2026-07-19",
            "count": 3
          },
          {
            "date": "2026-07-20",
            "count": 2
          },
          {
            "date": "2026-07-21",
            "count": 1
          },
          {
            "date": "2026-07-23",
            "count": 3
          }
        ],
        "complete": true,
        "collected": 182,
        "total_forks": 184
      },
      "star_history": null,
      "open_issues_and_prs": 26
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "Cargo.toml",
        "agy-acp/Cargo.toml",
        "crates/openab-core/Cargo.toml",
        "crates/openab-gateway/Cargo.toml",
        "crates/openab-mcp/Cargo.toml",
        "crates/platform-schema/Cargo.toml",
        "openab-agent/Cargo.toml",
        "openab-auth-proxy/Cargo.toml",
        "operator/Cargo.toml"
      ],
      "largest_source_bytes": 958227,
      "source_files_sampled": 103,
      "oversized_source_files": 16,
      "agent_instruction_files": [
        "AGENTS.md",
        "agentcore/runtimes/kiro/steering/agent.md",
        "docs/gemini.md"
      ],
      "agent_instruction_max_bytes": 6568
    },
    "dependencies": {
      "manifests": [
        "Cargo.toml",
        "agy-acp/Cargo.toml",
        "openab-agent/Cargo.toml",
        "openab-auth-proxy/Cargo.toml",
        "operator/Cargo.toml"
      ],
      "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": [
        "crates"
      ],
      "dependencies": [
        {
          "name": "openab-core",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "openab-gateway",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "openab-mcp",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "tokio",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tracing",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "tracing-subscriber",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "clap",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "4"
        },
        {
          "name": "anyhow",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "axum",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "reqwest",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "serde",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "async-trait",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "serenity",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "tokio",
          "manifest": "agy-acp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde",
          "manifest": "agy-acp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "agy-acp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "uuid",
          "manifest": "agy-acp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "fs2",
          "manifest": "agy-acp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4.3"
        },
        {
          "name": "rusqlite",
          "manifest": "agy-acp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "=0.31.0"
        },
        {
          "name": "shell-words",
          "manifest": "agy-acp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.1.0"
        },
        {
          "name": "openab-mcp",
          "manifest": "openab-agent/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "tokio",
          "manifest": "openab-agent/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde",
          "manifest": "openab-agent/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "openab-agent/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "reqwest",
          "manifest": "openab-agent/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "anyhow",
          "manifest": "openab-agent/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "async-trait",
          "manifest": "openab-agent/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "uuid",
          "manifest": "openab-agent/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "clap",
          "manifest": "openab-agent/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "4"
        },
        {
          "name": "tracing",
          "manifest": "openab-agent/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "tracing-subscriber",
          "manifest": "openab-agent/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "base64",
          "manifest": "openab-agent/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.22.1"
        },
        {
          "name": "url",
          "manifest": "openab-agent/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2.5.8"
        },
        {
          "name": "rmcp",
          "manifest": "openab-agent/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.7"
        },
        {
          "name": "tokio",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.44"
        },
        {
          "name": "axum",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "hyper",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.6"
        },
        {
          "name": "hyper-util",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "rustls",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.23"
        },
        {
          "name": "hyper-rustls",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.27"
        },
        {
          "name": "http-body-util",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "reqwest",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "serde",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "toml",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "clap",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "4"
        },
        {
          "name": "sha2",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.10"
        },
        {
          "name": "base64",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.22"
        },
        {
          "name": "rand",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "uuid",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "url",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "urlencoding",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "dirs",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "6"
        },
        {
          "name": "anyhow",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tracing",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "tracing-subscriber",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "open",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "5"
        },
        {
          "name": "tower",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.5"
        },
        {
          "name": "tower-http",
          "manifest": "openab-auth-proxy/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.6"
        },
        {
          "name": "aws-config",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.5"
        },
        {
          "name": "aws-sdk-ecs",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.53"
        },
        {
          "name": "aws-sdk-ec2",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "aws-sdk-iam",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "aws-sdk-s3",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.65"
        },
        {
          "name": "aws-sdk-scheduler",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.98"
        },
        {
          "name": "aws-sdk-ssm",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.52"
        },
        {
          "name": "aws-sdk-sts",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "aws-sdk-cloudwatchlogs",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "aws-sdk-secretsmanager",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "aws-sdk-apigatewayv2",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "aws-sdk-servicediscovery",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "ecsctl",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "clap",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "4.5"
        },
        {
          "name": "chrono",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4"
        },
        {
          "name": "serde",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "serde_json",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_yaml",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.9"
        },
        {
          "name": "tokio",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.40"
        },
        {
          "name": "toml",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "anyhow",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "dirs",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "6"
        },
        {
          "name": "rpassword",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "7"
        },
        {
          "name": "reqwest",
          "manifest": "operator/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "tokio",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "toml",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "toml_edit",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.22"
        },
        {
          "name": "tracing",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "tracing-subscriber",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "serenity",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "uuid",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "regex",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "anyhow",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "async-trait",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "futures-util",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "rand",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "clap",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "4"
        },
        {
          "name": "rpassword",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "7"
        },
        {
          "name": "reqwest",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "bytes",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "base64",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.22"
        },
        {
          "name": "image",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.25"
        },
        {
          "name": "unicode-width",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2"
        },
        {
          "name": "unicode-segmentation",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "pulldown-cmark",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.13"
        },
        {
          "name": "tokio-tungstenite",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.21"
        },
        {
          "name": "rustls",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.22"
        },
        {
          "name": "tokio-rustls",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.25"
        },
        {
          "name": "webpki-roots",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.26"
        },
        {
          "name": "cron",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.16.0"
        },
        {
          "name": "chrono",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4.44"
        },
        {
          "name": "chrono-tz",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.10.4"
        },
        {
          "name": "emojis",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "sha2",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.10"
        },
        {
          "name": "tempfile",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3.27.0"
        },
        {
          "name": "aws-sdk-secretsmanager",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "aws-sdk-s3",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "aws-config",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "zip",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "flate2",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tar",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4.45"
        },
        {
          "name": "aws-sigv4",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "aws-credential-types",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "urlencoding",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "hex",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4"
        },
        {
          "name": "http",
          "manifest": "crates/openab-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tokio",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "axum",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "tokio-tungstenite",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.21"
        },
        {
          "name": "futures-util",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "serde",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "reqwest",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "tracing",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "tracing-subscriber",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "anyhow",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "uuid",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "chrono",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4"
        },
        {
          "name": "hmac",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "sha2",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.10"
        },
        {
          "name": "base64",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.22"
        },
        {
          "name": "jsonwebtoken",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "9"
        },
        {
          "name": "aes",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "cbc",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "prost",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.13"
        },
        {
          "name": "subtle",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "sha1",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.10"
        },
        {
          "name": "quick-xml",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.37"
        },
        {
          "name": "image",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.25"
        },
        {
          "name": "parking_lot",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "urlencoding",
          "manifest": "crates/openab-gateway/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "tokio",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "reqwest",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "reqwest013",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.13"
        },
        {
          "name": "anyhow",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "async-trait",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "tracing",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "base64",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.22.1"
        },
        {
          "name": "sha2",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.11.0"
        },
        {
          "name": "getrandom",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4.2"
        },
        {
          "name": "urlencoding",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2.1.3"
        },
        {
          "name": "open",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "5.3.5"
        },
        {
          "name": "url",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2.5.8"
        },
        {
          "name": "oauth2",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "5"
        },
        {
          "name": "jsonschema",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.46"
        },
        {
          "name": "rmcp",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.7"
        },
        {
          "name": "axum",
          "manifest": "crates/openab-mcp/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "serde",
          "manifest": "crates/platform-schema/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "toml",
          "manifest": "crates/platform-schema/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        }
      ],
      "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": 11,
        "merged_prs": 769,
        "open_issues": 15,
        "closed_ratio": 0.964,
        "closed_issues": 396,
        "closed_unmerged_prs": 263
      },
      "bus_factor": 2,
      "bot_contributors": 3,
      "top_contributors": [
        {
          "type": "User",
          "login": "chaodu-agent",
          "commits": 523,
          "avatar_url": "https://avatars.githubusercontent.com/u/274062505?v=4"
        },
        {
          "type": "User",
          "login": "thepagent",
          "commits": 293,
          "avatar_url": "https://avatars.githubusercontent.com/u/262003297?v=4"
        },
        {
          "type": "User",
          "login": "dogzzdogzz",
          "commits": 45,
          "avatar_url": "https://avatars.githubusercontent.com/u/23068316?v=4"
        },
        {
          "type": "User",
          "login": "JARVIS-coding-Agent",
          "commits": 34,
          "avatar_url": "https://avatars.githubusercontent.com/u/55979927?v=4"
        },
        {
          "type": "User",
          "login": "wangyuyan-agent",
          "commits": 17,
          "avatar_url": "https://avatars.githubusercontent.com/u/265828726?v=4"
        },
        {
          "type": "User",
          "login": "brettchien",
          "commits": 15,
          "avatar_url": "https://avatars.githubusercontent.com/u/1193046?v=4"
        },
        {
          "type": "User",
          "login": "masami-agent",
          "commits": 14,
          "avatar_url": "https://avatars.githubusercontent.com/u/266806885?v=4"
        },
        {
          "type": "User",
          "login": "clsung",
          "commits": 12,
          "avatar_url": "https://avatars.githubusercontent.com/u/26345?v=4"
        },
        {
          "type": "User",
          "login": "chenhan1218",
          "commits": 11,
          "avatar_url": "https://avatars.githubusercontent.com/u/514188?v=4"
        },
        {
          "type": "User",
          "login": "antigenius0910",
          "commits": 11,
          "avatar_url": "https://avatars.githubusercontent.com/u/5915590?v=4"
        }
      ],
      "contributors_sampled": 49,
      "top_contributor_share": 0.483
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "build-binaries.yml",
        "build-gateway.yml",
        "build-images.yml",
        "build-oabctl.yml",
        "build-operator-branch.yml",
        "build-operator.yml",
        "bundle-pre-seed-utils.yml",
        "chart-test.yml",
        "ci-agy-acp.yml",
        "ci-auth-proxy.yml",
        "ci-openab-agent.yml",
        "ci.yml",
        "close-stale-issues.yml",
        "close-stale-prs.yml",
        "close-unlinked-stale-issues.yml",
        "docker-smoke-test-unified.yml",
        "docker-smoke-test.yml",
        "gateway-release-pr.yml",
        "issue-check.yml",
        "issue-pending-maintainer.yml",
        "issue-triage.yml",
        "line.yml",
        "needs-rebase.yml",
        "pending-decision.yml",
        "pending-maintainer.yml",
        "platform-schema-conformance.yml",
        "pr-bot-review.yml",
        "pr-discussion-check.yml",
        "pr-preview.yml",
        "pre-beta-build.yml",
        "release-pr.yml",
        "release.yml",
        "review-contract.yml",
        "slack.yml",
        "snapshot-build.yml",
        "stale-contributor.yml",
        "stale-issue.yml",
        "tag-on-merge.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Cargo.lock"
      ],
      "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": 4,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 10,
            "reason": "all changesets reviewed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 6 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 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 19 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 1,
            "reason": "9 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "53061d696148106b2b7529f9d6c5dd802dff4545",
        "ran_at": "2026-07-28T06:33:49Z",
        "aggregate_score": 4.6,
        "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-28T06:18:54Z",
      "oldest_open_prs": [
        {
          "number": 1181,
          "created_at": "2026-06-23T21:04:07Z",
          "last_comment_at": "2026-06-23T21:16:00Z",
          "last_comment_author": "chaodu-agent"
        },
        {
          "number": 1204,
          "created_at": "2026-06-26T00:05:42Z",
          "last_comment_at": "2026-07-13T07:24:30Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 1205,
          "created_at": "2026-06-26T00:08:11Z",
          "last_comment_at": "2026-07-14T11:59:49Z",
          "last_comment_author": "chaodu-agent"
        },
        {
          "number": 1234,
          "created_at": "2026-06-28T15:52:03Z",
          "last_comment_at": "2026-07-20T09:53:39Z",
          "last_comment_author": "chaodu-agent"
        },
        {
          "number": 1258,
          "created_at": "2026-06-30T03:22:34Z",
          "last_comment_at": "2026-06-30T03:36:33Z",
          "last_comment_author": "chaodu-agent"
        },
        {
          "number": 1435,
          "created_at": "2026-07-22T05:21:59Z",
          "last_comment_at": "2026-07-27T15:44:46Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 1447,
          "created_at": "2026-07-24T02:30:12Z",
          "last_comment_at": "2026-07-28T03:40:49Z",
          "last_comment_author": "chaodu-obk"
        },
        {
          "number": 1456,
          "created_at": "2026-07-25T17:04:06Z",
          "last_comment_at": "2026-07-27T19:56:57Z",
          "last_comment_author": "chaodu-obk"
        },
        {
          "number": 1457,
          "created_at": "2026-07-25T20:24:46Z",
          "last_comment_at": "2026-07-27T19:51:19Z",
          "last_comment_author": "chaodu-obk"
        },
        {
          "number": 1458,
          "created_at": "2026-07-25T20:26:19Z",
          "last_comment_at": "2026-07-27T19:49:16Z",
          "last_comment_author": "chaodu-obk"
        },
        {
          "number": 1460,
          "created_at": "2026-07-28T04:20:58Z",
          "last_comment_at": "2026-07-28T06:18:51Z",
          "last_comment_author": "chaodu-obk"
        }
      ],
      "last_merged_pr_at": "2026-07-25T05:00:08Z",
      "ci_last_conclusion": "SKIPPED",
      "oldest_open_issues": [
        {
          "number": 38,
          "created_at": "2026-04-04T16:24:57Z",
          "last_comment_at": "2026-04-24T10:59:38Z",
          "last_comment_author": "obrutjack"
        },
        {
          "number": 243,
          "created_at": "2026-04-12T04:18:01Z",
          "last_comment_at": "2026-04-15T20:54:07Z",
          "last_comment_author": "chengli"
        },
        {
          "number": 489,
          "created_at": "2026-04-20T10:40:10Z",
          "last_comment_at": "2026-04-22T07:27:58Z",
          "last_comment_author": "CHC-Agent"
        },
        {
          "number": 736,
          "created_at": "2026-05-04T23:29:12Z",
          "last_comment_at": "2026-05-05T22:02:09Z",
          "last_comment_author": "CHC-Agent"
        },
        {
          "number": 790,
          "created_at": "2026-05-11T11:24:36Z",
          "last_comment_at": "2026-05-11T22:01:25Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 997,
          "created_at": "2026-06-04T05:58:11Z",
          "last_comment_at": "2026-06-08T03:59:25Z",
          "last_comment_author": "fcwu"
        },
        {
          "number": 1233,
          "created_at": "2026-06-28T15:09:42Z",
          "last_comment_at": "2026-06-28T15:09:51Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 1367,
          "created_at": "2026-07-11T19:21:46Z",
          "last_comment_at": "2026-07-24T08:18:56Z",
          "last_comment_author": "SunnyYYLin"
        },
        {
          "number": 1401,
          "created_at": "2026-07-14T06:59:11Z",
          "last_comment_at": "2026-07-14T06:59:21Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 1405,
          "created_at": "2026-07-15T00:37:54Z",
          "last_comment_at": "2026-07-15T18:05:15Z",
          "last_comment_author": "chaodu-agent"
        },
        {
          "number": 1409,
          "created_at": "2026-07-16T01:37:03Z",
          "last_comment_at": "2026-07-16T01:37:13Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 1420,
          "created_at": "2026-07-18T02:02:41Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1434,
          "created_at": "2026-07-22T05:07:23Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1436,
          "created_at": "2026-07-22T14:47:49Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1459,
          "created_at": "2026-07-25T20:37:35Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/openabdev/openab",
    "host": "github.com",
    "name": "openab",
    "owner": "openabdev"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 69,
      "inputs": {
        "security": 46,
        "vitality": 82,
        "community": 72,
        "governance": 65,
        "engineering": 77
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 82,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 1480,
              "human_commit_share": 0.9,
              "days_since_last_push": 3,
              "active_weeks_last_year": 17
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 3 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "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": "1480 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1480
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 19 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 100,
              "latest_release_tag": "oabctl-pre-beta",
              "releases_from_tags": false,
              "days_since_latest_release": 3,
              "mean_days_between_releases": 2.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "100 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 3 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~2.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 2.3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "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": "good",
        "name": "Community & Adoption",
        "value": 72,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "forks": 184,
              "stars": 717,
              "watchers": 4,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "717 stars",
                "points": 46.3,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 717
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "184 forks",
                "points": 18.9,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 184
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "4 watchers",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "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": 65,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "moderate",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "bus_factor": 2,
              "contributors_sampled": 49,
              "top_contributor_share": 0.483
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "2 contributor(s) cover half of all commits",
                "points": 25.2,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 48% of commits",
                "points": 11.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 48
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "49 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 49
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 6 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 89,
            "inputs": {
              "merged_prs": 769,
              "open_issues": 15,
              "closed_issues": 396,
              "issue_closed_ratio": 0.964,
              "closed_unmerged_prs": 263
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "96% of issues closed",
                "points": 45.1,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 96
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "769/1032 decided PRs merged",
                "points": 28.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 769,
                      "decided": 1032
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "all changesets reviewed",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 47,
            "inputs": {
              "followers": 32,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "openabdev",
              "public_repos": 5,
              "account_age_days": 112
            },
            "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": "32 followers of openabdev",
                "points": 10.9,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 32,
                      "login": "openabdev"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "5 public repos, account ~0 yr old",
                "points": 6.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 5
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 77,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "38 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 38
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": "https://openabdev.github.io/openab/",
              "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://openabdev.github.io/openab/",
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 46,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 46,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 4.6
            },
            "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 is not maximal on development and all release branches",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "all changesets reviewed",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 6 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "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 19 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "9 existing vulnerabilities detected",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 4
            },
            "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": 74,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.989,
              "agent_instruction_files": [
                "AGENTS.md",
                "agentcore/runtimes/kiro/steering/agent.md",
                "docs/gemini.md"
              ],
              "agent_instruction_max_bytes": 6568
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, agentcore/runtimes/kiro/steering/agent.md, docs/gemini.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, agentcore/runtimes/kiro/steering/agent.md, docs/gemini.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "89 of 90 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 89,
                      "sampled": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "Cargo.lock"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.04,
              "toolchain_manifests": [
                "Cargo.toml",
                "agy-acp/Cargo.toml",
                "crates/openab-core/Cargo.toml",
                "crates/openab-gateway/Cargo.toml",
                "crates/openab-mcp/Cargo.toml",
                "crates/platform-schema/Cargo.toml",
                "openab-agent/Cargo.toml",
                "openab-auth-proxy/Cargo.toml",
                "operator/Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Cargo.toml, agy-acp/Cargo.toml, crates/openab-core/Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "Cargo.toml, agy-acp/Cargo.toml, crates/openab-core/Cargo.toml"
                    }
                  }
                ],
                "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": "Rust (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "4 of the last 100 commits agent-authored or agent-credited",
                "points": 8,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 4,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "primary_language": "Rust",
              "largest_source_bytes": 958227,
              "source_files_sampled": 103,
              "oversized_source_files": 16
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Rust (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "16/103 source files over 60KB",
                "points": 46.5,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 103,
                      "oversized": 16
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "moderate",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "Could not fetch crates package 'openab' from its registry",
    "Could not fetch crates package 'agy-acp' from its registry",
    "Could not fetch crates package 'oabctl' from its registry",
    "Could not fetch crates package 'openab-agent' from its registry",
    "Could not fetch crates package 'openab-auth-proxy' from its registry",
    "Could not fetch crates package 'openab-mcp' from its registry",
    "Could not fetch crates package 'openab-core' from its registry",
    "Could not fetch crates package 'openab-gateway' from its registry",
    "Could not fetch crates package 'platform-schema' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T06:34:43.305842Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/o/openabdev/openab.svg",
  "full_name": "openabdev/openab",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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