Public record
Software health reportschema 0.26.0 · metrics 1.13.0 · 2026-07-22 06:01 UTC

signadot / tony-format

Home of the Tony format

GoApache-2.0★ 4 stars⑂ 0 forkssince Nov 2025View on GitHub ↗

signadot/tony-format holds a health index of 64 out of 100, placing it in the Moderate band. It scores highest on Engineering Quality (85/100) and lowest on Community & Adoption (28/100). It was last updated today. A single contributor accounts for most of its recent work.

64
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

64
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

SignadotOrganization
52 followers17 public repossince Oct 2019

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
Gogithub.com/signadot/tony-format/go-tonyv0.0.82-790 days ago

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

72Good · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
11.8/36Commit cadence — 17/52 weeks with commits
18/18Commit volume — 311 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year311
human_commit_share1
days_since_last_push0
active_weeks_last_year17
How it's scored
16.2/27Ships releases — 6 version tags (no GitHub releases)
16.2/36Release recency — latest release 245 days ago
27/27Release cadence — a release every ~0.2 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count6
latest_release_tagv0.0.5
releases_from_tagsyes
days_since_latest_release245
mean_days_between_releases0.2
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

28Critical · 18% of overall
How it's scored
7.7/60Stars — 4 stars
0/25Forks — 0 forks
0/15Watchers — 1 watchers
Inputs used
forks0
stars4
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (Apache-2.0)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

64Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0.1/22.5Commit distribution — top contributor authored 100% of commits
2.7/13.5Contributor breadth — 2 contributors
10/10OpenSSF Scorecard: Contributors — project has 3 contributing companies or organizations -- score normalized to 10
Inputs used
bus_factor1
contributors_sampled2
top_contributor_share0.997
How it's scored
46.8/46.8Issue resolution — 100% of issues closed
38.2/38.3PR acceptance — 4/4 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs4
open_issues0
closed_issues2
issue_closed_ratio1
closed_unmerged_prs0
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
12.4/25Owner reach — 52 followers of signadot
21.1/25Track record — 17 public repos, account ~6 yr old
Inputs used
followers52
owner_typeOrganization
is_verified
owner_loginsignadot
public_repos17
account_age_days2,456
How it's scored
25/25Published & resolvable — 1 package(s) on go
35/35Publish recency — latest publish 0 days ago
20/20Version history — 79 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesgithub.com/signadot/tony-format/go-tony
ecosystemsgo
any_deprecatedno
min_days_since_publish0

Engineering Quality

Are baseline engineering and documentation practices in place?

85Excellent · 20% of overall
How it's scored
24/24CI workflows — 1 workflow(s)
24/24Tests present
16/16Linter config
9.6/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — no data
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configyes
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepage
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

66Moderate · 16% of overall
How it's scored
3.8/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — no data
0/2.5CI-Tests — no data
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.5License — 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 — no data
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 — no data
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated14
scorecard_versionv5.5.0
checks_inconclusive4
scorecard_aggregate6.6
Excluded from scoring (no data or not applicable): branch_protection, ci_tests, packaging, signed_releases. Remaining weights renormalized.

AI Readiness

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.

69Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
37.3/40Legible commit history — 70 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.7
agent_instruction_files
agent_instruction_max_bytes
How it's scored
18/18One-command bootstrap — go-tony/Makefile
22/22Automated tests
11/11Lint / format config
11/11Static type checking — Go (statically typed)
10/10Reproducible environment — Dockerfile, lockfile
10/10Demonstrated agent practice — 70 of the last 100 commits agent-authored or agent-credited
5/8Automated maintenance — dependency automation configured, none observed in the sampled commits
6/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 6
Inputs used
has_nixno
has_testsyes
lockfilesCargo.lock, go.sum
has_dockerfileyes
typed_languageyes
bootstrap_filesgo-tony/Makefile
has_devcontainerno
has_linter_configyes
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
How it's scored
45/45Type-checkable code — Go (statically typed)
54.6/55Manageable file sizes — 4/511 source files over 60KB
Inputs used
primary_languageGo
largest_source_bytes127,724
source_files_sampled511
oversized_source_files4
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

4GitHub stars
2contributors
311commits, last 12 months
0days since last push
6releases
1bus factor
0open issues
Go, PyPIpackage ecosystems

Data collection warnings

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

More detail

Star and fork history 4 ★ / 0 ⇿
4Stars

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

1223344412025-112026-032026-07
OpenSSF Scorecard 6.6 / 10
6.6aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-22 06:01 UTC

5Binary-Artifactsbinaries present in source code
n/aBranch-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
n/aCI-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
n/aPackagingpackaging workflow not detected
6Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 6
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
7Vulnerabilities3 existing vulnerabilities detected
Direct dependencies 13
RegistryPackageVersion constraintManifest
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
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Raw JSON report machine-readable
{
  "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"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.26.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsGo.