公开记录
软件健康报告模式 0.27.0 · 指标 2.3.1 · 2026-07-28 05:46 UTC

scitix / siclaw

AI-powered SRE platform — read-only infrastructure diagnostics with deep investigation, security governance, and team collaboration

TypeScript · PythonApache-2.0★ 223 星标⑂ 27 复刻始于 2026年3月在 GitHub 上查看 ↗
类型MCP 服务器网页界面如何判定

scitix/siclaw 的健康指数为 100 分中的 80 分,处于「优秀」区间。 其得分最高的类别是Vitality(86/100),最低的是Security(46/100)。 最近一次更新在今天。 近期的大部分工作由 2 位贡献者完成。

80
总分 / 100
优秀

软件健康指数

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

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

评分画像

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

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

所有权

scitix组织
49 关注者39 个公开仓库始于 2024年7月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npmsiclaw0.1.4455130 天前srekubernetesk8saicopilotdiagnosticsclaudeagent

按类别列示的指标

活力

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

86优秀 · 占总体的 21%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
15.2/36提交节奏 — 52 周中有 22 周有提交
18/18提交量 — 最近一年 1,431 次提交
0/10OpenSSF Scorecard:Maintained — 无数据
所用输入
commits_last_year1,431
human_commit_share1
days_since_last_push0
active_weeks_last_year22

发布纪律

100卓越
评分方式
27/27有发布版本 — 已发布 20 个发布版本
36/36发布时效 — 最近一次发布版本于 0 天前
27/27发布节奏 — 约每 4.7 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count20
latest_release_tagv0.2.9
releases_from_tags
days_since_latest_release0
mean_days_between_releases4.7

社区与采用

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

59中等 · 占总体的 17%
评分方式
38.1/60星标 — 223 个星标
11.8/25复刻 — 27 个复刻
0/15关注者 — 2 位关注者
所用输入
forks27
stars223
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

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

可持续性与治理

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

69良好 · 占总体的 23%
评分方式
25.2/54巴士系数 — 2 位贡献者贡献了半数提交
12.7/22.5提交分布 — 头号贡献者编写了 44% 的提交
12.2/13.5贡献者广度 — 9 位贡献者
0/10OpenSSF Scorecard:Contributors — 无数据
所用输入
bus_factor2
contributors_sampled9
top_contributor_share0.435
评分方式
24.7/42议题解决 — 59% 的议题已关闭
25.9/30PR 接受 — 已裁定的 PR 中 371/429 已合并
0/13Newcomer PR acceptance — 30 天内没有首次贡献者的 PR 得到裁决
0/15OpenSSF Scorecard:Code-Review — 无数据
所用输入
merged_prs371
open_issues7
closed_issues10
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio0.588
closed_unmerged_prs58
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
已排除计分(无数据或不适用):newcomer_pr_acceptance。 其余权重已重新归一化。
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
12.2/25所有者影响力 — scitix 有 49 位关注者
15.7/25既往记录 — 39 个公开仓库,账户约 2 年
所用输入
followers49
owner_typeOrganization
is_verified
owner_loginscitix
public_repos39
account_age_days731
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 130 天前
20/20版本历史 — 5 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagessiclaw
ecosystemsnpm
any_deprecated
min_days_since_publish130

工程质量

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

72良好 · 占总体的 19%

工程实践

60中等
评分方式
24/24CI 工作流 — 2 个工作流
24/24存在测试
0/16Linter 配置
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

文档

90优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://siclaw.ai
10/10仓库描述
10/10主题标签 — 10 个主题标签
0/10Wiki
所用输入
topicsai-agent, aiops, devops, kubernetes, llm, sre, openclaw, agent, ai-agents, sre-agent
has_wiki
homepagehttps://siclaw.ai
has_readme
has_docs_dir
has_description

安全

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

46薄弱 · 占总体的 16%

安全态势

40薄弱
评分方式
30/30安全策略(SECURITY.md)
0/25Dependabot 配置
0/25依赖锁定文件 — 已发布的类库——锁定文件属于应用层关注点,不作要求
0/20CodeQL 工作流
所用输入
sourcefile_signals
lockfilespackage-lock.json
manifestspackage.json, portal-web/package.json
has_codeql_workflow
has_security_policy
has_dependabot_config
已排除计分(无数据或不适用):依赖锁定文件。 其余权重已重新归一化。
评分方式
14.6/35直接依赖不含已知公告 — 1 个受影响:@mariozechner/pi-coding-agent 0.55.4 (high 7.3)
13.2/25间接依赖不含已知公告 — 1 个受影响:@hono/node-server 1.19.15 (moderate 5.9)
40/40没有长期未处理的公告 — 没有公告公开超过 90 天
所用输入
sourceosv
advisories4
affected_packages2
assessed_packages424
unassessed_packages0
affected_by_severityhigh 1, moderate 1
direct_affected_packages1
比对的是 npm:siclaw@0.1.4 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 424 个软件包。 未对可达性进行分析。

AI 就绪度

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

78良好 · 占总体的 4%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md, kbc/CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 92 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.92
agent_instruction_filesAGENTS.md, CLAUDE.md, kbc/CLAUDE.md
agent_instruction_max_bytes25,866
评分方式
18/18一条命令的引导启动 — Makefile
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — mcp/create-chart/tsconfig.json, mcp/sicore-a2a-adapter/tsconfig.json, portal-web/tsconfig.json, tsconfig.json
10/10可复现环境 — Dockerfile, lockfile
4/10已体现的代理实践 — 最近 100 次提交中有 2 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — 无数据
所用输入
has_nix
has_tests
lockfilespackage-lock.json
has_dockerfile
typed_language
bootstrap_filesMakefile
has_devcontainer
has_linter_config
typecheck_configsmcp/create-chart/tsconfig.json, mcp/sicore-a2a-adapter/tsconfig.json, portal-web/tsconfig.json, tsconfig.json
agent_commit_share0.02
toolchain_manifests
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — TypeScript(静态类型)
53.2/55可控的文件大小 — 采样的 643 个源文件中有 21 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes370,531
source_files_sampled643
oversized_source_files21
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
20/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

223GitHub 星标
9贡献者
1,431最近 12 个月提交数
0距最近推送天数
20发布版本数
2巴士系数(bus factor)
7开放议题
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 did not return a usable result (2026/07/28 05:46:07 Warning: PATs stored in env variables GITHUB_AUTH_TOKEN and GITHUB_TOKEN differ. Scorecard will use the former.); skipping Scorecard checks

更多细节

Star 与 Fork 历史 0 ★ / 27 ⇿
0Star
27Fork
19发布

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

0510152025302722026-032026-052026-07
主版本 0次版本 2修订 17
直接依赖 36
注册表软件包版本约束清单文件
npm@anthropic-ai/sdk^0.71.2package.json
npm@arizeai/openinference-semantic-conventions^2.5.0package.json
npm@clack/prompts^1.1.0package.json
npm@earendil-works/pi-agent-core^0.80.7package.json
npm@earendil-works/pi-coding-agent0.80.7package.json
npm@earendil-works/pi-tui^0.80.7package.json
npm@kubernetes/client-node^1.4.0package.json
npm@modelcontextprotocol/sdk^1.27.1package.json
npm@opentelemetry/api^1.9.1package.json
npm@opentelemetry/exporter-trace-otlp-proto^0.219.0package.json
npm@opentelemetry/resources^2.8.0package.json
npm@opentelemetry/sdk-trace-node^2.8.0package.json
npm@sinclair/typebox^0.34.0package.json
npmadm-zip^0.5.17package.json
npmdiff^8.0.3package.json
npmglob^13.0.6package.json
npmjs-yaml^4.1.1package.json
npmjsonwebtoken^9.0.3package.json
npmmarkdown-it^14.1.0package.json
npmmysql2^3.22.0package.json
npmnode-forge^1.3.3package.json
npmprom-client^15.1.3package.json
npmsqlite-vec^0.1.7-alpha.2package.json
npmssh2^1.17.0package.json
npmtar^7.5.15package.json
npmws^8.18.0package.json
npmcron-parser^5.5.0portal-web/package.json
npmlucide-react^0.460.0portal-web/package.json
npmmermaid^11.15.0portal-web/package.json
npmprismjs^1.30.0portal-web/package.json
npmreact^18.3.1portal-web/package.json
npmreact-dom^18.3.1portal-web/package.json
npmreact-markdown^10.1.0portal-web/package.json
npmreact-router-dom^7.0.0portal-web/package.json
npmreact-simple-code-editor^0.14.1portal-web/package.json
npmremark-gfm^4.0.1portal-web/package.json
全部依赖 未采集

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

依赖安全公告 2

安装 npm:siclaw@0.1.4 会引入 424 个包(直接与传递):其中 2 个存在已知公告,1 个为直接依赖。

软件包版本关系严重程度公告数修复版本
@mariozechner/pi-coding-agent0.55.4直接30.78.1
@hono/node-server1.19.15间接12.0.5

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "ai-agent",
        "aiops",
        "devops",
        "kubernetes",
        "llm",
        "sre",
        "openclaw",
        "agent",
        "ai-agents",
        "sre-agent"
      ],
      "is_fork": false,
      "size_kb": 15451,
      "has_wiki": false,
      "homepage": "https://siclaw.ai",
      "languages": {
        "CSS": 1761,
        "HTML": 773,
        "Shell": 70560,
        "Python": 1459359,
        "Makefile": 7051,
        "Dockerfile": 3327,
        "JavaScript": 105832,
        "TypeScript": 6673844,
        "Go Template": 7209
      },
      "pushed_at": "2026-07-28T04:54:04Z",
      "created_at": "2026-03-02T04:31:11Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-27T08:32:31Z",
      "description": "AI-powered SRE platform — read-only infrastructure diagnostics with deep investigation, security governance, and team collaboration",
      "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",
        "Python"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "scitix",
      "company": null,
      "location": null,
      "followers": 49,
      "avatar_url": "https://avatars.githubusercontent.com/u/176687877?v=4",
      "created_at": "2024-07-26T14:06:40Z",
      "is_verified": null,
      "public_repos": 39,
      "account_age_days": 731
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": null,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.9",
          "kind": "patch",
          "published_at": "2026-07-27T09:29:27Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-07-23T12:36:52Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-07-22T11:37:32Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-07-17T16:37:08Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-07-09T17:37:23Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-06-30T15:15:42Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-06-26T11:11:12Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-06-24T11:23:37Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-06-22T13:17:56Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-06-15T08:12:58Z"
        },
        {
          "tag": "v0.1.9",
          "kind": "patch",
          "published_at": "2026-06-10T13:14:09Z"
        },
        {
          "tag": "v0.1.8",
          "kind": "patch",
          "published_at": "2026-06-09T09:36:33Z"
        },
        {
          "tag": "v0.1.7",
          "kind": "patch",
          "published_at": "2026-06-03T13:29:45Z"
        },
        {
          "tag": "v0.1.6",
          "kind": "patch",
          "published_at": "2026-05-27T09:13:38Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2026-04-28T12:47:02Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-03-19T11:40:32Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-03-15T10:19:46Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-03-13T12:47:09Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-03-07T07:25:05Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-03-07T05:22:08Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "35f3d9b2a29a6f98882f0cf433fbb6c80d8a6da7",
          "body": "kbc box: rebuild and continue on compile-turn stall or SDK subprocess death",
          "is_bot": false,
          "headline": "Merge pull request #448 from scitix/fix/kbc-compile-stall-coverage",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T05:29:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46ea747aec40308bcebce7488ee059967595edd1",
          "body": "posixpath and urllib.parse have no call sites in this module. They arrived with\nthe record-stream recognisers — the ones that decided for the model what a source\nwas — and outlived the revert that removed them.\n\nCaught in review. My first check said urllib was still used; the grep had counted\n`import urllib.parse` as a call site. Both are gone.",
          "is_bot": false,
          "headline": "chore(kbc): drop the imports the reverted classifiers left behind",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T04:23:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16990b53ec9b9b89ace7fe31cc680d6870cb9a54",
          "body": "…ranscript\n\nThree consecutive batches of one live compile transcribed the same tickets. An\naggregate ledger of 1,177 records. Then twenty-one weekly exports the ledger was\nbuilt from. Then an 825-record bitable dump of the same period, read in\nthirty-two windows and appended chunk by chunk.\n\nThe com\n[…]\nvers one specification\npresented twice, an old and a new revision of a process, a table that exists as\nboth a screenshot and text — anywhere the corpus carries one body of fact in\nmore than one shape.",
          "is_bot": false,
          "headline": "docs(kbc): compile the delta of an overlapping source, not a second t…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T03:58:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "192bc75897a7a5d6f871783066fa32cf4b796c9b",
          "body": "…or our machinery\n\nThe batch train ended on things that were never the owner's knowledge going\nwrong. A stalled turn or a dead SDK subprocess ended the run instead of being\nrebuilt and continued. A content shape the planner disliked wedged it. One\nunreadable PDF page — a missing extractor, a file th\n[…]\nthe unreadable section and box_role all deferred to it\nin the same commit, because a rule taught to one component and not its siblings\nis the shape of every contradiction this codebase produced today.",
          "is_bot": false,
          "headline": "fix(kbc): keep the batch train alive, and stop making the owner pay f…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T03:37:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0f129c4932a876c6abfe54cdc605b1d8d2654f2f",
          "body": "…its forms\n\nTwo knowledge bases could not be compiled at all — the box started, planned, and\ndied before reading a page:\n\n  RuntimeError: hierarchical batch planner produced an invalid plan: batch h026:\n  attachment …/assets/…pptx is separated from the document that embeds it\n\nThe two packers disagr\n[…]\n\"reproduction\"\nof this bug passed attachment_edges=None, where nothing owns anything, no family\nforms, and the defect cannot fire. A test that cannot fail on the defect it\nnames is worse than no test.",
          "is_bot": false,
          "headline": "fix(kbc): a document family never splits, and the ledger counts both …",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T03:35:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4bd98810f50a23e53b96bc5813292fceadd7e680",
          "body": "…e kept\n\nA deck or a workbook arrived as one opaque blob: the pre-render carried its text\nand everything else — every slide picture, every chart — was simply gone, with\nnothing anywhere saying so. A hardware manual whose diagrams are the content\ncompiled to a page about a document that had no diagra\n[…]\nwner can see is a different\nthing from a gap nobody knows about.\n\nScope is deliberate: the common shapes, extracted cheaply and predictably. Rare\nones are named as unsupported instead of half-handled.",
          "is_bot": false,
          "headline": "feat(kbc): keep what is inside an Office file, and name what cannot b…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T03:33:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1f936f482180a72a208212d937eb46ea10529e48",
          "body": "…essage-location\n\nfix(lark): link feedback cards to persisted messages",
          "is_bot": false,
          "headline": "Merge pull request #447 from glow-Kev1n/fix/siclaw-channel-feedback-m…",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-24T13:44:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7975b2cc212bdf493b508e8d20c7860645c64758",
          "body": null,
          "is_bot": false,
          "headline": "fix(lark): persist delta-only replies for feedback",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-24T08:52:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba2661c98068e0ed589df162ad69d8dad21cfc89",
          "body": null,
          "is_bot": false,
          "headline": "fix(lark): link feedback cards to assistant messages",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-23T12:48:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a433c2d905b1830dab1e3b02d8b24d112193370",
          "body": "feat(kb): platform hardening batch — coverage v2, box naming, MCP multi-key, test-session resilience, custom prompt fix",
          "is_bot": false,
          "headline": "Merge pull request #446 from scitix/feat/kb-platform-batch-20260723",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T11:45:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1738a60b0d21aea9e239359e06d71da724a1d1f",
          "body": "…ragment/?query\n\nAn anchored angle destination — ![f](<assets/a b.png>#fig1) — defeated the\nunwrap: the link regex's angle alternation only matches when `>` is\nimmediately followed by `)`, so the whole `<...>#fig1` fell to the bare\nbranch, endswith(\">\") was false, the brackets were never stripped, a\n[…]\n lockstep); the shared asset-provenance fixture pins the case\nwith a new `guide/assets/c d.png` referenced only via\n`<assets/c d.png>#fig1` — the old parser demonstrably drops that edge in\nboth repos.",
          "is_bot": false,
          "headline": "fix(kbc): unwrap angle-bracketed link destinations with a trailing #f…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T11:27:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ab3cbb162036650b46c43e0b29723abb9bd3b70c",
          "body": "…w generation-specific\n\nTwo review findings on the stall-reap path:\n\n1. The pending-terminator window was armed only AFTER interrupt() returned,\n   but the stall turn_done frees the UI BEFORE that await — a retry landing\n   while interrupt() was in flight saw neither _needs_rebuild nor a pending\n   \n[…]\ne reaper inside a blocked interrupt(),\nretries in exactly that gap, and asserts one stall, a rebuild, and the\nretry's answer displayed. Verified it fails on the previous head with the\nretry swallowed.",
          "is_bot": false,
          "headline": "fix(kbc-box): close the reap-to-arm gap and make the terminator windo…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T11:27:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "916d85d80b0c03261366aa6e0619881503dfc84f",
          "body": "…ndow is unresolved\n\nAfter a stall reap whose interrupt() succeeded, the watchdog frees the UI\n(turn_done) and arms a bounded window waiting for the torn-down turn's\nResultMessage. But the UI can retry immediately inside that window, and\narming the retry on the old client is ambiguous (review P1): i\n[…]\ntall timeout, the second answer is displayed, the\nclient was rebuilt, and no stale-frame drops occurred. Verified it fails\non the previous head with two turn_stalled events and the retry answer\neaten.",
          "is_bot": false,
          "headline": "fix(kbc-box): rebuild on retry while the post-interrupt terminator wi…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T11:06:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cf1b9b6096e4719f3eb206cf5fceabd391e93889",
          "body": "…t-message\n\nAfter a rebuild whose reconnect failed, the driver clears `connected` and\nparks until the next rebuild request. But handle_test_message waited on\n`connected` first, so every retry timed out at the liveness gate (503\n\"session is still starting\") and the rebuild retry path never ran — the\n\n[…]\nonnect fails (immediate retryable 503, flag re-armed), second retry\nrebuilds on a fresh client and the turn is answered. Verified the test\nfails on the previous head with exactly the reported symptom.",
          "is_bot": false,
          "headline": "fix(kbc-box): consult _needs_rebuild before the liveness gate in /tes…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T10:32:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "35d1860daed4b8412c5327401befb017978129b7",
          "body": "…ator is lost\n\nReview P1 on the per-turn generation guard. The guard assumes a stall-reaped\ntest turn's torn-down ResultMessage eventually arrives and advances\n_results_seen. But the reaper's client.interrupt() can be swallowed by the same\nblack hole that wedged the turn, so that terminator may NEVE\n[…]\n interrupt but terminator never arrives -> window elapses -> rebuild;\nterminator arrives in-window -> no rebuild, existing drop path (regression\nguard). Full suite green across three consecutive runs.",
          "is_bot": false,
          "headline": "fix(kbc-box): rebuild test-session client when a reaped turn's termin…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T10:15:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "85e8ce34f4d20640cf6589e3d25359baf43319bc",
          "body": "…y + per-turn generation guard\n\nP1-1 (idempotency key not run-isolated): the open-test dedup map was keyed by\nclient_request_id alone, so on a shared box two runs colliding on a request id\nwould replay each other's tid/snapshot/fingerprint. Key it by (parent_run_id,\nclient_request_id) and re-verify \n[…]\ndog reap, then injects the reaped turn's late partial + ResultMessage via a\nnew queue-driven fake, asserting the fresh turn survives and completes on its own\nresult while both stragglers are dropped).",
          "is_bot": false,
          "headline": "fix(kbc-box): review P1s in test-session path — run-scoped idempotenc…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T08:51:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eaf53f0b40b4dac33d53576895d981724c402df2",
          "body": "…le pods\n\nIntegration fix for the #442 × #444 merge interaction. #442 renamed the\ncompile-box pod prefix (agentbox- → kbc-box-, profile-derived) and updated\nonReap/onAdopt to pass rec.profile, but left the other capability call sites\nresolving the pod name with the default \"agentbox\" prefix. On main\n[…]\nmory-cold testClose/testSessions now assert getAsync is called with\nthe recovered \"kb-compile\" profile (→ kbc-box-<id>); cancel asserts stop carries\nthe profile for both in-memory and store-only runs.",
          "is_bot": false,
          "headline": "fix(capability): thread run profile into box discovery/stop for compi…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:59:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cf4fd46cd56dd4914377cd0d16ca84a333e99c27",
          "body": "Box turn-stall watchdog, idle-TTL reaper, test-session list; gateway proxy/idempotency + relay predicate.",
          "is_bot": false,
          "headline": "Merge PR #444 fix/kb-test-session-resilience into batch",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:36:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "183edb0e17eb0f8f9ff22e1234fdd5f248b8cca2",
          "body": "Apply agent custom system prompt fallback on the web chat path (gateway chat.send).",
          "is_bot": false,
          "headline": "Merge PR #445 fix/chat-custom-system-prompt into batch",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:36:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26d494acb2cac3006b9c32e7cd412bf0029da50e",
          "body": "selfcheck coverage v2 (media assets auto-attach via citing docs) + fixtures + box role discipline + mediaverify interop.",
          "is_bot": false,
          "headline": "Merge PR #439 feat/kb-asset-provenance into batch",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:36:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "18078ac40718e0e56f39b624b061b37564ca81bc",
          "body": "Rename compile box image to siclaw-kbc-box and pod prefix to kbc-box; upgrade cleans old pods.",
          "is_bot": false,
          "headline": "Merge PR #442 feat/kbcbox-naming into batch",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:36:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3f57579834607e0d93293736a763690f1b30fc1",
          "body": "Support multiple named A2A keys selected by alias in mcp/sicore-a2a-adapter.",
          "is_bot": false,
          "headline": "Merge PR #443 feat/mcp-multi-key-alias into batch",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:36:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7104d97b7556ca796b14d88f27db4f888d4c17f",
          "body": "chat.send only read params.systemPrompt when building the box prompt.\nsicore's web-chat proxy never forwards that param, so a custom-prompt\nagent silently fell back to AgentBox's built-in default SRE persona on\nsicore web chat — while channel paths (dingtalk/lark) resolved the\nagent's own template a\n[…]\nsystem-prompt.test.ts covering: explicit param wins and\nskips the lookup; omitted param resolves the agent's custom prompt; no\ncustom prompt / lookup failure -> undefined default (send still acks ok).",
          "is_bot": false,
          "headline": "fix(runtime): apply agent custom system prompt on the web chat path",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T04:50:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6239a80c2c3c95113aef217800f2bc95be750762",
          "body": "Align the testStart idempotency key with sicore (MR!696) and the codebase's\nexisting convention: every consumer-minted idempotency key here is a `<noun>_id`\n(message_id for a turn, command_id for a typed command, operation_id for a\nmutation receipt) — there is no `idempotency_key`. So the field is\n`\n[…]\n → open fresh. Box read + TestRun attribute +\nteardown cleanup, the gateway request type + passthrough, and the box test's\nwire bodies all renamed. box suite 70 green; tsc clean; gateway vitest green.",
          "is_bot": false,
          "headline": "Rename test-session idempotency field to client_request_id",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T04:47:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a14548704368ecad39fab9d1b85950c86ac59337",
          "body": "Follow-up to the testStart idempotency change: the relay-skip guard only fires\non the rare idempotent-replay path, and a future refactor of the testStart\nhandler could silently drop it — splitting the box's single-consumer\n/test-events stream. Extract the decision into a pure predicate\n(shouldRelayT\n[…]\n unit-test both branches\n(replay → no relay; fresh open or flag absent → relay); the handler now calls\nthe predicate instead of an inline check. Behavior unchanged. tsc clean;\ntest-relay vitest green.",
          "is_bot": false,
          "headline": "Extract shouldRelayTestSession predicate + unit-test both branches",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T04:35:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2a0a995e8794bc9623128d82e4129f0ac2157d38",
          "body": "Two P2 follow-ups from the sicore MR review, layered on the test-session work.\n\n1. testStart idempotency (kbc/platform/pod/compile_box.py + gateway):\n   handle_open_test accepts an optional `idempotency_key`. A retried open with\n   the same key returns the SAME live session (same tid/snapshot_hash/p\n[…]\ndrops the key (fresh afterwards), no-key never deduped;\ngateway test asserts a shared box's two runs are mutually invisible in the list.\ntsc --noEmit clean; gateway vitest green; box suite 70 passing.",
          "is_bot": false,
          "headline": "Add testStart idempotency key + run-scoped test-session listing",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T04:32:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "651dc321a627f1b17450e4d1c085ee55f9f27679",
          "body": "…session limit\n\nWire the box-side test-session resilience through the TS gateway so the consumer\ncan reach it, aligned with the sicore side.\n\n1. capability.testSessions (src/gateway/server.ts): new RPC method proxying the\n   box's GET /test-sessions. Read-only reconciliation — mirrors testClose's bo\n[…]\nest-sessions.test.ts (passthrough with\ntid preserved / empty on absent box / run_id required); box test asserts the\nstructured 429 body. tsc --noEmit clean; gateway vitest green; box suite 69\npassing.",
          "is_bot": false,
          "headline": "Add capability.testSessions runtime method + structured 429 for test-…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T15:24:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4fcb40b1ee19f0d4344784202479811b4972ad46",
          "body": "…fecycle logs\n\nThree production-confirmed defects in the read-only test-session path\n(kbc/platform/pod/compile_box.py), all box-side:\n\n1. Test turns hung on \"thinking\" forever. The test-session receive loop\n   (test_session_driver) was a bare `async for msg in receive_messages()`\n   with no model-st\n[…]\ndged turn and keeps the\nsession live for a follow-up question; idle-TTL sweep drops orphans and spares\nactive sessions; GET /test-sessions returns the agreed wire shape. Full suite\ngreen (69 passing).",
          "is_bot": false,
          "headline": "Add test-session resilience: turn-stall watchdog, idle-TTL reaper, li…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T15:09:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9475d94ea4ad8041920e330e503a1b497602e685",
          "body": "One adapter process could previously bind only a single A2A key, so\nswitching Siclaw agents meant editing config and restarting. Passing the\nkey as a tool argument is not an option: credentials must never flow\nthrough the model context.\n\nAdd configuration-side named keys, selected at call time by al\n[…]\nw logic through an AgentRouter; keep SicoreA2aClient per-key.\nExisting tests updated to the router API; add router unit tests, multi-key\nrouting tool tests, and a two-alias stdio e2e cold-start smoke.",
          "is_bot": false,
          "headline": "feat(sicore-a2a-mcp): support multiple named A2A keys selected by alias",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T15:07:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b7074badb90aebb8ca7b7440e6fe98675d7aaff7",
          "body": "…to kbc-box\n\nMotivation (operations): during production troubleshooting every pod was\nnamed `agentbox-<id>`, so a KB compile box and a chat agentbox could only be\ntold apart by label/image filtering — the compile box has bitten on-call more\nthan once. Make the compile box distinguishable at a glance\n[…]\nfor prod.\n\nTests: box-profile / k8s-spawner / manager suites green, including new coverage\nfor the kbc-box prefix, the legacy-pod reap, the chat-pod guard, and the\nprofile-aware stop/getAsync lookups.",
          "is_bot": false,
          "headline": "feat(kbc): rename compile box image to siclaw-kbc-box and pod prefix …",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T14:57:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d581f3731bb03f9af2182e285b1b64ce97f99f6d",
          "body": "Two implementation-level details locked byte-for-byte with the sicore adoption\nledger (shared fixture, DESIGN §六), after cross-checking the two implementations:\n\n1. is_media_asset segment match is now case-INSENSITIVE (`Assets/`, `report.ASSETS/`\n   count too). The platform always writes lowercase `\n[…]\ner change alters any prior fixture\noutput; expected.json is regenerated from the reference implementation with an\nin-generator sanity assert on the invariants. All selfcheck + mediaverify tests\ngreen.",
          "is_bot": false,
          "headline": "feat(kbc): align coverage-v2 edge semantics with sicore ledger mirror",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T12:38:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5790bf354a3cf72de169acafe7629544c19dc7f9",
          "body": "Follow-up to coverage v2. media_citing_pages() gains a third discovery path:\na candidate page that cites a DOCUMENT d in its compiled_from now inherits the\nimage numeric-fidelity check of every image d embeds in its body (via\nasset_attribution_edges), unioned with the existing two paths (directly-ci\n[…]\ntion surface),\nso a media asset like .tiff is accounted by coverage but not numerically re-read.\nAdditive only: no existing media test used an assets/ raw path, so all prior\nassertions pass unchanged.",
          "is_bot": false,
          "headline": "feat(kbc): media numeric re-verification follows attribution edges",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T12:25:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ec1b74c85ae34a37334359641834be27ae970995",
          "body": "Media assets (images under assets/) are document attachments, not first-class\nsources. Coverage v2 auto-accounts an image against any document that embeds it\nin its body, once that document is itself cited or excluded — so compiled_from\nno longer needs a token per image and the exclusion ledger no l\n[…]\nells the compile agent to cite documents only —\nimages auto-attach; do not cite or exclude them one-by-one; orphan images still\nneed a reasoned exclusion; assets/sheets/ placeholders handled as usual.",
          "is_bot": false,
          "headline": "feat(kbc): coverage v2 — media assets auto-attach via citing docs",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T12:19:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ef14a19e338a0bc0444091d9352a1f219fdde2a6",
          "body": "fix(kbc): de-stream v2 — default-on session-scoped activation + stall-watchdog floor (follow-up to #434)",
          "is_bot": false,
          "headline": "Merge pull request #438 from scitix/fix/kb-destream-session-scoped",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T11:36:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d1814132bca503be6ff75f00cdf967607655118",
          "body": "The v2 de-stream tests (test_destream.py) were not executed by the KBC Box\nCI job, so the green \"KBC Box Test\" check did not cover this PR's shim/session\n-scoping/watchdog-floor tests. Run it explicitly alongside test_compile_box.py.",
          "is_bot": false,
          "headline": "ci(kbc): run test_destream.py in the KBC Box CI workflow",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T09:52:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "041147a24bce89ec9a47484f103d9b6cc8afb440",
          "body": "…dog floor to model phase\n\nFollow-up review fixes for #438 (de-stream v2):\n\n- The two non-interactive Claude reviewer sessions — explicit test\n  recommendation (_recommendation_session_opts) and reference-answer assist\n  (_reference_assist_session_opts) — still ran with an empty SDK env and hit\n  th\n[…]\nt_destream.py gains two integration assertions: both reviewer callers'\n  opts.env carry the shim URL (and clear to {} on operator opt-out), and the\n  watchdog floor never extends a pending-tool bound.",
          "is_bot": false,
          "headline": "fix(kbc): route reviewer sessions through de-stream shim; scope watch…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T09:52:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "614a7b65edb029a5e7539c2e4b39eca61ffd445d",
          "body": "fix(agentbox): distinguish probe failures from unreachable clusters",
          "is_bot": false,
          "headline": "Merge pull request #428 from caihongwei2006/feat/probe-error-codes",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T09:26:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49591c609e607679f54de4fdeb7c588e4a8c3be0",
          "body": "…-watchdog floor\n\nFollow-up to #434, which merged while the shim was still at v1. v1 activated\nthe de-streaming shim with a global env rewrite (ANTHROPIC_BASE_URL) gated on\nan opt-in KBC_DESTREAM flag, and did not account for the stall watchdog. Two\nproblems with that shape:\n\n- Global env rewrite ha\n[…]\ne honest price, still far\n  under the CLI's own ~60min request timeout.\n\nBlast radius: the kbc-compile-box image only (127.0.0.1 listener); runtime,\nagentbox and sicore-side LLM callers are untouched.",
          "is_bot": false,
          "headline": "fix(kbc): de-stream v2 — default-on session-scoped activation + stall…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T09:18:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e9539778c3d2796b935ce549b7b55aab88830fcc",
          "body": "feat(kbc): de-stream the compile box's Anthropic calls to dodge the gateway charset bug",
          "is_bot": false,
          "headline": "Merge pull request #434 from scitix/feat/kb-compile-destream",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T08:34:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae5555f01fa48f7a03e223adfdbcbb86e7f04b9f",
          "body": "fix(kbc): scale L1 auto-repair budget with open-violation workload",
          "is_bot": false,
          "headline": "Merge pull request #430 from scitix/fix/kb-l1-repair-budget-scaling",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T08:16:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c2cc962b7845b5149c262ea83a5d0136e30dd32",
          "body": "fix(tools): filter kubectl exec transport noise",
          "is_bot": false,
          "headline": "Merge pull request #436 from caihongwei2006/fix/pod-exec-transport-noise",
          "author_name": "jacoblee-io",
          "author_login": "jacoblee-io",
          "committed_at": "2026-07-22T08:09:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69a38c3520062f1e209fbcda08cebad533c3b417",
          "body": "Default debug mode can expose Docker/Moby and kubectl exec Go transport diagnostics in pod_exec stderr. Remove known SPDY/WebSocket stream log lines while preserving the actual container or OCI error.",
          "is_bot": false,
          "headline": "fix(tools): filter kubectl exec transport noise",
          "author_name": "jtang",
          "author_login": null,
          "committed_at": "2026-07-22T07:57:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "430aa1b996ea8686adbf1ba40939521b439e698a",
          "body": "Review finding: the limit derives from the OPEN workload, which shrinks as\nrepairs land, so gating on a per-turn recomputation closes the gate at\nroughly half-repaired (55-item motivating case: stops at turn 4 with ~19\nleft). Mirror the evaluation timing of _batch_media_verify_round_limit, not\njust \n[…]\n the shrinking-workload path: 30-violation episode\nrecords limit 3, workload collapses to 2 after the first repair, the gate\nstays open for rounds 2-3, and the unconverged report shows used=3/limit=3.",
          "is_bot": false,
          "headline": "fix(kbc): gate the repair loop on a per-episode high-water budget",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T06:50:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d676ca8d2a4a044d0ffd76a63c966c8422b853a",
          "body": "…kload\n\nA flat 2-round repair budget is sized for ordinary drift. A first full\ncompile or a wiki adoption over a large KB opens dozens of mechanical\nviolations at once, so the budget is structurally spent before the loop can\nconverge and the whole tail lands in the owner's question queue as one\nopaq\n[…]\nELFCHECK.json additionally reports repair_rounds_limit for\nobservability. Existing flat-budget gate tests are unaffected (small\nworkloads keep the floor); new unit test covers floor, scaling, and cap.",
          "is_bot": false,
          "headline": "fix(kbc): scale the L1 auto-repair budget with the open-violation wor…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T06:50:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1395a96eddbac7f90f16b88da0cf7240ba3944ea",
          "body": "…repair-20260721\n\nfix(kbc): normalize unambiguous source citations",
          "is_bot": false,
          "headline": "Merge pull request #426 from scitix/fix/kbc-deterministic-provenance-…",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T06:22:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "125bc5ea00470733ca851695f509d816a709a01a",
          "body": "…riage\n\nfix(kbc): auto-resolve image-verification doubts backed by co-cited text sources",
          "is_bot": false,
          "headline": "Merge pull request #433 from scitix/fix/kb-media-verify-text-backed-t…",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T06:22:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4f56f4411d3ad08d314e167686477d0c6f006cc",
          "body": "…fix)\n\nmassapi's Anthropic-compatible STREAMING route corrupts multibyte characters\nwhose bytes straddle an SSE chunk boundary (per-chunk UTF-8 decode with\nerrors=replace -> U+FFFD); its non-streaming route returns identical bytes\nintact (gateway bug report, 2026-07). The compile box is non-interact\n[…]\nesis round-trip (byte-perfect CJK text, tool_use\npartial_json, usage split), keepalive under a slow upstream, error mapping,\nraw passthrough, and activation env logic (opt-in/opt-out/codex untouched).",
          "is_bot": false,
          "headline": "feat(kbc): in-pod de-streaming shim for the Anthropic route (charset …",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T06:11:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b2ef03de922e03cda41bd0e863d198ba48dbcb62",
          "body": "feat(gateway): persist prompt trace attribution",
          "is_bot": false,
          "headline": "Merge pull request #429 from glow-Kev1n/feat/siclaw-trace-audit",
          "author_name": "chent1996",
          "author_login": "chent1996",
          "committed_at": "2026-07-22T05:27:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0deae055fdd87fd3ac086d149eb17bc67cad7f0",
          "body": "…sources\n\nThe blind-verify comparer flags 超出转写范围 when a cited image cannot\nsupport a claim. That inference is only valid when the image is the claim's\nsole source — curated pages routinely cite whole asset sets as corroboration\nwhile the figure comes from a co-cited text export. Live adoption run\n(2\n[…]\nbacked claim conflicting with what the image shows is a\ngenuine cross-source conflict. Qualitative claims without distinctive\nnumbers keep escalating.\n\nImplements the triage step of scitix/siclaw#431.",
          "is_bot": false,
          "headline": "fix(kbc): auto-resolve image doubts verbatim-backed by co-cited text …",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T04:45:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7fd26e7b455172a60f07db92398d6e9ca298c9ad",
          "body": "cluster_list's kubectl probe reported every failure as reachable:false,\nso a local kubeconfig/credential/tooling problem read as \"cluster down\"\nand invited the model to hallucinate an outage.\n\nClassify probe outcomes as success / unreachable / probe_failed with a\nstructured reason. unreachable now r\n[…]\nReverts the global test-ignore .gitignore block so tests stay versioned;\nadds table-driven classifier tests and three-state cluster_list tests.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agentbox): distinguish probe failures from unreachable clusters",
          "author_name": "jtang",
          "author_login": null,
          "committed_at": "2026-07-22T03:43:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b4e83fc98f5097ee590e2edbea6a2d276507674c",
          "body": "Standalone Portal must mirror the trace-binding RPC or every local prompt logs an unknown-method warning. Keep the mutation narrow and idempotent, and dispatch best-effort binds without delaying response streaming.\n\nTested: tsc --noEmit; git diff --check; SQLite SQL probe\nNot-tested: local Vitest (esbuild is not executable); GitHub Actions pending",
          "is_bot": false,
          "headline": "fix(gateway): complete trace message binding",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-22T03:20:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b71ea50747a794ded569903b1347ad32914b7b5d",
          "body": "The mechanical normalizer re-parses each payload wrapped in ASCII parens.\nA payload holding an unbalanced ASCII \")\" inside a full-width marker makes\nthat re-parse close before the span's true end, so the parsed item covers\nonly a prefix of the span; rewriting the whole span from it would silently\ndrop the tail. Require the parsed item to cover the payload (modulo the\nseparator strip the parser itself applies) and otherwise leave the span\nmalformed for semantic repair.",
          "is_bot": false,
          "headline": "fix(kbc): skip span-truncating citation rewrites",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-22T03:13:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8daf382f21d6aab263cd4e46c6d9894efd30c9ae",
          "body": null,
          "is_bot": false,
          "headline": "test(gateway): make trace binding mocks async",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-22T02:54:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ac79b05b2637adb9217cd40e6f9fcbea4e18270",
          "body": "A concurrent chat.send is persisted before AgentBox can report that the session is already running. Once the fallback steer succeeds, relabel that exact row so transcript and trace readers keep additional input separate from the prompt that started the active trace.",
          "is_bot": false,
          "headline": "fix(gateway): mark automatic steer messages",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-22T02:44:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c9115dfd21654a3b388b296a26aec05e90f9bdb",
          "body": null,
          "is_bot": false,
          "headline": "feat(gateway): persist prompt trace attribution",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-22T02:44:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16b160994c2ef283aad5c84ddb1525a3f857edb5",
          "body": "Move exact provenance formatting repairs ahead of the model repair budget while preserving incremental page isolation.\n\nTested: test_selfcheck.py; test_incremental.py; test_compile_box.py\n\nScope-risk: narrow",
          "is_bot": false,
          "headline": "fix(kbc): normalize unambiguous source citations",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-21T11:10:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c76d2334b502eaad95f180d3b7b6b2dbf82f1ba",
          "body": "feat(mcp): add Sicore A2A adapter for coding agents",
          "is_bot": false,
          "headline": "Merge pull request #420 from scitix/feat/a2a-mcp-adapter",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T10:59:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b6d61442bad6360b790f436e024e83935ac5285",
          "body": "fix(kbc): allow the Codex nested writer sandbox",
          "is_bot": false,
          "headline": "Merge pull request #425 from scitix/fix/kbc-codex-bwrap-sandbox-20260721",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T10:57:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "429d1d64d1f06bb096456328d48e26b128641dbf",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): allow the Codex nested writer sandbox",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-21T09:31:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab4a4a95e45bed6b25188f22caf29b821fe20c50",
          "body": "fix(kbc): accept bounded large source snapshot parts",
          "is_bot": false,
          "headline": "Merge pull request #424 from scitix/fix/kbc-large-source-parts-20260720",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T09:24:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "659795a0dbdfe5de0f6eaaf89536b56f8f332bc1",
          "body": "… absent\n\nSicore agent API keys are per-agent, so requiring the operator to also\ncopy the agent UUID into MCP config was redundant friction. When\nSICLAW_AGENT_ID is unset the adapter now asks GET /api/v1/a2a/self\n(sicore MR feat/a2a-key-self-endpoint) which agent the key is bound to,\nwith the same bounded idempotent-read retry as other GETs. Setting\nSICLAW_AGENT_ID still pins the agent explicitly and remains required\nagainst older Sicore deployments without /self (actionable 404 error).",
          "is_bot": false,
          "headline": "feat(mcp): resolve the agent from the A2A key when SICLAW_AGENT_ID is…",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-21T07:39:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4b7f268e46b8cf0c41ad2c9efd00c33ea6bcc4a",
          "body": "A successful message:send followed by a fully failed bounded wait used to\nreturn a plain tool error without the task_id. The task already exists\nserver-side, so the error invited the client model to resubmit a duplicate\ninvestigation. Return the submitted task as a compact working view with a\nwait_error note instead.",
          "is_bot": false,
          "headline": "fix(mcp): keep task_id when the bounded wait fails after submission",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-21T06:38:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d36ca9b9ee32edc094c48f1d0a9be57498461601",
          "body": null,
          "is_bot": false,
          "headline": "fix(mcp): retry transient A2A task reads",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T06:36:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8a04582b25a653058f8a665d6da9206bfe833d2",
          "body": "Root-level Vitest discovers the adapter tests before the nested package has built its ignored dist output. Start the subprocess through tsx so both the repository CI suite and the standalone package exercise the same source entrypoint.\n\nTested: npm test in adapter package; root npx vitest stdio e2e; root npm test (4502 passed, 2 skipped)\n\nScope-risk: narrow",
          "is_bot": false,
          "headline": "test(mcp): run stdio e2e from TypeScript source",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T06:36:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "191752889354a8c424bbf31fe6f080adb2376a73",
          "body": "Codex and Claude need a thin local bridge to reuse a user's existing Siclaw agent without receiving cluster credentials or choosing a different agent at runtime. Keep long investigations durable in Sicore, expose a bounded same-turn watchdog, and suppress repeated partial reports until the task is terminal.\n\nTested: npm ci; npm test; npm audit --omit=dev; live Sicore A2A WATCHDOG_READY smoke test\n\nScope-risk: narrow",
          "is_bot": false,
          "headline": "feat(mcp): add Sicore A2A adapter for coding agents",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T06:36:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e526e7b7e28695dd8d370a29a2945ebb05286944",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): bound large source materialization",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-21T02:57:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f243b4cd7c19ed077861e969775c2dad57d38de2",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): accept bounded large source parts",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-20T17:17:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adfb49f10b62d5a2edbfe681867337a8d910446b",
          "body": "…260719\n\nfeat(kbc): support attachment-aware PDF batch slices",
          "is_bot": false,
          "headline": "Merge pull request #423 from scitix/feat/kbc-attachment-family-pdf-20…",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T11:20:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a66073fd6f5a564c7a5527a1f12d34b27ac174a",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): integrate PDF batches with Codex engine",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-20T08:35:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e38e9ee6ecd695bcec1fc77c39d2c05e16e7de0",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): enforce batch raw read scope",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T07:59:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0ad0108509bd9f39ffb80917da93e5ed2d83d4f",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): keep PDF metadata off the small-KB path",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T07:58:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc6bdabbd2024cf80275ac858c2e0f5d956acee0",
          "body": null,
          "is_bot": false,
          "headline": "Support attachment-aware PDF batch slices",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T07:58:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b9683cf80302fa58ba9994f3fe80cddb919abd7",
          "body": "…60718\n\nfeat(kbc): add hierarchical compilation for very large corpora",
          "is_bot": false,
          "headline": "Merge pull request #422 from scitix/feat/kbc-hierarchical-compile-202…",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T07:51:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7621a7b6ef48ad0605355c7689b56752633ea1a0",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): make batch resume phase-aware",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-20T07:24:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "238da21e52fbff521552474fbf664f79b630b06c",
          "body": null,
          "is_bot": false,
          "headline": "test(kbc): cover hierarchical engine integration",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-20T06:40:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1539e14b5de0ab8685cad07ed1a6dd1c32e80fb",
          "body": null,
          "is_bot": false,
          "headline": "Reverify ledger-clean media repairs",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db54c1e33181da516c6bdd598225b9bc974d17fc",
          "body": null,
          "is_bot": false,
          "headline": "Slice oversized Markdown batches",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "459c08c6049947a734ec7f421eb80f7f7ae54611",
          "body": null,
          "is_bot": false,
          "headline": "Reduce hierarchical vision context",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72acb4ce71beaa7b167b4f68b15df34ec052dda2",
          "body": null,
          "is_bot": false,
          "headline": "Bound image-heavy hierarchical batches",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e531b8c99c6e7b5c6bdb0fefabbb886abec3c587",
          "body": null,
          "is_bot": false,
          "headline": "Keep hierarchical media verification resumable",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96423309e6ce6b90b12c220e9754ea9899c162fa",
          "body": null,
          "is_bot": false,
          "headline": "Fail closed on invalid batch results",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ee96a9b7710d57db9b082b6976aad2ea8c6b43f",
          "body": "Bind image verification to page and image content so repaired pages cannot inherit a stale pass. Add an explicitly scoped candidate-page delete tool and accept common plural page locators.\n\nTested: KBC compile-box, selfcheck, batching, Office ingest, red-blue, and mTLS suites\n\nScope-risk: moderate",
          "is_bot": false,
          "headline": "Harden media verification and candidate cleanup",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5abaffc4c8fe20d0d9c6bcc559a6b1d8aa4c5778",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): relax stall timeout for hierarchical batches",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:35:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f27d528861e4e3db94456396aa1a18085666630",
          "body": "Keep the existing single-session and flat-batch routes unchanged, while grouping document assets, adding bounded section reduction, and persisting resumable map/reduce/final phases.\n\nTested: KBC Python suites; npm test; npm run build; 628MB GPU Raw planner dry-run\n\nScope-risk: moderate",
          "is_bot": false,
          "headline": "feat(kbc): add hierarchical compilation for very large corpora",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:35:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1cf7ddb60211e6e5d1a279835b3dd6d92721bcb",
          "body": "feat(kbc): add resumable Source Snapshot v2 delivery",
          "is_bot": false,
          "headline": "Merge pull request #421 from scitix/feat/kbc-source-snapshot-v2-20260718",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:26:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ae32ad1ace6ee8b325db2bb37e1f5059b2f4f9f",
          "body": "Tested: npm test; npm run build; compile-box and source-snapshot protocol tests\n\nScope-risk: narrow",
          "is_bot": false,
          "headline": "fix(kbc): distinguish snapshot conflicts from live runs",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T05:59:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9fa670656b56c7c93ac036c01bb5b00a0cd5cfde",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): match Go snapshot manifest escaping",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T05:59:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d85dcf0246b0d67978be4cbdf7911d23e1e4506",
          "body": null,
          "is_bot": false,
          "headline": "Accept standard authoring tar roots",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T05:59:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcfda74549a44df35af6d7f8c07667d5311b34e0",
          "body": null,
          "is_bot": false,
          "headline": "feat(kbc): add resumable source snapshot delivery",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T05:59:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "afcf159f20e364b919b9da2a45fad7c838196b60",
          "body": "feat(kbc): add Codex SDK compiler engine",
          "is_bot": false,
          "headline": "Merge pull request #419 from scitix/feat/kb-codex-engine",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T05:56:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ba4d90e509882e6e69a2bba134631afd2b12e70",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): expose pinned Codex runtime to sandbox",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T04:53:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01ccb4e6c59d797b482e87170a4c2173865248eb",
          "body": null,
          "is_bot": false,
          "headline": "ci(kbc): allow Codex namespace sandbox",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T04:50:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0452655b4337ce084c8dc04bb8dee5fb2f5419f6",
          "body": null,
          "is_bot": false,
          "headline": "build(kbc): install Codex Linux sandbox",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T04:47:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "407bf5168b45fe309e1df8c12ad1ca6adac169ed",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): sandbox Codex writer sessions",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T04:44:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "860e45309f939bd680e2bb21b2f68e58546e637c",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): enforce Codex read-only boundaries",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T03:59:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b790233ccea991db26ada814d1a340029ad2623d",
          "body": "Keep KBC workflow and tool semantics engine-neutral while adding an isolated official Codex SDK adapter for OpenAI Responses providers.\\n\\nTested: KBC compile-box regression, Codex adapter tests, capability tests, npm build\\nConfidence: high\\nScope-risk: moderate",
          "is_bot": false,
          "headline": "feat(kbc): add Codex SDK compiler engine",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-18T09:37:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63461813512b868201367341a0af6849fd2bbfbc",
          "body": "fix(gateway): pair tool results by toolCallId, not per-name FIFO",
          "is_bot": false,
          "headline": "Merge pull request #417 from scitix/investigate/tool-output-mismatch",
          "author_name": "jacoblee-io",
          "author_login": "jacoblee-io",
          "committed_at": "2026-07-17T16:36:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "895c23e4954fae56013b27c6cd693d8f77791356",
          "body": "pi-agent executes a same-turn tool batch in parallel: all\ntool_execution_start events fire in call order, but each\ntool_execution_end fires on its own completion. The SSE consumer paired\nstarts and ends through per-toolName FIFO queues, so when same-name\ncalls (e.g. several MCP navix invocations) co\n[…]\nCall record; events lacking an id\nkeep the per-toolName FIFO as fallback. The abort finalizer now walks\nthe same records, unchanged in behavior.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(gateway): pair tool results by toolCallId, not per-name FIFO",
          "author_name": "lrli",
          "author_login": "nightmeng",
          "committed_at": "2026-07-17T16:14:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7c2329082fab3da6208619cb885a9363f4e9286a",
          "body": "fix(kbc): make reference assistance reliable",
          "is_bot": false,
          "headline": "Merge pull request #416 from scitix/feat/kb-reference-assist-20260717",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-17T15:43:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "334a8704456720ba374a20f324917eadd78604aa",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): allow bounded background reference assistance",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-17T15:02:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 20,
      "commits_last_year": 1431,
      "latest_release_at": "2026-07-27T09:29:27Z",
      "latest_release_tag": "v0.2.9",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 22,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 4.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 87,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "siclaw",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "sre",
            "kubernetes",
            "k8s",
            "ai",
            "copilot",
            "diagnostics",
            "claude",
            "agent"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/siclaw",
          "is_deprecated": false,
          "latest_version": "0.1.4",
          "repository_url": "https://github.com/scitix/siclaw",
          "versions_count": 5,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 45,
          "first_published_at": "2026-03-07T05:08:53.215000Z",
          "latest_published_at": "2026-03-19T11:44:03.902000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 130
        }
      ]
    },
    "popularity": {
      "forks": 27,
      "stars": 223,
      "watchers": 2,
      "fork_history": {
        "days": [
          {
            "date": "2026-03-06",
            "count": 1
          },
          {
            "date": "2026-03-10",
            "count": 1
          },
          {
            "date": "2026-03-11",
            "count": 1
          },
          {
            "date": "2026-03-12",
            "count": 1
          },
          {
            "date": "2026-03-15",
            "count": 1
          },
          {
            "date": "2026-03-17",
            "count": 1
          },
          {
            "date": "2026-03-24",
            "count": 1
          },
          {
            "date": "2026-04-02",
            "count": 1
          },
          {
            "date": "2026-04-13",
            "count": 1
          },
          {
            "date": "2026-04-14",
            "count": 2
          },
          {
            "date": "2026-04-15",
            "count": 1
          },
          {
            "date": "2026-04-18",
            "count": 1
          },
          {
            "date": "2026-04-19",
            "count": 2
          },
          {
            "date": "2026-04-28",
            "count": 1
          },
          {
            "date": "2026-05-07",
            "count": 1
          },
          {
            "date": "2026-05-09",
            "count": 1
          },
          {
            "date": "2026-05-10",
            "count": 1
          },
          {
            "date": "2026-05-20",
            "count": 1
          },
          {
            "date": "2026-05-21",
            "count": 1
          },
          {
            "date": "2026-05-26",
            "count": 1
          },
          {
            "date": "2026-05-30",
            "count": 1
          },
          {
            "date": "2026-06-11",
            "count": 1
          },
          {
            "date": "2026-07-13",
            "count": 1
          },
          {
            "date": "2026-07-21",
            "count": 1
          },
          {
            "date": "2026-07-27",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 27,
        "total_forks": 27
      },
      "star_history": null,
      "open_issues_and_prs": 11
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": true,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "mcp/create-chart/tsconfig.json",
        "mcp/sicore-a2a-adapter/tsconfig.json",
        "portal-web/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 370531,
      "source_files_sampled": 643,
      "oversized_source_files": 21,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md",
        "kbc/CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 25866
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "portal-web/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "@mariozechner/pi-coding-agent",
            "direct": true,
            "version": "0.55.4",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.3,
            "advisory_ids": [
              "GHSA-7v5m-pr3q-6453",
              "GHSA-jfgx-wxx8-mp94",
              "GHSA-r95r-rj6r-c39x"
            ],
            "fixed_version": "0.78.1",
            "advisory_count": 3,
            "oldest_advisory_days": 41
          },
          {
            "name": "@hono/node-server",
            "direct": false,
            "version": "1.19.15",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 5.9,
            "advisory_ids": [
              "GHSA-frvp-7c67-39w9"
            ],
            "fixed_version": "2.0.5",
            "advisory_count": 1,
            "oldest_advisory_days": 6
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "high": 1,
          "moderate": 1
        },
        "advisory_count": 4,
        "affected_count": 2,
        "assessed_count": 424,
        "malicious_count": 0,
        "assessed_package": "npm:siclaw@0.1.4",
        "unassessed_count": 0,
        "direct_affected_count": 1
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@anthropic-ai/sdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.71.2"
        },
        {
          "name": "@arizeai/openinference-semantic-conventions",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.5.0"
        },
        {
          "name": "@clack/prompts",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.0"
        },
        {
          "name": "@earendil-works/pi-agent-core",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.80.7"
        },
        {
          "name": "@earendil-works/pi-coding-agent",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "0.80.7"
        },
        {
          "name": "@earendil-works/pi-tui",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.80.7"
        },
        {
          "name": "@kubernetes/client-node",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.4.0"
        },
        {
          "name": "@modelcontextprotocol/sdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.27.1"
        },
        {
          "name": "@opentelemetry/api",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.9.1"
        },
        {
          "name": "@opentelemetry/exporter-trace-otlp-proto",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.219.0"
        },
        {
          "name": "@opentelemetry/resources",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.8.0"
        },
        {
          "name": "@opentelemetry/sdk-trace-node",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.8.0"
        },
        {
          "name": "@sinclair/typebox",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.34.0"
        },
        {
          "name": "adm-zip",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.5.17"
        },
        {
          "name": "diff",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.0.3"
        },
        {
          "name": "glob",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^13.0.6"
        },
        {
          "name": "js-yaml",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.1"
        },
        {
          "name": "jsonwebtoken",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.0.3"
        },
        {
          "name": "markdown-it",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^14.1.0"
        },
        {
          "name": "mysql2",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.22.0"
        },
        {
          "name": "node-forge",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.3.3"
        },
        {
          "name": "prom-client",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^15.1.3"
        },
        {
          "name": "sqlite-vec",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.1.7-alpha.2"
        },
        {
          "name": "ssh2",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.17.0"
        },
        {
          "name": "tar",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.5.15"
        },
        {
          "name": "ws",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.18.0"
        },
        {
          "name": "cron-parser",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.5.0"
        },
        {
          "name": "lucide-react",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.460.0"
        },
        {
          "name": "mermaid",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.15.0"
        },
        {
          "name": "prismjs",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.30.0"
        },
        {
          "name": "react",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.3.1"
        },
        {
          "name": "react-dom",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.3.1"
        },
        {
          "name": "react-markdown",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.1.0"
        },
        {
          "name": "react-router-dom",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.0"
        },
        {
          "name": "react-simple-code-editor",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.14.1"
        },
        {
          "name": "remark-gfm",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.1"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 4,
        "merged_prs": 371,
        "open_issues": 7,
        "closed_ratio": 0.588,
        "closed_issues": 10,
        "closed_unmerged_prs": 58
      },
      "bus_factor": 2,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "LikiosSedo",
          "commits": 601,
          "avatar_url": "https://avatars.githubusercontent.com/u/107271763?v=4"
        },
        {
          "type": "User",
          "login": "jacoblee-io",
          "commits": 337,
          "avatar_url": "https://avatars.githubusercontent.com/u/267827480?v=4"
        },
        {
          "type": "User",
          "login": "nightmeng",
          "commits": 229,
          "avatar_url": "https://avatars.githubusercontent.com/u/8165086?v=4"
        },
        {
          "type": "User",
          "login": "chent1996",
          "commits": 191,
          "avatar_url": "https://avatars.githubusercontent.com/u/106315742?v=4"
        },
        {
          "type": "User",
          "login": "a-yeyang",
          "commits": 13,
          "avatar_url": "https://avatars.githubusercontent.com/u/88581400?v=4"
        },
        {
          "type": "User",
          "login": "fred-scitix",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/191930924?v=4"
        },
        {
          "type": "User",
          "login": "silence8013",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/70105334?v=4"
        },
        {
          "type": "User",
          "login": "wangao1236",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/12544973?v=4"
        },
        {
          "type": "User",
          "login": "Likio-scitix",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/267880712?v=4"
        }
      ],
      "contributors_sampled": 9,
      "top_contributor_share": 0.435
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "kbc-ci.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": null,
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-27T05:31:30Z",
      "oldest_open_prs": [
        {
          "number": 418,
          "created_at": "2026-07-18T02:02:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 435,
          "created_at": "2026-07-22T06:21:25Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 440,
          "created_at": "2026-07-22T13:18:38Z",
          "last_comment_at": "2026-07-22T13:27:38Z",
          "last_comment_author": "LikiosSedo"
        },
        {
          "number": 450,
          "created_at": "2026-07-28T02:59:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-27T05:29:32Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 123,
          "created_at": "2026-03-17T04:51:49Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 348,
          "created_at": "2026-06-22T13:00:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 349,
          "created_at": "2026-06-22T13:00:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 427,
          "created_at": "2026-07-21T11:30:13Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 431,
          "created_at": "2026-07-22T04:33:15Z",
          "last_comment_at": "2026-07-22T04:40:02Z",
          "last_comment_author": "LikiosSedo"
        },
        {
          "number": 432,
          "created_at": "2026-07-22T04:33:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 437,
          "created_at": "2026-07-22T08:48:04Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/scitix/siclaw",
    "host": "github.com",
    "name": "siclaw",
    "owner": "scitix"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "excellent",
      "name": "Overall health",
      "note": "The weighted overall 68 is calibrated to 80 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 68,
            "calibrated": 80,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 80,
      "inputs": {
        "security": 46,
        "vitality": 86,
        "community": 59,
        "governance": 69,
        "calibration": "2026-08-02",
        "engineering": 72,
        "ai_readiness": 78,
        "weighted_overall_raw": 68
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "commits_last_year": 1431,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 22
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "22/52 weeks with commits",
                "points": 15.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 22
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1431 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1431
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "exceptional",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "releases_count": 20,
              "latest_release_tag": "v0.2.9",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 4.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "20 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 59,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "forks": 27,
              "stars": 223,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "223 stars",
                "points": 38.1,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 223
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "27 forks",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 27
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": null,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "readme_badge_services": [],
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "at_risk",
            "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": 28,
            "inputs": {
              "packages": [
                "siclaw"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 45
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "45 downloads/month across npm",
                "points": 22.2,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 45,
                      "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": "good",
        "name": "Sustainability & Governance",
        "value": 69,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "moderate",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "bus_factor": 2,
              "contributors_sampled": 9,
              "top_contributor_share": 0.435
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "2 contributor(s) cover half of all commits",
                "points": 25.2,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 44% of commits",
                "points": 12.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 44
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "9 contributors",
                "points": 12.2,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 70,
            "inputs": {
              "merged_prs": 371,
              "open_issues": 7,
              "closed_issues": 10,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": 0.588,
              "closed_unmerged_prs": 58,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "59% of issues closed",
                "points": 24.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 59
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "371/429 decided PRs merged",
                "points": 25.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 371,
                      "decided": 429
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 58,
            "inputs": {
              "followers": 49,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "scitix",
              "public_repos": 39,
              "account_age_days": 731
            },
            "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": "49 followers of scitix",
                "points": 12.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 49,
                      "login": "scitix"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "39 public repos, account ~2 yr old",
                "points": 15.7,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 39
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 2
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "siclaw"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 130
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 130 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 130
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "5 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "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": 72,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "OpenSSF Scorecard unavailable",
                "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": [
                "ai-agent",
                "aiops",
                "devops",
                "kubernetes",
                "llm",
                "sre",
                "openclaw",
                "agent",
                "ai-agents",
                "sre-agent"
              ],
              "has_wiki": false,
              "homepage": "https://siclaw.ai",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://siclaw.ai",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "10 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "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": "weak",
        "name": "Security",
        "value": 46,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "weak",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Dependency lockfiles. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "dependency_lockfiles"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 40,
            "inputs": {
              "source": "file_signals",
              "lockfiles": [
                "package-lock.json"
              ],
              "manifests": [
                "package.json",
                "portal-web/package.json"
              ],
              "has_codeql_workflow": false,
              "has_security_policy": true,
              "has_dependabot_config": false
            },
            "components": [
              {
                "key": "security_policy_security_md",
                "name": "Security policy (SECURITY.md)",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "dependabot_config",
                "name": "Dependabot config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "dependency_lockfiles",
                "name": "Dependency lockfiles",
                "detail": "published library — lockfiles are an application concern, not expected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "lockfiles_not_expected",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "codeql_workflow",
                "name": "CodeQL workflow",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "good",
            "name": "Dependency advisories",
            "note": "Matched the npm:siclaw@0.1.4 runtime dependency closure — what installing the published package pulls in — 424 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:siclaw@0.1.4",
                  "assessed": 424
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 68,
            "inputs": {
              "source": "osv",
              "advisories": 4,
              "affected_packages": 2,
              "assessed_packages": 424,
              "unassessed_packages": 0,
              "affected_by_severity": "high 1, moderate 1",
              "direct_affected_packages": 1
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "1 affected: @mariozechner/pi-coding-agent 0.55.4 (high 7.3)",
                "points": 14.6,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "@mariozechner/pi-coding-agent 0.55.4 (high 7.3)"
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "1 affected: @hono/node-server 1.19.15 (moderate 5.9)",
                "points": 13.2,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "@hono/node-server 1.19.15 (moderate 5.9)"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "exceptional",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 424,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 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": 78,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.92,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md",
                "kbc/CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 25866
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md, kbc/CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md, kbc/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": "92 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 92,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "mcp/create-chart/tsconfig.json",
                "mcp/sicore-a2a-adapter/tsconfig.json",
                "portal-web/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0.02,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "mcp/create-chart/tsconfig.json, mcp/sicore-a2a-adapter/tsconfig.json, portal-web/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "mcp/create-chart/tsconfig.json, mcp/sicore-a2a-adapter/tsconfig.json, portal-web/tsconfig.json, tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "2 of the last 100 commits agent-authored or agent-credited",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 2,
                      "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": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 370531,
              "source_files_sampled": 643,
              "oversized_source_files": 21
            },
            "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": "21/643 source files over 60KB",
                "points": 53.2,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 643,
                      "oversized": 21
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "moderate",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "labels": [
        "mcp-server",
        "library",
        "web-ui"
      ],
      "scores": {
        "web-ui": 4,
        "library": 6,
        "mcp-server": 7
      },
      "primary": "mcp-server",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:npm",
          "weight": 6
        },
        {
          "tier": "dependencies",
          "label": "mcp-server",
          "source": "dep:@modelcontextprotocol/sdk",
          "weight": 4
        },
        {
          "tier": "dependencies",
          "label": "web-ui",
          "source": "dep:react-dom",
          "weight": 4
        },
        {
          "tier": "structure",
          "label": "mcp-server",
          "source": "mcp_signal",
          "weight": 3
        }
      ],
      "artifacts": [],
      "confidence": "medium",
      "host_extension": false,
      "runs_as_process": true,
      "consumed_by_code": true
    },
    "metrics_version": "2.3.1"
  },
  "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",
    "OpenSSF Scorecard did not return a usable result (2026/07/28 05:46:07 Warning: PATs stored in env variables GITHUB_AUTH_TOKEN and GITHUB_TOKEN differ. Scorecard will use the former.); skipping Scorecard checks"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T05:46:31.003218Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/scitix/siclaw.svg",
  "full_name": "scitix/siclaw",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

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