Raw JSON report machine-readable
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 13166,
"has_wiki": true,
"homepage": null,
"languages": {
"Go": 2192773,
"Shell": 232352,
"Makefile": 8847,
"Starlark": 78146
},
"pushed_at": "2026-07-20T04:18:35Z",
"created_at": "2026-04-25T16:50:05Z",
"owner_type": "Organization",
"updated_at": "2026-07-19T02:13:08Z",
"description": "Pure-Go reimplementation of USB/IP userspace for Linux",
"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": null,
"name": "AbiliSoft",
"type": "Organization",
"login": "abilisoft",
"company": null,
"location": "United States of America",
"followers": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/277256767?v=4",
"created_at": "2026-04-18T12:23:30Z",
"is_verified": null,
"public_repos": 4,
"account_age_days": 95
},
"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": "v1.0.2",
"kind": "patch",
"published_at": "2026-07-18T19:52:38Z"
}
],
"recent_commits": [
{
"oid": "b46dc5467ef75f3d0a7c89069871ed9c9402db75",
"body": "## Summary\n\n- add an opt-in BuildBuddy BES and remote-cache Bazel configuration\n- authenticate trusted GitHub Actions through a private ignored Bazel\noverride\n- keep fork pull requests on repository-local caching when secrets are\nunavailable\n- pass only the BuildBuddy secret through reusable workflo\n[…]\n passed\n\nRemote execution is intentionally not enabled: a fresh RBE proof exposed\nexisting non-remote-hermetic shell tests. This PR enables the requested\nshared cache without weakening or breaking CI.",
"is_bot": false,
"headline": "ci: enable BuildBuddy remote caching (#45)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-07-19T02:13:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "74a92760f88deaf0677994c1f5b79c1c4f0606bc",
"body": "Use GitHub CLI-compatible streamed pagination for immutable release recovery and cover multi-row release state aggregation.",
"is_bot": false,
"headline": "fix(release): support GitHub CLI pagination (#44)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-07-18T19:32:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8c588542eba516521d82c1ac0e12d733905cc3b5",
"body": "## Summary\n\n- correct normal release validation for annotated tag objects versus\npeeled commits\n- add a fixed, protected-main-only recovery workflow for the existing\nsigned `v1.0.2` tag\n- bind publication to one exact draft ID, asset roster, local/remote\ndigests, and SLSA subjects\n- synchronize regr\n[…]\nake ci-local`\n- `make release-snapshot`\n- `openspec validate --specs --strict`\n- `openspec validate --changes --strict`\n- focused actionlint, shellcheck, release/recovery validator, and\nworkflow tests",
"is_bot": false,
"headline": "fix(release): recover immutable v1.0.2 (#43)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-07-18T18:59:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "72aa5a6b585d1f5b6230c8362254ea2a6296ec75",
"body": null,
"is_bot": false,
"headline": "fix(release): make stable version tags immutable",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-07-18T15:02:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "368605a9e7ea5937def55bcf61925e67be97571e",
"body": null,
"is_bot": false,
"headline": "fix(release): keep publication fail closed (#41)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-07-18T05:15:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7b377f09e67f70417cdbc2e76e8ed20ff0a679ee",
"body": "## Summary\n\n- add fail-closed, three-cycle live USB/IP resilience coverage for\nrepeated attach/transfer/detach, delayed traffic, and daemon restart\n- add a tracked two-guest KVM test with distinct exporter/importer\nkernels, bidirectional ACM payloads, exact-port drain checks, and 25 ms\nnetem delay p\n[…]\n/15 passed\n- total coverage: 94.07%; changed executable lines: 96/96 (100%)\n\nThe two-guest KVM result is manual evidence because GitHub-hosted\nrunners do not provide this dedicated kernel environment.",
"is_bot": false,
"headline": "test(integration): add multi-VM resilience coverage (#40)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-07-15T23:29:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "978936ca8a4dee7158a0f217a986d4ad2c9c4d03",
"body": "## Summary\n\n- make fresh-process CLI detach reconcile directly against live VHCI\nstate while preserving tracked-handle concurrency, retry, reservation,\nand shutdown semantics\n- keep VHCI bus IDs kernel-local and validate detach targets under the\nport-mutation lock\n- report remote metadata only for t\n[…]\n daemon-restart, and event tests\n- two-VM KVM exporter/importer proof with an exact 60-byte ACM payload\ntransfer and matching SHA-256\n`14df31f9b4a62c5fe4614121d701485c3ae53ef410b656dd78e033976b187d00`",
"is_bot": false,
"headline": "fix(importer): support one-shot CLI detach (#39)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-07-14T21:11:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4c663801abd4a6f922e717d19cadb16350d96a6e",
"body": "… go-deps group (#38)\n\nBumps the go-deps group with 1 update:\n[github.com/lmittmann/tint](https://github.com/lmittmann/tint).\n\nUpdates `github.com/lmittmann/tint` from 1.1.3 to 1.2.0\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a\nhref=\"https://github.com/lmittmann/tint/releases\">g\n[…]\nre <dependency name> <ignore condition>` will\nremove the ignore condition of the specified dependency and ignore\nconditions\n\n\n</details>\n\n---------\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "deps(deps): bump github.com/lmittmann/tint from 1.1.3 to 1.2.0 in the…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-14T01:34:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "611dd0f76873e1830f2604ab3e4bde21442b778e",
"body": "## Summary\n\n- preserve direct stable tag pushes as a release entry point\n- add an Actions **Release → Run workflow** form that validates the\ncurrent default-branch head, creates the requested stable tag\natomically, and hands off to the same tag-context release pipeline\n- roll back only the newly cre\n[…]\n*Release** workflow from the default branch with `vX.Y.Z`. The\nGitHub **Draft a new release** form remains intentionally outside the\npipeline. No live release tag was created while validating this PR.",
"is_bot": false,
"headline": "ci: add GitHub UI release trigger (#36)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-07-14T01:33:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3faa5ddc5c802be077cb2aa11ea60c4481849824",
"body": "## Summary\n\n- add the repository-root Context7 ownership verification file\n- register `https://context7.com/abilisoft/usbip-go` with the supplied\npublic key\n\n## Validation\n\n- `jq -e` exact-content validation\n- `git diff --check`",
"is_bot": false,
"headline": "chore: add Context7 ownership config (#37)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-07-14T01:33:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a3ce11796fe2bf71f8b954ea5f96adb8ea92575d",
"body": "## Summary\n\n- make stable release automation runnable on standard free GitHub-hosted\nrunners by removing the privileged kernel job and its release dependency\n- keep `make test-integration` as an explicit manual maintainer check\ninstead of claiming unavailable kernel capabilities passed or skipped in\n[…]\naining 135\nverified by GitHub\n\n## Release impact\n\n- no public Go or CLI API break\n- no release version is hardcoded in README or operator documentation\n- no tag or GitHub release is created by this PR",
"is_bot": false,
"headline": "ci: prepare release for hosted runners (#35)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-07-12T16:50:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a1fd9be0a879ed5042d749de639dcc78d3c5ccc8",
"body": "## Summary\n\n- remove the dead Go Report Card badge from the README\n- keep the golangci-lint formatter rationale independent of the retired\nservice\n- retain the existing repository-controlled CI, security, supply-chain,\nand coverage signals\n\n## Validation\n\n- `make lint` (25/25 targets passed)\n- `git diff --check`",
"is_bot": false,
"headline": "docs: remove Go Report Card references (#34)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-07-12T02:53:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a26bea479c2898fabf2ed6dad40a3a0094089625",
"body": "## Summary\n\n- eliminate intermittent `ETXTBSY` failures by replacing transient\nexecutable test stubs with deterministic command-output injection\n- make configfs gadget cleanup idempotent and add a focused missing-root\nregression target\n- require every USB/IP, gadget-function, and `dummy_hcd` prerequ\n[…]\n than left queued\nindefinitely. Root-only VUDC and `dummy_hcd` scenarios remain externally\nblocked until an online root-capable `usbip-kernel` runner uses a kernel\nwith `CONFIG_USB_DUMMY_HCD` enabled.",
"is_bot": false,
"headline": "fix(test): harden kernel integration (#33)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-07-12T02:19:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9a15f6b4a10c093b6839a27492aca704ab11dd28",
"body": "## Summary\n\n- update Go, Bazel, GitHub Actions, lint, security, release, and\npackaging dependencies to current compatible versions\n- replace the parallel Nix, Task, and Docker Compose workflows with\nhermetic Bazel/Bzlmod behind stable Make targets\n- harden exporter/importer lifecycle ownership, tran\n[…]\ns, zero `RMriveraS`\nidentity/email occurrences, and zero commits without a signature header.\nAll 17 PR commits are GitHub-verified, use the intended identity, and\npreserve the exact pre-rewrite patch.",
"is_bot": false,
"headline": "fix: harden USB/IP and build pipeline (#32)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-07-11T19:53:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "89dc8fc9db85d3841d2a72115f01174a888b0eab",
"body": "…ates (#31)\n\nBumps the github-actions group with 6 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [actions/checkout](https://github.com/actions/checkout) | `6.0.2` |\n`7.0.0` |\n| [codecov/codecov-action](https://github.com/codecov/codecov-action) |\n`6.0.1` | `7.0.0` |\n|\n[g\n[…]\nabot unignore <dependency name> <ignore condition>` will\nremove the ignore condition of the specified dependency and ignore\nconditions\n\n\n</details>\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "ci(deps): bump the github-actions group across 1 directory with 6 upd…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-11T14:41:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3d40f28a5ab59bcd43547bd65b6ad28bc2d4ebc2",
"body": "Bumps the go-deps group with 3 updates:\n[charm.land/lipgloss/v2](https://github.com/charmbracelet/lipgloss),\n[golang.org/x/sys](https://github.com/golang/sys) and\n[golang.org/x/term](https://github.com/golang/term).\n\nUpdates `charm.land/lipgloss/v2` from 2.0.3 to 2.0.4\n<details>\n<summary>Release not\n[…]\nabot unignore <dependency name> <ignore condition>` will\nremove the ignore condition of the specified dependency and ignore\nconditions\n\n\n</details>\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "deps(deps): bump the go-deps group with 3 updates (#29)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-11T14:41:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2978ede78fbd01084115f30f93164637a3c5779e",
"body": "…s group (#26)\n\nBumps the go-deps group with 1 update:\n[golang.org/x/sys](https://github.com/golang/sys).\n\nUpdates `golang.org/x/sys` from 0.44.0 to 0.45.0\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a\nhref=\"https://github.com/golang/sys/commit/397d5f80920585bc27433d878aba498d062f81e1\"><code>397d\n[…]\nabot unignore <dependency name> <ignore condition>` will\nremove the ignore condition of the specified dependency and ignore\nconditions\n\n\n</details>\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "deps(deps): bump golang.org/x/sys from 0.44.0 to 0.45.0 in the go-dep…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-05-30T02:41:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "87816d5bdccc6e5bbba74edacf85136182a9bc13",
"body": "Bumps the github-actions group with 3 updates:\n[codecov/codecov-action](https://github.com/codecov/codecov-action),\n[github/codeql-action](https://github.com/github/codeql-action) and\n[goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action).\n\nUpdates `codecov/codecov-action` f\n[…]\nabot unignore <dependency name> <ignore condition>` will\nremove the ignore condition of the specified dependency and ignore\nconditions\n\n\n</details>\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "ci(deps): bump the github-actions group with 3 updates (#27)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-05-30T02:41:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1f70f0f5e58f4790a6f61de84bcabd491dbcf256",
"body": "## Summary\n\n- package gremlins v0.6.0 in `flake.nix` with fixed source/vendor hashes\n- add dedicated `.#mutation` shell and Docker compose `mutation` service\n- run local and CI mutation tests through `.#mutation` without runtime\ntool installation\n- include mutation tooling in `.#qa` while keeping th\n[…]\nmp GOMODCACHE=$PWD/build/gomodcache go vet\n./cmd/... ./pkg/... ./internal/... ./examples/... ./test/...'`\n\n## Signing\n\n- Head commit `f6e9018` is signed and GitHub reports verification reason\n`valid`.",
"is_bot": false,
"headline": "fix: provide gremlins from mutation shell (#25)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-18T23:24:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1907e09d27f0f271c6ec4f82c9f56358d4c526d3",
"body": "…ub-actions group (#24)\n\nBumps the github-actions group with 1 update:\n[github/codeql-action](https://github.com/github/codeql-action).\n\nUpdates `github/codeql-action` from 4.35.4 to 4.35.5\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a\nhref=\"https://github.com/github/codeql-actio\n[…]\nabot unignore <dependency name> <ignore condition>` will\nremove the ignore condition of the specified dependency and ignore\nconditions\n\n\n</details>\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "ci(deps): bump github/codeql-action from 4.35.4 to 4.35.5 in the gith…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-05-18T11:46:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4b860ab84a92522d4bae3a0be0bc2b2148e3a3ac",
"body": "## Summary\n\n- simplify CLI/domain event rendering helpers while preserving\nobservable event behavior\n- stabilize future-only session watcher lifecycle tests and document the\nWatchSessions contract in OpenSpec\n- centralize Nix Go toolchain selection for dev shells and the microVM\nclosure\n\n## Validati\n[…]\n./cmd/... ./pkg/... ./internal/...\n./test/... -count=1`\n\n## Notes\n\n- Nix-specific local gates were not run in this sandbox because `nix`,\n`nixpkgs-fmt`, `statix`, and `deadnix` are not installed here.",
"is_bot": false,
"headline": "chore: simplify Go and Nix cleanup (#23)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-18T02:59:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "68771b421c1247b903ff378e937aacaeb5424e80",
"body": "Bumps the github-actions group with 2 updates:\n[vladopajic/go-test-coverage](https://github.com/vladopajic/go-test-coverage)\nand [github/codeql-action](https://github.com/github/codeql-action).\n\nUpdates `vladopajic/go-test-coverage` from 2.18.6 to 2.18.8\n<details>\n<summary>Release notes</summary>\n<p\n[…]\nabot unignore <dependency name> <ignore condition>` will\nremove the ignore condition of the specified dependency and ignore\nconditions\n\n\n</details>\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "ci(deps): bump the github-actions group with 2 updates (#22)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-05-11T13:23:31Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6ba9824ea77b2f15e1c3e8d5a8b10daaa3d226d4",
"body": "…ps group (#21)\n\nBumps the go-deps group with 1 update:\n[golang.org/x/term](https://github.com/golang/term).\n\nUpdates `golang.org/x/term` from 0.42.0 to 0.43.0\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a\nhref=\"https://github.com/golang/term/commit/3c3e4855f7d2eb06c3e48933554add9ec6b599b5\"><code\n[…]\nabot unignore <dependency name> <ignore condition>` will\nremove the ignore condition of the specified dependency and ignore\nconditions\n\n\n</details>\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "deps(deps): bump golang.org/x/term from 0.42.0 to 0.43.0 in the go-de…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-05-11T13:22:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e2917c39530c680a2a7e32a089addb23779d1918",
"body": "## Summary\n\n- make `usbip-go list` default to local exportable devices\n- add `usbip-go list HOST` for remote device discovery\n- remove list selector flags with no compatibility shims or deprecated\naliases\n- update README, docs, integration examples, OpenSpec specs, and\ntraceability for the new flow\n\n[…]\n/... ./pkg/... ./internal/... ./examples/... ./test/...\n-count=1`\n- `rtk openspec validate --specs --strict`\n- `task ci:fmt:go:check ci:fmt:markdown:check ci:lint:go\nci:lint:markdown ci:lint:openspec`",
"is_bot": false,
"headline": "feat(cli): simplify list command (#20)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-11T02:33:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "72620ebe9eff10418300a7ccb6e83ddf4eea92d9",
"body": "## Summary\n- Add OpenSpec baseline specs and traceability as the canonical project\nreference.\n- Clean up stale documentation and include release packaging assets.\n- Split Nix tooling shells and expand local/CI QA gates for format,\nlint, tidy, vulnerability, and test checks.\n\n## Validation\n- `task ci:check`\n- `nix flake show --all-systems`\n- YAML/TOML parse and OpenSpec traceability reference check\n- `git diff --check`",
"is_bot": false,
"headline": "docs: document baseline specs and tighten QA gates (#19)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-11T01:32:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "be57a48f49d245a90ab352f829f413c9ee8422d3",
"body": "…ixed gates (#18)\n\n## Summary\n\nReplace the 7-workflow pile (15+ duplicated `actions/checkout` +\nNix-installer + FlakeHub-cache step blocks across 10 jobs in `ci.yml`\nalone) with a small library of reusable workflows + one composite\naction. Caller workflows become short orchestrators; gates have a si\n[…]\ncause GitHub does\nnot run a workflow at all on `labeled` events when `pull_request:\npaths:` is set and the diff misses → label-gate removed from inline;\nad-hoc PR runs use `workflow_dispatch` instead.",
"is_bot": false,
"headline": "ci: pipeline reorganization — reusable workflows, composite action, f…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-09T17:40:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "aa214fb20881ef416fbeda36bfb419151cfb6bdd",
"body": "… (#17)\n\n## Summary\n\nFour-commit branch addressing one CI failure and three production bugs\nsurfaced while running `usbip-go serve` against an ASIX AX88179B\nUSB-Ethernet dongle.\n\n## Commits\n\n- **b07cb8a** `ci(coverage)` — pin `vladopajic/go-test-coverage` back to\nv2.18.6. v2.18.7's PR #308 changed f\n[…]\nX AX88179B (cdc_ncm bound)\nwithout operator-side rebind dance.\n- [x] Manual: `usbip-go list -l` now shows bound devices.\n- [x] Manual: all `serve` daemon log lines share the configured handler\nformat.",
"is_bot": false,
"headline": "fix(ci-kernel-cmd): coverage pin v2.18.6, bind order, log unification…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-09T03:59:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6b1182901d79978607025c905b53fd77558fe9e6",
"body": "…nixpkgs pin\n\nThe bumped golangci-lint v2.12.1 (loaded via the new nixpkgs pin\n8e58c3dfe4bd) ships a stricter linter set than v2.11.4. Auto-fix\nresolved the bulk: gofmt/whitespace, modernize, perfsprint,\nintrange, paralleltest, thelper, testpackage, wsl_v5 cuddling.\n\nManual changes:\n\n- .golangci.yml\n[…]\nteral formatting, intrange loops, etc.) — no behavioural changes.\n\nVerified inside dev container: `task check` passes (gofmt, lint @ 0\nissues, govulncheck @ no vulnerabilities, full test suite green).",
"is_bot": false,
"headline": "chore(lint): apply golangci-lint v2.12.1 cleanup; flake.lock for new …",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2f1f876787960749b2c9870fb4dc885ded0e445c",
"body": "…n jobs\n\nDeterminateSystems/flakehub-cache-action v3.19.0+ requires\n`id-token: write` at job scope to exchange the runner's OIDC token\nfor cache authentication. The workflow's top-level\n`permissions: contents: read` block does not grant id-token, so\nwithout per-job override the cache action would fail at runtime on\nboth vm-smoke and vm-integration.\n\nMirrors the per-job id-token grants already in ci.yml, codeql.yml,\nnightly.yml, and release.yml for the same action.",
"is_bot": false,
"headline": "ci(vm-integration): grant id-token: write to vm-smoke + vm-integratio…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "241543eb63b559808ce740be7a772010771ec333",
"body": "… deps\n\nBrings the spec's golangci-lint module dep into parity with main\n(PR #15). Transitive go.mod / go.sum changes:\n\n- github.com/tetafro/godot v1.5.4 -> v1.5.6\n- github.com/timakin/bodyclose pseudo-version refresh to 73d1f95b84b4\n- go-simpler.org/sloglint v0.11.1 -> v0.12.0\n- ClickHouse/clickhou\n[…]\n pulled in as new transitive deps for the\n v2.12.1 linter set.\n\nVerified locally: golangci-lint run on the full code surface still\nreports 0 issues; go test -race for cmd/pkg/internal/test all green.",
"is_bot": false,
"headline": "chore(deps): bump golangci-lint v2.11.4 → v2.12.1 + transitive linter…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "25be377e7a84dfb87484e26bc8c610fa22bf9ed6",
"body": "…tch)\n\n- DeterminateSystems/flakehub-cache-action: v3.18.1 -> v3.19.0\n- github/codeql-action/init: v4.35.2 -> v4.35.3\n- github/codeql-action/analyze: v4.35.2 -> v4.35.3\n- github/codeql-action/upload-sarif: v4.35.2 -> v4.35.3\n- vladopajic/go-test-coverage: v2.18.6 -> v2.18.7\n\nSHA-pinned upgrades only — no behavioural workflow changes. Brings\nspec into parity with main's dependabot-driven action updates (PR #12\n+ #16). Touches all seven workflows in .github/workflows/.",
"is_bot": false,
"headline": "chore(deps): sync GitHub Actions pins with main (5 actions, latest pa…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4cd37d52d2f3fb42eead4821b15b0e00eb4853f8",
"body": "…pin nixpkgs to staging-next tip carrying go_1_26 1.26.3\n\nCloses two stdlib vulnerabilities surfaced by govulncheck on the\nprior Go 1.26.2 baseline:\n\n - GO-2026-4971 (net@go1.26.2)\n - GO-2026-4918 (net/http@go1.26.2)\n\nBoth fixed in Go 1.26.3.\n\n- go.mod: go 1.26.2 → 1.26.3.\n- go.sum/go.mod: golang.\n[…]\nulncheck (no\nvulnerabilities found).\n\nCI verification pending: nix flake update will refresh flake.lock to\nmatch the new pin; CI's nix develop --command surface picks up the new\ngo_1_26 automatically.",
"is_bot": false,
"headline": "chore(deps): bump Go to 1.26.3, x/sys to 0.44.0, charm tooling deps; …",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "79b500be7dd0a570eb97ee71f37bf33780fa809c",
"body": "Auto-fix: gofmt formatting (3 files), wsl_v5 whitespace cuddling\n(7 sites), noinlineerr deinlining (3 sites), testifylint\nrequire.Equal narrowing (2 sites).\n\nManual:\n- gosec G115 path-based exclusion in .golangci.yml for the new\n internal/adapter/kernel/(attach|export).go uintptr↔int round-trips\n \n[…]\n8 →\n under cap).\n- gocognit: split Shutdown into captureShutdownState + spawnGraceful-\n Disconnects helpers (20 → under cap); extract performImportHandshake\n from attachOverDialed (13 → under cap).",
"is_bot": false,
"headline": "chore(lint): apply golangci-lint cleanup across recent refactors",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "08ea70801505531f35e116230e7e73bb449c1522",
"body": "- app/limits: newAcceptLimiter rejects NaN and +/-Inf rps. Without\n the guards a NaN slipped through the rps <= 0 check (NaN\n comparisons are false), and rate.NewLimiter(NaN) produced a\n limiter that permitted every connection — silently disabling the\n accept-rate ceiling.\n- cmd/health: readines\n[…]\none branch returns 503\n immediately so a wedged probe that ignores its ctx cannot stall\n the /readyz handler; the orphaned probe goroutine completes on\n its own time without holding the connection.",
"is_bot": false,
"headline": "fix: reject NaN/Inf accept-rate; race readiness probe against ctx",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "06cf8efefc4a1948a795fd746aacc3284061c22c",
"body": "Each Subscribe call spawned a ctx-watcher goroutine that selected\non ctx.Done() or unsubSig. When the dispatcher exited unexpectedly\n(fatal netlink error), the cleanup goroutine closed subscriber\nchannels but never fired unsubSig — so every per-subscription\nwatcher leaked until its caller's ctx eventually cancelled. Add a\nthird select case on dispatcher.done so a dispatcher death tears\nevery watcher down promptly.",
"is_bot": false,
"headline": "fix(kernel): close per-subscription watcher on dispatcher exit",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cf271a6f80055455e9a1766579f4b040b77860a3",
"body": "The CLI defer-Close fired the moment runAttach returned, cancelling\nthe AutoReconnect watcher inside Importer the same instant the\nattach command finished printing its result. Effectively\n--auto-reconnect was a no-op for the CLI: the watcher had no\nopportunity to observe a detach before it was torn down. Now\nrunAttach blocks on ctx.Done() when AutoReconnect is set, closing\nonly after SIGINT/SIGTERM propagates through cobra's signal-aware\nctx. Without the flag the CLI remains one-shot.",
"is_bot": false,
"headline": "fix(cmd): keep Importer alive in `attach --auto-reconnect`",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5c7f62af304e3e7d2f259e4326eeca60cb7c2657",
"body": "… e.mu\n\n- runHandoff: replace tryHandoff with a wrapper that holds handoffMu\n only while flipping the cancelled / handedOff flags, NOT during\n the ExportOnConn sysfs write. Holding the lock across the kernel\n call deadlocked Shutdown's signalCancel when ExportOnConn wedged.\n The fundamental orph\n[…]\ncannot\n race the channel initialisation and read nil. Capture the channel\n before unlocking and pass it explicitly to waitDisconnectBounded;\n the function no longer reads e.disconnectDone directly.",
"is_bot": false,
"headline": "fix(app): runHandoff narrows handoffMu; allocate disconnectDone under…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3fe4b26624de3de230c533d40d19b36049ce40f0",
"body": "…annel\n\n- session/exporter: per-handle handoffMu + tryHandoff/signalCancel\n atomically resolves the runRegisteredSession-vs-Shutdown race. The\n prior pre-handoff select-default check was best-effort; now\n Shutdown observes whether the handler reached ExportOnConn before\n scheduling Disconnect. A\n[…]\nompletion event instead of each spawning a\n fresh wg.Wait helper that raced an already-cancelled drainCtx and\n surfaced spurious wrapped-ctx errors. waitDisconnectBounded was\n reworked accordingly.",
"is_bot": false,
"headline": "fix(app): per-handle handoffMu/signalCancel; shared disconnectDone ch…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bcfa5752ebbd9e23ddd8b3c57c1b6bc9663267ca",
"body": "…test fixture\n\n- waitDisconnectBounded godoc: explicitly note the wg.Wait helper\n goroutine remains parked until every Disconnect goroutine returns.\n Same accepted leaked-goroutine trade-off documented in the wedged-\n handler note in waitSessionsBounded; the leak is bounded (one\n helper per Shut\n[…]\nown that fires between registerSession and ExportOnConn,\n intermittently failing TestExporterShutdown_DeadlineExceeded\n which expects the drain to time out with the handler parked in\n ExportOnConn.",
"is_bot": false,
"headline": "fix(app): document waitDisconnectBounded helper-goroutine leak; sync …",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "558feadf435d439bafda2ea8cbe793e549ce681c",
"body": "- session: pre-handoff cancel check in runRegisteredSession. After\n registerSession returns, Shutdown can race the new handle:\n snapshot, cancel, spawn Disconnect — all between the\n registerSession-mu unlock and the ExportOnConn call. Without the\n new select on handle.done + ctx.Done before Expo\n[…]\n gets a non-blocking re-check after drainCtx\n fires and is skipped entirely when no goroutines were spawned\n (handles empty), avoiding a spurious wrapped-ctx error on a no-op\n second Shutdown call.",
"is_bot": false,
"headline": "fix(app): pre-handoff cancel check; surface bounded Disconnect error",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ada233d7096e0585adaaa918875f4bcbd460a223",
"body": "The bounded shutdownTimeout backstop is applied via\napplyShutdownBackstop to derive drainCtx; previously the per-session\nDisconnect goroutines carried the original caller ctx, so the\nconfigured backstop could not cancel a stuck Disconnect — only\nwaitDisconnectBounded's wait was bounded. Reorder Shut\n[…]\nDisconnect goroutine. The kernel\nsysfs write itself is still uncancellable (kernel API limitation)\nbut the Go-side ctx now matches the documented backstop semantics\nfor any cancellable kernel adapter.",
"is_bot": false,
"headline": "fix(app): thread drainCtx into Shutdown's per-session Disconnect",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "03f22042c6bb5a276486d5da7a52fee831b1659d",
"body": "Per-busid Disconnect goroutines previously outlived Shutdown silently.\nA wedged kernel sysfs write still leaks the goroutine (no userspace\ncancellation hook), but Shutdown now waits on them up to drainCtx and\nlogs a Warn if any remain pending when the deadline fires. Diagnostic-\nonly — the leaked-goroutine trade-off still applies, but the leak no\nlonger hides past the Shutdown return.",
"is_bot": false,
"headline": "fix(app): bound Shutdown Disconnect goroutines by drainCtx",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4cd49059b516e9cf41e183fb7394ec8b813f944f",
"body": "The contract requires Shutdown to remain callable multiple times\n(Close paths and explicit shutdown race), so a hard idempotent early-\nreturn is not acceptable. Without a gate, repeat Shutdown calls\nre-spawn per-busid Disconnect goroutines on top of any already-wedged\nfrom the prior invocation.\n\nCap\n[…]\nly. Subsequent calls fall through to wait on the\nshared drain future, which is itself idempotent. waitSessionsBounded\nand the ctx-spurious-deadline race tests pass because the drain path\nis unchanged.",
"is_bot": false,
"headline": "fix(app): gate Shutdown side-effects behind firstShutdown flag",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6dc7d887c385c55e2fed56c48f870eec34e51b1b",
"body": "… across reply\n\n- exporter Shutdown: cancel every session handle BEFORE issuing the\n graceful kernel Disconnect, and run each Disconnect in its own\n goroutine. The prior sequential loop blocked the bounded drain\n when a single sysfs Disconnect wedged: h.cancel() never ran, the\n drain never made \n[…]\nompletes. Previously the timeout was cleared right after the\n request body decode, so a client that wrote a valid request and\n then stopped reading parked the handler in EncodeOpRep*\n indefinitely.",
"is_bot": false,
"headline": "fix(app): cancel handles before kernel Disconnect; arm import timeout…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1598b80cdec3d792b08766a2099ac0b5a96e4efe",
"body": "…alidation\n\n- kernel/device: isExportable now hides a usbip-host bound device\n when its usbip_status read fails. The prior permissive default\n advertised devices the kernel had not finished attaching, so peers\n attempted attaches the kernel rejected. Hiding briefly during\n rebind is the safer tr\n[…]\nxportedDevices missing-status test\n for the new strict semantics; per-conn busid pairing in concurrent\n attach test (shared queue raced and mismatched encode/decode pairs\n under parallel dispatch).",
"is_bot": false,
"headline": "fix(kernel-wire): strict isExportable; topology ENOENT alias; speed v…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5282db6251f0ae6b596480c1dadf26c6b959405d",
"body": "…usid match\n\n- session: subscribe-failure path now sends an OP_REP_IMPORT-error\n (ST_DEV_ERR) before returning. Previously the importer received\n EOF on a registration that had already passed device lookup, with\n no protocol-level rejection signal.\n- exporter: registerSession rejects a second con\n[…]\nn cannot\n block daemon exit beyond the configured deadline.\n- tests: codec mocks track requested busid so reply matches; per-peer\n cap test uses distinct busids per session (busid uniqueness guard).",
"is_bot": false,
"headline": "fix(app-cmd): subscribe-failure ST_DEV_ERR; busid uniqueness; reply b…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c6c9558cfdc899570bcbd8fb6188aaeb4fb60e8a",
"body": "…wn ST_*\n\nHIGH protocol bug: serveImport never sent OP_REP_IMPORT before the\nkernel sockfd handoff, so a real client (upstream usbip or this Go\nimporter) parked indefinitely waiting for the reply.\n\n- session: serveImport now looks the requested device up in the\n exported set BEFORE building any ses\n[…]\nt for\n the stricter unknown-status mapping; thread ListExportedDevicesFunc\n plus EncodeOpRepImportFunc / EncodeOpRepImportErrorFunc through\n every exporter test that exercises the import handshake.",
"is_bot": false,
"headline": "fix(app-wire): send OP_REP_IMPORT before kernel handoff; reject unkno…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "dce0c3b69c569368f7194eaa6b1aaacf345b7475",
"body": "…oroutines\n\n- kernel: dup the fd inside the extractFD Control callback so a\n concurrent conn.Close (e.g. exporter Shutdown force-close) cannot\n release the underlying fd between extraction and the kernel sysfs\n write; callers close the dup'd fd via defer after the write. Tests\n updated: fd value\n[…]\nor OP_REP_IMPORT decode by\n closing the connection from a separate goroutine. The watcher\n exits cleanly on function return via a watchDone channel so there\n is no goroutine leak on the happy path.",
"is_bot": false,
"headline": "fix(kernel-app): dup fd in extractFD (TOCTOU); importer ctx-watcher g…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e34b945bf77e27f1b5bd932dda6c72ed9bc6a962",
"body": "- header: extend status=0 enforcement to request opcodes; the spec\n mandates status=0 on all headers — prior code only checked reply\n opcodes. Remove now-unused isReplyOpCode helper and update the\n mutation-baseline comment.\n- importer: surface SetReadDeadline failures as errors on both the\n dev\n[…]\nnstraint on the\n usbip-host/unbind sysfs write; this is a kernel-API limitation\n with no userspace cancellation path, so callers requiring a hard\n deadline must rely on OS-level process management.",
"is_bot": false,
"headline": "fix(wire-app): status=0 for all opcodes; surface SetReadDeadline errors",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0d9c1dcbfee57f7ac6059d373dcf26af3216df01",
"body": "… ctx deadline\n\n- uevent: add cleanup goroutine on dispatcher start; when run() exits\n unexpectedly (fatal netlink error) the goroutine closes all\n subscriber channels (callers see end-of-events) and clears the\n stale a.disp pointer so the next Subscribe dials a fresh connection\n instead of atta\n[…]\ny after a vhci_hcd module reload.\n- importer: propagate ctx deadline to the attach connection's read\n deadline before DecodeOpRepImport, matching the deadline already\n applied to DecodeOpRepDevlist.",
"is_bot": false,
"headline": "fix(kernel): dispatcher exit cleanup; topology retry-on-error; attach…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6e392e8a5594fb9efc8e5eb1fcc49078f526d718",
"body": "- exporter: wrap acceptLoopExited close in sync.Once so a panic inside\n acceptLoop or spawnCtxListenerCloser still unblocks a concurrent\n Shutdown (panic path previously left the channel open).\n- session: keep handshake timeout armed during EncodeOpRepDevlist write;\n serveDevlist now receives and\n[…]\n- serve: remove status socket in the goroutine after fn() returns if\n it bound successfully, ensuring cleanup when the caller timed out\n on the ready signal without registering its own unlink defer.",
"is_bot": false,
"headline": "fix(app): panic-safe acceptLoopExited; arm devlist timeout across write",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "68695954e0bfe2b131aac88c9fcd4c053ef53ae5",
"body": "…ted race\n\nReplace sync.WaitGroup with lifecycleWaitGroup (channel-counter) so\ndrain futures can be observed via select without spawning waiter\ngoroutines. Eliminates two MEDIUM goroutine leaks: importer\nwaitGroupBounded and exporter drainFuture both used fire-and-forget\ngoroutines blocked on WaitGr\n[…]\nlled.\n\nLog conn.Close failure in attachAtPort after kernel handoff at Debug\nlevel. The error is benign (kernel already holds its own fd ref) but\nsilent failures here obscure transient fd-table issues.",
"is_bot": false,
"headline": "fix(app): replace WaitGroup with channel-counter; close acceptLoopExi…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "edf5532d781cf1974a15a9f72a19ea22b5ef6d06",
"body": "Remove \"(client)\" / \"(server)\" parentheticals from README — avoided\nterms per domain glossary. Fix install command in ops.md: binary is\n`usbip-go`, path is `/usr/local/bin/`.",
"is_bot": false,
"headline": "docs: fix terminology and binary name in README and ops",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1f1645a84db7481fae6f837764e88a61dc11aec4",
"body": "Replace ./... with explicit package paths in ci:test and ci:test:cover\nso the build module marker is no longer needed to stop go test from\ndescending into the module cache. Untrack build/go.mod and collapse\nthe gitignore exception to a plain /build/ rule.\n\nRename \"Flagged ambiguities\" section in CONTEXT.md to \"Term\ndisambiguation\"; remove \"Resolved:\" process prefixes throughout.",
"is_bot": false,
"headline": "chore: remove build/go.mod sentinel, clean spec term disambiguation",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "83f844152f70d08630258ca17534232e1439027c",
"body": "…face\n\nCollapses the two-binary tree (cmd/usbip + separate daemon) into a\nsingle cmd/usbip-go. All roles — importer, exporter, daemon — are\nexposed as flat top-level verbs. Daemon mode is `usbip-go serve`.\n\nKey changes:\n- cmd/usbip/ → cmd/usbip-go/ (directory rename, 77 files)\n- activationFdName: \"u\n[…]\ner.Attach/attachOverDialed\n- WatchSessions and Watch: lazy-subscribe so unranged iter.Seq leaks\n no channel or goroutine\n- DisconnectReasonGraceful removed (unused constant)\n- Coverage: 92.4% → 93.7%",
"is_bot": false,
"headline": "feat(cmd): rename binary usbip → usbip-go, single flat-subcommand sur…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2acdc53098d5b62e41d0bb659648f707419490ab",
"body": "Add .github/workflows/vm-integration.yml so the project's microVM\nintegration tests run on a schedule + on relevant PRs without\ngating every push on the slow path:\n\n- vm-smoke (5-10 min): builds the microVM closure via Nix, boots\n qemu_kvm, asserts every required USBIP kernel module is present\n in\n[…]\nueueing up VM boots.\n\nThe Taskfile.yml `task vm:smoke` and `task vm:test:integration`\nlocal commands are unchanged — operators can still iterate on the\nVM tests interactively without going through CI.",
"is_bot": false,
"headline": "ci: nightly VM-integration workflow exercises the full kernel surface",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7df7a7034072117bd1cbdb16389e71baecab2eab",
"body": "Cover the largest uncovered functions surfaced by go-test-coverage:\n\ncmd/usbip/health_test.go (new) — covers the entire health.go module\nthat lived at 0%:\n- ready() truth table (all flags + each flipped false in turn,\n zero-value safety)\n- newLivenessChecker constant 200\n- newReadinessChecker happy\n[…]\nEmptyIter (Subscribe error\n path)\n\nCoverage delta:\n- 92.4% → 93.7% (+47 lines)\n- All new tests behavior-focused (no implementation coupling)\n\nTests: 1331 pass with race detector. golangci-lint clean.",
"is_bot": false,
"headline": "test: raise coverage 92.4% -> 93.7% (+1.3pp)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "62e0de7a0c4dd12495ab18476055fdd432c42f80",
"body": "The branch made two intentional public-API deltas through the spec\n+ migration phases:\n\nADDITIONS to pkg/usbip:\n- PortAttachedEvent / PortDetachedEvent / PortErroredEvent /\n DeviceBoundEvent / DeviceUnboundEvent / SessionStartedEvent /\n SessionEndedEvent type aliases (round-2 facade re-exports so\n\n[…]\nstcoverage.yaml: 92.4% (>= 90%)\n- DDD boundary grep gates: clean\n- no-cgo gate: clean\n- Cross-compile linux/darwin/windows × amd64/arm64 ./pkg/...: clean\n- apidiff against regenerated baselines: clean",
"is_bot": false,
"headline": "chore(api): regenerate apidiff baselines after public-API delta",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b4cec6252b59c20c9b251cce095e84df60c7261e",
"body": "Round 7 codex review caught residual stale references in:\n- docs/ops.md: header, install paths, systemd unit example bodies\n (FileDescriptorName, ExecStart), --status-socket-group default,\n daemon-flag table, journalctl unit name, drain-and-upgrade\n recipe, troubleshooting checklist\n- cmd/usbip/s\n[…]\n,\nthe systemd units are `usbip.service` / `usbip.socket`, the daemon\nruns as `usbip serve`, and the default --status-socket-group is\n`usbip`.\n\nTests: 1305 pass with race detector. golangci-lint clean.",
"is_bot": false,
"headline": "docs: drop stale usbip-go/usbipd-go references after single-binary merge",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "385b382fedfcdd3e6a7de3e6265408aa3d60ca2b",
"body": "Round 6 codex review found a stale claim in handleStatusDrain's doc\ncomment: \"Exporter.Shutdown wraps in sync.Once\". The actual\nimplementation at internal/app/exporter.go:331-349 uses a mutex-\nguarded flag-and-clear pattern (sets the shutdown flag under\nExporter.mu and captures-and-clears the listen\n[…]\n-op pass).\nADR-0012 was already corrected in earlier rounds; this comment was\nthe last surviving instance of the wrong claim.\n\nNo code change. Tests: 1305 pass with race detector. golangci-lint\nclean.",
"is_bot": false,
"headline": "docs: handleStatusDrain comment matches actual idempotency mechanism",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4f5ca619ead11e78b41f16c0475618bc42576405",
"body": "…; clarify session-accounting reset\n\nRound 5 codex review: 3 BUGs.\n\n- runDrain wrote \"drain timed out after X\" directly to cmd.ErrOrStderr\n AND returned errDrainTimeout. main's renderMainError formats every\n returned error through FormatError, which renders errDrainTimeout\n as \"usbip: drain timed\n[…]\n, daemon-layer accounting does not, and\n operators needing accounting continuity must drain fully before\n upgrading rather than mid-flight.\n\nTests: 1305 pass with race detector. golangci-lint clean.",
"is_bot": false,
"headline": "fix(drain): validate --poll-interval; remove duplicate timeout stderr…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "35a8036b04b34fd76c57fffceea8637819b0d7b6",
"body": "…echanism\n\nRound 4 codex review found three remaining stale facts in\ndocs/adr/0012-drain-mechanism-http-over-uds.md:\n\n- \"Polls every 500ms\" — actual default at cmd/usbip/drain.go:25 is\n drainPollInterval = 200 * time.Millisecond. Updated.\n- \"Default `usbip-go` group\" — actual default at\n cmd/usbip\n[…]\nid-drain case —\n Round 2 fixed the same claim on the adjacent row but missed this\n one. Rewrote to match the actual flag-and-clear pattern.\n\nTests: 1302 pass with race detector. golangci-lint clean.",
"is_bot": false,
"headline": "docs: ADR-0012 fact-fix — poll interval, default group, idempotency m…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6a6ee3206b74d898fec562cb77af84ab6d6e981c",
"body": "Round 3 codex review: errStatusSocketDisabled fell through MapError's\nsentinel registry and landed on the ExitGeneric default (1). Empty\n--status-socket is a command configuration / preflight class fault,\nnot a runtime fault — it should exit with ExitUsage (2) so\nsupervisors and shell scripts can di\n[…]\nubcommandRejectsEmptyStatusSocket extended to assert\nMapError(err) == ExitUsage so a regression that drops the registry\nentry surfaces in CI.\n\nTests: 1302 pass with race detector. golangci-lint clean.",
"is_bot": false,
"headline": "fix(drain): map errStatusSocketDisabled to ExitUsage",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "48b415b14d3b9b12e8fd5d7dbe10fdceaf9c0afe",
"body": "…t; ADR fact-fix\n\nRound 2 codex review of the drain phase:\n\n- ADR-0012 Idempotency section incorrectly described Exporter.Shutdown\n as sync.Once-guarded. The actual mechanism is a `shutdown` flag set\n under Exporter.mu plus the listener captured-and-cleared so\n subsequent calls find an empty sess\n[…]\nerators\n understand the configuration root cause rather than chasing\n ENOENT/EINVAL. TestDrainSubcommandRejectsEmptyStatusSocket pins\n it.\n\nTests: 1302 pass with race detector. golangci-lint clean.",
"is_bot": false,
"headline": "fix(serve): drain query-param rejection; preflight empty status-socke…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ea987d4968c2aa63da611c1cb50ef7fabb14f0e5",
"body": "Round 1 codex review of the drain phase surfaced one BUG, two\nSUSPECTs, and one ADR completeness gap.\n\nThe serveStatus closure used context.WithoutCancel(ctx) for drainCtx\nunder the comment \"cancels alongside daemon shutdown while ignoring\nper-request cancellation\" — but context.WithoutCancel return\n[…]\n failure — the daemon exits either way,\n retry is via daemon restart with a bumped --shutdown-timeout.\n\nCross-reference to docs/ops.md added. Tests: 1300 pass with race\ndetector. golangci-lint clean.",
"is_bot": false,
"headline": "fix(serve): drainCtx propagates daemon cancel; 202 vs 200 split",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e12e2340ad3fec75a0029309ac27a4d6ebf84592",
"body": "ADR-0012 captures the drain mechanism design (HTTP-over-UDS with\nclient-side polling) plus the rejected alternatives (signals,\nsd_notify, gRPC, custom binary protocol). The decisive trade-offs:\n\n- Signals collapse to one bit — no command parameters, no typed\n ack, no operator-group permission model\n[…]\nmeout\nrelationship and recommends keeping the client bound > server bound\nso the operator-visible result tracks the daemon's actual behavior.\n\nTests: 1300 pass with race detector. golangci-lint clean.",
"is_bot": false,
"headline": "feat(serve): idempotent POST /drain handler; ADR-0012",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "61a7e11d999633755d0abb5756edd64180beee09",
"body": "…up log\n\nRound 6 codex review:\n\n- classifySessionDeclineOutcome had ErrACLRejected and ErrRateLimited\n branches that the round-5 wiring made unreachable: ACL and rate\n rejections happen in acceptLoop BEFORE registerSession runs and emit\n their outcome labels directly at those sites in exporter.go\n[…]\ntical future PR. Deferred — the symmetric concern is\n not specific to this branch and would inflate the test surface for\n conjectural risk.\n\nTests: 1299 pass with race detector. golangci-lint clean.",
"is_bot": false,
"headline": "fix: simplify session-decline classifier; test build-provenance start…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8e60aafc990439897817af09a0e358d7476b201a",
"body": "…; LastError leak doc\n\nRound 5 codex review surfaced two BUGs and one SUSPECT:\n\n- runRegisteredSession's pre-subscribe failure path returned without\n storing a typed DisconnectReason on the handle, so the deferred\n endSession published the \"handler exited\" fallback instead of\n kernel_error. The S\n[…]\nd scrub before forwarding to less-privileged audiences,\n rather than silently leaking diagnostic strings to whoever consumes\n Watch output.\n\nTests: 1298 pass with race detector. golangci-lint clean.",
"is_bot": false,
"headline": "fix: pre-subscribe failure stores typed reason; ACL/rate emit outcome…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9ffd40e383d614344d4475c1cd4b82583c6620b5",
"body": "…oc port_reconnect_exhausted\n\nRound 4 codex review surfaced two BUGs:\n\nDisconnectReason enum values were defined but never emitted:\nwaitForSessionEnd returned a typed DisconnectReason that\nrunRegisteredSession discarded; endSession logged a free-form\n\"handler exited\" string. The fix threads the type\n[…]\ne production\nevent union; the new event's record shape is documented with the\nattempts and last_error fields and an ADR-0009 cross-reference.\n\nTests: 1298 pass with race detector. golangci-lint clean.",
"is_bot": false,
"headline": "fix: wire DisconnectReason into endSession; drop dead Sysfs* enums; d…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "012231302457e54b089a2641a2bec3ff9719ea58",
"body": "…tests\n\nRound 3 codex review surfaced three BUGs:\n\n- statusExporter.KernelModules's lock-then-probe-then-write pattern\n had a write race: a probe started at t=0 finishing AFTER a probe\n started at t=1 would overwrite the fresher cache with stale data.\n The post-probe re-acquire now double-checks \n[…]\nas a false positive — paralleltest\nrecognises t.Setenv as a parallel-incompatible call and suppresses\nthe warning, so no exclusion is needed.\n\nTests: 1298 pass with race detector. golangci-lint clean.",
"is_bot": false,
"headline": "fix: KernelModules cache double-check; doc port/watch verbs; outcome …",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d6c71a29c704e2f74d4177336b7dc70c27583e6f",
"body": "Round 2 codex review surfaced two BUGs and two SUSPECTs:\n\n- pkg/usbip did not re-export the new PortReconnectExhausted event\n type or its EventKind constant. Public consumers had to reach into\n pkg/domain to type-assert on a Watch yield, breaking the facade\n boundary established by ADR-0003. The \n[…]\nImporterReconnectExhaustedAttemptsTable parametrised over\n MaxAttempts in {1,3,5} so the off-by-one fix is locked in across\n the cap range.\n\nTests: 1294 pass with race detector. golangci-lint clean.",
"is_bot": false,
"headline": "fix: re-export events on facade; classify Permission/NoFreePort attaches",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "acafa540bbd6c8e43f0f04dc0a318dfe7663ce76",
"body": "Two findings from the second adversarial review on this branch:\n\n- Importer.Watch's merged select is pseudo-random per Go semantics.\n When ctx.Done() and an event channel are simultaneously ready, the\n iterator may yield ONE final event before terminating.\n newImporterMergedSeq's doc comment now \n[…]\nle covering the v1\n contract §7.4 catalog plus the new code 12 entry, and the daemon-\n flag section now references `usbip serve --help` instead of the\n retired `usbipd-go --help`.\n\nNo code changes.",
"is_bot": false,
"headline": "docs: exit-code table; document Importer.Watch cancellation semantics",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d7bb542e8d54ee3524cd3fd0836cecd3b73abeca",
"body": "Codex adversarial review of the cmd/ merge surfaced three real issues:\n\n1. bindServeFlags re-declared --log-level / --log-format / --verbose\n that the root command already exposes as persistent flags. Cobra\n tolerates the parallel registration but the SHADOW masks the\n root's parse: an operato\n[…]\nvery binary_*_test.go file in the\n merged tree.\n- No importer test calls os.Chdir, so the relative TMPDIR cleanup\n path stays well-defined.\n\nTests: 1290 pass with race detector. golangci-lint clean.",
"is_bot": false,
"headline": "fix(cmd): drop duplicate logging flags from serve; rename systemd units",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d977e8272069dfb8642f27b5cfde3d9f33b400e4",
"body": "Per ADR-0011, the unified `usbip` binary exposes flat top-level verbs:\n\n usbip list\n usbip attach\n usbip detach\n usbip bind\n usbip unbind\n usbip serve (replaces upstream `usbipd`, the daemon)\n usbip drain\n usbip version\n\nThe two-binary tree is gone. Daemon-side files (run.go, drain.go,\nh\n[…]\nlusions retargeted; .testcoverage.yaml +\n.github/codecov.yml exclusions retargeted; internal/testutil/binbuild.go\ncallers updated to \"usbip\".\n\nTests: 1290 pass with race detector. golangci-lint clean.",
"is_bot": false,
"headline": "refactor: merge cmd/usbip-go + cmd/usbipd-go into single cmd/usbip",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9c92e15d47b7b9bd1e7ddaed2e4837b05a62ea8c",
"body": "Capture the decision for the impending cmd/ merge. The new `usbip`\nbinary exposes flat top-level verbs (`usbip attach`, `usbip serve`,\n`usbip drain`, ...) rather than grouped subcommands (`usbip device\nattach`, `usbip server start`, ...).\n\nReasoning:\n\n- Unix tradition: management tools (`lsusb`, `ud\n[…]\np server drain`. Scripts\n that already use upstream `usbip attach -r host -b busid` keep\n working without rename.\n\nCONTEXT.md operator-vocabulary table updated to enumerate every verb\nwith its role.",
"is_bot": false,
"headline": "docs: ADR-0011 single binary uses flat verbs",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "462ad442082acb5316a3a70f8567af2bf083bf27",
"body": "Audited what the metrics layer told operators that journald + sysfs +\nsystemd did not already tell them. Of twelve metrics, only handshake\nduration histogram and reconnect-rate aggregations were uniquely\nPrometheus-only; the other ten duplicated information visible through\nusbip list, /sys/devices/.\n[…]\nly need Prometheus metrics run a\nsidecar that parses journalctl --output=json instead of adding the\nlibrary back into their dependency graph.\n\nTests: 1292 pass with race detector. golangci-lint clean.",
"is_bot": false,
"headline": "refactor: drop Prometheus metrics layer; observability via slog + sysfs",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1bd76aee7e11e283263a123d3f928dd5dd370229",
"body": "Add docs/agents/ with three workflow conventions consumed by the\nmattpocock/skills engineering skill set: issue tracker workflow\n(GitHub via gh CLI), triage label vocabulary (the five canonical\nroles), and domain doc layout (single-context, references CONTEXT.md\nand docs/adr/).\n\nThese files document\n[…]\ne\nexisting CONTEXT.md and ADR set.\n\nGitignore CLAUDE.md and AGENTS.md (the AI-tool convention pointer\nfiles at the repo root): they're thin index files, the substantive\nworkflow lives in docs/agents/.",
"is_bot": false,
"headline": "chore: scaffold per-repo agent skills config",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9d4d5e781674594238a9e8b098e90b3fbb12a02f",
"body": "Capture the project's domain language and foundational architectural\ndecisions, then add a new PortReconnectExhaustedEvent surfaced through\nImporter.Watch when the reconnect watcher gives up.\n\nSpec scaffold:\n- CONTEXT.md establishes the bounded-context vocabulary (Exporter,\n Importer, Device, BusID\n[…]\ng mechanism that would emit them\n(WatchRemote) was never built and would be a connection-churn\npattern against the exporter rate limiter; defer to a concrete\nauto-attach use case before reintroducing.",
"is_bot": false,
"headline": "feat: domain spec scaffold + PortReconnectExhausted event",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c2d31601571202f404cb3ccee500a0390c3d4e70",
"body": "## Summary\n\nFixes the bind path against composite USB devices (the original ASIX\nAX88179 USB-Ethernet trigger) and brings the bind/unbind implementation\ninto conformance with upstream Linux usbip-utils via a multi-pass review\nagainst the kernel's `usbip_bind.c`, `usbip_unbind.c`, and\n`drivers/usb/us\n[…]\nne defensive\n`ListDirEntries` error path in `busIDInterfaceDirs` untestable via MapFS\n— production-only)\n- [ ] Smoke test on Pi 5 (ASIX AX88179): bind → attach loopback → ping\nover the imported netdev",
"is_bot": false,
"headline": "fix: bind multi-interface devices + upstream-conformance audit (#14)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5e9c37fb49722d4fde2cf9066d04303de14aafff",
"body": "## Summary\n\nBug fixes plus a CLI/UX refresh, all converged through TDD + Codex\nadversarial review.\n\n### Fixes\n\n- **Speed bug** — sysfs reports Mbps strings (`5000`, `10000`); old code\ncast raw to enum. New `ReadSpeedAttr` lookup table covers every Linux\n`speed_show()` output.\n- **Wire double-read** \n[…]\nd-trip succeeds without `0x332d`\nmismatch\n- [ ] `--output=json` consumers see no schema diff\n- [ ] After merge: tag `v1.1.0`, verify pkg.go.dev shows Apache 2.0\nlicense + retracted versions\n\n---------",
"is_bot": false,
"headline": "fix: sysfs speed + wire double-read + bind ergonomics + UX refresh (#13)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c1efa4bbda100483b8a54d2fe0792bb5f42284ba",
"body": "Bumps the github-actions group with 2 updates:\n[vladopajic/go-test-coverage](https://github.com/vladopajic/go-test-coverage)\nand\n[goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action).\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": false,
"headline": "ci(deps): bump the github-actions group with 2 updates (#12)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a090456082366b88a9336efb9554e09fe8d0161c",
"body": "## Summary\n\n- Adds `retract` directives for `v0.1.0` and `v1.0.0`, both published\naccidentally\n- `v0.2.x` is the correct release line\n- After merge, cut `v0.2.1` so pkg.go.dev indexes the retraction and\nre-detects the license\n\n## Test plan\n\n- [ ] Merge and tag `v0.2.1`\n- [ ] Verify pkg.go.dev shows `v0.1.0` and `v1.0.0` as retracted\n- [ ] Verify license detected on pkg.go.dev module page",
"is_bot": false,
"headline": "fix(module): retract v0.1.0 and v1.0.0 published accidentally (#11)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9ebe262575ed3c4df757c5d77c68c85e9245eadb",
"body": "Project 12654. Sits beside the existing Scorecard badge so the two OpenSSF signals are visually grouped.",
"is_bot": false,
"headline": "docs(readme): add OpenSSF Best Practices badge (#10)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5c820e51cde0c0168b3817b79717920d26e72298",
"body": "… body (#9)\n\n## Summary\n\n- **Root cause** of the empty release body on v1.0.0: `.goreleaser.yml`\nhad `changelog.disable: true`. In goreleaser v2\n(`internal/pipe/changelog/changelog.go:45-51`), that flag short-circuits\n`Pipe.Skip` to `true`, which **skips the entire changelog pipe** —\nincluding the b\n[…]\n7-453 (silent-empty\nacceptance).\n- goreleaser v2.15.2\n[`internal/pipe/release/body.go`](https://github.com/goreleaser/goreleaser/blob/v2.15.2/internal/pipe/release/body.go)\n— body template at line 13.",
"is_bot": false,
"headline": "fix(release): drop changelog.disable so --release-notes file lands in…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "10250ba174245a0326f740672c6e9430069fae34",
"body": "…aracter (#8)\n\n## Summary\n\n- GitHub Actions rejected the `!v*.*.*+*` exclusion in `release.yml`\n`on:tags` with `push event contained invalid tags patterns`. `+` is a\nreserved glob metacharacter in GHA's tag-filter dialect (one-or-more\nquantifier), so the pattern fails the trigger validator before th\n[…]\nl excludes it.\n- [x] Push a probe build-metadata tag (`v0.0.0+build.7`) on a fork and\nconfirm the trigger fires but the ref_name guard step aborts the job\nwith \"tag is not a canonical stable release\".",
"is_bot": false,
"headline": "fix(release): drop ~/.ssh/config.*.*+* — GHA rejects + as glob metach…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f8c1f2fd7bc3e7e293a5c1d11b20eb296822990d",
"body": "…rcement (#7)\n\n## Summary\n\n- **Empty release body on v1.0.0** — `git-cliff --unreleased --tag $TAG`\nreturns nothing when the tag is at HEAD (which `actions/checkout` always\ndoes on tag push). Switch to `git-cliff --latest`; verified locally\nproduces 36KB body covering all conventional commits.\n- **P\n[…]\n[ ] Next stable tag (v1.0.1+) lands with full body\n\n## Verification\n\nCodex CONVERGED across 4 review rounds (cliff invocation, pre-release\nexclusion, ref_name guard + doc scrub, formatter enablement).",
"is_bot": false,
"headline": "fix(release): cliff --latest, stable-tag-only pipeline, gofmt -s enfo…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "47d1036da0e0abdf7e460dc455e73bb2f18b8407",
"body": "## Summary\n\n- v0.1.0 tag-push release failed because cosign v3.0.6 removed the\nlegacy `--output-signature` / `--output-certificate` two-file artefact\ncontract. With those flags ignored and no `--bundle` path supplied,\ncosign refused to sign and the GoReleaser step exited 1.\n- Migrate goreleaser `sig\n[…]\ner verify-artifact ...`, `cosign\nverify-blob --bundle ...`, `sha256sum -c --ignore-missing ...`.\n- [x] Confirm SLSA Build Provenance job still attaches\n`multiple.intoto.jsonl` (independent of cosign).",
"is_bot": false,
"headline": "fix(release): migrate cosign signing to Sigstore bundle format (#6)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e2109ac8018fc9a6fc9494e7d33cd5c95ce45465",
"body": "## Summary\n\n- Drop in-tree `CHANGELOG.md`; release notes generated at tag time via\n`git-cliff` and published as the GitHub Release body by goreleaser\n(`--release-notes` wiring through `ci:release` task; `release.draft:\nfalse` + `mode: replace`).\n- Add `govulncheck` SARIF emit + `upload-sarif` in `ci\n[…]\nHUB_TOKEN`).\n- [ ] Confirm README badges render: CI, CodeQL, Trivy, Scorecard,\nCodecov, Go Report Card, License.\n- [ ] `task lint` / `task test` / `task vuln` / `task ci:vuln:sarif` all\nclean locally.",
"is_bot": false,
"headline": "build(release): tag-driven notes + govulncheck/Trivy SARIF (#5)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "56d6665603c29e812a10640111cde880b1635413",
"body": null,
"is_bot": false,
"headline": "test(coverage): lift total coverage to 90%",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "79b6f0bed17b3f17909e2b8ed5c7d3f4d21023a3",
"body": null,
"is_bot": false,
"headline": "ci(scorecard): goreleaser-action marker + codecov coverage badge (#3)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f25654754ca8a6bb2a9d12197bdc8f27686030f2",
"body": "…ovenance (#2)\n\n## Summary\n\nLands the public `TransportOptions` surface and the adapter-side TCP tuning that honors it. Adds an option-honoring `Exporter.ListenAndServe` so accepted server-side connections inherit the configured tuning. Bundles supporting governance + supply-chain bits picked up alo\n[…]\nnternal/adapter/transport`; both reference `internal/netopts` only\n- [x] api-surface: `api/pkg_usbip.json` regenerated, diff is purely additive\n- [x] TDD discipline: every behavior change is RED-first",
"is_bot": false,
"headline": "feat(usbip-transport-ci): TransportOptions + ListenAndServe + SLSA pr…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c712aedefe923b67ea5c207f90ac47cec36b20bf",
"body": "* test(app): RED for TransportOptions plumbing (PR 1a)\n\nLock in PR 1a contract from docs/high-latency-plan.md §3:\n\n- TransportOptions struct with eight fields (DialConnectTimeout,\n TCPKeepAliveIdle/Interval/Probes, Send/ReceiveBufferBytes,\n Read/WriteDeadline).\n- ValidateTransportOptions rejects n\n[…]\nat honors the stored options — but callers reading the\ngodoc cannot tell that today. Make the limitation explicit on both\nthe option function and the exporterConfig field comment.\n\nNo behavior change.",
"is_bot": false,
"headline": "feat(app): TransportOptions plumbing (PR 1a, internal-only) (#1)",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "64fa570c9d1e89a19f5e0981a813ed1b2a6365d7",
"body": "Two OpenSSF Scorecard fixes:\n\n1. Token-Permissions: Scorecard flags any non-read permission granted\n at workflow root. Move `id-token: write` (and, for release.yml,\n `contents: write`) from each workflow's root `permissions` block\n to per-job blocks on every job that needs them. Workflow roots\n[…]\nf\n - Taskfile.yml ci:test:mutation: gremlins@v0.6.0\n\nThe pinned versions track go.mod so a `task tidy` followed by a\nversion bump there will surface a CI-time mismatch rather than\nsilently drifting.",
"is_bot": false,
"headline": "ci(workflows): scope writes to job level; pin go install versions",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "aaac0827c84c38e095b0017a15394c460cbae3f9",
"body": "Run `task fmt` after the ci:fmt scope-down. The previous root-recursive\ngofumpt invocation failed silently on build/cache/go-mod permissions,\nso this churn had been accumulating since the last successful pass.\nPure formatter output, no semantic changes.",
"is_bot": false,
"headline": "style: apply gofumpt struct-literal multi-line rule",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ddd1e3e1d2634aa0a28b53c2196e0624de08da7c",
"body": "ci:fmt was running `gofmt -s -w .` and `gofumpt -w .` from the repo\nroot. The recursion descended into build/cache/go-mod (the hermetic\nGo module cache) where module sources are stored read-only, surfacing\n\"permission denied\" rather than running cleanly. Limit the formatter\narguments to `cmd example\n[…]\n:push task description and rewrite the CONTRIBUTING.md\nmicroVM paragraph that pointed at a non-existent kvm-labelled CI\nrunner. Both followed from the integration.yml deletion in the\npreceding commit.",
"is_bot": false,
"headline": "build(taskfile): scope ci:fmt to source roots; refresh integration docs",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "228c44ba338ef184fd293715e745b033cddad5c9",
"body": "Three CI changes:\n\n1. Replace DeterminateSystems/magic-nix-cache-action@v13 with\n DeterminateSystems/flakehub-cache-action@v3.18.1 across ci, codeql,\n nightly, release-validate, and release. FlakeHub Cache replaces\n the deprecated magic-nix-cache and authenticates via GitHub OIDC,\n so each a\n[…]\ny\n push to main hung waiting for a runner. GitHub-hosted runners do\n not expose `/dev/kvm` and TCG fallback is too slow for CI; the\n integration tier runs locally via `task vm:test:integration`.",
"is_bot": false,
"headline": "ci(workflows): swap to FlakeHub Cache, gate CodeQL, drop integration",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "da38d5a4445b7c4d474f58556575a5cbd48ef5f1",
"body": "TestReconnect_ResetsBackoffAfterSuccess used the replacement watcher's\nregistry subscription as a happens-before fence for the parent\nwatcher's Backoff.Reset call. They are unordered: the recursive Attach\nspawns the replacement watcher's goroutine inside finishAttach, and\nthe parent then calls finis\n[…]\nthe assert\nfired before Reset.\n\nSwitch the assertion to require.Eventually polling\nbackoff.ResetCalls() == 1, which observes the actual contract surface\nwithout depending on the subscription ordering.",
"is_bot": false,
"headline": "fix(app): poll Backoff.Reset counter instead of subscription fence",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e57443b08fcc21efec8d003d97146893e737563d",
"body": "… public repo\n\nGitHub deprecated Node 20 actions (deprecation notice on every\nrun; forced default June 2026, removed September 2026). Bump\nevery \\`uses:\\` reference to the latest Node-24-compatible major,\npreserving SHA pins + \\`# vN\\` Dependabot anchors:\n\n * actions/checkout v4 → v6.0.2 (de0fac2e)\n[…]\n\\`task test\\` race-clean, \\`task vuln\\`\nclean. \\`act push -j {ddd-boundary, no-cgo, lint-and-vet,\nunit-linux, conformance, coverage, cross-compile, api-surface}\\`\nall pass under the bumped action set.",
"is_bot": false,
"headline": "ci(deps): bump every action to its Node-24 release; gate Scorecard on…",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1c4b76e94677e5301d184cdab2f4571852be2e99",
"body": "Codex flagged the substring \\`container: nixos/nix\\` surviving in\na comment block at .github/workflows/ci.yml:24. The comment\nexplained why the workflow does not use that pattern, but a\nrelease-time grep that asserts the substring is absent would\nfire as a false positive. Reword without the literal token.",
"is_bot": false,
"headline": "docs(ci.yml): rephrase comment to avoid grep collision",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "20f561ff997cd6dfa3a9f9f5008085f88fca288e",
"body": "Three new test files in cmd/usbip-go/ cover every pure helper that\nsits below the cobra Action layer — parseBackoff (every accepted\ngrammar plus rejection paths), classifyEvent / eventHeader / every\nadapt* (sweeps each EventKind with a proper time-stamped fixture\nand pins the type-assertion rejectio\n[…]\npurely for testing — the user-facing\nexception clause.\n\ncross-compile, api-surface, conformance, coverage, no-cgo,\nunit-linux, lint-and-vet, ddd-boundary all replay clean under\n\\`act push -j <name>\\`.",
"is_bot": false,
"headline": "test(cmd-usbip-go-ci-coverage): add pure-helper tests + bump thresholds",
"author_name": "Ricardo Rivera",
"author_login": "silkrad",
"committed_at": "2026-05-08T16:39:49Z",
"body_truncated": true,
"is_coding_agent": false
}
],
"releases_count": 1,
"commits_last_year": 599,
"latest_release_at": "2026-07-18T19:52:38Z",
"latest_release_tag": "v1.0.2",
"releases_from_tags": false,
"days_since_last_push": 3,
"active_weeks_last_year": 5,
"days_since_latest_release": 4,
"mean_days_between_releases": null
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 87,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": true
},
"ecosystem": {
"packages": [
{
"name": "github.com/abilisoft/usbip-go",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/abilisoft/usbip-go",
"is_deprecated": false,
"latest_version": "v1.0.2",
"repository_url": "https://github.com/abilisoft/usbip-go",
"versions_count": 6,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-18T15:02:10Z",
"latest_version_yanked": null,
"days_since_latest_publish": 4
}
]
},
"popularity": {
"forks": 0,
"stars": 3,
"watchers": 1,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": null,
"open_issues_and_prs": 1
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [
"Makefile",
"vendor/charm.land/lipgloss/v2/Taskfile.yaml",
"vendor/github.com/charmbracelet/fang/Taskfile.yml",
"vendor/github.com/spf13/cobra/Makefile",
"vendor/go.uber.org/goleak/Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod",
"tools/go.mod"
],
"largest_source_bytes": 66581,
"source_files_sampled": 357,
"oversized_source_files": 1,
"agent_instruction_files": [
"AGENTS.md",
"vendor/github.com/clipperhouse/displaywidth/AGENTS.md"
],
"agent_instruction_max_bytes": 6677
},
"dependencies": {
"manifests": [
"go.mod",
"tools/go.mod"
],
"advisories": {
"error": null,
"scope": "repository_graph",
"source": "osv",
"findings": [],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 244,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "charm.land/lipgloss/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.0.5"
},
{
"name": "github.com/charmbracelet/colorprofile",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.4.3"
},
{
"name": "github.com/charmbracelet/fang",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.0.0"
},
{
"name": "github.com/coreos/go-systemd/v22",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v22.7.0"
},
{
"name": "github.com/lmittmann/tint",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.2.0"
},
{
"name": "github.com/spf13/cobra",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.10.2"
},
{
"name": "github.com/stretchr/testify",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.11.1"
},
{
"name": "go.uber.org/goleak",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.3.0"
},
{
"name": "golang.org/x/sys",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.47.0"
},
{
"name": "golang.org/x/term",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.45.0"
},
{
"name": "golang.org/x/time",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.15.0"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "charm.land/lipgloss/v2",
"direct": true,
"version": "v2.0.5",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/colorprofile",
"direct": true,
"version": "v0.4.3",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/fang",
"direct": true,
"version": "v1.0.0",
"ecosystem": "go"
},
{
"name": "github.com/coreos/go-systemd/v22",
"direct": true,
"version": "v22.7.0",
"ecosystem": "go"
},
{
"name": "github.com/lmittmann/tint",
"direct": true,
"version": "v1.2.0",
"ecosystem": "go"
},
{
"name": "github.com/spf13/cobra",
"direct": true,
"version": "v1.10.2",
"ecosystem": "go"
},
{
"name": "github.com/stretchr/testify",
"direct": true,
"version": "v1.11.1",
"ecosystem": "go"
},
{
"name": "go.uber.org/goleak",
"direct": true,
"version": "v1.3.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/sys",
"direct": true,
"version": "v0.47.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/term",
"direct": true,
"version": "v0.45.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/time",
"direct": true,
"version": "v0.15.0",
"ecosystem": "go"
},
{
"name": "4d63.com/gocheckcompilerdirectives",
"direct": false,
"version": "v1.4.0",
"ecosystem": "go"
},
{
"name": "4d63.com/gochecknoglobals",
"direct": false,
"version": "v0.2.2",
"ecosystem": "go"
},
{
"name": "codeberg.org/chavacava/garif",
"direct": false,
"version": "v0.2.1",
"ecosystem": "go"
},
{
"name": "codeberg.org/polyfloyd/go-errorlint",
"direct": false,
"version": "v1.9.0",
"ecosystem": "go"
},
{
"name": "dev.gaijin.team/go/exhaustruct/v4",
"direct": false,
"version": "v4.0.0",
"ecosystem": "go"
},
{
"name": "dev.gaijin.team/go/golib",
"direct": false,
"version": "v0.8.1",
"ecosystem": "go"
},
{
"name": "github.com/4meepo/tagalign",
"direct": false,
"version": "v1.4.3",
"ecosystem": "go"
},
{
"name": "github.com/abirdcfly/dupword",
"direct": false,
"version": "v0.1.8",
"ecosystem": "go"
},
{
"name": "github.com/adminbenni/iota-mixing",
"direct": false,
"version": "v1.0.0",
"ecosystem": "go"
},
{
"name": "github.com/alecthomas/chroma/v2",
"direct": false,
"version": "v2.27.0",
"ecosystem": "go"
},
{
"name": "github.com/alecthomas/go-check-sumtype",
"direct": false,
"version": "v0.3.1",
"ecosystem": "go"
},
{
"name": "github.com/alexkohler/nakedret/v2",
"direct": false,
"version": "v2.0.6",
"ecosystem": "go"
},
{
"name": "github.com/alexkohler/prealloc",
"direct": false,
"version": "v1.1.0",
"ecosystem": "go"
},
{
"name": "github.com/alfatraining/structtag",
"direct": false,
"version": "v1.0.0",
"ecosystem": "go"
},
{
"name": "github.com/alingse/asasalint",
"direct": false,
"version": "v0.0.11",
"ecosystem": "go"
},
{
"name": "github.com/alingse/nilnesserr",
"direct": false,
"version": "v0.2.0",
"ecosystem": "go"
},
{
"name": "github.com/alwxsin/noinlineerr",
"direct": false,
"version": "v1.0.5",
"ecosystem": "go"
},
{
"name": "github.com/antonboom/errname",
"direct": false,
"version": "v1.1.2",
"ecosystem": "go"
},
{
"name": "github.com/antonboom/nilnil",
"direct": false,
"version": "v1.1.2",
"ecosystem": "go"
},
{
"name": "github.com/antonboom/testifylint",
"direct": false,
"version": "v1.6.4",
"ecosystem": "go"
},
{
"name": "github.com/ashanbrown/forbidigo/v2",
"direct": false,
"version": "v2.3.1",
"ecosystem": "go"
},
{
"name": "github.com/ashanbrown/makezero/v2",
"direct": false,
"version": "v2.2.1",
"ecosystem": "go"
},
{
"name": "github.com/beorn7/perks",
"direct": false,
"version": "v1.0.1",
"ecosystem": "go"
},
{
"name": "github.com/bkielbasa/cyclop",
"direct": false,
"version": "v1.2.3",
"ecosystem": "go"
},
{
"name": "github.com/blizzy78/varnamelen",
"direct": false,
"version": "v0.8.0",
"ecosystem": "go"
},
{
"name": "github.com/bluekeyes/go-gitdiff",
"direct": false,
"version": "v0.8.1",
"ecosystem": "go"
},
{
"name": "github.com/bombsimon/wsl/v4",
"direct": false,
"version": "v4.7.0",
"ecosystem": "go"
},
{
"name": "github.com/bombsimon/wsl/v5",
"direct": false,
"version": "v5.8.0",
"ecosystem": "go"
},
{
"name": "github.com/breml/bidichk",
"direct": false,
"version": "v0.3.3",
"ecosystem": "go"
},
{
"name": "github.com/breml/errchkjson",
"direct": false,
"version": "v0.4.1",
"ecosystem": "go"
},
{
"name": "github.com/burntsushi/toml",
"direct": false,
"version": "v1.6.0",
"ecosystem": "go"
},
{
"name": "github.com/butuzov/ireturn",
"direct": false,
"version": "v0.4.1",
"ecosystem": "go"
},
{
"name": "github.com/butuzov/mirror",
"direct": false,
"version": "v1.3.3",
"ecosystem": "go"
},
{
"name": "github.com/catenacyber/perfsprint",
"direct": false,
"version": "v0.10.1",
"ecosystem": "go"
},
{
"name": "github.com/ccojocar/zxcvbn-go",
"direct": false,
"version": "v1.0.4",
"ecosystem": "go"
},
{
"name": "github.com/cespare/xxhash/v2",
"direct": false,
"version": "v2.3.0",
"ecosystem": "go"
},
{
"name": "github.com/charithe/durationcheck",
"direct": false,
"version": "v0.0.11",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/ultraviolet",
"direct": false,
"version": "v0.0.0-20260703014108-f5a850f9c2b7",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/x/ansi",
"direct": false,
"version": "v0.11.7",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/x/exp/charmtone",
"direct": false,
"version": "v0.0.0-20260705004817-2cc9a8fe1146",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/x/exp/golden",
"direct": false,
"version": "v0.0.0-20260705004817-2cc9a8fe1146",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/x/term",
"direct": false,
"version": "v0.2.2",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/x/termios",
"direct": false,
"version": "v0.1.1",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/x/windows",
"direct": false,
"version": "v0.2.2",
"ecosystem": "go"
},
{
"name": "github.com/checkmake/checkmake",
"direct": false,
"version": "v0.3.2",
"ecosystem": "go"
},
{
"name": "github.com/ckaznocha/intrange",
"direct": false,
"version": "v0.3.1",
"ecosystem": "go"
},
{
"name": "github.com/clickhouse/clickhouse-go-linter",
"direct": false,
"version": "v1.2.1",
"ecosystem": "go"
},
{
"name": "github.com/clipperhouse/displaywidth",
"direct": false,
"version": "v0.11.0",
"ecosystem": "go"
},
{
"name": "github.com/clipperhouse/uax29/v2",
"direct": false,
"version": "v2.7.0",
"ecosystem": "go"
},
{
"name": "github.com/curioswitch/go-reassign",
"direct": false,
"version": "v0.3.0",
"ecosystem": "go"
},
{
"name": "github.com/daixiang0/gci",
"direct": false,
"version": "v0.14.0",
"ecosystem": "go"
},
{
"name": "github.com/dave/dst",
"direct": false,
"version": "v0.27.4",
"ecosystem": "go"
},
{
"name": "github.com/davecgh/go-spew",
"direct": false,
"version": "v1.1.1",
"ecosystem": "go"
},
{
"name": "github.com/davecgh/go-spew",
"direct": false,
"version": "v1.1.2-0.20180830191138-d8f796af33cc",
"ecosystem": "go"
},
{
"name": "github.com/denis-tingaikin/go-header",
"direct": false,
"version": "v0.5.0",
"ecosystem": "go"
},
{
"name": "github.com/djarvur/go-err113",
"direct": false,
"version": "v0.1.1",
"ecosystem": "go"
},
{
"name": "github.com/dlclark/regexp2/v2",
"direct": false,
"version": "v2.3.0",
"ecosystem": "go"
},
{
"name": "github.com/ettle/strcase",
"direct": false,
"version": "v0.2.0",
"ecosystem": "go"
},
{
"name": "github.com/fatih/color",
"direct": false,
"version": "v1.19.0",
"ecosystem": "go"
},
{
"name": "github.com/fatih/structtag",
"direct": false,
"version": "v1.2.0",
"ecosystem": "go"
},
{
"name": "github.com/firefart/nonamedreturns",
"direct": false,
"version": "v1.0.8",
"ecosystem": "go"
},
{
"name": "github.com/fsnotify/fsnotify",
"direct": false,
"version": "v1.10.1",
"ecosystem": "go"
},
{
"name": "github.com/fzipp/gocyclo",
"direct": false,
"version": "v0.6.0",
"ecosystem": "go"
},
{
"name": "github.com/ghostiam/protogetter",
"direct": false,
"version": "v0.3.21",
"ecosystem": "go"
},
{
"name": "github.com/go-critic/go-critic",
"direct": false,
"version": "v0.14.4",
"ecosystem": "go"
},
{
"name": "github.com/go-gremlins/gremlins",
"direct": false,
"version": "v0.6.0",
"ecosystem": "go"
},
{
"name": "github.com/go-ini/ini",
"direct": false,
"version": "v1.67.0",
"ecosystem": "go"
},
{
"name": "github.com/go-toolsmith/astcast",
"direct": false,
"version": "v1.1.0",
"ecosystem": "go"
},
{
"name": "github.com/go-toolsmith/astcopy",
"direct": false,
"version": "v1.1.0",
"ecosystem": "go"
},
{
"name": "github.com/go-toolsmith/astequal",
"direct": false,
"version": "v1.2.0",
"ecosystem": "go"
},
{
"name": "github.com/go-toolsmith/astfmt",
"direct": false,
"version": "v1.1.0",
"ecosystem": "go"
},
{
"name": "github.com/go-toolsmith/astp",
"direct": false,
"version": "v1.1.0",
"ecosystem": "go"
},
{
"name": "github.com/go-toolsmith/strparse",
"direct": false,
"version": "v1.1.0",
"ecosystem": "go"
},
{
"name": "github.com/go-toolsmith/typep",
"direct": false,
"version": "v1.1.0",
"ecosystem": "go"
},
{
"name": "github.com/go-viper/mapstructure/v2",
"direct": false,
"version": "v2.5.0",
"ecosystem": "go"
},
{
"name": "github.com/go-xmlfmt/xmlfmt",
"direct": false,
"version": "v1.1.3",
"ecosystem": "go"
},
{
"name": "github.com/gobwas/glob",
"direct": false,
"version": "v0.2.3",
"ecosystem": "go"
},
{
"name": "github.com/goccy/go-json",
"direct": false,
"version": "v0.10.6",
"ecosystem": "go"
},
{
"name": "github.com/godoc-lint/godoc-lint",
"direct": false,
"version": "v0.11.2",
"ecosystem": "go"
},
{
"name": "github.com/gofrs/flock",
"direct": false,
"version": "v0.13.0",
"ecosystem": "go"
},
{
"name": "github.com/golangci/asciicheck",
"direct": false,
"version": "v0.5.0",
"ecosystem": "go"
},
{
"name": "github.com/golangci/dupl",
"direct": false,
"version": "v0.0.0-20260401084720-c99c5cf5c202",
"ecosystem": "go"
},
{
"name": "github.com/golangci/go-printf-func-name",
"direct": false,
"version": "v0.1.1",
"ecosystem": "go"
},
{
"name": "github.com/golangci/gofmt",
"direct": false,
"version": "v0.0.0-20250106114630-d62b90e6713d",
"ecosystem": "go"
},
{
"name": "github.com/golangci/golangci-lint/v2",
"direct": false,
"version": "v2.12.2",
"ecosystem": "go"
},
{
"name": "github.com/golangci/golines",
"direct": false,
"version": "v0.15.0",
"ecosystem": "go"
},
{
"name": "github.com/golangci/misspell",
"direct": false,
"version": "v0.8.0",
"ecosystem": "go"
},
{
"name": "github.com/golangci/plugin-module-register",
"direct": false,
"version": "v0.1.2",
"ecosystem": "go"
},
{
"name": "github.com/golangci/revgrep",
"direct": false,
"version": "v0.8.0",
"ecosystem": "go"
},
{
"name": "github.com/golangci/rowserrcheck",
"direct": false,
"version": "v0.0.0-20260701145345-399602f983c8",
"ecosystem": "go"
},
{
"name": "github.com/golangci/swaggoswag",
"direct": false,
"version": "v0.0.0-20250504205917-77f2aca3143e",
"ecosystem": "go"
},
{
"name": "github.com/golangci/unconvert",
"direct": false,
"version": "v0.0.0-20250410112200-a129a6e6413e",
"ecosystem": "go"
},
{
"name": "github.com/google/go-cmp",
"direct": false,
"version": "v0.7.0",
"ecosystem": "go"
},
{
"name": "github.com/google/pprof",
"direct": false,
"version": "v0.0.0-20260709232956-b9395ee17fa0",
"ecosystem": "go"
},
{
"name": "github.com/google/renameio",
"direct": false,
"version": "v1.0.1",
"ecosystem": "go"
},
{
"name": "github.com/gordonklaus/ineffassign",
"direct": false,
"version": "v0.2.0",
"ecosystem": "go"
},
{
"name": "github.com/gostaticanalysis/analysisutil",
"direct": false,
"version": "v0.7.1",
"ecosystem": "go"
},
{
"name": "github.com/gostaticanalysis/comment",
"direct": false,
"version": "v1.5.0",
"ecosystem": "go"
},
{
"name": "github.com/gostaticanalysis/forcetypeassert",
"direct": false,
"version": "v0.2.0",
"ecosystem": "go"
},
{
"name": "github.com/gostaticanalysis/nilerr",
"direct": false,
"version": "v0.1.2",
"ecosystem": "go"
},
{
"name": "github.com/gostaticanalysis/testutil",
"direct": false,
"version": "v0.6.1",
"ecosystem": "go"
},
{
"name": "github.com/hako/durafmt",
"direct": false,
"version": "v0.0.0-20210608085754-5c1018a4e16b",
"ecosystem": "go"
},
{
"name": "github.com/hashicorp/go-immutable-radix/v2",
"direct": false,
"version": "v2.1.0",
"ecosystem": "go"
},
{
"name": "github.com/hashicorp/go-version",
"direct": false,
"version": "v1.9.0",
"ecosystem": "go"
},
{
"name": "github.com/hashicorp/golang-lru/v2",
"direct": false,
"version": "v2.0.7",
"ecosystem": "go"
},
{
"name": "github.com/hectane/go-acl",
"direct": false,
"version": "v1.0.0",
"ecosystem": "go"
},
{
"name": "github.com/hexops/gotextdiff",
"direct": false,
"version": "v1.0.3",
"ecosystem": "go"
},
{
"name": "github.com/inconshreveable/mousetrap",
"direct": false,
"version": "v1.1.0",
"ecosystem": "go"
},
{
"name": "github.com/jgautheron/goconst",
"direct": false,
"version": "v1.10.2",
"ecosystem": "go"
},
{
"name": "github.com/jjti/go-spancheck",
"direct": false,
"version": "v0.6.5",
"ecosystem": "go"
},
{
"name": "github.com/julz/importas",
"direct": false,
"version": "v0.2.0",
"ecosystem": "go"
},
{
"name": "github.com/karamaru-alpha/copyloopvar",
"direct": false,
"version": "v1.2.2",
"ecosystem": "go"
},
{
"name": "github.com/kisielk/errcheck",
"direct": false,
"version": "v1.20.0",
"ecosystem": "go"
},
{
"name": "github.com/kkhaike/contextcheck",
"direct": false,
"version": "v1.1.6",
"ecosystem": "go"
},
{
"name": "github.com/kr/pretty",
"direct": false,
"version": "v0.3.1",
"ecosystem": "go"
},
{
"name": "github.com/kulti/thelper",
"direct": false,
"version": "v0.7.1",
"ecosystem": "go"
},
{
"name": "github.com/kunwardeep/paralleltest",
"direct": false,
"version": "v1.0.15",
"ecosystem": "go"
},
{
"name": "github.com/lasiar/canonicalheader",
"direct": false,
"version": "v1.1.2",
"ecosystem": "go"
},
{
"name": "github.com/ldez/exptostd",
"direct": false,
"version": "v0.4.5",
"ecosystem": "go"
},
{
"name": "github.com/ldez/gomoddirectives",
"direct": false,
"version": "v0.9.0",
"ecosystem": "go"
},
{
"name": "github.com/ldez/grignotin",
"direct": false,
"version": "v0.10.1",
"ecosystem": "go"
},
{
"name": "github.com/ldez/structtags",
"direct": false,
"version": "v0.6.1",
"ecosystem": "go"
},
{
"name": "github.com/ldez/tagliatelle",
"direct": false,
"version": "v0.7.2",
"ecosystem": "go"
},
{
"name": "github.com/ldez/usetesting",
"direct": false,
"version": "v0.5.0",
"ecosystem": "go"
},
{
"name": "github.com/leonklingele/grouper",
"direct": false,
"version": "v1.1.2",
"ecosystem": "go"
},
{
"name": "github.com/lucasb-eyer/go-colorful",
"direct": false,
"version": "v1.4.0",
"ecosystem": "go"
},
{
"name": "github.com/macabu/inamedparam",
"direct": false,
"version": "v0.2.0",
"ecosystem": "go"
},
{
"name": "github.com/makenowjust/heredoc",
"direct": false,
"version": "v1.0.0",
"ecosystem": "go"
},
{
"name": "github.com/manuelarte/embeddedstructfieldcheck",
"direct": false,
"version": "v0.4.0",
"ecosystem": "go"
},
{
"name": "github.com/manuelarte/funcorder",
"direct": false,
"version": "v0.6.0",
"ecosystem": "go"
},
{
"name": "github.com/maratori/testableexamples",
"direct": false,
"version": "v1.0.1",
"ecosystem": "go"
},
{
"name": "github.com/maratori/testpackage",
"direct": false,
"version": "v1.1.2",
"ecosystem": "go"
},
{
"name": "github.com/masterminds/semver/v3",
"direct": false,
"version": "v3.5.0",
"ecosystem": "go"
},
{
"name": "github.com/matoous/godox",
"direct": false,
"version": "v1.1.0",
"ecosystem": "go"
},
{
"name": "github.com/matryer/is",
"direct": false,
"version": "v1.4.1",
"ecosystem": "go"
},
{
"name": "github.com/mattn/go-colorable",
"direct": false,
"version": "v0.1.15",
"ecosystem": "go"
},
{
"name": "github.com/mattn/go-isatty",
"direct": false,
"version": "v0.0.22",
"ecosystem": "go"
},
{
"name": "github.com/mattn/go-runewidth",
"direct": false,
"version": "v0.0.24",
"ecosystem": "go"
},
{
"name": "github.com/mgechev/revive",
"direct": false,
"version": "v1.15.0",
"ecosystem": "go"
},
{
"name": "github.com/mirrexone/unqueryvet",
"direct": false,
"version": "v1.5.4",
"ecosystem": "go"
},
{
"name": "github.com/mitchellh/go-homedir",
"direct": false,
"version": "v1.1.0",
"ecosystem": "go"
},
{
"name": "github.com/moricho/tparallel",
"direct": false,
"version": "v0.3.2",
"ecosystem": "go"
},
{
"name": "github.com/muesli/cancelreader",
"direct": false,
"version": "v0.2.2",
"ecosystem": "go"
},
{
"name": "github.com/muesli/mango",
"direct": false,
"version": "v0.2.0",
"ecosystem": "go"
},
{
"name": "github.com/muesli/mango-cobra",
"direct": false,
"version": "v1.3.0",
"ecosystem": "go"
},
{
"name": "github.com/muesli/mango-pflag",
"direct": false,
"version": "v0.2.0",
"ecosystem": "go"
},
{
"name": "github.com/muesli/roff",
"direct": false,
"version": "v0.1.0",
"ecosystem": "go"
},
{
"name": "github.com/munnerz/goautoneg",
"direct": false,
"version": "v0.0.0-20191010083416-a7dc8b61c822",
"ecosystem": "go"
},
{
"name": "github.com/nakabonne/nestif",
"direct": false,
"version": "v0.3.1",
"ecosystem": "go"
},
{
"name": "github.com/nishanths/exhaustive",
"direct": false,
"version": "v0.12.0",
"ecosystem": "go"
},
{
"name": "github.com/nishanths/predeclared",
"direct": false,
"version": "v0.2.2",
"ecosystem": "go"
},
{
"name": "github.com/nunnatsa/ginkgolinter",
"direct": false,
"version": "v0.23.0",
"ecosystem": "go"
},
{
"name": "github.com/olekukonko/cat",
"direct": false,
"version": "v0.0.0-20250911104152-50322a0618f6",
"ecosystem": "go"
},
{
"name": "github.com/olekukonko/errors",
"direct": false,
"version": "v1.3.0",
"ecosystem": "go"
},
{
"name": "github.com/olekukonko/ll",
"direct": false,
"version": "v0.1.8",
"ecosystem": "go"
},
{
"name": "github.com/olekukonko/tablewriter",
"direct": false,
"version": "v1.1.4",
"ecosystem": "go"
},
{
"name": "github.com/onsi/ginkgo/v2",
"direct": false,
"version": "v2.32.0",
"ecosystem": "go"
},
{
"name": "github.com/onsi/gomega",
"direct": false,
"version": "v1.42.1",
"ecosystem": "go"
},
{
"name": "github.com/openpeedeep/depguard/v2",
"direct": false,
"version": "v2.2.1",
"ecosystem": "go"
},
{
"name": "github.com/pelletier/go-toml/v2",
"direct": false,
"version": "v2.4.3",
"ecosystem": "go"
},
{
"name": "github.com/pmezard/go-difflib",
"direct": false,
"version": "v1.0.0",
"ecosystem": "go"
},
{
"name": "github.com/pmezard/go-difflib",
"direct": false,
"version": "v1.0.1-0.20181226105442-5d4384ee4fb2",
"ecosystem": "go"
},
{
"name": "github.com/prometheus/client_golang",
"direct": false,
"version": "v1.23.2",
"ecosystem": "go"
},
{
"name": "github.com/prometheus/client_model",
"direct": false,
"version": "v0.6.2",
"ecosystem": "go"
},
{
"name": "github.com/prometheus/common",
"direct": false,
"version": "v0.70.0",
"ecosystem": "go"
},
{
"name": "github.com/prometheus/procfs",
"direct": false,
"version": "v0.21.1",
"ecosystem": "go"
},
{
"name": "github.com/quasilyte/go-ruleguard",
"direct": false,
"version": "v0.4.5",
"ecosystem": "go"
},
{
"name": "github.com/quasilyte/go-ruleguard/dsl",
"direct": false,
"version": "v0.3.23",
"ecosystem": "go"
},
{
"name": "github.com/quasilyte/gogrep",
"direct": false,
"version": "v0.5.0",
"ecosystem": "go"
},
{
"name": "github.com/quasilyte/regex/syntax",
"direct": false,
"version": "v0.0.0-20210819130434-b3f0c404a727",
"ecosystem": "go"
},
{
"name": "github.com/quasilyte/stdinfo",
"direct": false,
"version": "v0.0.0-20220114132959-f7386bf02567",
"ecosystem": "go"
},
{
"name": "github.com/raeperd/recvcheck",
"direct": false,
"version": "v0.3.0",
"ecosystem": "go"
},
{
"name": "github.com/rivo/uniseg",
"direct": false,
"version": "v0.4.7",
"ecosystem": "go"
},
{
"name": "github.com/rogpeppe/go-internal",
"direct": false,
"version": "v1.15.0",
"ecosystem": "go"
},
{
"name": "github.com/ryancurrah/gomodguard",
"direct": false,
"version": "v1.4.1",
"ecosystem": "go"
},
{
"name": "github.com/ryancurrah/gomodguard/v2",
"direct": false,
"version": "v2.1.3",
"ecosystem": "go"
},
{
"name": "github.com/ryanrolds/sqlclosecheck",
"direct": false,
"version": "v0.6.0",
"ecosystem": "go"
},
{
"name": "github.com/sagikazarmark/locafero",
"direct": false,
"version": "v0.12.0",
"ecosystem": "go"
},
{
"name": "github.com/sanposhiho/wastedassign/v2",
"direct": false,
"version": "v2.1.0",
"ecosystem": "go"
},
{
"name": "github.com/santhosh-tekuri/jsonschema/v6",
"direct": false,
"version": "v6.0.2",
"ecosystem": "go"
},
{
"name": "github.com/sashamelentyev/interfacebloat",
"direct": false,
"version": "v1.1.0",
"ecosystem": "go"
},
{
"name": "github.com/sashamelentyev/usestdlibvars",
"direct": false,
"version": "v1.29.0",
"ecosystem": "go"
},
{
"name": "github.com/securego/gosec/v2",
"direct": false,
"version": "v2.27.1",
"ecosystem": "go"
},
{
"name": "github.com/sergi/go-diff",
"direct": false,
"version": "v1.4.0",
"ecosystem": "go"
},
{
"name": "github.com/sirupsen/logrus",
"direct": false,
"version": "v1.9.4",
"ecosystem": "go"
},
{
"name": "github.com/sivchari/containedctx",
"direct": false,
"version": "v1.0.3",
"ecosystem": "go"
},
{
"name": "github.com/sonatard/noctx",
"direct": false,
"version": "v0.5.1",
"ecosystem": "go"
},
{
"name": "github.com/sourcegraph/go-diff",
"direct": false,
"version": "v0.8.0",
"ecosystem": "go"
},
{
"name": "github.com/spf13/afero",
"direct": false,
"version": "v1.15.0",
"ecosystem": "go"
},
{
"name": "github.com/spf13/cast",
"direct": false,
"version": "v1.10.0",
"ecosystem": "go"
},
{
"name": "github.com/spf13/pflag",
"direct": false,
"version": "v1.0.10",
"ecosystem": "go"
},
{
"name": "github.com/spf13/viper",
"direct": false,
"version": "v1.21.0",
"ecosystem": "go"
},
{
"name": "github.com/ssgreg/nlreturn/v2",
"direct": false,
"version": "v2.2.1",
"ecosystem": "go"
},
{
"name": "github.com/stbenjam/no-sprintf-host-port",
"direct": false,
"version": "v0.3.1",
"ecosystem": "go"
},
{
"name": "github.com/stretchr/objx",
"direct": false,
"version": "v0.5.3",
"ecosystem": "go"
},
{
"name": "github.com/subosito/gotenv",
"direct": false,
"version": "v1.6.0",
"ecosystem": "go"
},
{
"name": "github.com/tenntenn/text/transform",
"direct": false,
"version": "v0.0.0-20250402111347-ba836492e880",
"ecosystem": "go"
},
{
"name": "github.com/tetafro/godot",
"direct": false,
"version": "v1.5.6",
"ecosystem": "go"
},
{
"name": "github.com/timakin/bodyclose",
"direct": false,
"version": "v0.0.0-20260129054331-73d1f95b84b4",
"ecosystem": "go"
},
{
"name": "github.com/timonwong/loggercheck",
"direct": false,
"version": "v0.11.0",
"ecosystem": "go"
},
{
"name": "github.com/tomarrell/wrapcheck/v2",
"direct": false,
"version": "v2.12.0",
"ecosystem": "go"
},
{
"name": "github.com/tommy-muehle/go-mnd/v2",
"direct": false,
"version": "v2.5.1",
"ecosystem": "go"
},
{
"name": "github.com/ultraware/funlen",
"direct": false,
"version": "v0.2.0",
"ecosystem": "go"
},
{
"name": "github.com/ultraware/whitespace",
"direct": false,
"version": "v0.2.0",
"ecosystem": "go"
},
{
"name": "github.com/uudashr/gocognit",
"direct": false,
"version": "v1.2.1",
"ecosystem": "go"
},
{
"name": "github.com/uudashr/iface",
"direct": false,
"version": "v1.5.0",
"ecosystem": "go"
},
{
"name": "github.com/xen0n/gosmopolitan",
"direct": false,
"version": "v1.3.0",
"ecosystem": "go"
},
{
"name": "github.com/xo/terminfo",
"direct": false,
"version": "v0.0.0-20220910002029-abceb7e1c41e",
"ecosystem": "go"
},
{
"name": "github.com/yagipy/maintidx",
"direct": false,
"version": "v1.0.0",
"ecosystem": "go"
},
{
"name": "github.com/yeya24/promlinter",
"direct": false,
"version": "v0.3.0",
"ecosystem": "go"
},
{
"name": "github.com/ykadowak/zerologlint",
"direct": false,
"version": "v0.1.5",
"ecosystem": "go"
},
{
"name": "gitlab.com/bosi/decorder",
"direct": false,
"version": "v0.4.2",
"ecosystem": "go"
},
{
"name": "go-simpler.org/musttag",
"direct": false,
"version": "v0.14.0",
"ecosystem": "go"
},
{
"name": "go-simpler.org/sloglint",
"direct": false,
"version": "v0.12.0",
"ecosystem": "go"
},
{
"name": "go.augendre.info/arangolint",
"direct": false,
"version": "v0.4.0",
"ecosystem": "go"
},
{
"name": "go.augendre.info/fatcontext",
"direct": false,
"version": "v0.10.0",
"ecosystem": "go"
},
{
"name": "go.uber.org/multierr",
"direct": false,
"version": "v1.11.0",
"ecosystem": "go"
},
{
"name": "go.uber.org/zap",
"direct": false,
"version": "v1.28.0",
"ecosystem": "go"
},
{
"name": "go.yaml.in/yaml/v3",
"direct": false,
"version": "v3.0.4",
"ecosystem": "go"
},
{
"name": "golang.org/x/exp",
"direct": false,
"version": "v0.0.0-20260709172345-9ea1abe57597",
"ecosystem": "go"
},
{
"name": "golang.org/x/exp/typeparams",
"direct": false,
"version": "v0.0.0-20260709172345-9ea1abe57597",
"ecosystem": "go"
},
{
"name": "golang.org/x/mod",
"direct": false,
"version": "v0.38.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/sync",
"direct": false,
"version": "v0.22.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/telemetry",
"direct": false,
"version": "v0.0.0-20260710170516-c325552849a7",
"ecosystem": "go"
},
{
"name": "golang.org/x/text",
"direct": false,
"version": "v0.40.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/tools",
"direct": false,
"version": "v0.48.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/vuln",
"direct": false,
"version": "v1.6.0",
"ecosystem": "go"
},
{
"name": "google.golang.org/protobuf",
"direct": false,
"version": "v1.36.11",
"ecosystem": "go"
},
{
"name": "gopkg.in/check.v1",
"direct": false,
"version": "v1.0.0-20201130134442-10cb98267c6c",
"ecosystem": "go"
},
{
"name": "gopkg.in/yaml.v3",
"direct": false,
"version": "v3.0.1",
"ecosystem": "go"
},
{
"name": "honnef.co/go/tools",
"direct": false,
"version": "v0.7.0",
"ecosystem": "go"
},
{
"name": "mvdan.cc/gofumpt",
"direct": false,
"version": "v0.10.0",
"ecosystem": "go"
},
{
"name": "mvdan.cc/unparam",
"direct": false,
"version": "v0.0.0-20251027182757-5beb8c8f8f15",
"ecosystem": "go"
}
],
"collected": true,
"truncated": false,
"total_count": 244,
"direct_count": 11,
"indirect_count": 233
}
},
"maintainership": {
"issues": {
"open_prs": 1,
"merged_prs": 43,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 2
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "silkrad",
"commits": 591,
"avatar_url": "https://avatars.githubusercontent.com/u/25689973?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"_arch-checks.yml",
"_conformance.yml",
"_coverage.yml",
"_security.yml",
"_unit-tests.yml",
"ci.yml",
"codeql.yml",
"mutation.yml",
"nightly.yml",
"recover-v1.0.2.yml",
"release.yml",
"scorecard.yml",
"trivy.yml"
],
"has_docs_dir": true,
"linter_configs": [
".golangci.yaml",
".golangci.yml"
],
"has_editorconfig": true,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 9,
"reason": "branch protection is not maximal on development and all release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 10,
"reason": "11 out of 11 merged PRs checked by a CI test -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 5,
"reason": "badge detected: Passing",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 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": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"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": 8,
"reason": "dependency not pinned by hash detected -- score normalized to 8",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 10,
"reason": "SAST tool is run on all commits",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 10,
"reason": "security policy file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": 10,
"reason": "1 out of the last 1 releases have a total of 2 signed artifacts.",
"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": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "b46dc5467ef75f3d0a7c89069871ed9c9402db75",
"ran_at": "2026-07-23T04:47:26Z",
"aggregate_score": 8,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": true,
"has_security_policy": true,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-22T07:13:24Z",
"oldest_open_prs": [
{
"number": 46,
"created_at": "2026-07-20T04:18:35Z",
"last_comment_at": "2026-07-20T04:20:20Z",
"last_comment_author": "codecov"
}
],
"last_merged_pr_at": "2026-07-19T02:13:03Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/abilisoft/usbip-go",
"host": "github.com",
"name": "usbip-go",
"owner": "abilisoft"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 65,
"inputs": {
"security": 84,
"vitality": 69,
"community": 39,
"governance": 51,
"engineering": 84
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "moderate",
"name": "Vitality",
"value": 69,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 58,
"inputs": {
"commits_last_year": 599,
"human_commit_share": 0.92,
"days_since_last_push": 3,
"active_weeks_last_year": 5
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 3 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 3
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "5/52 weeks with commits",
"points": 3.5,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 5
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "599 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 599
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 86,
"inputs": {
"releases_count": 1,
"latest_release_tag": "v1.0.2",
"releases_from_tags": false,
"days_since_latest_release": 4,
"mean_days_between_releases": null
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "1 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 1
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 4 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 4
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "cadence unknown (single release)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "release_cadence_unknown",
"params": {}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "1 out of the last 1 releases have a total of 2 signed artifacts.",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 39,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 5,
"inputs": {
"forks": 0,
"stars": 3,
"watchers": 1,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "3 stars",
"points": 4.9,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 3
}
}
],
"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": "good",
"name": "Community health",
"note": null,
"notes": [],
"value": 77,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (Apache-2.0)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "Apache-2.0"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 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": 6.3,
"status": "met",
"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": 51,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 13,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "moderate",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 69,
"inputs": {
"merged_prs": 43,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 2
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "43/45 decided PRs merged",
"points": 36.6,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 43,
"decided": 45
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 38,
"inputs": {
"followers": 1,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "abilisoft",
"public_repos": 4,
"account_age_days": 95
},
"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": "1 followers of abilisoft",
"points": 2.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 1,
"login": "abilisoft"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "4 public repos, account ~0 yr old",
"points": 5.6,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 4
}
},
{
"code": "account_age_years",
"params": {
"years": 0
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/abilisoft/usbip-go"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 4
},
"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 4 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 4
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "6 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 6
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 84,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "excellent",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": true,
"has_linter_config": true,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "13 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 13
}
}
],
"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": ".golangci.yaml, .golangci.yml",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".golangci.yaml, .golangci.yml"
}
}
],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 6.4,
"status": "met",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "11 out of 11 merged PRs checked by a CI test -- score normalized to 10",
"points": 20,
"status": "met",
"details": [],
"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": "good",
"name": "Security",
"value": 84,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "good",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Packaging. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"packaging"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 80,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 8
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection is not maximal on development and all release branches",
"points": 6.8,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "11 out of 11 merged PRs checked by a CI test -- score normalized to 10",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "badge detected: Passing",
"points": 1.2,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "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": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"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 8",
"points": 4,
"status": "partial",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is run on all commits",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "1 out of the last 1 releases have a total of 2 signed artifacts.",
"points": 7.5,
"status": "met",
"details": [],
"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": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "excellent",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 244 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"indirect_dependencies_free_of_known_advisories",
"no_advisories_left_outstanding"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_repository",
"params": {
"assessed": 244
}
},
{
"code": "advisories_repo_graph_caveat",
"params": {}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 0,
"affected_packages": 0,
"assessed_packages": 244,
"unassessed_packages": 0,
"affected_by_severity": "none",
"direct_affected_packages": 0
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "no direct dependency carries a known advisory",
"points": 35,
"status": "met",
"details": [
{
"code": "no_direct_advisories",
"params": {}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "transitive set not separable from development and test dependencies in this scope",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_scope_not_separable",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory carries a publication date",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_no_publication_date",
"params": {}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 244,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "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": 2
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 82,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
"AGENTS.md",
"vendor/github.com/clipperhouse/displaywidth/AGENTS.md"
],
"agent_instruction_max_bytes": 6677
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md, vendor/github.com/clipperhouse/displaywidth/AGENTS.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md, vendor/github.com/clipperhouse/displaywidth/AGENTS.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "92 of 92 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 92,
"sampled": 92
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "excellent",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 88,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [
"Makefile",
"vendor/charm.land/lipgloss/v2/Taskfile.yaml",
"vendor/github.com/charmbracelet/fang/Taskfile.yml",
"vendor/github.com/spf13/cobra/Makefile",
"vendor/go.uber.org/goleak/Makefile"
],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [
"go.mod",
"tools/go.mod"
],
"dependency_bot_commit_share": 0.08
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Makefile, vendor/charm.land/lipgloss/v2/Taskfile.yaml, vendor/github.com/charmbracelet/fang/Taskfile.yml, vendor/github.com/spf13/cobra/Makefile, vendor/go.uber.org/goleak/Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Makefile, vendor/charm.land/lipgloss/v2/Taskfile.yaml, vendor/github.com/charmbracelet/fang/Taskfile.yml, vendor/github.com/spf13/cobra/Makefile, vendor/go.uber.org/goleak/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": ".golangci.yaml, .golangci.yml",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".golangci.yaml, .golangci.yml"
}
}
],
"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": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "8 of the last 100 commits are automated dependency updates",
"points": 8,
"status": "met",
"details": [
{
"code": "dependency_bot_commits",
"params": {
"count": 8,
"sampled": 100
}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 8",
"points": 8,
"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": 66581,
"source_files_sampled": 357,
"oversized_source_files": 1
},
"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": "1/357 source files over 60KB",
"points": 54.8,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 357,
"oversized": 1
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
],
"report_type": "repository",
"generated_at": "2026-07-23T04:47:35.911156Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/abilisoft/usbip-go.svg",
"full_name": "abilisoft/usbip-go",
"license_state": "standard",
"license_spdx": "Apache-2.0"
}