JSON-Rohbericht maschinenlesbar
{
"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"
}