公开记录
软件健康报告模式 0.26.0 · 指标 1.13.0 · 2026-07-22 06:01 UTC

signadot / tony-format

Home of the Tony format

GoApache-2.0★ 4 星标⑂ 0 复刻始于 2025年11月在 GitHub 上查看 ↗

signadot/tony-format 的健康指数为 100 分中的 64 分,处于「中等」区间。 其得分最高的类别是Engineering Quality(85/100),最低的是Community & Adoption(28/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

64
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

Signadot组织
52 关注者17 个公开仓库始于 2019年10月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/signadot/tony-format/go-tonyv0.0.82-790 天前

按类别列示的指标

活力

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

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

发布纪律

66中等
评分方式
16.2/27有发布版本 — 6 个版本标签(无 GitHub 发布版本)
16.2/36发布时效 — 最近一次发布版本于 245 天前
27/27发布节奏 — 约每 0.2 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count6
latest_release_tagv0.0.5
releases_from_tags
days_since_latest_release245
mean_days_between_releases0.2
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

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

28危急 · 占总体的 18%
评分方式
7.7/60星标 — 4 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 1 位关注者
所用输入
forks0
stars4
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(Apache-2.0)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template

可持续性与治理

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

64中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0.1/22.5提交分布 — 头号贡献者编写了 100% 的提交
2.7/13.5贡献者广度 — 2 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 3 contributing companies or organizations -- score normalized to 10
所用输入
bus_factor1
contributors_sampled2
top_contributor_share0.997
评分方式
46.8/46.8议题解决 — 100% 的议题已关闭
38.2/38.3PR 接受 — 已裁定的 PR 中 4/4 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs4
open_issues0
closed_issues2
issue_closed_ratio1
closed_unmerged_prs0
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
12.4/25所有者影响力 — signadot 有 52 位关注者
21.1/25既往记录 — 17 个公开仓库,账户约 6 年
所用输入
followers52
owner_typeOrganization
is_verified
owner_loginsignadot
public_repos17
account_age_days2,456
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 0 天前
20/20版本历史 — 79 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/signadot/tony-format/go-tony
ecosystemsgo
any_deprecated
min_days_since_publish0

工程质量

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

85优秀 · 占总体的 20%

工程实践

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

文档

75良好
评分方式
30/30README
25/25文档目录
0/15文档 / 主页站点
10/10仓库描述
0/10主题标签
10/10Wiki
所用输入
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

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

66中等 · 占总体的 16%

安全态势

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

AI 就绪度

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

69中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
37.3/40可读的提交历史 — 100 次人类提交中有 70 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.7
agent_instruction_files
agent_instruction_max_bytes
评分方式
18/18一条命令的引导启动 — go-tony/Makefile
22/22自动化测试
11/11Lint / 格式化配置
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — Dockerfile, lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 70 次由代理编写或署名代理
5/8自动化维护 — 已配置依赖自动化,但在抽样提交中未观察到
6/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 6
所用输入
has_nix
has_tests
lockfilesCargo.lock, go.sum
has_dockerfile
typed_language
bootstrap_filesgo-tony/Makefile
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.7
toolchain_manifestsdocs/sketchy/editors/tree-sitter-tony/Cargo.toml, docs/sketchy/editors/tree-sitter-tony/bindings/rust/Cargo.toml, go-tony/go.mod
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — Go(静态类型)
54.6/55可控的文件大小 — 采样的 511 个源文件中有 4 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes127,724
source_files_sampled511
oversized_source_files4

机器可读接口

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

关键数据

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

数据采集警告

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

更多细节

Star 与 Fork 历史 4 ★ / 0 ⇿
4Star

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

1223344412025-112026-032026-07
OpenSSF Scorecard 6.6 / 10
6.6综合

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

5Binary-Artifactsbinaries present in source code
不适用Branch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
不适用CI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
10Contributorsproject has 3 contributing companies or organizations -- score normalized to 10
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
10Fuzzingproject is fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
不适用Packagingpackaging workflow not detected
6Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 6
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
7Vulnerabilities3 existing vulnerabilities detected
直接依赖 13
注册表软件包版本约束清单文件
Gogithub.com/evanphx/json-patchv0.5.2go-tony/go.mod
Gogithub.com/expr-lang/exprv1.17.6go-tony/go.mod
Gogithub.com/fatih/colorv1.18.0go-tony/go.mod
Gogithub.com/go-air/giniv1.0.4go-tony/go.mod
Gogithub.com/google/go-cmpv0.6.0go-tony/go.mod
Gogithub.com/google/gopsv0.3.28go-tony/go.mod
Gogithub.com/mattn/go-isattyv0.0.20go-tony/go.mod
Gogithub.com/novln/docker-parserv1.0.0go-tony/go.mod
Gogithub.com/scott-cotton/cliv0.2.3go-tony/go.mod
Gogithub.com/sergi/go-diffv1.4.0go-tony/go.mod
Gogo.lsp.dev/jsonrpc2v0.10.0go-tony/go.mod
Gogo.lsp.dev/protocolv0.12.0go-tony/go.mod
Gogolang.org/x/toolsv0.39.0go-tony/go.mod
全部依赖 未采集

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 32121,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 2656228,
        "Makefile": 2925,
        "Dockerfile": 427
      },
      "pushed_at": "2026-07-21T16:55:04Z",
      "created_at": "2025-11-17T20:37:45Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-21T16:56:25Z",
      "description": "Home of the Tony format",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "https://www.signadot.com",
      "name": "Signadot",
      "type": "Organization",
      "login": "signadot",
      "company": null,
      "location": null,
      "followers": 52,
      "avatar_url": "https://avatars.githubusercontent.com/u/57196635?v=4",
      "created_at": "2019-10-30T20:15:26Z",
      "is_verified": null,
      "public_repos": 17,
      "account_age_days": 2456
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.0.5",
          "kind": "patch",
          "published_at": "2025-11-18T23:01:33Z"
        },
        {
          "tag": "v0.0.4",
          "kind": "patch",
          "published_at": "2025-11-18T22:50:18Z"
        },
        {
          "tag": "v0.0.4-repo-setup",
          "kind": "prerelease",
          "published_at": "2025-11-17T21:40:12Z"
        },
        {
          "tag": "v0.0.3",
          "kind": "patch",
          "published_at": "2025-11-17T21:36:43Z"
        },
        {
          "tag": "v0.0.2",
          "kind": "patch",
          "published_at": "2025-11-17T21:24:26Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2025-11-17T20:57:16Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "b9c564d1330348b53a1814434d34e4e591b8db63",
          "body": "…rror\n\nfindSnapshotBaseReader errored when IterAtPath(kp) found no index node — i.e. when the\nbaseline index tree lacks a node at kp because nothing has ever been written there. But\nReadStateAt returns the whole reconstructed doc for any path (the caller narrows via\nextractPathValue), so an absent p\n[…]\nng) plus a scoped read after the path is populated; verified as a differential\nagainst the old error.\n\nIssue: eagjggjdh12ksg00bsn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "logd: read an absent path as empty, not an \"invalid index iterator\" e…",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-21T16:55:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fa8c022cb177351c9d3c81d431a637d2d6ace8a3",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: nest logd and docd under the Tools nav section",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T21:30:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "af9539782cf87de7e3d6ed723c0e17197ac55a42",
          "body": "…t writes\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: clarify all-or-nothing wording for conditional multi-participan…",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T21:28:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "59fdd43ce419396aa7cd85dd45e091424f4cd051",
          "body": "…mpaction, conditional writes)\n\nNew docs/logd/ site section highlighting the store's headline capabilities that docd\ninherits: watch replay from any commit (time travel), event-preserving watch streams\n(logd guarantee / docd best-effort), logarithmic compaction, and compare-and-swap\nconditions on writes. Wired into the mkdocs nav before docd; cross-links to the docd\ncomposition and transactions pages.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add logd capabilities page (time travel, event preservation, co…",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T21:24:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f2a2126c81ae5ef2b43563dc0fbbf610d766a3ef",
          "body": "Add a package overview for system/docd/server (previously undocumented) and a\nconsumable set of site pages under docs/docd/, wired into the mkdocs nav:\n- index.md: overview, the two faces, the mount model\n- mounts.md: MOUNT protocol, registry, single-owner routing, tombstones, .meta\n- composition.md\n[…]\nconnect contract (logd guarantee, docd best-effort)\n- transactions.md: multi-mount patch decomposition, the tx-id pool, and scopes\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: document docd (godoc package overview + site pages)",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T21:03:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "97a57550a4cd53f54707ed0cc9d84bf5f20223a3",
          "body": "The recompute-and-diff scoped watch dropped exactly one delta per watch under rapid\nwrites. handleWatch registers the watcher with the hub BEFORE capturing currentCommit,\nso a write landing in that window is queued with commit <= currentCommit. The scoped\npath set lastReplayedCommit = startCommit (s\n[…]\nr -> queued-commit -> forwardEvents\nordering; verified as a real differential (fails before the fix).\n\nIssue: eagjggjdh12ksg00bsn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "logd: fix scoped watch dropping a write that races into the watch window",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T19:51:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9af5a1d1960836c9db67365af259a05749c73efc",
          "body": "… mounts\n\nResolves the reconnect-semantics question from issue favh47sxh. logd owns\nevent-preservation: a single commit sequence, FromCommit replays the exact delta\nhistory. docd inherits that for single-route watches, but a COMPOSED watch multiplexes\nbackends with independent commit sequences, so a\n[…]\nCommit stays\nan exact resume point for single-route watches and a best-effort hint for composed\nones.\n\nIssue: favh47sxh12kraaebsn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: declare event-preservation a logd guarantee, best-effort across…",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T19:22:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3c874c4f1c96b18a8b159e23a4122bf660f595ff",
          "body": "When docd ends a watch server-side (a mount force-ends an overlapping watch, or the\nowning controller crashes), the terminal WatchEvent dropped its Commit, and libctl's\nWatchEndedError carried only {Path, Reason}. A client had no commit to resume from, so\nre-watching could only start from current — \n[…]\nssue favh47sxh). Test covers the single-route controller-crash case, verified as a\nreal differential.\n\nIssue: favh47sxh12kraaebsn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: surface the ended-at commit for gapless watch resume",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T18:56:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3c3227c38af5470ef94be33e43c55127e14b6408",
          "body": "A scoped watcher forwarded raw committed deltas, so it received baseline writes to\npaths the scope had already overridden (and !key merges resolved against the wrong\nbase) — its applied state diverged from a scoped read.\n\nA scoped watcher now reproduces the scoped read: on each relevant commit it\nre\n[…]\nt), baseline writes a.y (flows). Verified as a real\ndifferential against the old raw-forwarding path.\n\nIssue: eagjggjdh12ksg00bsn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "logd: copy-on-write scoped watch via recompute-and-diff",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T15:48:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "769eab434e5750f26f714b74ff4f824ebd85d39a",
          "body": "The initial op-preserving scoped read materialized baseline state, then re-applied\nthe scope's patches over it through a node<->events round-trip. That round-trip\nmis-handled numeric-string field keys (e.g. a path-based write to \"users.1\", stored\nas the quoted field \"1\"): the scope patch's computed \n[…]\nss gives them all a consistent patch-path computation. Removes the\nnow-unused nodeEventReader helper.\n\nIssue: eagjggjdh12ksg00bsn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "logd: compute scoped reads in a single apply pass",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T15:48:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f3beebdb00d3280ac9f8fa555138674994c2760d",
          "body": "Follow-on to removing scope-snapshot creation: now that no scope snapshots are\ncreated or read, remove the scope-capable machinery that only existed to serve them.\n\n- findSnapshotBaseReader / createSnapshot: drop the scopeID parameter and the\n  scope-snapshot branches; baseline-only.\n- createSchemaS\n[…]\npreserving patches over\nthe baseline snapshot. Storage and server suites pass.\n\nIssues: eagjggjdh12ksg00bsn0, 5hmq80f3h12krh1mbsn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "logd: excise dead scope-snapshot code",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T15:25:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "02a323916f3d4d5a3afd7e06f6d1585346738373",
          "body": "SwitchDLog auto-created a scope snapshot per active scope on every log switch, and\nCreateScopeSnapshot exposed the same. A scope snapshot materializes the scope\noverlay, which resolves !key away, so re-applying it onto a changed baseline is\nunsound. Now that scoped reads replay the scope's raw op-pr\n[…]\nfiltering) are now\nunreachable for creation; their full excision is folded into 5hmq80f3h12krh1mbsn0.\n\nIssue: eagjggjdh12ksg00bsn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "logd: stop creating unsound scope snapshots",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T15:11:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d8f5626137e813d5ec907dd2a2d5baf90765065f",
          "body": "A scope is a live overlay, not a frozen branch: the scoped view at commit C is\nthe baseline state at C with the scope's own writes replayed on top. The prior\nReadStateAt interleaved baseline and scope patches by commit (latest-commit-wins),\nso a later baseline write to a path a scope had already wri\n[…]\noing baseline\ninsert, and scope-patch retention through compaction (verified as a real\ndifferential).\n\nIssue: eagjggjdh12ksg00bsn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "logd: op-preserving copy-on-write scoped reads",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T15:04:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d1360cecdc20ca7a2ae2e84b9e471cd96573715",
          "body": "…ries\n\nThe streaming tokenizer (TokenSource, used by stream.Decoder — the wire decoder\nfor logd/docd sessions and verse) reads in fixed-size chunks and calls the\nstateless TokenizeOne per token. A token that spans a chunk boundary must return\nio.EOF (\"need more data\") so the source grows the buffer \n[…]\n-prefix literals, and literals with ':'/'.' at buffer sizes 1..256\nand asserts the token stream matches whole-buffer tokenization.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "token: fix streaming tokenizer splitting tokens at read-buffer bounda…",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T12:08:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e151d05ac48d85b32b31b284e3504016a0bc61c",
          "body": "…actions\n\nCompletes COW scope across the mount boundary (issue 3vm6gq21). Building on the\ncontract + single-route work, docd now carries the client scope through every\nplace it fans out to a controller or opens its own logd connection.\n\n- Composed MATCH: readFrom routes controller sub-reads with the\n[…]\n ancestor read\nsees scoped base + mount; baseline sees neither). Full system suite green under\n-race.\n\nIssue: 3vm6gq21h12krv32bnn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: scope-aware composed reads/watches and scoped multi-mount trans…",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T10:53:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ecde3667f3f4bf5b459d62b26147ba8cfdba21a7",
          "body": "…+ single-route)\n\nScope isolation stopped at the mount boundary: docd routed ops to controllers with\nno scope, so a scoped client's read of a mount saw baseline and its write leaked to\nbaseline. First step of full scope-aware support.\n\n- SessionRequest gains an additive Scope field (regenerated). lo\n[…]\nhis branch: scope on composed reads/watches, and scoped\nmulti-mount tx coordination (issue 3vm6gq21).\n\nIssue: 3vm6gq21h12krv32bnn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd/libctl: propagate COW scope across the mount boundary (contract …",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T10:13:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "65ad174a262220a3fbf8b20c49ae5b7b797854e5",
          "body": "A match pattern (PathData.Data — field selection / array filtering) was carried by\nthe wire and honored by logd and the Handler.Match contract, but was unreachable\nfrom the client and dropped by docd's composed reads.\n\n- tony.FilterState: the match-then-trim projection logd applied server-side, move\n[…]\nt),\nMatchPatternComposed (pattern trims a composed base+mount read). Full suite green\nunder -race.\n\nUmbrella: wcabztj2h12ksb9qbnn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "libctl/docd: plumb match/trim patterns through the client end-to-end",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T10:00:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6294729694d5c02abbf7e4a39d2d9aacc2993bf3",
          "body": "Adds a deliberate, draining unmount distinct from a crash: instead of dropping the\nconnection (which tombstones the mount and gives watchers controller_unavailable),\na controller asks docd to drain the overlapping watches and cleanly remove the\nmount.\n\n- MountRequest gains an Unmount control frame (\n[…]\nller_unavailable) and the mount is fully removed (no tombstone). Full\nsystem suite green under -race.\n\nIssue: rkrvsf1ch12kr6mcbnn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: graceful unmount (controller control-frame)",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T04:08:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6a676df9108ff0733ac24ebe6e4ff684cbf24110",
          "body": "Lets a controller override, per mount, how long docd waits for overlapping watch\nreaders to drain before force-ending them — previously only a server-wide\ndefault (Spec.MountForceAfter) applied.\n\n- MountSpec gains ForceAfter (additive, regenerated): a duration string; \"0\"\n  means wait forever (never\n[…]\ngisters a mount\ndespite a held overlapping watch and a large (10s) server default. Green under\n-race.\n\nIssue: rkrvsf1ch12kr6mcbnn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: per-mount force_after on the MOUNT protocol",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T04:01:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "142b5d812a21b5da36095495af5c9acfd0e15794",
          "body": "Replaces the silent stop a watch suffered on force or controller crash with an\nexplicit, re-establishable terminal signal.\n\n- WatchEvent gains Ended + EndReason (additive; regenerated). Being a watch event,\n  it routes to the client's watch by path — the only channel that reaches it.\n- ClientSession\n[…]\n); WatchEndsOnControllerCrash (crash ->\ncontroller_unavailable). Full system suite green under -race.\n\nIssue: rkrvsf1ch12kr6mcbnn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: signal watch termination so clients re-establish (no silent stop)",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T03:55:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a74e9b54e82948344f26b88654fd45d1fc018cd8",
          "body": "Closes the read-side watch gap symmetric to Match composition: a client watch\nwhose kpath is a strict ancestor of one or more mounts no longer single-routes to\nlogd (blind to the mounts) but is composed across the base owner and every mount\nbelow it, multiplexed into the one client watch.\n\n- MountSe\n[…]\nfrom BOTH logd and the controller,\nre-stamped with root-rooted patches intact. All green under -race.\n\nIssue: rkrvsf1ch12kr6mcbnn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: compose ancestor watches across mount boundaries",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T03:42:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7ce13a1b585b34deb9d1691935005323eb007a9f",
          "body": "…ter)\n\nWires the mount coordinator (mountCoord) into the live server so a mount is\nserialized against the watches it would affect.\n\n- Every client watch registers as a coordinator reader keyed by path, with a\n  force-teardown hook; unwatch and session close release it. Admission runs off\n  the reque\n[…]\nverlappingWatch (finite force_after registers the mount\ndespite a held watch). All green under -race.\n\nIssue: rkrvsf1ch12kr6mcbnn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: coordinate mounts against overlapping watches (block + force_af…",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T03:22:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4bd6d73d70891560b3ade398da55de30ec0421bb",
          "body": "…e_after)\n\nThe concurrent core of step 2: mountCoord serializes mount/unmount (writers)\nagainst active watches (readers) on overlapping kpaths — one path a field-prefix\nof the other — with writer priority.\n\n- beginRead(path, cancel): registers an active watch, blocking while an\n  overlapping writer \n[…]\n lifetime. Wiring (watch reader registration, mount handshake\nforce_after, graceful unmount) follows.\n\nIssue: rkrvsf1ch12kr6mcbnn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: mount/unmount reader-writer coordinator (writer priority + forc…",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T03:06:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bfb774e53e107414a862fd6ee7008219419f9d21",
          "body": "docd single-routes reads, so a MATCH whose kpath is a strict ancestor of one or\nmore mounts (nested mounts included) went only to its base owner and was blind to\nevery mounted subtree beneath it — the read-side gap symmetric to splitPatch on\nthe write side.\n\nA composed MATCH now fans across the base\n[…]\n of scope). Watch composition and\nmount/unmount reader coordination are the next steps on this issue.\n\nIssue: rkrvsf1ch12kr6mcbnn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: compose ancestor reads (MATCH) across mount boundaries",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T03:00:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "57dbc86cd24ec288b411dad16d22d8ec2ab20a22",
          "body": "Completes docd-coordinated patch splitting (the transparent multi-mount tx model)\nand corrects a foundational path bug found along the way.\n\nPath fix (the important part): docd's path layer used \"/\" separators, but the\npath language is kpath (.field / [i] / {i}) — logd parses a slash path as ONE\nlit\n[…]\nection, and CAS abort. Existing tests\nretrofitted to kpath paths.\n\nIssue: qf58mz22h12krzk2bnn0 (docd umbrella wcabztj2h12ksb9qbnn0)\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: coordinate multi-mount patches; fix path layer to use kpath",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T01:41:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "316ed4d4a486562d2db170f6f9a7b197d3a654b3",
          "body": "The static decomposition half of docd-coordinated transactions: splitPatch\npartitions a client patch (path, data) across the live mounts and a base\nremainder, so a single client patch spanning several mounts can later be\ncommitted atomically. Data is rooted at the document root; each mount claims th\n[…]\noverride). The coordinator that consumes this is the next commit.\n\nIssue: qf58mz22h12krzk2bnn0 (docd umbrella wcabztj2h12ksb9qbnn0)\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: add patch splitter for cross-mount decomposition (not yet wired)",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T00:55:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0ac7428ad1b3695d2aca3436edc83778b9161982",
          "body": "…ch protocol\n\nCompare-and-swap was implemented at the tx layer but unreachable from any session\nclient, and had a latent bug against real storage. Wire it end to end and fix it.\n\nBug fix (tx/match.go): evaluateMatches compared the match pattern against the raw\nresult of ReadStateAt, which is rooted \n[…]\nition against real logd; CAS routed through docd to a controller.\n\nIssue: 0qt62a91h12kr2b8bnn0 (docd umbrella wcabztj2h12ksb9qbnn0)\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "logd/libctl/docd: expose CAS (match preconditions) in the session pat…",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-20T00:27:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e8b1b7f19202fabefb6b84bc1d83406b9b7a885",
          "body": "Pooling only pays off if the pool stays warm. Previously Prefetch filled it once\nand every subsequent drain fetched inline (one logd round trip per Get) — no\nbetter than not pooling. Now a background refiller tops each participant count\nback up to poolSize as it is drained, so Gets are served from c\n[…]\ntch counts guessed wrong.\n\nTest: drain the pool and confirm it converges back to poolSize. Race-clean.\n\nIssue: wcabztj2h12ksb9qbnn0\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "txpool: background backfill so Gets stay served from cache",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-19T23:55:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a926d8b3b6c27447603c8c271925037376dc0000",
          "body": "…actions\n\nThe txpool was created in `o sys up` but orphaned (docd never used it). Now docd\nowns it and uses it to coordinate multi-participant (multi-mount) transactions.\n\nModel (per scott): a TxID is cheap to pre-allocate, and a participant joins the\ntransaction by writing to logd with that id (the\n[…]\nhTx to two\nlogd-backed controllers commit atomically). Race-clean; verified `o sys up`\nwarms the pool.\n\nIssue: wcabztj2h12ksb9qbnn0\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: wire the txpool — serve NewTx from it, enable multi-mount trans…",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-19T23:29:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e92708204287d82ed1f2a763e6a0b7c1fd3013d0",
          "body": "…bility)\n\nClient sessions dialed logd once; a not-yet-listening logd (startup ordering) or\na brief blip at connect time failed the client immediately. Now the dial retries\nwith exponential backoff (100ms -> 5s) up to logdConnectTimeout (30s), aborting\nif the session is closed.\n\nDeliberately scoped t\n[…]\nTest: a client connects while logd is down and its operation completes once logd\ncomes up. Race-clean.\n\nIssue: wcabztj2h12ksb9qbnn0\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: retry logd dial with backoff (startup ordering / brief unavaila…",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-19T23:14:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "21ad7a902c407424de8d52ea879db76608c15a5e",
          "body": "- .meta (index): lists the metadata resources docd serves (mounts, schema), so\n  the surface is self-describing.\n- .meta/schema: per-mount schema contributions ({contributions: [{path, status,\n  schema}]}). These are the raw contributions; composing them into one unified\n  schema is future work (com\n[…]\n running `o sys up`; tests cover .meta index + schema content\nand concurrent schema reads; race-clean.\n\nIssue: wcabztj2h12ksb9qbnn0\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: extend .meta surface with schema + index; add `o sys docd schema`",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-19T23:04:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b42bb81f52f0dc5a47c66e37b7a20fee6bd5a553",
          "body": "Adds introspection: docd answers a MATCH on the reserved .meta/mounts path from\nits mount registry, over the normal client protocol — no separate admin channel.\nThe .meta subtree is docd-served (not routed to logd/controllers) and reserved\nfrom being mounted.\n\n- meta.go: mountsDoc renders the regist\n[…]\n debugging). Verified against a running\n`o sys up`; test covers live + tombstoned entries; race-clean.\n\nIssue: wcabztj2h12ksb9qbnn0\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: serve mount registry at .meta/mounts + `o sys docd mounts`",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-19T22:58:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f5bdf09b1e22a86bd3f6d39e3728c4419fc6ba2b",
          "body": "…gh to logd\n\nWhen a controller disconnects, its mounted subtree held content that lived in the\ncontroller, not logd. Previously the mount was fully unregistered, so subsequent\nops fell through to logd and returned empty/null — silently wrong. Now the mount\nis tombstoned: ops on the subtree fail with\n[…]\nnts the path and service resumes. Existing disconnect tests\nupdated to expect a tombstone. Race-clean.\n\nIssue: wcabztj2h12ksb9qbnn0\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: tombstone a crashed controller's mount instead of falling throu…",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-19T22:50:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c96fe19ba100b8ad0613d5b2f035d526d6abf042",
          "body": "Failure-injection test for the M1b failAllRoutes path: a client match is held\nin-flight by a blocking controller handler, the controller is then crashed, and\nthe client's operation must return an error rather than hang. Race-clean.\n\nIssue: wcabztj2h12ksb9qbnn0\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: test that a controller crash fails in-flight ops deterministically",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-19T22:40:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "edf6c3bc0264d74800ab952f1d39c207ee8a3142",
          "body": "o sys up predates the docd two-listener split and only started the mount\nlistener via docd StartTCP(docd-addr), leaving no client-facing listener — so a\nclient could not reach the composed system.\n\nStart both: the client-facing listener on -docd-addr (default :9124, logd session\nprotocol, routed to \n[…]\nects the txpool, and shuts down cleanly on SIGINT/SIGTERM. up runs in the\nforeground; Ctrl+C stops it.\n\nIssue: wcabztj2h12ksb9qbnn0\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "o sys up: start docd's two listeners (client + mount)",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-19T22:38:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6ce36d590b0f3da7805db03d7af18e93953d9f62",
          "body": "Fixes a correctness defect from the initial M1b routing: the controller runtime\nkeyed active watches by path, but docd multiplexes many client sessions onto one\ncontroller connection, so two clients watching the same mounted path collided —\nthe second silently cancelled the first.\n\nKey watches by th\n[…]\n; both receive broadcasts; one\nunwatching leaves the other streaming. Race-clean across repeated runs.\n\nIssue: wcabztj2h12ksb9qbnn0\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: make concurrent watches on the same mounted path independent",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-19T22:31:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "35944008eda6b5ec79170d7d907b8c6efe193d28",
          "body": "Turns the M1a transparent proxy into a path-based routing multiplexer. docd is\nnow a logd-backed document server with controller overlays: base/unmounted paths\ngo straight to logd (as in M1a); operations under a mounted subtree route to the\nowning controller, which answers for it.\n\nThe docd<->contro\n[…]\ns docd-side watch fan-out (one controller-facing watch per path, fanned to\nN clients); tracked for M2.\n\nIssue: wcabztj2h12ksb9qbnn0\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: route mounted subtrees to controllers (M1b)",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-19T22:19:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "419b5211d413da7ecad1f87a2cb8a5bb248bd7a7",
          "body": "- ClientTCPListener: close the shutdown-race window. Register the session and\n  wg.Add under the same lock that observes `closed`, so a concurrent Close()\n  either sees the session (and closes it) or the session sees closed (and is\n  refused). Previously wg.Add ran before the session was in the map,\n[…]\nascading to both pumps).\n- pumpConn: drop the dead io.EOF branch — io.Copy reports EOF as a nil error.\n\nIssue: wcabztj2h12ksb9qbnn0\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: address M1a client-proxy review findings",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-19T22:01:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fb3cd206ff929cca3d8f9f67352972ea0629e180",
          "body": "docd's client face now speaks the logd session protocol verbatim and proxies\neach client connection to logd. Pointing a libctl.LogdSession at docd's client\naddress behaves exactly as if pointed at logd — the switchability proof for the\ndocd/logd additive-protocol design.\n\nM1a is a transparent pass-t\n[…]\nners.\n- End-to-end tests: Patch/Match and Watch round-trip through docd to logd,\n  green under -race.\n\nIssue: wcabztj2h12ksb9qbnn0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: add client-facing listener as transparent logd proxy (M1a)",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-19T21:50:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ced8522f4e1b2d497ba57388fe68a5aad8665c71",
          "body": "Set a session-wide copy-on-write scope via LogdSessionConfig.Scope,\nsent in the hello handshake so all operations (match, patch, watch,\nnewtx) are isolated to that scope. Add DeleteScope (baseline-only) and\na Scope accessor, mirroring the server-side scope semantics.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "libctl: add COW scope support to LogdSession",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-17T22:02:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "674af343d5e53613aba93cc43bf93c88fa12455e",
          "body": "The logd session protocol is asynchronous and multiplexed: requests carry\nan optional id that responses echo, and the server also pushes unsolicited\nwatch events (which carry no id). The previous LogdSession ignored this and\ndid strict send-one/read-one request/response under a mutex, which cannot\nc\n[…]\nrs are now\nread-only. Populate the previously path-less replay-complete event with its\nwatch path so clients can route it by path.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "libctl: make LogdSession async with read-pump and add Watch",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-17T17:15:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f0715ea61d3891d91519ba33059a071ed4ad6abb",
          "body": "Add LogdSession with Match and Patch operations, connection handling\nwith retry and backoff, and integration with MountClient. This provides\nthe sync version - async ID-based protocol will be added in a follow-up.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "libctl: add LogdSession for controller communication with logd",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-17T16:37:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "46d3f61ce8ea122537219cc3183ccc10f4ed2475",
          "body": "Add libctl package with MountClient for controllers to connect to docd:\n\n- Mount() connects and performs handshake\n- MountConfig: DocdAddr, LogdAddr, Controller, Path, Schema, DialTimeout\n- MountClient: holds connection state, provides accessors\n- Proper error handling for protocol and connection er\n[…]\nTests covering success, errors, cleanup, and multiple controllers\n\nPart of #101\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "libctl: add mount client for controllers",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-17T16:37:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eeaeca8fa13c9b476af44f02966a5080112a5948",
          "body": "Add mount protocol for controller registration with docd:\n\n- Define mount protocol types (MountRequest, MountResponse, etc.)\n- Add MountRegistry for tracking path → controller mappings\n- Implement handshake: controller sends hello+mount, docd responds\n- Handle validation (path format, duplicate moun\n[…]\nler disconnects\n- Add comprehensive tests for handshake scenarios\n\nPart of #101\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docd: implement MOUNT protocol hello and handshake",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-07-17T16:37:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bad810bc7cafab98276708be00bf4472a1b19deb",
          "body": "ci: pin GitHub Actions to SHAs (ENG-921)",
          "is_bot": false,
          "headline": "Merge pull request #6 from signadot/eng-921-pin-actions",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-06-16T11:40:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1683167e83e0fca5689a4bd5efcc3140049a1d93",
          "body": "Replace mutable @vN tags with full commit SHAs (with the tag preserved as\na trailing comment) so the actions resolved at workflow run time become\nimmutable. Add a github-actions dependabot config so the SHAs/tags stay\nup to date automatically.\n\nRefs https://linear.app/signadot/issue/ENG-921",
          "is_bot": false,
          "headline": "ci: pin GitHub Actions to SHAs (ENG-921)",
          "author_name": "Anirudh Ramanathan",
          "author_login": "foxish",
          "committed_at": "2026-06-16T00:15:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2000b97ed349e61d2a9d698db69aec5b424b0cbe",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "update README with docs site link, godoc badge, and git issue reference",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-02-18T11:51:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f2432ed168fec52766c4eff2dc2ad328cd9ca489",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "add GitHub Actions workflow to deploy docs to GitHub Pages",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-02-18T11:40:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c298ed3afb4e63b38c8c5c0f983055aa2b95656b",
          "body": "reflect.StructOf produces anonymous types that lose Name()/PkgPath(),\nand the flat metadata fields (TypeName, StructTypeName, TypePkgPath)\ncan only describe one level of nesting. This made map[string]StructType\nand deeper nestings like []map[string]*Foo emit invalid Go code.\n\nAdd GoTypeExpr to Field\n[…]\nandled by construction. getFieldTypeName now returns\nGoTypeExpr when set.\n\nValidated: zero diff on all 13 regenerated packages, all tests pass.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "codegen: build type strings from AST instead of reflect.Type",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-02-17T21:49:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5bfa0b60043de8af9ba8e82440bb67475ddeb6dc",
          "body": "Skip nil documents returned by parse.Parse when matching,\npreventing panic when input contains empty YAML documents (just ---).\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "cmd/o: fix crash on empty document in match",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-02-05T09:28:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3bf4aba7208766aec0d701da29c56e88390c39f2",
          "body": null,
          "is_bot": false,
          "headline": "update README",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-31T17:19:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8fef39a52e84bc4102ea11763bc7d280752a75a4",
          "body": null,
          "is_bot": false,
          "headline": "blog",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-30T07:13:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5243c3212b70b1276cadd213a6fc0e875bc6a85a",
          "body": "Introduce a structured `output` section in the build config that\nconsolidates output concerns (destDir, suffix, filenames, k8s.filenames).\nLegacy top-level destDir/suffix fields remain supported as fallback when\noutput is absent.\n\nThe k8s.filenames pattern allows controlling output filenames for\nKub\n[…]\ntokens (name, kind, namespace),\ne.g. \"name-kind\" produces \"my-deployment-deployment\" instead of the\ndefault \"my-deployment-deployment-default\".\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "dirbuild: add build.output with k8s.filenames config",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-29T12:57:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f6d55c3e0143805a976b778a260a496bacc74742",
          "body": null,
          "is_bot": false,
          "headline": "codegen: fix isZeroValue inner struct case",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-28T14:05:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42743f083dcef0bb6725feafc9697ed708137b7a",
          "body": null,
          "is_bot": false,
          "headline": "thread patchopts so they are usable and define reject unsafe opt",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-28T11:40:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4cc5f1efdb52439643c3270c3228ea5136cfe85e",
          "body": "Add isComplexType helper function to consolidate the complex condition\nfor determining when a type requires FromTonyIR/ToTonyIR calls rather\nthan simple primitive extraction. This replaces ~13 occurrences of the\nsame long condition throughout the file.\n\nThe helper checks for:\n- Struct types\n- Pointers to structs\n- Named non-primitive types\n- Nested composites (slices, maps, arrays)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "codegen: add isComplexType helper and refactor type checks",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-26T16:15:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1f9695ce39c4773e788e05b684434072b2a4edfa",
          "body": "Add comprehensive package documentation and godocs for exported types\nand functions. Fix unkeyed struct literal warnings in debug.Tony usage.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "dirbuild: improve godocs and fix go vet warnings",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-26T05:19:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c03222febbe00ea9da6624d8136936465b3c697c",
          "body": null,
          "is_bot": false,
          "headline": "add comment to test ci-agent",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-25T17:02:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ccf8fe86991b73e435dcba8c744dcd0c3ae674a",
          "body": null,
          "is_bot": false,
          "headline": "test ci. add comment",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-25T16:14:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc6500664a23cb348cc739fe1640a3f5f05d90a1",
          "body": "The generatePrimitiveFromIR function was hardcoding 'elem' as the\ndestination variable name, but map value generation declares 'val'\nas the variable. This caused generated code to assign to undefined\n'elem' while leaving 'val' unassigned, resulting in empty map values.\n\nAdd destVar parameter to generatePrimitiveFromIR to specify the\ndestination variable name. Slice element calls pass \"elem\", map\nvalue calls pass \"val\".\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "codegen: fix FromTonyIR for map primitive values",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-25T14:57:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8eb867ceceaf5ee7a0c38bf4c532ae4d58bf9565",
          "body": "Use getFieldElementTypeName instead of getFieldTypeName inside the\npointer case to get the element type without the * prefix. This fixes\ngenerated code like `new(*string)` which creates `**string`.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "codegen: fix FromTonyIR for pointer types",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-24T16:19:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "267f324c7c4ae48511b6464d74f7cf3f90dcaf92",
          "body": "The stored type info (TypeName, StructTypeName, TypePkgPath) refers to\nthe element type, not the full composite type. This caused wrong\nsignatures for isZeroValue helpers with slice/array/map of struct types.\n\nFix by checking composite type kinds first and constructing the full\ntype string with the appropriate wrapper ([], [N], *, map[K]).\n\nFixes vh2hk34jh12ks8ywehmg\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "codegen: fix getFieldTypeName for composite types",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-24T15:08:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b561e6071d84a9d7f63ab24c286b6f1653a0cd0d",
          "body": "Changed package main to package pkg4 since this is test data without\na main function. Regenerated codegen output accordingly.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "testdata/pkg4: fix package declaration to match directory name",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-24T10:53:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5225f8cd8e38b60f79203a57ba1b55e37b05f240",
          "body": null,
          "is_bot": false,
          "headline": "update readme",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-24T08:50:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5464a2e8aabb535e01968abcbd8a101f664945c1",
          "body": null,
          "is_bot": false,
          "headline": "update status",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-24T08:32:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23ebb121dd940176ae8168bc4a74ba196ba699ba",
          "body": "The options need to be parsed via cfg.Parse() to populate struct fields.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "git-issue: fix -body flag by parsing options",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-23T11:00:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e098584944626c3a3dc4e7407a44ba900f336faa",
          "body": "Allows specifying issue body directly on the command line instead of\nrequiring stdin or editor input.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "git-issue: add -body flag to create command",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-23T10:36:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a8440eb81b8822738fb598191502c7d64decfde4",
          "body": "When a struct has an optional time.Time field, the generated code now\nincludes the isZeroValue helper function that uses v.IsZero() to check\nif the field should be omitted.\n\nFixes: eh4jy2bch12krshyedmg\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "codegen: add zero-value helper for time.Time optional fields",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-23T09:29:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "611c76cad89b270b49149c4cb2ae7442e8e68281",
          "body": "Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "add missing ir import in pkg4 testdata",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-22T22:12:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "73e4a067ee7f2c82bb3ea2952afbc0a225bc21f6",
          "body": null,
          "is_bot": false,
          "headline": "fix codegen again",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-22T10:38:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49e38f5e5b59cd0449b7796e284f10c994b04d7f",
          "body": null,
          "is_bot": false,
          "headline": "patch preTag fix",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-22T01:26:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffbbf5bca85b1bb679fec9cc5e874a29a0c4c7e3",
          "body": null,
          "is_bot": false,
          "headline": "bang fix",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-22T01:19:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b384220c16d0b8fd190038f0cc2b64343263a14d",
          "body": null,
          "is_bot": false,
          "headline": "preserve tags from orig doc and non-mergeop tags from patch",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-22T01:04:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "91949829035830cc35171e6a86489b76ce64af35",
          "body": null,
          "is_bot": false,
          "headline": "preserve non-merge tags before mergeop in patch",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-22T00:32:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b18ef9de049050fc475c6736daca7bb40962040e",
          "body": null,
          "is_bot": false,
          "headline": "fix tag preservation in !embed",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-21T23:33:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20cf9189c3ec2dea0b8401299655ad565aedaad5",
          "body": "Fix three places where reflection-based type names were used instead of\ngetFieldTypeName which properly handles external package types:\n- Line 376: zero value helper generation\n- Line 1878: uint type casting in FromTonyIR\n- Line 1884: float type casting in FromTonyIR\n\nRegenerated testdata packages to reflect the changes.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "codegen: use getFieldTypeName for uint/float types and regenerate",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-21T21:50:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7253066eaaa46262ddfa29ebe0fdcfe6de6e2771",
          "body": "Fix several codegen bugs related to named types losing their type info\nwhen reflect.Type is constructed via reflect.StructOf:\n\n- getTypeString: check for named types with package paths FIRST before\n  checking Kind, so time.Duration returns \"time.Duration\" not \"int64\"\n\n- Add getFieldTypeName helper t\n[…]\nd code only uses interface methods (removes unused imports)\n\nRegenerated all _gen.go files with the fixed codegen.\n\nFixes: qnnaa1a5h12ksdj3e5mg\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "codegen: fix named type handling and regenerate",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-21T21:39:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "174e461587af651b2481cdbe40de05177869c7ff",
          "body": null,
          "is_bot": false,
          "headline": "ir.Node Clone: copy lines, panick when src == dst",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-21T15:59:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e667e231b0351067d44736b1dc9e42483d806e58",
          "body": null,
          "is_bot": false,
          "headline": "ir.Node: add DeepCopy for interop with controller-gen",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-21T13:41:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b6cbe6fd1161249d9b2e4806f19103875e017cc4",
          "body": "…ngerous",
          "is_bot": false,
          "headline": "add controller-gen annotation on ir.Node because controller-gen is da…",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-21T13:17:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d0883ba5e7b66fa564d29297a54d41ca7b20623",
          "body": null,
          "is_bot": false,
          "headline": "add json tags to ir.Node for k8s embedding",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-21T13:11:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84f407d0f1a437aaa333188e5ae6e73cdce65c80",
          "body": "…he full doc",
          "is_bot": false,
          "headline": "fill the result prior to eval w/ clone so getpath is always against t…",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-20T12:36:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3505726373ac8df1f81e1e6f0d81a72fa4716989",
          "body": null,
          "is_bot": false,
          "headline": "fix Dockerfile oras reference",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-19T12:08:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fe12bfc55a9757c17e129025de536c831d13377",
          "body": "XIRs are byte-reversed so sorting by XIDR string doesn't give\nchronological order. Sort by Created timestamp instead (newest first).\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "git-issue: sort list by created time instead of XIDR",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-19T11:45:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4508dafc33b70f243bd17426baa03c5307d8f8df",
          "body": "Replace monotonic numeric issue IDs with globally unique XIDs to prevent\nconflicts in distributed usage. XIDs are presented byte-reversed (XIDR)\nso that prefixes diverge quickly, enabling short prefix lookups like\ngit short SHAs.\n\nKey changes:\n- Add XID implementation without external dependencies (\n[…]\ntamp + machine + pid + counter.\nReversed display means counter bits come first, making prefixes unique\nafter just 2-3 characters in most cases.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "git-issue: migrate from numeric IDs to XIDR (reversed XIDs)",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-18T23:37:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9a36be8b45a8cf801b04ccff1f3fcf1f62a5f0b9",
          "body": "Allows ] to be included in expressions by escaping as \\].\nBackslash escapes any character: \\x -> x, \\] -> ], \\\\ -> \\.\nUnclosed expressions (no unescaped ]) are treated as literal text.\n\nFixes #112\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "add backslash escaping to .[...] and $[...] expressions",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-18T22:40:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "049153f258cbebfb565b39fedb4f881ba19ff63b",
          "body": "- support o build -p -\n- Add oras to Dockerfile for OCI artifact support\n- Add README for patch-argocd example with ORAS usage for per-deploy image tags\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add oras to image and document ArgoCD plugin usage",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-18T12:03:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ac83a2f0c698b7d322d19df5ce1f39f57bf1fcc4",
          "body": "Previously !unquote would patch doc with its child first, then unquote\nthe result. This caused a nil pointer panic when the child was an empty\nobject. Now !unquote operates directly on doc (ignoring child), matching\nhow !quote works. Also validates input is a string type.\n\nFixes #111\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix !unquote to mirror !quote behavior",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-18T00:27:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "19ff302068df4a40e20654436edd94259590d939",
          "body": "…essions\n\nPreviously these functions were only available via !script tags. Now they\nwork in .[...] eval expressions as well, allowing users to reference other\nfields in the document being evaluated.\n\n- Add Node field to EvalOptions to track current node during evaluation\n- Pass exprOpts to expr.Comp\n[…]\nrns the correct path for each node\n- Add comprehensive tests for script funcs in eval expressions\n- Add example file testdata/getpath-eval.tony\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "add script funcs (getpath, whereami, listpath, getenv) to .[...] expr…",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-17T21:59:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0f3ccdf5e624b4f5576b9b6eef6d7717e036f2f0",
          "body": null,
          "is_bot": false,
          "headline": "remove discover from plugin config, our argo instance doesn't like it",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-16T16:55:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6aa0cbf8e75009a5af2afbd4b9285b029be77da",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' of https://github.com/signadot/tony-format",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-16T14:44:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8fc8065b5622e124c8113e4662a175a28f6f623",
          "body": null,
          "is_bot": false,
          "headline": "fix repo-server-patch",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-16T14:44:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f2b5ecb2b7da9174e22f5d7602c78f6130f3207e",
          "body": null,
          "is_bot": false,
          "headline": "fix repo-server-patch",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-16T13:42:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2e953ba3e5ab8b02a692bdab6a735fa89d5f3b0",
          "body": null,
          "is_bot": false,
          "headline": "staging image prep",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-16T13:09:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dee185a6ecb61ae99403f68dfb77bee230c9c1ac",
          "body": "Trim was switching on match.Type without considering tags, causing\nincorrect results when the match document had a different structural\ntype than the input (e.g., !or [b c d] is ArrayType but matches strings).\n\nNow checks for tags first and uses MatchWith to verify matches,\nreturning the doc as-is for matching tagged patterns or nil for\nnon-matches to signal field exclusion.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix Trim with tagged match patterns like !or (issue 110)",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-16T13:08:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ff51419748bc321a8b236da6d00133bbbfae9353",
          "body": null,
          "is_bot": false,
          "headline": "add if: to dirbuild sources and fix again a codegen bug",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-15T21:20:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efaad8dd00924c55c63e986ac58b6d1722b4dba5",
          "body": null,
          "is_bot": false,
          "headline": "fix trailing newline/indent with merge key expansion",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-14T22:25:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70d98aa3eaef8397ad97cb0950ae33588cf53658",
          "body": "When parsing YAML, a field with no value (e.g., \"key:\" followed by\na sibling key or EOF) is now treated as implicit null rather than\nan error. This enables parsing Helm template output that may contain\nimplicit nulls.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "support implicit nulls in YAML format (issue 109)",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-14T21:56:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "01ea7b8e95658535a1982cf9ee69a8ad1371ae4a",
          "body": "Map values with pointer types like map[string]*ComponentConfig were\ngenerating incorrect code with *struct or empty type names instead of\nthe actual type name.\n\nThe fix introduces getMapValueTypeName helper that properly resolves\nmap value type names by checking field.StructTypeName first (set durin\n[…]\nuct types).\n\nAlso replaced several uses of getTypeName with getQualifiedTypeName for\npointer types since typ.Name() returns empty for pointers.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix codegen for map values with pointer types (issue 108)",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-13T23:34:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "754262dd1bfd91f1f4bc67e49ed3fcfb4ca24b96",
          "body": null,
          "is_bot": false,
          "headline": "fix encoding issue with merge keys",
          "author_name": "Scott Cotton",
          "author_login": "scott-cotton",
          "committed_at": "2026-01-13T14:20:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 6,
      "commits_last_year": 311,
      "latest_release_at": "2025-11-18T23:01:33Z",
      "latest_release_tag": "v0.0.5",
      "releases_from_tags": true,
      "days_since_last_push": 0,
      "active_weeks_last_year": 17,
      "days_since_latest_release": 245,
      "mean_days_between_releases": 0.2
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/signadot/tony-format/go-tony",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/signadot/tony-format/go-tony",
          "is_deprecated": false,
          "latest_version": "v0.0.82",
          "repository_url": "https://github.com/signadot/tony-format",
          "versions_count": 79,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-21T16:55:01Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 4,
      "watchers": 1,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [
          {
            "date": "2025-11-19",
            "count": 1
          },
          {
            "date": "2026-04-01",
            "count": 1
          },
          {
            "date": "2026-06-16",
            "count": 1
          },
          {
            "date": "2026-07-17",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 4,
        "total_stars": 4
      },
      "open_issues_and_prs": 5
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "go-tony/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "docs/sketchy/editors/tree-sitter-tony/Cargo.toml",
        "docs/sketchy/editors/tree-sitter-tony/bindings/rust/Cargo.toml",
        "go-tony/go.mod"
      ],
      "largest_source_bytes": 127724,
      "source_files_sampled": 511,
      "oversized_source_files": 4,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go-tony/go.mod",
        "requirements.txt"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "github.com/evanphx/json-patch",
          "manifest": "go-tony/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.5.2"
        },
        {
          "name": "github.com/expr-lang/expr",
          "manifest": "go-tony/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.17.6"
        },
        {
          "name": "github.com/fatih/color",
          "manifest": "go-tony/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.18.0"
        },
        {
          "name": "github.com/go-air/gini",
          "manifest": "go-tony/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.4"
        },
        {
          "name": "github.com/google/go-cmp",
          "manifest": "go-tony/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.6.0"
        },
        {
          "name": "github.com/google/gops",
          "manifest": "go-tony/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.3.28"
        },
        {
          "name": "github.com/mattn/go-isatty",
          "manifest": "go-tony/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.20"
        },
        {
          "name": "github.com/novln/docker-parser",
          "manifest": "go-tony/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.0"
        },
        {
          "name": "github.com/scott-cotton/cli",
          "manifest": "go-tony/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.2.3"
        },
        {
          "name": "github.com/sergi/go-diff",
          "manifest": "go-tony/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.4.0"
        },
        {
          "name": "go.lsp.dev/jsonrpc2",
          "manifest": "go-tony/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.10.0"
        },
        {
          "name": "go.lsp.dev/protocol",
          "manifest": "go-tony/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.12.0"
        },
        {
          "name": "golang.org/x/tools",
          "manifest": "go-tony/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.39.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 5,
        "merged_prs": 4,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 2,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "scott-cotton",
          "commits": 310,
          "avatar_url": "https://avatars.githubusercontent.com/u/46963814?v=4"
        },
        {
          "type": "User",
          "login": "foxish",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/906471?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.997
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "docs.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": true
    },
    "security_signals": {
      "lockfiles": [
        "Cargo.lock",
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 5,
            "reason": "binaries present in source code",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 3 contributing companies or organizations -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 10,
            "reason": "project is fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 6,
            "reason": "dependency not pinned by hash detected -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 7,
            "reason": "3 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "b9c564d1330348b53a1814434d34e4e591b8db63",
        "ran_at": "2026-07-22T06:01:17Z",
        "aggregate_score": 6.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-21T16:55:04Z",
      "oldest_open_prs": [
        {
          "number": 7,
          "created_at": "2026-06-16T11:41:25Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 8,
          "created_at": "2026-06-16T11:41:28Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 9,
          "created_at": "2026-06-16T11:41:30Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 10,
          "created_at": "2026-06-16T11:41:31Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 11,
          "created_at": "2026-06-16T11:41:37Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-06-16T11:40:48Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/signadot/tony-format",
    "host": "github.com",
    "name": "tony-format",
    "owner": "signadot"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 64,
      "inputs": {
        "security": 66,
        "vitality": 72,
        "community": 28,
        "governance": 64,
        "engineering": 85
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 72,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 311,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 17
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "17/52 weeks with commits",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 17
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "311 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 311
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "moderate",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 66,
            "inputs": {
              "releases_count": 6,
              "latest_release_tag": "v0.0.5",
              "releases_from_tags": true,
              "days_since_latest_release": 245,
              "mean_days_between_releases": 0.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "6 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 245 days ago",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 245
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.2 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 28,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 8,
            "inputs": {
              "forks": 0,
              "stars": 4,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "4 stars",
                "points": 7.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 64,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 22,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.997
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "merged_prs": 4,
              "open_issues": 0,
              "closed_issues": 2,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "4/4 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 4,
                      "decided": 4
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "followers": 52,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "signadot",
              "public_repos": 17,
              "account_age_days": 2456
            },
            "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": "52 followers of signadot",
                "points": 12.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 52,
                      "login": "signadot"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "17 public repos, account ~6 yr old",
                "points": 21.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 17
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/signadot/tony-format/go-tony"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "79 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 79
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 85,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 92,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": true
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": 16,
                "status": "met",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 9.6,
                "status": "met",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 66,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 66,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 14,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 4,
              "scorecard_aggregate": 6.6
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 3.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is fuzzed",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 6",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "3 existing vulnerabilities detected",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 69,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 37,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.7,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "70 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 37.3,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 70,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "excellent",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 93,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "Cargo.lock",
                "go.sum"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "go-tony/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.7,
              "toolchain_manifests": [
                "docs/sketchy/editors/tree-sitter-tony/Cargo.toml",
                "docs/sketchy/editors/tree-sitter-tony/bindings/rust/Cargo.toml",
                "go-tony/go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go-tony/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "go-tony/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": 11,
                "status": "met",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "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": "70 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 70,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "dependency automation configured, none observed in the sampled commits",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "dependency_bot_config_only",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 127724,
              "source_files_sampled": 511,
              "oversized_source_files": 4
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "4/511 source files over 60KB",
                "points": 54.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 511,
                      "oversized": 4
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T06:01:24.083592Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/signadot/tony-format.svg",
  "full_name": "signadot/tony-format",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

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