公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-27 05:57 UTC

axl-sdk / axl

TypeScript SDK for orchestrating Agentic Systems — concurrency, structured output, cost control, and consensus as first-class primitives.

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

axl-sdk/axl 的健康指数为 100 分中的 57 分,处于「中等」区间。 其得分最高的类别是Engineering Quality(84/100),最低的是Sustainability & Governance(32/100)。 最近一次更新在 6 天前。 近期的大部分工作由 1 位贡献者完成。

57
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

axl-sdk组织
0 关注者1 个公开仓库始于 2026年2月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npm@axlsdk/axl0.20.0835596 天前aiagentsllmtypescriptorchestrationagentic
npm@axlsdk/eval0.20.0769596 天前aievaluationscoringagents
npm@axlsdk/studio0.20.0879576 天前aistudiodeveloper-toolsagentsdebugging
npm@axlsdk/testing0.20.0731596 天前aitestingmockagents

按类别列示的指标

活力

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

81良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 6 天前
11.8/36提交节奏 — 52 周中有 17 周有提交
18/18提交量 — 最近一年 392 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year392
human_commit_share1
days_since_last_push6
active_weeks_last_year17

发布纪律

88优秀
评分方式
16.2/27有发布版本 — 55 个版本标签(无 GitHub 发布版本)
36/36发布时效 — 最近一次发布版本于 6 天前
27/27发布节奏 — 约每 7.6 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count55
latest_release_tagv0.20.0
releases_from_tags
days_since_latest_release6
mean_days_between_releases7.6
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

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

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

社区健康

85优秀
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(Apache-2.0)
18/18CONTRIBUTING 指南
13.5/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
46.8/80月度下载量 — npm 合计每月 3,214 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packages@axlsdk/axl, @axlsdk/eval, @axlsdk/studio, @axlsdk/testing
dependents
ecosystemsnpm
total_downloads
monthly_downloads3,214
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

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

32存在风险 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0/22.5提交分布 — 头号贡献者编写了 100% 的提交
1.4/13.5贡献者广度 — 1 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled1
top_contributor_share1
评分方式
0/46.8议题解决 — 没有议题或无数据
0/38.3PR 接受 — 已裁定的 PR 中 0/1 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs1
已排除计分(无数据或不适用):议题解决。 其余权重已重新归一化。
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
0/25所有者影响力 — axl-sdk 有 0 位关注者
3.1/25既往记录 — 1 个公开仓库,账户约 0 年
所用输入
followers0
owner_typeOrganization
is_verified
owner_loginaxl-sdk
public_repos1
account_age_days164
评分方式
25/25已发布且可解析 — npm 上有 4 个软件包
35/35发布时效 — 最近一次发布于 6 天前
20/20版本历史 — 59 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packages@axlsdk/axl, @axlsdk/eval, @axlsdk/studio, @axlsdk/testing
ecosystemsnpm
any_deprecated
min_days_since_publish6

工程质量

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

84良好 · 占总体的 20%

工程实践

80良好
评分方式
24/24CI 工作流 — 2 个工作流
24/24存在测试
16/16Linter 配置 — eslint.config.js
0/9.6Pre-commit 钩子
0/6.4.editorconfig
0/20OpenSSF Scorecard:CI-Tests — 无数据
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config
已排除计分(无数据或不适用):OpenSSF Scorecard:CI-Tests。 其余权重已重新归一化。

文档

90优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://www.npmjs.com/package/@axlsdk/axl
10/10仓库描述
10/10主题标签 — 13 个主题标签
0/10Wiki
所用输入
topicsagentic, agents, ai, anthropic, gemini, llm, openai, orchestration, sdk, structured-output, tool-calling, typescript, workflows
has_wiki
homepagehttps://www.npmjs.com/package/@axlsdk/axl
has_readme
has_docs_dir
has_description

安全

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

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

安全态势

44存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — 无数据
0/2.5CI-Tests — 无数据
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 80 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate4.4
已排除计分(无数据或不适用):branch_protection, ci_tests, signed_releases。 其余权重已重新归一化。

AI 就绪度

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

72良好 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 100 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes5,234
评分方式
0/18一条命令的引导启动
22/22自动化测试
11/11Lint / 格式化配置 — eslint.config.js
11/11静态类型检查 — examples/tsconfig.json, packages/axl-eval/tsconfig.json, packages/axl-studio/tsconfig.json, packages/axl-testing/tsconfig.json, packages/axl/tsconfig.json, tests/tsconfig.json
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 70 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilespnpm-lock.yaml
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configsexamples/tsconfig.json, packages/axl-eval/tsconfig.json, packages/axl-studio/tsconfig.json, packages/axl-testing/tsconfig.json, packages/axl/tsconfig.json, tests/tsconfig.json
agent_commit_share0.7
toolchain_manifests
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — TypeScript(静态类型)
53.9/55可控的文件大小 — 采样的 389 个源文件中有 8 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes188,417
source_files_sampled389
oversized_source_files8

机器可读接口

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

关键数据

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

数据采集警告

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

更多细节

OpenSSF Scorecard 4.4 / 10
4.4综合

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

10Binary-Artifactsno binaries found in the repo
不适用Branch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
不适用CI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
10Security-Policysecurity policy file detected
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities80 existing vulnerabilities detected
直接依赖 8
注册表软件包版本约束清单文件
npm@axlsdk/axlworkspace:*packages/axl-eval/package.json
npm@axlsdk/axlworkspace:*packages/axl-studio/package.json
npm@hono/node-server^1.13.0packages/axl-studio/package.json
npm@hono/node-ws^1.1.0packages/axl-studio/package.json
npmhono^4.7.0packages/axl-studio/package.json
npmtsx^4.19.0packages/axl-studio/package.json
npmws^8.0.0packages/axl-studio/package.json
npm@axlsdk/axlworkspace:*packages/axl-testing/package.json
全部依赖 未采集

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "agentic",
        "agents",
        "ai",
        "anthropic",
        "gemini",
        "llm",
        "openai",
        "orchestration",
        "sdk",
        "structured-output",
        "tool-calling",
        "typescript",
        "workflows"
      ],
      "is_fork": false,
      "size_kb": 11477,
      "has_wiki": false,
      "homepage": "https://www.npmjs.com/package/@axlsdk/axl",
      "languages": {
        "CSS": 2817,
        "HTML": 1112,
        "JavaScript": 56884,
        "TypeScript": 4985640
      },
      "pushed_at": "2026-07-20T20:06:42Z",
      "created_at": "2026-02-13T01:35:21Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-20T20:07:34Z",
      "description": "TypeScript SDK for orchestrating Agentic Systems — concurrency, structured output, cost control, and consensus as first-class primitives.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "axl-sdk",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/261329125?v=4",
      "created_at": "2026-02-13T01:34:31Z",
      "is_verified": null,
      "public_repos": 1,
      "account_age_days": 164
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.20.0",
          "kind": "minor",
          "published_at": "2026-07-20T19:35:03Z"
        },
        {
          "tag": "v0.19.1",
          "kind": "patch",
          "published_at": "2026-07-17T16:06:45Z"
        },
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-07-08T20:59:37Z"
        },
        {
          "tag": "v0.18.2",
          "kind": "patch",
          "published_at": "2026-05-31T21:06:59Z"
        },
        {
          "tag": "v0.18.1",
          "kind": "patch",
          "published_at": "2026-05-31T20:24:56Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-05-30T04:14:44Z"
        },
        {
          "tag": "v0.17.9",
          "kind": "patch",
          "published_at": "2026-05-28T14:53:25Z"
        },
        {
          "tag": "v0.17.8",
          "kind": "patch",
          "published_at": "2026-05-25T19:21:03Z"
        },
        {
          "tag": "v0.17.7",
          "kind": "patch",
          "published_at": "2026-05-20T16:12:14Z"
        },
        {
          "tag": "v0.17.6",
          "kind": "patch",
          "published_at": "2026-05-13T19:28:34Z"
        },
        {
          "tag": "v0.17.5",
          "kind": "patch",
          "published_at": "2026-05-07T05:16:08Z"
        },
        {
          "tag": "v0.17.4",
          "kind": "patch",
          "published_at": "2026-05-04T18:27:43Z"
        },
        {
          "tag": "v0.17.3",
          "kind": "patch",
          "published_at": "2026-05-03T22:43:20Z"
        },
        {
          "tag": "v0.17.2",
          "kind": "patch",
          "published_at": "2026-05-01T00:55:26Z"
        },
        {
          "tag": "v0.17.1",
          "kind": "patch",
          "published_at": "2026-04-30T23:33:52Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-04-30T23:08:45Z"
        },
        {
          "tag": "v0.16.1",
          "kind": "patch",
          "published_at": "2026-04-29T19:41:30Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-04-28T16:05:24Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-04-17T19:04:47Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-04-14T14:41:14Z"
        },
        {
          "tag": "v0.13.8",
          "kind": "patch",
          "published_at": "2026-04-12T04:37:44Z"
        },
        {
          "tag": "v0.13.7",
          "kind": "patch",
          "published_at": "2026-04-12T03:40:52Z"
        },
        {
          "tag": "v0.13.6",
          "kind": "patch",
          "published_at": "2026-04-06T19:58:13Z"
        },
        {
          "tag": "v0.13.5",
          "kind": "patch",
          "published_at": "2026-04-01T20:44:43Z"
        },
        {
          "tag": "v0.13.4",
          "kind": "patch",
          "published_at": "2026-04-01T14:53:38Z"
        },
        {
          "tag": "v0.13.3",
          "kind": "patch",
          "published_at": "2026-04-01T05:20:53Z"
        },
        {
          "tag": "v0.13.2",
          "kind": "patch",
          "published_at": "2026-04-01T04:55:00Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-04-01T04:02:02Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-04-01T02:57:48Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-03-31T14:25:03Z"
        },
        {
          "tag": "v0.11.6",
          "kind": "patch",
          "published_at": "2026-03-30T20:06:20Z"
        },
        {
          "tag": "v0.11.5",
          "kind": "patch",
          "published_at": "2026-03-30T19:56:18Z"
        },
        {
          "tag": "v0.11.4",
          "kind": "patch",
          "published_at": "2026-03-30T19:43:57Z"
        },
        {
          "tag": "v0.11.3",
          "kind": "patch",
          "published_at": "2026-03-30T19:30:13Z"
        },
        {
          "tag": "v0.11.2",
          "kind": "patch",
          "published_at": "2026-03-30T19:07:06Z"
        },
        {
          "tag": "v0.11.1",
          "kind": "patch",
          "published_at": "2026-03-30T18:50:01Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-03-30T16:13:39Z"
        },
        {
          "tag": "v0.10.4",
          "kind": "patch",
          "published_at": "2026-03-22T22:20:51Z"
        },
        {
          "tag": "v0.10.3",
          "kind": "patch",
          "published_at": "2026-03-22T18:20:59Z"
        },
        {
          "tag": "v0.10.2",
          "kind": "patch",
          "published_at": "2026-03-22T17:48:06Z"
        },
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2026-03-22T17:18:23Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-03-20T18:48:11Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-03-19T17:04:57Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-03-19T05:50:07Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-03-19T03:10:06Z"
        },
        {
          "tag": "v0.7.6",
          "kind": "patch",
          "published_at": "2026-03-18T06:03:48Z"
        },
        {
          "tag": "v0.7.5",
          "kind": "patch",
          "published_at": "2026-03-18T04:10:29Z"
        },
        {
          "tag": "v0.7.4",
          "kind": "patch",
          "published_at": "2026-03-18T03:43:15Z"
        },
        {
          "tag": "v0.7.3",
          "kind": "patch",
          "published_at": "2026-03-18T03:30:49Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2026-03-18T03:12:55Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-03-18T02:42:27Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-03-17T22:41:30Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-03-16T21:39:29Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-03-10T21:30:38Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-03-04T20:12:25Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "71e209de7d0823c538668c6d645bc359264b3999",
          "body": "Add plain-language guidance for reliable tool outcomes, safe failures, incomplete traces, Studio investigation, and eval evidence.\n\nCorrect the Studio capture note and name 0.20.0 in the migration guide.",
          "is_bot": false,
          "headline": "docs: Explain tool workflow benefits",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-20T20:03:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4dbf1a46a2c824d99ca03797192ed10e437b2e0e",
          "body": "Release the breaking tool-lifecycle v2 and stream-first observation contracts.\n\nShip coordinated 0.20.0 versions for all four public packages.",
          "is_bot": false,
          "headline": "chore: Bump to 0.20.0",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-20T19:35:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f705d54f049b6d34f674f62cdd2c66c699463b78",
          "body": "Emit a trusted-host runtime event when cancellation compensation cannot\nremove pending approval state without replacing the original workflow error.\n\nDocument store ordering and current Node 22, Redis, smoke, and SQLite\nverification evidence.",
          "is_bot": false,
          "headline": "fix(axl): surface approval cleanup failures",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-20T18:28:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30c2e61ece84d432e97a4a588ea06ac75317dfd6",
          "body": "Serialize approval publication, resolution, cancellation cleanup, and total deletion.\n\nPreserve incomplete observation status across streams, stores, recovery, and Studio.\n\nHarden decision validation, error causes, migrations, and adversarial coverage.",
          "is_bot": false,
          "headline": "fix(axl): close lifecycle review gaps",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-20T06:51:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a90fbbb5972645717545e2441b571aa64c98a134",
          "body": "Make in-process approval resolution atomic and remove misleading resume APIs.\nBound branch finalization with explicit observation completeness, preserve strict\nqueue-overflow causes, and suppress late root and child trace mutation.\n\nExpand adversarial, Studio, and live-provider lifecycle coverage and document\nthe owner-approved release boundary.",
          "is_bot": false,
          "headline": "fix(axl): harden release lifecycle contracts",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-18T22:12:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "faf46360a4438997606e2807596856dc812a2306",
          "body": "Reject hostile tool and approval boundary shapes.\n\nBound stream subscribers and finalize concurrent losers honestly.\n\nFail closed on unsafe cross-process approval replay.",
          "is_bot": false,
          "headline": "fix(axl): harden lifecycle edge cases",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-18T19:34:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3cf69530ba5fffb2cef72dbe4e72bb49a0adc38",
          "body": "Remove pair-aware queue retention and preserve explicit incomplete views.\n\nComplete lifecycle, projection, redaction, recovery, Studio, testing-runtime,\nand agent-as-tool acceptance coverage, including interrupted Playground rows.",
          "is_bot": false,
          "headline": "fix(axl): close lifecycle acceptance gaps",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-17T22:24:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3eb5c9d4e5c16d5cc466791c73bb600b643fb76",
          "body": "Switch live events and executions to schema v2 with explicit tool outcomes.\nRemove legacy callbacks and the dead ToolDenied error export.\nUpdate testing, Studio, history compatibility, docs, and migration gates.",
          "is_bot": false,
          "headline": "feat(axl)!: ship v2 tool lifecycle observation",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-17T21:31:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c92776f907d2e2daa38b4a9565c99573a422e7f8",
          "body": "Persist explicit event schema carriers while preserving legacy payloads. Reject mixed or unsupported traces before they can poison history.\n\nTeach recovery, redaction, and Studio to consume the historical v1/v2 union before the v2 writer is activated.",
          "is_bot": false,
          "headline": "feat(axl): add event schema compatibility readers",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-17T20:24:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73da0f735f8de5053784b428915ee295e08983b0",
          "body": "Route non-handoff tool requests through typed parse, execution, message, and observation seams while preserving the v1 public lifecycle. Add characterization coverage for legacy event ordering, MCP malformed results, and detached override invocation.",
          "is_bot": false,
          "headline": "refactor(axl): centralize tool invocation outcomes",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-17T20:01:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a223c14565021c0d858b9b563fa4534731f8ce3",
          "body": "Warn once per process when createContext receives a legacy observation callback while preserving callback behavior for the compatible release. Migrate in-tree tests and guidance to ctx.events, explicit streams, and trace listeners.",
          "is_bot": false,
          "headline": "deprecate(axl): migrate legacy observation callbacks",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-17T19:48:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5c3b84290099c61e70f4e45f227755540497ee3",
          "body": "Use explicit inherited context state for runtime.stream transport selection. Keep legacy callback activation compatible while migrating internal and test sentinels to stream-first observation.",
          "is_bot": false,
          "headline": "refactor(axl): decouple streaming mode from callbacks",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-17T19:35:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d93a96118133cd311e07c7adfd9445976b9c725",
          "body": "Add compile-only terminal, rejection, and schema-version types for the breaking lifecycle migration. Freeze legacy event fixtures and Studio snapshots before the runtime writer changes.",
          "is_bot": false,
          "headline": "feat(axl): lock v2 tool lifecycle contracts",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-17T19:29:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f349c807f84b6220649e2a18203db09e0fada0f3",
          "body": null,
          "is_bot": false,
          "headline": "chore: Bump to 0.19.1",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-17T16:06:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af27ed931ed86eae02a9fc53715b00badb9b6306",
          "body": "Keep mapper causes out of ordinary error serialization, centralize real and mocked tool finalization, and skip unusable projection work after cancellation. Document provider string-envelope semantics and track the legacy tool lifecycle redesign for the next major.",
          "is_bot": false,
          "headline": "fix(axl): harden projection lifecycle boundaries",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-17T14:10:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70c9dabaccd9778e57fbca2f1270c78a95c1e906",
          "body": "Keep Gemini function responses object-shaped, reject hidden thenables, and stop aborted tool loops before provider continuation. Add mixed-batch, retry, streaming, nested-composition, and history regressions plus contract guidance.",
          "is_bot": false,
          "headline": "fix(axl): close tool projection edge cases",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-17T06:41:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "536ef438ca1a5b1685b5a947beccd4578607e0ef",
          "body": "Observe rejected async projectors, isolate legacy error sentinels from configured policies, and reject descriptor-map prototype pollution. Keep projectors receiver-free and preserve legacy mock timing while strengthening tests and guidance.",
          "is_bot": false,
          "headline": "fix(axl): harden tool output projection boundaries",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-17T06:04:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0366613453a955f9740c52cb3bd29804bd855509",
          "body": "Add direct regression coverage for legacy serialization and failure ordering, type erasure and inference, configured mock bypass policy, accessor rejection, and mock telemetry classification.",
          "is_bot": false,
          "headline": "test(axl): lock projection acceptance boundaries",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-17T04:27:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e8cc2f798f76e797859e99f655bfc8699a3c720",
          "body": "Document verbose message snapshots on agent_call_start, where the provider request is captured. Correct related redaction, buffering, and fixture guidance without changing runtime behavior.",
          "is_bot": false,
          "headline": "docs(axl): correct full trace request attribution",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-17T04:17:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14b2cbd80f08f2a8590e34d90258258109a8ef89",
          "body": "Allow local tools to expose a strict synchronous projection to the model while retaining complete host-observable results. Preserve sensitive, failure, direct-invocation, MCP, handoff, and legacy serialization semantics, including configured mock parity.",
          "is_bot": false,
          "headline": "feat(axl): add model-facing tool output projections",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-17T04:13:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d39136b908babb96374696cda9a111fa4bf7f22",
          "body": "Add Axl-specific Codex roles and an agent-neutral guidance entrypoint. Share the canonical Claude skill tree through a relative Codex symlink, align the cross-surface workflows, and add bounded live-API verification.",
          "is_bot": false,
          "headline": "chore(agents): share workflows across agent tools",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-17T01:55:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0ba47c93f59563768480080399aac29583d5cc9",
          "body": "… honesty)\n\nThe downstream type-export smoke fixture pinned `agent_call_end.cost` as a\nrequired `number` (spec/16 decision 10). The unpriced-cost honesty change in\nthis release made it `number | undefined` (undefined for a pricing-table miss /\nerror path) — a deliberate, documented breaking type cha\n[…]\noke job correctly caught the stale pin; update the fixture to the\nnew contract. Test-only; the published 0.19.0 types are correct.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(smoke): agent_call_end.cost is number | undefined (unpriced-cost…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-08T21:12:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "65558c0710a0104f292cc4cee783f67791bab0c6",
          "body": null,
          "is_bot": false,
          "headline": "chore: Bump to 0.19.0",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-08T20:59:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa4f391e3ec1ac0f09e9286bf756f7422f8dddad",
          "body": "- Rewrite the section summary to cover BOTH themes (provider expansion +\n  structured-output / ctx.ask pipeline) — it previously described only the\n  provider work.\n- Consolidate the two fragmented prompt-rendering bullets (compact/$ref and the\n  io:'input' fix) into one coherent entry; drop the orp\n[…]\n \"Repair recipes\" entry (Problem C) and point the structured-\n  output entries at the new api-reference #structured-output anchor.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: tighten [Unreleased] changelog for the structured-output work",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-08T20:51:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "84dc1a4005df03f3c36c00d6b1ce488e0f4dcc70",
          "body": "- api-reference.md: new \"## Structured Output\" section — the one-stop decision\n  table for the default (prompt-guided + client-side Zod), schemaPrompt modes,\n  nativeStructuredOutput + the per-provider capability tiers, the responseFormat\n  wire summary, precedence/forwarding, repair, and related di\n[…]\nOADMAP, CHANGELOG all current;\narchitecture/security unaffected — verified no stale json_object/responseFormat\nreferences remain).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: consolidated Structured Output reference + session docs sweep",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-08T20:45:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1242a21b15a45b1dee4feb6ab1f25920789b3971",
          "body": "… json_schema\n\nAdds end-to-end live-API coverage for the structured-output / ctx.ask pipeline\n(gated per key; run via pnpm test:integration), and fixes a real capability\nbug the new native path exposed.\n\nIntegration matrix (all verified against real APIs):\n- native-output truth-table across BOTH nat\n[…]\nmeout` to 60s (live reasoning models + schema\nretries exceed Vitest's 5s default — also fixes a pre-existing mistral-large flake).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(axl): live-API integration tier for spec 22 + fix Groq per-model…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-08T20:21:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a12ee032f8e56b4151006a87b3d173e10bb07111",
          "body": "… through delegate handoff\n\nAdversarial review fixes for spec 22 Problem B (native structured output).\n\n- F1: the native json_schema was derived via zodToJsonSchema (OUTPUT mode),\n  which collapsed any .transform()/.pipe() schema to an empty {} on the wire and\n  contradicted the prompt for .default(\n[…]\nquired; a 2-candidate delegate forwards both the custom\nschemaPrompt text and the native json_schema format to the handoff target.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(axl): native structured output derives input-side schema; forward…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-08T19:58:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "519035385f9d3e1628486be5d4a99364f5042dfc",
          "body": "…recipes\n\nProblem C of spec 22 (repair) ships as documentation, plus a correctness fix\nthe recipe depends on.\n\n- renderSchemaForPrompt now uses z.toJSONSchema's `io: 'input'` mode. The\n  default 'output' mode collapses a `.transform()`/`.pipe()` schema to an empty\n  `{}` — so a schema-in-prompt with\n[…]\nsform()` schema renders its input fields (name/email) and omits\nthe computed post-transform field (domain) in the appended prompt.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(axl): render prompt schemas from the input side; document repair …",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-08T19:47:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3a1130655bbf9d82fc947b6cdc74b1e16e908732",
          "body": "Problem B of spec 22 — decouple the model-facing prompt contract from the\nparse schema, plus review fixes for Problems A/E.\n\nschemaPrompt (AskOptions + AgentConfig, forwarded through delegate):\n- 'json-schema' (default) — today's rendering.\n- 'none' — append zero prompt text; the Zod schema stays th\n[…]\nixes, streaming observer gate. Docs: api-reference, providers\n(prompt-guided vs native + support table), observability, CHANGELOG.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): schemaPrompt + provider-neutral nativeStructuredOutput",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-08T19:42:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a1bb2fac389bad941cd45dac0683cb4318d9e897",
          "body": "Problem E of spec 22. Structured-output failures that fail quietly — a dropped\n.refine() the model never sees, a union root that silently disables streaming,\nan oversized appended schema paid every attempt — now surface as a first-class\n`schema_diagnostic` event (once per ask) plus, for the surprisi\n[…]\ns), every emit site, warn dedup + both silencing\npaths. Docs: observability.md (#schema-diagnostics), api-reference.md, CHANGELOG.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): schema_diagnostic events for silent structured-output cliffs",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-08T19:25:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "48252e0079b6bdbd95591c27cdddc598bcd172e1",
          "body": "Problem A of spec 22. `ctx.ask({ schema })` appended the full JSON Schema\npretty-printed and inline-duplicated on every call — for an 8-arm union with\nshared sub-objects this was ~10× more prompt tokens than necessary, paid every\nattempt.\n\n- Add a private `renderSchemaForPrompt` that renders the sch\n[…]\nni-noregress (tool-def path stays\ninline). Docs: observability.md (prompt cost), providers.md (Gemini schema\nhandling), CHANGELOG.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): compact + $ref-hoisted structured-output prompt rendering",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-08T19:07:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2f838f0a163990260e419a32771fcd3a02cd88b5",
          "body": "Four skills (tackle-plan, plan-doc, scenario-review, session-review) were\ncopied from a mobile/web-app repo and carried foreign references. Adapt them\nplus their supporting agents/rules to this SDK monorepo:\n\n- Add adversarial-code-reviewer and balanced-implementer agents (adapted from\n  the source \n[…]\n  -> axl landmines, doc paths -> .internal/spec/, drop nonexistent commitlint.\n- Track skills: add !.claude/skills/ to .gitignore.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(claude): adapt copied skills and agents to axl conventions",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-08T18:50:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0606976e2599f0eef2e2fe12ad02055a75126650",
          "body": "Keep the Unreleased notes focused on user-visible provider, cost, and error-handling changes before merging the branch.",
          "is_bot": false,
          "headline": "docs: tighten provider compatibility changelog",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-08T17:18:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87f1fc4cdae1ecd66235cbe091d6bbcf949dab29",
          "body": "Normalize OpenAI-compatible content block responses to the ProviderResponse string contract.\n\nAdjust DeepSeek live coverage for unsupported forced tool_choice and make preset tests robust to ambient local-provider env vars.",
          "is_bot": false,
          "headline": "fix(axl): harden live preset integrations",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-08T17:11:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a7c0a966a742e49cb03d7cf57998031f78df7be",
          "body": "Align provider docs and comments with the implemented Bedrock and Azure auth surfaces.\n\nAdd opt-in local preset smoke tests for vLLM, LM Studio, llama.cpp, and SGLang alongside Ollama.",
          "is_bot": false,
          "headline": "test(axl): expand preset integration coverage",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-08T16:27:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e866db27b6d5f8b6c3fb97ef8a3c8e3ab55a4800",
          "body": "Scope covers the full provider expansion plan diff review, not only the current session delta.\n\nFix typed error/lower-bound-cost propagation, provider-scoped reasoning metadata, unpriced aggregate surfacing, Azure bearer auth override, and OpenAI-compatible stream failure handling.\n\nAdd regression coverage across core providers, runtime hooks, testing runtime, eval artifacts, Studio aggregates, and gated preset round trips.",
          "is_bot": false,
          "headline": "fix(axl): harden provider compatibility review findings",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-08T16:19:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "835247d14820f1fedc45c5061058c6404a4aa0aa",
          "body": "Promote the unpriced lower-bound signal from per-ask and budget surfaces to execution-level aggregates, trackExecution/trackCost, and AxlTestRuntime.\n\nShare the isUnpricedLeaf discriminator with Studio reducers, add focused regression coverage, and update docs for the new aggregate signal.",
          "is_bot": false,
          "headline": "feat(axl): surface unpriced execution aggregates",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-07-08T15:33:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20074606100f70d9452a0eabb5d2063910bef1af",
          "body": "…s, embedder msg parity\n\nMaintainability/DX follow-ups from the holistic multi-perspective review of 5633dab\n(verdict: sound; zero must-fix bugs). No behavior change to shipped features.\n\n- DRY: extract a single `BudgetContextState` type in context.ts, referenced by the\n  init type + private field +\n[…]\nere declined\nas over-engineering (per-adapter extractErrorMessage varies; the compiler-guarded test\nalready covers the invariant).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(axl): spec-21 review polish — DRY budgetContext, harden type…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-06-03T14:10:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5633daba5a1d7ae9caab90132bfdaf77abab3f76",
          "body": "Two paired additions from spec 21. Both are purely additive (patch under the\n0.x rule); multi-perspective-reviewed (verdicts sound / sound-with-fixes, all\nfindings folded in).\n\nPart A — Budget honesty. ctx.budget() now REPORTS unpriced spend instead of\nsilently understating it: BudgetResult gains `u\n[…]\nm-site network failures). Full\nmonorepo green; docs updated (api-reference, providers, security, observability,\nCHANGELOG, rules).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): budget honesty + typed provider errors (spec 21)",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-06-03T01:04:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f879251a5b91c133a4ab388aff953855bd93f604",
          "body": "… Bedrock id/docs\n\nMulti-perspective review (verdict: T2.2 ship; T2.1/T2.5 ship-with-fixes; central\ndetection design validated — keep it). Fixes:\n\nM1 (verified bug) — T2.5 streaming false-positive. The streaming branch fabricated\na {0,0,0} usage object when the `done` chunk had none, so a no-usage s\n[…]\ntModel race, per-retry key re-resolution. Full suite green\n(axl 1706 · studio 693).\n\nRef: .internal/spec/20-provider-tier2-plan.md\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(axl): address Tier-2 review — streaming unpriced false-positive +…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-06-02T04:47:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "46d5934f8f1156a9f261042ac904ffde6477c9d8",
          "body": "…gnal\n\n- Add a roundtrip-handoff cost-honesty test: the target ask_end (emitted at a\n  different code site than the main loop) carries unpriced when the target turn is\n  unpriced, while the source ask_end (priced turns) does not — closing the\n  plan's MF-3 gap.\n- docs/observability.md: document ask_end.unpriced (cost as a lower bound;\n  failures not flagged) and the agent_call_end.cost number|undefined widening.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(axl): cover handoff-roundtrip unpriced ask_end + document the si…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-06-02T04:27:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "04f5954f6264d9cde69d32ae1831e7ad98d1ba2e",
          "body": "Renders the ask_end.unpriced signal so an ask/dashboard that used an unpriced\nmodel reads as a lower bound, not a misleading exact $0.00. Two carriers (the\ndashboard and the ask tree read different sources):\n\n- Dashboard: CostData.unpricedCalls, accumulated in reduceCost from\n  agent_call_end/memory\n[…]\nreen\n(axl 1702 · studio 686 · e2e 75 · tests 159). CHANGELOG updated.\n\nRef: .internal/spec/20-provider-tier2-plan.md (T2.5 Studio)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl-studio): surface unpriced cost as a lower bound (T2.5 Studio)",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-06-02T04:09:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "70bf741c94b5fe4a6cfc3e9b93147448089b6325",
          "body": "Tier 1 made per-call cost honest (undefined, not a fake $0). But the per-ask\nrollup (ask_end.cost) still summed unpriced calls as 0, so an ask that used an\nunpriced model reported an exact $0.00 — the same lie, relocated to the aggregate.\n\nCore fix, at the single emitEvent cost-rollup chokepoint:\n- \n[…]\nl suite green (1702). Studio rendering (the two carriers) follows next.\n\nRef: .internal/spec/20-provider-tier2-plan.md (T2.5 core)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): ask_end.unpriced signal for honest aggregate cost (T2.5 core)",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-06-02T03:59:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c8a085a16e8d086670b9197ff8e72b454c261ab7",
          "body": "Bedrock's OpenAI-compatible endpoint for gpt-oss, via the generic engine:\n- bearer auth (AWS_BEARER_TOKEN_BEDROCK; short-term tokens via the T2.2 callback),\n  no SigV4. Region-specific base URL (prefer bedrock-mantle) enforced by\n  requireExplicitBaseUrl. Versioned model ids passed in full\n  (bedroc\n[…]\nrt gating, unknown cost)\n+ gated integration block. Full suite green (1694).\n\nRef: .internal/spec/20-provider-tier2-plan.md (T2.1)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): AWS Bedrock preset (gpt-oss) + Tier-2 docs (T2.1)",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-06-02T03:51:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d0f1ffc9908bfe9a720960a43e7be0601fb4155",
          "body": "ProviderConfig.apiKey (and every provider constructor) now accepts\n`string | (() => string | Promise<string>)`. A function is resolved per request\n— supporting Azure-Entra, Databricks/IBM OAuth, and Bedrock short-term tokens —\nwith the callback owning its own refresh/caching (Axl never memoizes).\n\n-\n[…]\nesponses streaming-site guard, rejecting callback). Full suite green (1689).\n\nRef: .internal/spec/20-provider-tier2-plan.md (T2.2)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): async apiKey callback for expiring credentials (T2.2)",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-06-02T03:46:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eeb759dc73327d4240c6ca1e5917f8cbd5e87873",
          "body": "Lists every supported key — the big three plus the Tier-1 OpenAI-compatible\npresets (OpenRouter, xAI, DeepSeek, Mistral, Groq), Azure (key + base URL +\ndeployment), self-hosted opt-in (OLLAMA_BASE_URL/MODEL), and the planned Bedrock\nbearer token — each with a \"where to get it\" URL and notes. Everything is\noptional; integration tests gate-skip per missing key. CONTRIBUTING points at it.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: expand .env.example with all provider keys + how to obtain them",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-06-02T02:48:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b9bb05b9eeae12bf9a751303bde35f91e3f8bcf2",
          "body": "…le presets\n\nPer-preset `skipIf(!<KEY>)` smoke tests (run via `pnpm test:integration`),\nmatching the existing integration-test pattern: cheapest models, tiny payloads.\n\nThe high-value assertions guard the riskiest part of the preset layer — the\nper-model reasoning_effort gating that produced three 4\n[…]\n test` (integration config glob); typechecks and\ngate-skips cleanly (13 skipped) without keys. Assertions run only with real keys.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(axl): gated live integration smoke tests for the OpenAI-compatib…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-06-02T02:22:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e9a7683673ef0a29b0b8d9e06bf4f8526b3f76fa",
          "body": "Living-docs for the Tier-1 provider expansion (same change set):\n- docs/providers.md: new \"OpenAI-compatible providers & presets\" section (preset\n  table, per-preset auth/reasoning/pricing matrix, self-hosted ports + caveats);\n  presets added to the effort-mapping table with per-model omit/no-op foo\n[…]\npreset quick-start.\n- ROADMAP.md: provider expansion reframed as generic-engine + presets (replaces\n  the stale per-adapter plan).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(axl): document OpenAI-compatible presets + cost-on-miss change",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-06-02T02:12:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fd732e82550e12e4abb72f20fe3f9aaee0b4e902",
          "body": "…rden tool-call streaming\n\nMulti-perspective review found three preset bugs where the unified `effort`\nknob emitted an invalid `reasoning_effort` and caused a hard 400/422 (contra\nthe \"no silent 400\" guarantee), plus latent streaming/safety gaps.\n\nPreset fixes (each verified against current provider\n[…]\nallowlist, NaN\nguard, reasoning_details streaming, abrupt stream close, Azure throw). Full\nsuite green (1675); e2e + studio green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(axl): address Tier-1 review — gate reasoning_effort per model, ha…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-06-02T02:12:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e0bf3a2bde6bfdb35825351c32f998cad89eecf5",
          "body": "…AI, DeepSeek, Mistral, Groq, self-hosted)\n\nEach preset is a ProviderProfile served by the generic engine — no new adapter\ncode. Registered in the registry under its provider name (lazy, env-key aware);\nthe native big-3 adapters keep precedence.\n\n- OpenRouter: reasoning object (effort XOR max_tokens\n[…]\nl. 22 preset tests + registry-wiring tests;\nfull axl suite green (1659).\n\nRef: .internal/spec/19-provider-expansion.md (T1.1–T1.4)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): add Tier-1 OpenAI-compatible presets (OpenRouter, Azure, x…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-06-02T01:08:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eb1c84fba2023e95b7fcf4fef911fc3ef86d140d",
          "body": "…ProviderProfile\n\nIntroduces a single generic engine over the OpenAI /v1/chat/completions wire\nformat, parameterized by a ProviderProfile. OpenAIProvider becomes a thin\nsubclass with the canonical OpenAI profile; behavior is byte-for-byte unchanged\nexcept the deliberate cost-on-miss fix below.\n\nThe \n[…]\ne flipped test is the\ncost-on-miss contract. 52 new adversarial engine tests.\n\nRef: .internal/spec/19-provider-expansion.md (T1.0)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): generalize OpenAIProvider into OpenAICompatibleProvider + …",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-06-02T00:59:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a09fed17683e0ec41aa7d8a2650e2a9fce876f75",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: Bump to 0.18.2",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-31T21:06:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5294eb7fbd1990afc18cef5111b94f2fcee87495",
          "body": "…ession)\n\nThe `applies?` field added to `Scorer`/`ScorerConfig` in 0.18.1 was declared as\na function-valued property, whose parameters `strictFunctionTypes` checks\ncontravariantly. That broke assignability of a concretely-typed\n`Scorer<…, TInput, TAnnotations>` to the `Scorer<unknown, unknown, unkno\n[…]\nerApplies` alias are\nunchanged. Adds `scorer-assignability.test-d.ts`, compiled by the `typecheck`\nCI gate, as a regression guard.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(axl-eval): declare Scorer.applies with method syntax (0.18.1 regr…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-31T21:06:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0508e4b89d176dcf67bc23f9dd5d08f22428afb7",
          "body": "Split the 384-line CLAUDE.md into a lean 78-line index plus nine task-scoped rule files under .claude/rules/ — eight path-scoped so they load only when the matching package is touched, documentation.md always loaded. Drop brittle implementation detail (exact prices, versions, model lists, the per-fi\n[…]\nn docs/studio-api.md and the eval/studio rules.\n\nTrack .claude/rules/ via a !.claude/rules/ un-ignore, mirroring !.claude/agents/.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: modularize CLAUDE.md into .claude/rules/",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-31T20:51:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "410a6871fdfbe3e2dacd564da65c0f26f75648db",
          "body": null,
          "is_bot": false,
          "headline": "chore: Bump to 0.18.1",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-31T20:24:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8069a1f41fac97b9fc59eec3ce5d511041da0f6",
          "body": "Match the 0.18.0 headline + tight-paragraph voice and write for the\nupgrader: lead with the capability, the no-provider-call win, the\nmean/gate-exclusion semantics, and the NaN deprecation. Drop the\nfield-by-field type enumeration and internal mechanics (PairedSampleNote,\naggregateRuns, always-populated n, advisory internals) — that lives in\napi-reference, not the changelog.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: tighten conditional-scorer CHANGELOG entry (~250→120 words)",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-31T20:19:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "432111960140fc596a68cd0911f8a15fced2d0c4",
          "body": "Adds `seedConditionalScorerEval` to the Studio dev fixtures so the dev\nserver (and the release smoke checklist) exercises every UI surface that\nrenders the `applies` skip / N-A scorer state — previously unreachable\nbecause no fixture produced a skipped scorer:\n\n- run-detail Scorer Summary + Score Di\n[…]\ncandidate pair whose conditional scorer applies to different item\nsubsets. Visually verified end-to-end in the running dev server.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(studio): seed a conditional-scorer eval in dev fixtures",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-31T20:17:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bdcea9601bdb30da4419486be944b81b70e8da82",
          "body": "Findings from a 3-lens review (correctness / architecture+types / UX) of the\nconditional-scorer work. No blockers were found; these close real edge cases,\none cross-surface inconsistency, and a DRY gap.\n\nCorrectness:\n- CLI `compare` skip NOTE missed the equal-but-disjoint case (both sides skip\n  the\n[…]\nmean not red, failed-null tooltip, rich-vs-simple\nchip). Full suite green (eval 375, studio 686, e2e 159); all packages typecheck.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(axl-eval,studio): address final multi-perspective review",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-31T19:18:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "87fbed75aaaf6831b22ee3ccfb6c3d42fec840f8",
          "body": "The compare row mixes two samples: the headline `delta` is the difference of\ntwo INDEPENDENT per-side means (each over that side's own scored items), while\nthe CI / significance are PAIRED over the items scored on both sides. Under\nasymmetric skips or failures these diverge — a delta can be a sample\n[…]\no\n(PairedSampleNote shows on divergence, hidden when symmetric / counts absent).\nFull suite green (eval 374, studio 677, e2e 159).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl-eval,studio): label per-side vs paired sample in compare view",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-31T18:55:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09bd447829e4e88c89403c0df01fc427008ad417",
          "body": "…very journey\n\nFollow-up to the `applies` predicate: close the journey gaps found by walking\nthe feature from each user's perspective (eval author, CI gatekeeper, Studio\noperator, comparison analyst, programmatic/back-compat consumer).\n\nCI/CD gatekeeper:\n- New non-fatal advisory `reportFullySkippedS\n[…]\nnent tests\n(detail N/A vs failed, list N/A cell, chips, compare non-comparable). Full suite\ngreen (eval 373, studio 671, e2e 159).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl-eval,studio): make conditional-scorer skips visible across e…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-31T18:23:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "82eafdb139cd4027bd11f343c8b903b01eb7df5a",
          "body": "A scorer can legitimately not apply to every dataset item (a refusal judge\nfor refusal-expected items, a constraint judge for constrained items, …).\nAXL runs every scorer against every item, so the community workaround was to\nreturn a NaN sentinel for inapplicable items — which the 0.18.0 failure-ra\n[…]\n adversarial conditional-scorer tests + multi-run/Studio badge/\nredact coverage. Full suite green (eval 372, studio 661, e2e 159).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl-eval,studio): conditional scorers via `applies` predicate",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-31T17:58:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "62d6c5d5dba9ac0cb3388cca334500adfbf72ba7",
          "body": "Rewrite the verbose recent and major-release entries (0.13.7–0.18.0)\nfor high signal: keep breaking changes, public APIs, defaults, and\nmigration notes; cut implementation archaeology, internal symbol\nnames, and exhaustive type-export enumerations. No content for\n0.13.6 and earlier changed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: tighten CHANGELOG for readability (35% shorter)",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-31T16:35:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ddfe3d8f017cb4cff7151343a102281314fb5628",
          "body": "Minor release (0.x convention: minor = behavior change). Highlights: eval trust\nsignals (failure-rate gate, total-wipeout guard, per-scorer scored/failed counts)\n+ opt-in provider rate governor; latest flagships (gpt-5.5, Opus 4.8); launch-prep\ndocs. Three behavior changes warrant the minor: scorers\n[…]\nrect \"pre-0.17.10\" artifact references to \"pre-0.18.0\" (the scored/failed/\n  degraded fields ship in 0.18.0; there is no 0.17.10).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: Bump to 0.18.0",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-30T04:14:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ff232d51f99c4f70596a473f9bf9c8aa2ce1acde",
          "body": "…y pass\n\nDocumentation sweep (verified by a parallel docs-consistency agent), calibrated\nto each document's reader and depth:\n\n- api-reference.md (reader looks up exact API): documented the newly-exported\n  `evaluateScorerErrorRateGate` and `evaluateScorerTolerance` (+ the\n  `ScorerToleranceVerdict`\n[…]\nnto a bold lead + scannable sub-bullets instead of ~400-word paragraphs.\n- Fixed a stray blank line between two `Changed` bullets.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: final sweep for failure-signal + governor; CHANGELOG readabilit…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-29T21:52:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d941a5606dbf9af6c1373cb7c15a9951642b952f",
          "body": "Outlined the user journeys the failure-signal + governor work must support\n(CI gatekeeper, eval author, infra operator, Studio user, programmatic\nconsumer), then verified the implementation against them with parallel agents.\nMost scenarios passed (notably the governor's cancellation chain is wired a\n[…]\nare run with no config can't set it — add a\nminimal `axl.config.ts`. (Assessed an env-var/flag as speculative surface; not built.)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(axl-eval,studio): close journey gaps found by scenario verification",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-29T21:26:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "102122fd85b8734f4c5cb6e899f6011ddb46142c",
          "body": "…-signal + governor\n\nFour parallel review passes (concurrency, eval correctness, architecture,\nproduct/docs) on commits 7c308db + 25d8ed1. No critical bugs; this addresses\nevery major/minor finding plus the warranted improvements.\n\nEval failure-rate signal:\n- DRY: the type-aware tolerance arithmetic\n[…]\n, governor\nobserve-throws-still-releases + first-grant-immediate + release-underflow-warn,\nStudio degraded banner + consolidation.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(axl,axl-eval,studio): address multi-perspective review of failure…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-29T21:14:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "25d8ed1620d0f42c1f0d97a2aa3b22eb25a6104b",
          "body": "Part 2 of the eval-trust effort. Provider pacing was purely reactive — the\n429/503/529 backoff only engaged after a request was rejected. A large\nfan-out on a shared API key (e.g. an eval issuing concurrency ×\nscorerConcurrency, up to 25, concurrent judge calls) could storm a provider\nbefore any bac\n[…]\nease-on-throw, nested\nno-deadlock, undefined-governor unchanged) + registry wiring. retry.test.ts:58\nmigrated to the options form.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): opt-in provider rate-limit governor at the fetch chokepoint",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-29T20:43:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7c308dba9247a76ee91554b85abd7be7bdc8726b",
          "body": "Primary change — Part 1 of the eval-trust effort:\n\nConcurrent scorers can overrun a rate-limited judge model; when a judge\ncall exhausts the provider's retry backoff it throws, the item's score\nbecomes null, and the mean is computed over the survivors — so a\n--fail-on-regression gate can pass on a n\n[…]\n pass, examples/, docs/studio-api.md, gpt-5.5 +\nOpus-4.8 provider/pricing additions) per maintainer direction to land it\ntogether.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl-eval): scorer failure-rate trust signal + launch-prep docs",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-29T20:29:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ddb9f4ef8dcff04e945c10631f8a72679cdc265e",
          "body": "The unit suite validates the concurrent-scorer mechanics deterministically with\nconstant scorers + MockProvider; nothing exercised the motivating case against a\nlive provider. Adds a gated integration test that does.\n\n- packages/axl-eval/src/__tests__/integration-scorer-concurrency.test.ts:\n  descri\n[…]\n:integration` is now\n  `pnpm -r test:integration` so it covers axl + axl-eval.\n- Docs: CLAUDE.md testing section + CHANGELOG note.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(axl-eval): gated live-API integration test for concurrent scorers",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-29T17:19:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5a3180a7916b7e4951554ea890027163ca1b638a",
          "body": "…scorers\n\nFindings from a concurrency / architecture / product review of 071f611.\n\nCorrectness:\n- mapWithConcurrency: coerce non-finite/fractional concurrency\n  (Number.isFinite(c) ? Math.floor(c) : 1) before clamping. A raw config\n  `concurrency: NaN` (e.g. Number(process.env.X)) made Math.max(1,Na\n[…]\no banner. Full suite green (eval 318, studio 627, core 1560, e2e/integ\n234) + typecheck + build. Docs/CHANGELOG/CLAUDE.md updated.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(axl-eval,studio): address multi-perspective review of concurrent …",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-29T17:11:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "071f6117e8f269b8cae634e541d09420b35452f1",
          "body": "Tackles three of the outstanding @axlsdk/eval feature requests (#4 already\nshipped). Reviewed the rest as an owner; deferred #2-items (needs item identity),\n#5 (annotations already round-trip; the gap was #4), and #6 (overlaps rescore +\nadds a stale-cache footgun).\n\n#1 — Concurrent scorers within an\n[…]\nd to cli-args.ts so it is unit-testable without firing\nmain(). Docs updated: README, api-reference, CHANGELOG, CLAUDE.md, spec/13.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl-eval): concurrent scorers + --concurrency / --scorers CLI flags",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-29T16:53:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3fc29b561cf435a880235556fbabeb9dbc6b8c1e",
          "body": "Multi-perspective review surfaced real issues; this addresses them.\n\nCorrectness:\n- dataset(): gate drop-detection on the annotations schema being a ZodObject\n  (isObjectSchema, via the public .shape getter). A .transform()/.preprocess()/\n  pipe reshapes parsed output, so the raw-vs-parsed diff was \n[…]\nrror'+file; banner RTL (singular/plural/chips/cap/\nempty); multi-run aggregate propagation. Replaced `as never` with a typed stub.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(axl-eval,studio): address review of dropped-annotation-keys feature",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-29T15:03:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a3c8876abef6e96c646924bd9ae33b1c915f6682",
          "body": "…ace in Studio\n\nZod object schemas strip undeclared keys by default, so an annotation\nfield missing from a dataset's `annotations` schema was silently dropped\nbefore reaching scorers — a scorer reading it saw `undefined` and quietly\nbecame a no-op while the eval still \"passed\". Worst on file-based d\n[…]\nfile/nested/all policies), runner metadata\npropagation, client helper. Docs: CHANGELOG, api-reference, axl-eval README,\nCLAUDE.md.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl-eval): flag annotation keys dropped by dataset schema + surf…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-29T14:38:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "99ce11411c9ffe2f54346cc7a0daa9df0a97accd",
          "body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: Bump to 0.17.9",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-28T14:53:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4466cbdb36689a28c415aaace02f174b79ec6270",
          "body": "…pagation\n\nWidens `LlmScorerConfig` with six additive ChatOptions fields (`maxTokens`,\n`effort`, `thinkingBudget`, `includeThoughts`, `stop`, `providerOptions`) so\nreasoning-capable judges (gpt-5.x, Opus 4.5+/Sonnet 4.6+, Gemini 3.x) can be\ncalibrated through `effort: 'high'` without abandoning `llm\n[…]\ninterface from `@axlsdk/axl` instead of an inline subset, so\nany future `ChatOptions` field is automatically available to scorers.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl-eval): llmScorer ChatOptions surface + end-to-end signal pro…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-28T14:51:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bfaf6ef796c6dce60b8eeb54bbdf45df1b43d09a",
          "body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: Bump to 0.17.8",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-25T19:21:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "49eae199506a93226da61e774ff6dcb700c98e49",
          "body": "Adds GA pricing for google:gemini-3.5-flash ($1.50/$9.00 per 1M tokens;\ncached input rides the standard 10% rule). Versioned identifiers\n(gemini-3.5-flash-001) resolve via the existing longest-prefix matcher.\n\nFixes a latent gap surfaced by 3.5 Flash and other Gemini 3.x models:\nthe provider dropped\n[…]\no on 3.x, 2.x back-compat (no id field), and the full parallel-call\ntwo-turn round-trip. 81/81 gemini tests pass; typecheck clean.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): Gemini 3.5 Flash support + functionCall.id round-trip",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-25T19:12:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "43650c1fe48503d39ad8e3fb671d3d1a5106e600",
          "body": "GitHub flagged Node.js 20 actions as deprecated during the v0.17.7\npublish run — Node.js 20 will be forced off the runners on\nJune 2, 2026 (~1 week away). The v6 majors of all three actions\nsupport Node.js 24.\n\nVersions verified against upstream:\n- actions/checkout@v6 (v6.0.2, released 2026-01-09)\n-\n[…]\ntry-url`) is stable across the major bump.\n\nThis push triggers CI on main, which exercises all three actions\nacross the Node 20 + 22 matrix, lint, and smoke jobs — the validation\ngate for the v6 bump.",
          "is_bot": false,
          "headline": "ci: bump actions/checkout, actions/setup-node, pnpm/action-setup to @v6",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-25T18:07:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9357e1210ef5513274fecb8c296e2fae3ae56603",
          "body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: Bump to 0.17.7",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-20T16:12:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e250a963479737ed92f575368157a31088fe878d",
          "body": "The two customer-ask planning docs (axl-team-asks.md,\naxl-team-asks-review.md) now live under .internal/ — already gitignored\nas a whole — instead of being listed individually in .gitignore. One\nrule covers them, consistent with how the rest of the internal planning\nmaterial (specs, roadmap, competitive analysis) is kept out of the\npublished repo. Reverts the per-file .gitignore entries added in the\nprevious commit.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: move customer-ask working docs into .internal/",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-20T16:10:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e5e05e62b6ac6998c711193314344f543ab26f71",
          "body": "Pre-publish documentation pass. Three things: CHANGELOG finalization,\nversion-number correction, and untracking the customer-ask working docs.\n\nVersion correction: 0.18.0 → 0.17.7\n- The release is 100% additive (spec/18 confirms no breaking changes).\n  Per the project's pre-1.0 semver convention — p\n[…]\nng docs, not part of the published repo.\n\nNo code changed this turn — docs only. The redis.ts zRange migration\nshipped in f39a29b.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: finalize CHANGELOG for 0.17.7 release + version-ref sync",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-20T16:00:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f39a29be3da04d9130c7ea0a17136caf6a293247",
          "body": "Owner-judgment test coverage pass. Identifies and closes coverage gaps\nacross the entire 0.18.0 surface, AND catches a real production bug\n(node-redis v5 API mismatch) that mock-based tests couldn't surface.\n\nThe bug, caught by the integration tests\n- `RedisStore.listExecutions(limit)` and `listEval\n[…]\n).\n- tests/studio: 159 passed (unchanged).\n- redis-integration with REDIS_URL set: 11/11 passing against\n  redis://localhost:6379.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: 19 new tests across E2E + REDIS_URL-gated integration",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-19T23:11:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "87c3eb14f7c911cd9526d50282c7e9ebffb00142",
          "body": "…r reactivity\n\nOwner judgment on the spec/18 §12 deferred list. Three items were\ntrivial-to-medium cost with real customer-visible value; the rest stay\ndeferred for lack of a concrete pull (cross-process lease, tags-field\nseparation, per-event size guard, promise-chain cap, RedisClient type\nrefactor\n[…]\ne items to \"Shipped\n  in 0.18.0\" with check marks; remaining deferred items annotated\n  with workaround / customer-pull rationale.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): pull forward 3 deferred items — audit symmetry + aggregato…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-19T20:25:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eb65ebf541206fbf50759159922d88083d1020ae",
          "body": "Pre-release documentation pass. Two new anchor docs serve as\nsource-of-truth for the design; nine existing docs gain targeted\nupdates that cross-link the anchors rather than duplicating the deep\ncontent.\n\nNew anchor docs\n- `docs/migration/state-store-durability.md` — customer-facing migration\n  guid\n[…]\numan` signal-abort wiring.\n\nInternal specs (next commit) and internal docs (commit after) still\npending — anchor doc `.internal/spec/18-state-durability.md` and\nspec README index entry already landed.",
          "is_bot": false,
          "headline": "docs: sweep external + READMEs + CLAUDE.md for 0.18.0 release",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-19T17:46:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4eff9be496e19b8c53ed4b9acbcc25947b008868",
          "body": "Walked through 30+ user scenarios across six personas (compliance, operator,\ndeveloper, SRE, performance, migrating-user). Spawned a verification agent\nto cross-check each against the implementation. Six new gaps found and\nfixed; all interlocking on the GDPR-delete + awaitHuman path.\n\nCritical: awai\n[…]\n\n- Updated: deleteExecution MULTI queue-length assertion 8→9.\n- Total: 1550 axl + 603 studio inline + 226 e2e/integration passing.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(axl): scenario-driven gaps from owner-level review",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-19T03:27:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5bfd367e1fd3e56a19b50d3e4617a3a74d0fae1c",
          "body": "Smaller cleanups + documentation updates rounding out the multi-perspective\nreview of the 0.18.0 work.\n\nOperator hygiene (RedisStore)\n- `listPendingExecutions` self-prunes stale ids whose `executionState`\n  blob has TTL-evicted. Without this, the pending-set bloats forever\n  in deployments that age \n[…]\nthe live id AND the dead id is\n  SREM'd from the pending set.\n- Total: 1543 axl + 603 studio inline + 226 e2e/integration passing.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(axl): operator-hygiene fixes + docs sync from review",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-19T02:53:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6dc3ec54ea5461aed10629ce832bccef2fef43f8",
          "body": "Targeted improvements raised by the post-implementation review of the\n0.18.0 release work. Each is independently small; bundling because they\ntouch the same files and share test fixtures.\n\nMemory + session TTL semantics\n- getMemory's race-safe legacy migration now applies the configured\n  `memory` T\n[…]\nstudio inline + 226 e2e/integration passing\n  (1542 axl reflects +2 net new tests; the renamed assertions stayed\n  count-neutral).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(axl): strong-suggestion fixes from multi-perspective review",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-19T02:45:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1d5f62f8b28982730367af9618a14099b9388416",
          "body": "Bundles 9 fixes uncovered by the post-implementation review of the 0.18.0\nrelease work. Each is independently testable; bundling because they share\ntest infrastructure and are interlocking.\n\nState store consistency\n- deleteExecution now sweeps every per-execution surface: checkpoint blob,\n  exec-sta\n[…]\ntest.ts:145\n  (history array widening for ChatMessage union).\n- Total: 1540 axl + 603 studio inline + 226 e2e/integration passing.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(axl): critical correctness fixes from multi-perspective review",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-19T02:38:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9e64025a1735b28e0f9b0855b684a19c05d403d7",
          "body": "Without streaming, events are buffered in memory and only persist at the\nterminal done/error event — if the process crashes mid-run, the events\nare lost. With state.persist: 'streaming', events are batched and flushed\nto a streaming buffer throughout the run; on crash, the next process\ncalls runtime\n[…]\n, string_delta\n(high-volume, reconstructable from persisted agent_call_end.data).\n\nAddresses ask #1 from the customer-team review.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): state.persist: 'streaming' for in-flight trace durability",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-18T21:52:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cc7cb0564c3645c841974dbc9070dbc19e4307b9",
          "body": "Without TTLs, every save on RedisStore accumulates forever and Redis\neventually OOMs. New options:\n\n- `defaultTtl`: TTL in seconds applied to every TTL-capable category.\n- `ttls`: per-category overrides (seconds, or `null` to opt out even\n  when defaultTtl is set).\n\nCategories: `session`, `sessionMe\n[…]\nMULTI overhead). With a TTL, hSet + EXPIRE queue\nin a single MULTI for atomicity.\n\nAddresses ask #3 from the customer-team review.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): RedisStore TTL config (defaultTtl + per-category overrides)",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-18T21:33:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8fc39094f84f94d6dea20dff5c5797aff1183a9b",
          "body": "Symmetric to `runtime.deleteEvalResult` / `DELETE /api/evals/history/:id`.\n\n- New optional `StateStore.deleteExecution?(id): Promise<boolean>`\n  interface method. All three built-in stores implement it.\n- `RedisStore.deleteExecution` removes from all three indexes\n  (legacy SET, sorted-set, data blo\n[…]\nbulk eviction by age, use\n`RedisStore` TTLs (coming in #3 from the same review).\n\nAddresses ask #10 from the customer-team review.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): runtime.deleteExecution and Studio DELETE /api/executions/:id",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-18T21:21:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a689340dc59ebc9a3ca8b0bffd774f7ad4e60e77",
          "body": "Thread caller-supplied `ExecuteOptions.metadata` verbatim onto the\n`ExecutionInfo` snapshot from both `runtime.execute()` and\n`runtime.stream()`. Gives users a stable, queryable surface for tags\nlike `userId`, `tenantId`, or correlation ids without parsing the\nevent timeline.\n\nPersisted by all three\n[…]\nilter via `runtime.getExecutions()` + an in-process\n`.filter()`, or mirror executions into their own datastore for richer\nqueries.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): lift ExecuteOptions.metadata onto ExecutionInfo.metadata",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-18T21:10:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bee51eff88a2376a88f1abf1c9e8b0514543c6e3",
          "body": "…ast path\n\nPre-patch, both methods scanned `SMEMBERS` + N×`GET` + JS-sort. Fine at\na few hundred entries, painful at 10k+. Now each `saveExecution` /\n`saveEvalResult` dual-writes the ID into a Redis sorted-set scored by\n`startedAt` / `timestamp` (inside the same MULTI as the data blob — so\natomicity\n[…]\nhe ZSET, not SREM on the legacy SET, to\navoid racing with the slow-path fallback.\n\nAddresses ask #4 from the customer-team review.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(axl): RedisStore listExecutions/listEvalResults use sorted-set f…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-18T21:08:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0554f0217f16e3c79420ec7c6487520d3cd2fb66",
          "body": "Every write path that touched more than one Redis key — `saveSession`,\n`deleteSession`, `saveExecutionState`, `saveExecution`, `saveEvalResult`,\n`deleteEvalResult`, `deleteMemory` — now queues all its commands in a\nsingle `client.multi()` chain and commits atomically.\n\nBefore this fix, a crash betwe\n[…]\nlags the need\nfor WATCH if a future contributor adds a read-modify-write pattern.\n\nAddresses ask #6 from the customer-team review.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(axl): RedisStore wraps every multi-key write in MULTI/EXEC",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-18T20:46:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e5a87010a1583a7bfee87a4ac342ef78a16c6f92",
          "body": "…migration\n\nBefore this fix, `ctx.remember()` against `RedisStore` silently took a\n`saveSessionMeta`-based fallback path inside `MemoryManager` which (a)\ndropped the optional `metadata` arg, (b) made entries invisible to\n`getAllMemory` (so `session.fork()` silently skipped memory migration),\nand (c)\n[…]\nrs on custom\n`StateStore` impls that haven't implemented the four memory methods.\n\nAddresses ask #2 from the customer-team review.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(axl): RedisStore implements memory methods with race-safe legacy …",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-18T20:39:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "07c6b32c478d940d2906b242d6f7bb11010e86ea",
          "body": "`RedisStore.create()` now accepts an options object with a `keyPrefix`\nfield, defaulting to `'axl:'` for backward compatibility. Useful when\nmultiple Axl deployments coexist on one Redis cluster (e.g. `'axl:prod:'`\nvs `'axl:staging:'`) or when sharing a cluster with other applications.\n\n- No normali\n[…]\ninst `this.keyPrefix` — factored out a `sessionIdsKey()`\n  helper for uniformity.\n\nAddresses ask #8 from the customer-team review.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): RedisStore keyPrefix option for shared-cluster deployments",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-18T20:27:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "85417e85bd6e2f3df505d572c0a9159bad2e2a70",
          "body": "Adds first-class support for claude-opus-4-7 ($5/$25 per 1M, same as 4.6)\nwith adaptive thinking + output_config.effort. Promotes 'xhigh' to the\npublic Effort enum, positioned between 'high' and 'max'. Maps natively\nto Opus 4.7 (output_config.effort: 'xhigh') and OpenAI gpt-5.2+\n(reasoning_effort: '\n[…]\n that mirrors the OpenAI pattern.\n\nAnthropic task budgets (public beta) intentionally deferred pending\nthe official API reference.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): Claude Opus 4.7 + cross-provider 'xhigh' effort tier",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-13T19:28:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dfb1e46f36969a682f894b70d403c16704929078",
          "body": "Adds the GA identifier alongside the existing -preview entry at the same\nrate ($0.25 / $1.50 per 1M tokens). The 3.x code paths (isGemini3x regex,\nthinkingLevel mapping, minThinkingLevel) already covered the GA\nidentifier — this release adds pricing only. Preview continues to work\nuntil Google's shu\n[…]\n5-25; migrate before then.\n\nAlso swaps the live-API integration test from preview → GA so it doesn't\nsilently break post-shut-off.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(axl): GA pricing for google:gemini-3.1-flash-lite (0.17.6)",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-13T19:00:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "794d65661022fa042fa2df70f8e2ecb6e78e3f5f",
          "body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: Bump to 0.17.5",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-07T05:16:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1474d58b136c763120a1a7632d197e0c194530d4",
          "body": "…n hover\n\nUser-reported: hovering over a collapsed `JsonViewer` (e.g. a chat\nbubble showing `> { title, summary, bulletPoints, confidence }`) made\nthe floating \"Expand\" + \"Copy\" buttons visually merge with the\nunderlying tree text — the buttons had a border but no fill, so the\nJSON preview showed th\n[…]\nExpand/Collapse and Copy buttons. Affects every\nJsonViewer surface (chat bubbles, tool inspector, trace bodies, etc.)\nidentically.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(studio): JsonViewer toolbar buttons no longer overlay tree text o…",
          "author_name": "Erik Portillo",
          "author_login": "erikportillo",
          "committed_at": "2026-05-07T04:33:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 55,
      "commits_last_year": 392,
      "latest_release_at": "2026-07-20T19:35:03Z",
      "latest_release_tag": "v0.20.0",
      "releases_from_tags": true,
      "days_since_last_push": 6,
      "active_weeks_last_year": 17,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 7.6
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 75,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@axlsdk/axl",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "ai",
            "agents",
            "llm",
            "typescript",
            "orchestration",
            "agentic"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@axlsdk/axl",
          "is_deprecated": false,
          "latest_version": "0.20.0",
          "repository_url": "https://github.com/axl-sdk/axl",
          "versions_count": 59,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 835,
          "first_published_at": "2026-02-17T17:32:09.269000Z",
          "latest_published_at": "2026-07-20T19:45:32.912000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        },
        {
          "name": "@axlsdk/eval",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "ai",
            "evaluation",
            "scoring",
            "agents"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@axlsdk/eval",
          "is_deprecated": false,
          "latest_version": "0.20.0",
          "repository_url": "https://github.com/axl-sdk/axl",
          "versions_count": 59,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 769,
          "first_published_at": "2026-02-17T17:32:17.220000Z",
          "latest_published_at": "2026-07-20T19:45:34.466000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        },
        {
          "name": "@axlsdk/studio",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "ai",
            "studio",
            "developer-tools",
            "agents",
            "debugging"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@axlsdk/studio",
          "is_deprecated": false,
          "latest_version": "0.20.0",
          "repository_url": "https://github.com/axl-sdk/axl",
          "versions_count": 57,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 879,
          "first_published_at": "2026-02-18T21:41:22.612000Z",
          "latest_published_at": "2026-07-20T19:45:38.542000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        },
        {
          "name": "@axlsdk/testing",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "ai",
            "testing",
            "mock",
            "agents"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@axlsdk/testing",
          "is_deprecated": false,
          "latest_version": "0.20.0",
          "repository_url": "https://github.com/axl-sdk/axl",
          "versions_count": 59,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 731,
          "first_published_at": "2026-02-17T17:32:15.122000Z",
          "latest_published_at": "2026-07-20T19:45:35.877000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 2,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "examples/tsconfig.json",
        "packages/axl-eval/tsconfig.json",
        "packages/axl-studio/tsconfig.json",
        "packages/axl-testing/tsconfig.json",
        "packages/axl/tsconfig.json",
        "tests/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 188417,
      "source_files_sampled": 389,
      "oversized_source_files": 8,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 5234
    },
    "dependencies": {
      "manifests": [
        "examples/package.json",
        "package.json",
        "tests/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@axlsdk/axl",
          "manifest": "packages/axl-eval/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@axlsdk/axl",
          "manifest": "packages/axl-studio/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@hono/node-server",
          "manifest": "packages/axl-studio/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.13.0"
        },
        {
          "name": "@hono/node-ws",
          "manifest": "packages/axl-studio/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.0"
        },
        {
          "name": "hono",
          "manifest": "packages/axl-studio/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.7.0"
        },
        {
          "name": "tsx",
          "manifest": "packages/axl-studio/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.19.0"
        },
        {
          "name": "ws",
          "manifest": "packages/axl-studio/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.0.0"
        },
        {
          "name": "@axlsdk/axl",
          "manifest": "packages/axl-testing/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "erikportillo",
          "commits": 392,
          "avatar_url": "https://avatars.githubusercontent.com/u/6964428?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "publish.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "eslint.config.js"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "pnpm-lock.yaml"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "80 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "71e209de7d0823c538668c6d645bc359264b3999",
        "ran_at": "2026-07-27T05:57:51Z",
        "aggregate_score": 4.4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-20T20:09:32Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/axl-sdk/axl",
    "host": "github.com",
    "name": "axl",
    "owner": "axl-sdk"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 44,
        "vitality": 81,
        "community": 45,
        "governance": 32,
        "engineering": 84
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 81,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 392,
              "human_commit_share": 1,
              "days_since_last_push": 6,
              "active_weeks_last_year": 17
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "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": "392 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 392
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "releases_count": 55,
              "latest_release_tag": "v0.20.0",
              "releases_from_tags": true,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 7.6
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "55 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 55
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~7.6 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 7.6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 45,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 2,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "2 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 58,
            "inputs": {
              "packages": [
                "@axlsdk/axl",
                "@axlsdk/eval",
                "@axlsdk/studio",
                "@axlsdk/testing"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3214
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,214 downloads/month across npm",
                "points": 46.8,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3214,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 32,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 1
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "0/1 decided PRs merged",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 0,
                      "decided": 1
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 33,
            "inputs": {
              "followers": 0,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "axl-sdk",
              "public_repos": 1,
              "account_age_days": 164
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "0 followers of axl-sdk",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "axl-sdk"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "1 public repos, account ~0 yr old",
                "points": 3.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 1
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@axlsdk/axl",
                "@axlsdk/eval",
                "@axlsdk/studio",
                "@axlsdk/testing"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 6
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "4 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 4,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 6 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "59 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 59
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 84,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 80,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "eslint.config.js",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "agentic",
                "agents",
                "ai",
                "anthropic",
                "gemini",
                "llm",
                "openai",
                "orchestration",
                "sdk",
                "structured-output",
                "tool-calling",
                "typescript",
                "workflows"
              ],
              "has_wiki": false,
              "homepage": "https://www.npmjs.com/package/@axlsdk/axl",
              "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://www.npmjs.com/package/@axlsdk/axl",
                "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": "13 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 44,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, CI-Tests, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "ci_tests",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 44,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 4.4
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "80 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 1
            },
            "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": 72,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 5234
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "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": [
                "pnpm-lock.yaml"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "examples/tsconfig.json",
                "packages/axl-eval/tsconfig.json",
                "packages/axl-studio/tsconfig.json",
                "packages/axl-testing/tsconfig.json",
                "packages/axl/tsconfig.json",
                "tests/tsconfig.json"
              ],
              "agent_commit_share": 0.7,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "eslint.config.js",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "examples/tsconfig.json, packages/axl-eval/tsconfig.json, packages/axl-studio/tsconfig.json, packages/axl-testing/tsconfig.json, packages/axl/tsconfig.json, tests/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples/tsconfig.json, packages/axl-eval/tsconfig.json, packages/axl-studio/tsconfig.json, packages/axl-testing/tsconfig.json, packages/axl/tsconfig.json, tests/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "70 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 70,
                      "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": 99,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 188417,
              "source_files_sampled": 389,
              "oversized_source_files": 8
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "8/389 source files over 60KB",
                "points": 53.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 389,
                      "oversized": 8
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T05:57:57.747248Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/axl-sdk/axl.svg",
  "full_name": "axl-sdk/axl",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

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