公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-23 04:47 UTC

abilisoft / usbip-go

Pure-Go reimplementation of USB/IP userspace for Linux

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

abilisoft/usbip-go 的健康指数为 100 分中的 65 分,处于「中等」区间。 其得分最高的类别是Engineering Quality(84/100),最低的是Community & Adoption(39/100)。 最近一次更新在 3 天前。 近期的大部分工作由 1 位贡献者完成。

65
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

AbiliSoft组织
1 关注者4 个公开仓库始于 2026年4月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/abilisoft/usbip-gov1.0.2-64 天前

按类别列示的指标

活力

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

69中等 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 3 天前
3.5/36提交节奏 — 52 周中有 5 周有提交
18/18提交量 — 最近一年 599 次提交
0/10OpenSSF Scorecard:Maintained — project was created within the last 90 days. Please review its contents carefully
所用输入
commits_last_year599
human_commit_share0.92
days_since_last_push3
active_weeks_last_year5

发布纪律

86优秀
评分方式
27/27有发布版本 — 已发布 1 个发布版本
36/36发布时效 — 最近一次发布版本于 4 天前
12.6/27发布节奏 — 节奏未知(仅一次发布)
10/10OpenSSF Scorecard:Signed-Releases — 1 out of the last 1 releases have a total of 2 signed artifacts.
所用输入
releases_count1
latest_release_tagv1.0.2
releases_from_tags
days_since_latest_release4
mean_days_between_releases

社区与采用

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

39存在风险 · 占总体的 18%
评分方式
4.9/60星标 — 3 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 1 位关注者
所用输入
forks0
stars3
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

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

可持续性与治理

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

51中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0/22.5提交分布 — 头号贡献者编写了 100% 的提交
1.4/13.5贡献者广度 — 1 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled1
top_contributor_share1
评分方式
0/46.8议题解决 — 没有议题或无数据
36.6/38.3PR 接受 — 已裁定的 PR 中 43/45 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs43
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs2
已排除计分(无数据或不适用):议题解决。 其余权重已重新归一化。
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
2.2/25所有者影响力 — abilisoft 有 1 位关注者
5.6/25既往记录 — 4 个公开仓库,账户约 0 年
所用输入
followers1
owner_typeOrganization
is_verified
owner_loginabilisoft
public_repos4
account_age_days95
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 4 天前
20/20版本历史 — 6 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/abilisoft/usbip-go
ecosystemsgo
any_deprecated
min_days_since_publish4

工程质量

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

84良好 · 占总体的 20%

工程实践

90优秀
评分方式
24/24CI 工作流 — 13 个工作流
24/24存在测试
16/16Linter 配置 — .golangci.yaml, .golangci.yml
0/9.6Pre-commit 钩子
6.4/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 11 out of 11 merged PRs checked by a CI test -- score normalized to 10
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

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

安全

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

84良好 · 占总体的 16%

安全态势

80良好
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
6.8/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 11 out of 11 merged PRs checked by a CI test -- score normalized to 10
1.2/2.5CII-Best-Practices — badge detected: Passing
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
5/5Fuzzing — project is fuzzed
2.5/2.5许可证 — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — 无数据
4/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 8
5/5SAST — SAST tool is run on all commits
5/5Security-Policy — security policy file detected
7.5/7.5Signed-Releases — 1 out of the last 1 releases have a total of 2 signed artifacts.
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate8
已排除计分(无数据或不适用):packaging。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
0/25间接依赖不含已知公告 — 在此范围内,传递依赖集合无法与开发和测试依赖区分
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories0
affected_packages0
assessed_packages244
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
已排除计分(无数据或不适用):间接依赖不含已知公告, 没有长期未处理的公告。 其余权重已重新归一化。 已将 244 个已解析依赖与 OSV 比对。 该仓库未发布任何索引可解析的软件包,因此改为评估仓库依赖图。该图将开发与测试版本固定同交付的依赖混在一起,因此仅对声明的运行时依赖计分;传递性发现仅作为背景信息列出,不计入评分。 未对可达性进行分析。

AI 就绪度

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

82良好 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, vendor/github.com/clipperhouse/displaywidth/AGENTS.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 92 次人类提交中有 92 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_filesAGENTS.md, vendor/github.com/clipperhouse/displaywidth/AGENTS.md
agent_instruction_max_bytes6,677
评分方式
18/18一条命令的引导启动 — 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
22/22自动化测试
11/11Lint / 格式化配置 — .golangci.yaml, .golangci.yml
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — lockfile
0/10已体现的代理实践 — 最近 100 次提交中没有代理编写的提交
8/8自动化维护 — 最近 100 次提交中有 8 次为自动依赖更新
8/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 8
所用输入
has_nix
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_filesMakefile, 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
has_linter_config
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod, tools/go.mod
dependency_bot_commit_share0.08
评分方式
45/45可类型检查的代码 — Go(静态类型)
54.8/55可控的文件大小 — 采样的 357 个源文件中有 1 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes66,581
source_files_sampled357
oversized_source_files1

机器可读接口

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

关键数据

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

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

更多细节

OpenSSF Scorecard 8.0 / 10
8.0综合

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

10Binary-Artifactsno binaries found in the repo
9Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests11 out of 11 merged PRs checked by a CI test -- score normalized to 10
5CII-Best-Practicesbadge detected: Passing
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
10Fuzzingproject is fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
不适用Packagingpackaging workflow not detected
8Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 8
10SASTSAST tool is run on all commits
10Security-Policysecurity policy file detected
10Signed-Releases1 out of the last 1 releases have a total of 2 signed artifacts.
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
10Vulnerabilities0 existing vulnerabilities detected
直接依赖 11
注册表软件包版本约束清单文件
Gocharm.land/lipgloss/v2v2.0.5go.mod
Gogithub.com/charmbracelet/colorprofilev0.4.3go.mod
Gogithub.com/charmbracelet/fangv1.0.0go.mod
Gogithub.com/coreos/go-systemd/v22v22.7.0go.mod
Gogithub.com/lmittmann/tintv1.2.0go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Gogo.uber.org/goleakv1.3.0go.mod
Gogolang.org/x/sysv0.47.0go.mod
Gogolang.org/x/termv0.45.0go.mod
Gogolang.org/x/timev0.15.0go.mod
全部依赖 244

来自 GitHub 依赖图的完整解析依赖集合:11 个直接依赖与 233 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
Gocharm.land/lipgloss/v2v2.0.5直接
Gogithub.com/charmbracelet/colorprofilev0.4.3直接
Gogithub.com/charmbracelet/fangv1.0.0直接
Gogithub.com/coreos/go-systemd/v22v22.7.0直接
Gogithub.com/lmittmann/tintv1.2.0直接
Gogithub.com/spf13/cobrav1.10.2直接
Gogithub.com/stretchr/testifyv1.11.1直接
Gogo.uber.org/goleakv1.3.0直接
Gogolang.org/x/sysv0.47.0直接
Gogolang.org/x/termv0.45.0直接
Gogolang.org/x/timev0.15.0直接
Go4d63.com/gocheckcompilerdirectivesv1.4.0间接
Go4d63.com/gochecknoglobalsv0.2.2间接
Gocodeberg.org/chavacava/garifv0.2.1间接
Gocodeberg.org/polyfloyd/go-errorlintv1.9.0间接
Godev.gaijin.team/go/exhaustruct/v4v4.0.0间接
Godev.gaijin.team/go/golibv0.8.1间接
Gogithub.com/4meepo/tagalignv1.4.3间接
Gogithub.com/abirdcfly/dupwordv0.1.8间接
Gogithub.com/adminbenni/iota-mixingv1.0.0间接
Gogithub.com/alecthomas/chroma/v2v2.27.0间接
Gogithub.com/alecthomas/go-check-sumtypev0.3.1间接
Gogithub.com/alexkohler/nakedret/v2v2.0.6间接
Gogithub.com/alexkohler/preallocv1.1.0间接
Gogithub.com/alfatraining/structtagv1.0.0间接
Gogithub.com/alingse/asasalintv0.0.11间接
Gogithub.com/alingse/nilnesserrv0.2.0间接
Gogithub.com/alwxsin/noinlineerrv1.0.5间接
Gogithub.com/antonboom/errnamev1.1.2间接
Gogithub.com/antonboom/nilnilv1.1.2间接
Gogithub.com/antonboom/testifylintv1.6.4间接
Gogithub.com/ashanbrown/forbidigo/v2v2.3.1间接
Gogithub.com/ashanbrown/makezero/v2v2.2.1间接
Gogithub.com/beorn7/perksv1.0.1间接
Gogithub.com/bkielbasa/cyclopv1.2.3间接
Gogithub.com/blizzy78/varnamelenv0.8.0间接
Gogithub.com/bluekeyes/go-gitdiffv0.8.1间接
Gogithub.com/bombsimon/wsl/v4v4.7.0间接
Gogithub.com/bombsimon/wsl/v5v5.8.0间接
Gogithub.com/breml/bidichkv0.3.3间接
Gogithub.com/breml/errchkjsonv0.4.1间接
Gogithub.com/burntsushi/tomlv1.6.0间接
Gogithub.com/butuzov/ireturnv0.4.1间接
Gogithub.com/butuzov/mirrorv1.3.3间接
Gogithub.com/catenacyber/perfsprintv0.10.1间接
Gogithub.com/ccojocar/zxcvbn-gov1.0.4间接
Gogithub.com/cespare/xxhash/v2v2.3.0间接
Gogithub.com/charithe/durationcheckv0.0.11间接
Gogithub.com/charmbracelet/ultravioletv0.0.0-20260703014108-f5a850f9c2b7间接
Gogithub.com/charmbracelet/x/ansiv0.11.7间接
Gogithub.com/charmbracelet/x/exp/charmtonev0.0.0-20260705004817-2cc9a8fe1146间接
Gogithub.com/charmbracelet/x/exp/goldenv0.0.0-20260705004817-2cc9a8fe1146间接
Gogithub.com/charmbracelet/x/termv0.2.2间接
Gogithub.com/charmbracelet/x/termiosv0.1.1间接
Gogithub.com/charmbracelet/x/windowsv0.2.2间接
Gogithub.com/checkmake/checkmakev0.3.2间接
Gogithub.com/ckaznocha/intrangev0.3.1间接
Gogithub.com/clickhouse/clickhouse-go-linterv1.2.1间接
Gogithub.com/clipperhouse/displaywidthv0.11.0间接
Gogithub.com/clipperhouse/uax29/v2v2.7.0间接
Gogithub.com/curioswitch/go-reassignv0.3.0间接
Gogithub.com/daixiang0/gciv0.14.0间接
Gogithub.com/dave/dstv0.27.4间接
Gogithub.com/davecgh/go-spewv1.1.1间接
Gogithub.com/davecgh/go-spewv1.1.2-0.20180830191138-d8f796af33cc间接
Gogithub.com/denis-tingaikin/go-headerv0.5.0间接
Gogithub.com/djarvur/go-err113v0.1.1间接
Gogithub.com/dlclark/regexp2/v2v2.3.0间接
Gogithub.com/ettle/strcasev0.2.0间接
Gogithub.com/fatih/colorv1.19.0间接
Gogithub.com/fatih/structtagv1.2.0间接
Gogithub.com/firefart/nonamedreturnsv1.0.8间接
Gogithub.com/fsnotify/fsnotifyv1.10.1间接
Gogithub.com/fzipp/gocyclov0.6.0间接
Gogithub.com/ghostiam/protogetterv0.3.21间接
Gogithub.com/go-critic/go-criticv0.14.4间接
Gogithub.com/go-gremlins/gremlinsv0.6.0间接
Gogithub.com/go-ini/iniv1.67.0间接
Gogithub.com/go-toolsmith/astcastv1.1.0间接
Gogithub.com/go-toolsmith/astcopyv1.1.0间接
Gogithub.com/go-toolsmith/astequalv1.2.0间接
Gogithub.com/go-toolsmith/astfmtv1.1.0间接
Gogithub.com/go-toolsmith/astpv1.1.0间接
Gogithub.com/go-toolsmith/strparsev1.1.0间接
Gogithub.com/go-toolsmith/typepv1.1.0间接
Gogithub.com/go-viper/mapstructure/v2v2.5.0间接
Gogithub.com/go-xmlfmt/xmlfmtv1.1.3间接
Gogithub.com/gobwas/globv0.2.3间接
Gogithub.com/goccy/go-jsonv0.10.6间接
Gogithub.com/godoc-lint/godoc-lintv0.11.2间接
Gogithub.com/gofrs/flockv0.13.0间接
Gogithub.com/golangci/asciicheckv0.5.0间接
Gogithub.com/golangci/duplv0.0.0-20260401084720-c99c5cf5c202间接
Gogithub.com/golangci/go-printf-func-namev0.1.1间接
Gogithub.com/golangci/gofmtv0.0.0-20250106114630-d62b90e6713d间接
Gogithub.com/golangci/golangci-lint/v2v2.12.2间接
Gogithub.com/golangci/golinesv0.15.0间接
Gogithub.com/golangci/misspellv0.8.0间接
Gogithub.com/golangci/plugin-module-registerv0.1.2间接
Gogithub.com/golangci/revgrepv0.8.0间接
Gogithub.com/golangci/rowserrcheckv0.0.0-20260701145345-399602f983c8间接
Gogithub.com/golangci/swaggoswagv0.0.0-20250504205917-77f2aca3143e间接
Gogithub.com/golangci/unconvertv0.0.0-20250410112200-a129a6e6413e间接
Gogithub.com/google/go-cmpv0.7.0间接
Gogithub.com/google/pprofv0.0.0-20260709232956-b9395ee17fa0间接
Gogithub.com/google/renameiov1.0.1间接
Gogithub.com/gordonklaus/ineffassignv0.2.0间接
Gogithub.com/gostaticanalysis/analysisutilv0.7.1间接
Gogithub.com/gostaticanalysis/commentv1.5.0间接
Gogithub.com/gostaticanalysis/forcetypeassertv0.2.0间接
Gogithub.com/gostaticanalysis/nilerrv0.1.2间接
Gogithub.com/gostaticanalysis/testutilv0.6.1间接
Gogithub.com/hako/durafmtv0.0.0-20210608085754-5c1018a4e16b间接
Gogithub.com/hashicorp/go-immutable-radix/v2v2.1.0间接
Gogithub.com/hashicorp/go-versionv1.9.0间接
Gogithub.com/hashicorp/golang-lru/v2v2.0.7间接
Gogithub.com/hectane/go-aclv1.0.0间接
Gogithub.com/hexops/gotextdiffv1.0.3间接
Gogithub.com/inconshreveable/mousetrapv1.1.0间接
Gogithub.com/jgautheron/goconstv1.10.2间接
Gogithub.com/jjti/go-spancheckv0.6.5间接
Gogithub.com/julz/importasv0.2.0间接
Gogithub.com/karamaru-alpha/copyloopvarv1.2.2间接
Gogithub.com/kisielk/errcheckv1.20.0间接
Gogithub.com/kkhaike/contextcheckv1.1.6间接
Gogithub.com/kr/prettyv0.3.1间接
Gogithub.com/kulti/thelperv0.7.1间接
Gogithub.com/kunwardeep/paralleltestv1.0.15间接
Gogithub.com/lasiar/canonicalheaderv1.1.2间接
Gogithub.com/ldez/exptostdv0.4.5间接
Gogithub.com/ldez/gomoddirectivesv0.9.0间接
Gogithub.com/ldez/grignotinv0.10.1间接
Gogithub.com/ldez/structtagsv0.6.1间接
Gogithub.com/ldez/tagliatellev0.7.2间接
Gogithub.com/ldez/usetestingv0.5.0间接
Gogithub.com/leonklingele/grouperv1.1.2间接
Gogithub.com/lucasb-eyer/go-colorfulv1.4.0间接
Gogithub.com/macabu/inamedparamv0.2.0间接
Gogithub.com/makenowjust/heredocv1.0.0间接
Gogithub.com/manuelarte/embeddedstructfieldcheckv0.4.0间接
Gogithub.com/manuelarte/funcorderv0.6.0间接
Gogithub.com/maratori/testableexamplesv1.0.1间接
Gogithub.com/maratori/testpackagev1.1.2间接
Gogithub.com/masterminds/semver/v3v3.5.0间接
Gogithub.com/matoous/godoxv1.1.0间接
Gogithub.com/matryer/isv1.4.1间接
Gogithub.com/mattn/go-colorablev0.1.15间接
Gogithub.com/mattn/go-isattyv0.0.22间接
Gogithub.com/mattn/go-runewidthv0.0.24间接
Gogithub.com/mgechev/revivev1.15.0间接
Gogithub.com/mirrexone/unqueryvetv1.5.4间接
Gogithub.com/mitchellh/go-homedirv1.1.0间接
Gogithub.com/moricho/tparallelv0.3.2间接
Gogithub.com/muesli/cancelreaderv0.2.2间接
Gogithub.com/muesli/mangov0.2.0间接
Gogithub.com/muesli/mango-cobrav1.3.0间接
Gogithub.com/muesli/mango-pflagv0.2.0间接
Gogithub.com/muesli/roffv0.1.0间接
Gogithub.com/munnerz/goautonegv0.0.0-20191010083416-a7dc8b61c822间接
Gogithub.com/nakabonne/nestifv0.3.1间接
Gogithub.com/nishanths/exhaustivev0.12.0间接
Gogithub.com/nishanths/predeclaredv0.2.2间接
Gogithub.com/nunnatsa/ginkgolinterv0.23.0间接
Gogithub.com/olekukonko/catv0.0.0-20250911104152-50322a0618f6间接
Gogithub.com/olekukonko/errorsv1.3.0间接
Gogithub.com/olekukonko/llv0.1.8间接
Gogithub.com/olekukonko/tablewriterv1.1.4间接
Gogithub.com/onsi/ginkgo/v2v2.32.0间接
Gogithub.com/onsi/gomegav1.42.1间接
Gogithub.com/openpeedeep/depguard/v2v2.2.1间接
Gogithub.com/pelletier/go-toml/v2v2.4.3间接
Gogithub.com/pmezard/go-difflibv1.0.0间接
Gogithub.com/pmezard/go-difflibv1.0.1-0.20181226105442-5d4384ee4fb2间接
Gogithub.com/prometheus/client_golangv1.23.2间接
Gogithub.com/prometheus/client_modelv0.6.2间接
Gogithub.com/prometheus/commonv0.70.0间接
Gogithub.com/prometheus/procfsv0.21.1间接
Gogithub.com/quasilyte/go-ruleguardv0.4.5间接
Gogithub.com/quasilyte/go-ruleguard/dslv0.3.23间接
Gogithub.com/quasilyte/gogrepv0.5.0间接
Gogithub.com/quasilyte/regex/syntaxv0.0.0-20210819130434-b3f0c404a727间接
Gogithub.com/quasilyte/stdinfov0.0.0-20220114132959-f7386bf02567间接
Gogithub.com/raeperd/recvcheckv0.3.0间接
Gogithub.com/rivo/unisegv0.4.7间接
Gogithub.com/rogpeppe/go-internalv1.15.0间接
Gogithub.com/ryancurrah/gomodguardv1.4.1间接
Gogithub.com/ryancurrah/gomodguard/v2v2.1.3间接
Gogithub.com/ryanrolds/sqlclosecheckv0.6.0间接
Gogithub.com/sagikazarmark/locaferov0.12.0间接
Gogithub.com/sanposhiho/wastedassign/v2v2.1.0间接
Gogithub.com/santhosh-tekuri/jsonschema/v6v6.0.2间接
Gogithub.com/sashamelentyev/interfacebloatv1.1.0间接
Gogithub.com/sashamelentyev/usestdlibvarsv1.29.0间接
Gogithub.com/securego/gosec/v2v2.27.1间接
Gogithub.com/sergi/go-diffv1.4.0间接
Gogithub.com/sirupsen/logrusv1.9.4间接
Gogithub.com/sivchari/containedctxv1.0.3间接
Gogithub.com/sonatard/noctxv0.5.1间接
Gogithub.com/sourcegraph/go-diffv0.8.0间接
Gogithub.com/spf13/aferov1.15.0间接
Gogithub.com/spf13/castv1.10.0间接
Gogithub.com/spf13/pflagv1.0.10间接
Gogithub.com/spf13/viperv1.21.0间接
Gogithub.com/ssgreg/nlreturn/v2v2.2.1间接
Gogithub.com/stbenjam/no-sprintf-host-portv0.3.1间接
Gogithub.com/stretchr/objxv0.5.3间接
Gogithub.com/subosito/gotenvv1.6.0间接
Gogithub.com/tenntenn/text/transformv0.0.0-20250402111347-ba836492e880间接
Gogithub.com/tetafro/godotv1.5.6间接
Gogithub.com/timakin/bodyclosev0.0.0-20260129054331-73d1f95b84b4间接
Gogithub.com/timonwong/loggercheckv0.11.0间接
Gogithub.com/tomarrell/wrapcheck/v2v2.12.0间接
Gogithub.com/tommy-muehle/go-mnd/v2v2.5.1间接
Gogithub.com/ultraware/funlenv0.2.0间接
Gogithub.com/ultraware/whitespacev0.2.0间接
Gogithub.com/uudashr/gocognitv1.2.1间接
Gogithub.com/uudashr/ifacev1.5.0间接
Gogithub.com/xen0n/gosmopolitanv1.3.0间接
Gogithub.com/xo/terminfov0.0.0-20220910002029-abceb7e1c41e间接
Gogithub.com/yagipy/maintidxv1.0.0间接
Gogithub.com/yeya24/promlinterv0.3.0间接
Gogithub.com/ykadowak/zerologlintv0.1.5间接
Gogitlab.com/bosi/decorderv0.4.2间接
Gogo-simpler.org/musttagv0.14.0间接
Gogo-simpler.org/sloglintv0.12.0间接
Gogo.augendre.info/arangolintv0.4.0间接
Gogo.augendre.info/fatcontextv0.10.0间接
Gogo.uber.org/multierrv1.11.0间接
Gogo.uber.org/zapv1.28.0间接
Gogo.yaml.in/yaml/v3v3.0.4间接
Gogolang.org/x/expv0.0.0-20260709172345-9ea1abe57597间接
Gogolang.org/x/exp/typeparamsv0.0.0-20260709172345-9ea1abe57597间接
Gogolang.org/x/modv0.38.0间接
Gogolang.org/x/syncv0.22.0间接
Gogolang.org/x/telemetryv0.0.0-20260710170516-c325552849a7间接
Gogolang.org/x/textv0.40.0间接
Gogolang.org/x/toolsv0.48.0间接
Gogolang.org/x/vulnv1.6.0间接
Gogoogle.golang.org/protobufv1.36.11间接
Gogopkg.in/check.v1v1.0.0-20201130134442-10cb98267c6c间接
Gogopkg.in/yaml.v3v3.0.1间接
Gohonnef.co/go/toolsv0.7.0间接
Gomvdan.cc/gofumptv0.10.0间接
Gomvdan.cc/unparamv0.0.0-20251027182757-5beb8c8f8f15间接
依赖安全公告 0

该仓库未发布可被索引解析的包,因此评估的是其自身的依赖图——共 244 个包,其中也包含从不交付的开发与测试版本固定:0 个存在已知公告,0 个为直接依赖。

没有已知公告影响已评估的依赖。

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

原始 JSON 报告 机器可读
{
  "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"
}

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

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

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