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

svyatov / oz

Config-driven CLI wizard framework

GoMIT★ 2 星标⑂ 0 复刻始于 2026年4月在 GitHub 上查看 ↗

svyatov/oz 的健康指数为 100 分中的 59 分,处于「中等」区间。 其得分最高的类别是AI Readiness(85/100),最低的是Community & Adoption(43/100)。 最近一次更新在 5 天前。 近期的大部分工作由 1 位贡献者完成。

59
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

Leonid Svyatov个人账户
33 关注者27 个公开仓库始于 2010年6月

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/svyatov/ozv0.2.0-220 天前

按类别列示的指标

活力

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

74良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 5 天前
4.2/36提交节奏 — 52 周中有 6 周有提交
18/18提交量 — 最近一年 127 次提交
10/10OpenSSF Scorecard:Maintained — 20 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year127
human_commit_share0.96
days_since_last_push5
active_weeks_last_year6

发布纪律

83良好
评分方式
27/27有发布版本 — 已发布 2 个发布版本
36/36发布时效 — 最近一次发布版本于 20 天前
19.8/27发布节奏 — 约每 89.7 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count2
latest_release_tagv0.2.0
releases_from_tags
days_since_latest_release20
mean_days_between_releases89.7

社区与采用

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

43存在风险 · 占总体的 18%
评分方式
0/60星标 — 2 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 0 位关注者
所用输入
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold

社区健康

92优秀
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
18/18CONTRIBUTING 指南
13.5/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

可持续性与治理

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

45存在风险 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0/22.5提交分布 — 头号贡献者编写了 100% 的提交
1.4/13.5贡献者广度 — 1 位贡献者
0/10OpenSSF Scorecard:Contributors — project has 0 contributing companies or organizations -- score normalized to 0
所用输入
bus_factor1
contributors_sampled1
top_contributor_share1
评分方式
0/46.8议题解决 — 没有议题或无数据
21.2/38.3PR 接受 — 已裁定的 PR 中 5/9 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/26 approved changesets -- score normalized to 0
所用输入
merged_prs5
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs4
已排除计分(无数据或不适用):议题解决。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
11/25所有者影响力 — svyatov 有 33 位关注者
22.5/25既往记录 — 27 个公开仓库,账户约 16 年
所用输入
followers33
owner_typeUser
is_verified
owner_loginsvyatov
public_repos27
account_age_days5,875
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 20 天前
12/20版本历史 — 2 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/svyatov/oz
ecosystemsgo
any_deprecated
min_days_since_publish20

工程质量

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

72良好 · 占总体的 20%

工程实践

80良好
评分方式
24/24CI 工作流 — 2 个工作流
24/24存在测试
16/16Linter 配置 — .golangci.yml
0/9.6Pre-commit 钩子
0/6.4.editorconfig
16/20OpenSSF Scorecard:CI-Tests — 4 out of 5 merged PRs checked by a CI test -- score normalized to 8
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

60中等
评分方式
30/30README
0/25文档目录
0/15文档 / 主页站点
10/10仓库描述
10/10主题标签 — 14 个主题标签
10/10Wiki
所用输入
topicscli, go, terminal, utility, bubbletea, cli-tool, code-generator, command-line, golang, interactive, scaffold, tui, wizard, yaml
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

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

62中等 · 占总体的 16%

安全态势

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

AI 就绪度

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

85优秀 · 占总体的 0%
评分方式
45/45代理指令 — CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 96 次人类提交中有 95 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.99
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes10,464
评分方式
18/18一条命令的引导启动 — Taskfile.yml
22/22自动化测试
11/11Lint / 格式化配置 — .golangci.yml
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — lockfile
0/10已体现的代理实践 — 最近 100 次提交中没有代理编写的提交
8/8自动化维护 — 最近 100 次提交中有 4 次为自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_filesTaskfile.yml
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0.04
评分方式
45/45可类型检查的代码 — Go(静态类型)
55/55可控的文件大小 — 采样的 77 个源文件中有 0 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes27,545
source_files_sampled77
oversized_source_files0

关键数据

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

更多细节

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

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

111222212026-042026-052026-06
OpenSSF Scorecard 5.3 / 10
5.3综合

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

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
8CI-Tests4 out of 5 merged PRs checked by a CI test -- score normalized to 8
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/26 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained20 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
8SASTSAST tool is not run on all commits -- score normalized to 8
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
直接依赖 9
注册表软件包版本约束清单文件
Gocharm.land/bubbles/v2v2.1.0go.mod
Gocharm.land/bubbletea/v2v2.0.7go.mod
Gocharm.land/huh/v2v2.0.3go.mod
Gocharm.land/lipgloss/v2v2.0.4go.mod
Gogithub.com/Masterminds/semver/v3v3.5.0go.mod
Gogithub.com/adrg/xdgv0.5.3go.mod
Gogithub.com/charmbracelet/x/termv0.2.2go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
全部依赖 31

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

注册表软件包版本关系
Gocharm.land/bubbles/v2v2.1.0直接
Gocharm.land/bubbletea/v2v2.0.7直接
Gocharm.land/huh/v2v2.0.3直接
Gocharm.land/lipgloss/v2v2.0.4直接
Gogithub.com/adrg/xdgv0.5.3直接
Gogithub.com/charmbracelet/x/termv0.2.2直接
Gogithub.com/masterminds/semver/v3v3.5.0直接
Gogithub.com/spf13/cobrav1.10.2直接
Gogopkg.in/yaml.v3v3.0.1直接
Gogithub.com/atotto/clipboardv0.1.4间接
Gogithub.com/catppuccin/gov0.3.0间接
Gogithub.com/charmbracelet/colorprofilev0.4.3间接
Gogithub.com/charmbracelet/ultravioletv0.0.0-20260525132238-948f4557a654间接
Gogithub.com/charmbracelet/x/ansiv0.11.7间接
Gogithub.com/charmbracelet/x/exp/orderedv0.1.0间接
Gogithub.com/charmbracelet/x/exp/stringsv0.1.0间接
Gogithub.com/charmbracelet/x/termiosv0.1.1间接
Gogithub.com/charmbracelet/x/windowsv0.2.2间接
Gogithub.com/clipperhouse/displaywidthv0.11.0间接
Gogithub.com/clipperhouse/uax29/v2v2.7.0间接
Gogithub.com/dustin/go-humanizev1.0.1间接
Gogithub.com/inconshreveable/mousetrapv1.1.0间接
Gogithub.com/lucasb-eyer/go-colorfulv1.4.0间接
Gogithub.com/mattn/go-runewidthv0.0.23间接
Gogithub.com/mitchellh/hashstructure/v2v2.0.2间接
Gogithub.com/muesli/cancelreaderv0.2.2间接
Gogithub.com/rivo/unisegv0.4.7间接
Gogithub.com/spf13/pflagv1.0.10间接
Gogithub.com/xo/terminfov0.0.0-20220910002029-abceb7e1c41e间接
Gogolang.org/x/syncv0.20.0间接
Gogolang.org/x/sysv0.45.0间接
依赖安全公告 0

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

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

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "cli",
        "go",
        "terminal",
        "utility",
        "bubbletea",
        "cli-tool",
        "code-generator",
        "command-line",
        "golang",
        "interactive",
        "scaffold",
        "tui",
        "wizard",
        "yaml"
      ],
      "is_fork": false,
      "size_kb": 641,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 536059
      },
      "pushed_at": "2026-07-16T10:33:38Z",
      "created_at": "2026-04-02T18:09:51Z",
      "owner_type": "User",
      "updated_at": "2026-07-01T14:31:09Z",
      "description": "Config-driven CLI wizard framework",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "https://www.svyatov.com",
      "name": "Leonid Svyatov",
      "type": "User",
      "login": "svyatov",
      "company": null,
      "location": "Yerevan, Armenia",
      "followers": 33,
      "avatar_url": "https://avatars.githubusercontent.com/u/310043?v=4",
      "created_at": "2010-06-20T15:48:24Z",
      "is_verified": null,
      "public_repos": 27,
      "account_age_days": 5875
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-07-01T14:32:26Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-04-02T20:33:51Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "a15b781fe1c1075157294bfc5c5700fd267e2c4f",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.2.0",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-07-01T14:30:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "faf405a6bc1e24f347f75994f12168a93edb4a9b",
          "body": null,
          "is_bot": false,
          "headline": "chore: stop tracking CONCEPTS.md",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-07-01T14:21:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d0afa5caff09144e96c57a36969b8ca3bbac861",
          "body": "## Summary\n\nWizards can now collect two kinds of input they couldn't before: secrets\nand bounded numbers.\n\nA `password` option masks input as it's typed, renders as `****`\neverywhere oz prints a command or answer (dry-run, confirmation prompt,\n`oz run show`, and the pins/presets editors), and is nev\n[…]\n both-set warning; and positional-password\nrejection.\n\nNo live TUI recording is attached — the behavior is covered by the test\nsuite above; the interactive prompt itself is a standard Bubbletea\nfield.",
          "is_bot": false,
          "headline": "feat(wizard): add password and number option types (#9)",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-07-01T14:01:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6d7677a96107ec2a52571a295fadad27f4ace2bc",
          "body": "Add CONCEPTS.md with core wizard/command-build domain vocabulary, and a\n\"Documented Knowledge\" section in CLAUDE.md pointing agents at docs/solutions/\nand CONCEPTS.md.",
          "is_bot": false,
          "headline": "docs: seed CONCEPTS.md vocabulary and surface knowledge stores",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-06-30T16:52:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7332b813b5980bb2bce72a42fb2d479f459d0e5d",
          "body": "Add `oz test [wizard]`, a snapshot harness that asserts a wizard's fixture\nanswers build the expected command, wired as a CI gate so registry wizards\ncan't silently rot.\n\n- internal/wizardtest: fixture loader + hermetic BuildCommand that mirrors the\n  run path (EffectiveCommand + FilterOptions + Fil\n[…]\nbundle-gem version-gating fixtures\n- CI runs `oz test --config-dir ./wizards` on every push/PR\n\nDocs: README commands + fixture-contributing flow, CONTRIBUTING fixture format,\nCHANGELOG Added entries.",
          "is_bot": false,
          "headline": "feat(test): add hermetic wizard test harness (oz test)",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-06-30T16:52:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6eb90072fa15dd6d2cafe411b7e3e1a786930526",
          "body": null,
          "is_bot": false,
          "headline": "chore: ignore docs directory",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-06-30T16:16:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d144155a2e384c3f48cd7b3e44940b99d6315b06",
          "body": "Wraps Bundler's `bundle gem` generator with interactive, version-aware\noptions, verified against real Bundler binaries from 2.2.0 to 4.0.12:\n\n- --changelog (>=2.2.8), --github-username (>=2.2.16), --linter (>=2.2.31)\n- --ext values: c, rust (>=2.4), go (>=4.0)\n- --bundle (>=2.7); --rubocop confirm f\n[…]\n <2.2.31, then --linter takes over\n  and --rubocop is hidden on 4.x where Bundler removed it\n- version picker via `bundle _<version>_ gem`\n\nRegistered in index.yml for `oz add` and `oz list --remote`.",
          "is_bot": false,
          "headline": "feat(wizards): add bundle-gem wizard",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-06-30T16:08:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3ca2d4cde81c588f22af283349b5c5b1160b3157",
          "body": null,
          "is_bot": false,
          "headline": "chore: ignore .compound-engineering directory",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-06-30T14:54:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "163d57931c3a02568f093f2250924b0ebdd2253e",
          "body": "Both 'oz list' and 'oz list --remote' ended without the trailing blank\nline every other command emits (ui.*Msgf, dry-run, doctor, show, pins,\npresets). Match the convention: leading + trailing blank around output.",
          "is_bot": false,
          "headline": "fix(ui): add trailing blank line to wizard list output",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-06-30T14:42:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78f683e194a5e378f6614a8e97235a17d13aa4f2",
          "body": "The shared list table's StyleFunc set no horizontal padding between\ncolumns, gluing name, description, and the (installed) tag together in\nboth 'oz list' and 'oz list --remote'.",
          "is_bot": false,
          "headline": "fix(ui): add column spacing to wizard list output",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-06-30T14:36:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "24644f21f327958cd1ce5bc4c4a8b2f28b78a1c8",
          "body": "Point the default registry at svyatov/oz (wizards/ + new index.yml on\nmain) instead of a separate, non-existent oz-wizards repo. Fixes the\nHTTP 404 from 'oz add <name>', 'oz list --remote', and 'oz update'.\nOverride still available via OZ_REGISTRY_URL. Docs updated.",
          "is_bot": false,
          "headline": "fix(registry): serve wizards from the main repo",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-06-30T14:30:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dfb255363397848bd7ccb31418884ce0686a2728",
          "body": "The asset-pipeline selector is gated < 8.0, leaving Rails 8.x with no\nway to reach --skip-asset-pipeline. Add a >= 8.0 version-gated confirm\nto close the gap. Verified against real rails 7.2.3.1/8.0.5/8.1.3.",
          "is_bot": false,
          "headline": "fix(wizards): expose --skip-asset-pipeline on Rails 8.x in rails-new",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-06-30T14:01:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0356781f21aadf0cab8fcff1b1dc8f56a65cc56",
          "body": null,
          "is_bot": false,
          "headline": "build(deps): bump charm.land/lipgloss/v2 from 2.0.2 to 2.0.4",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-06-30T11:57:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f76ed372a05d208faef9f64716081ff83367b22",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to\n7.\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a\nhref=\"https://github.com/actions/checkout/releases\">actions/checkout's\nreleases</a>.</em></p>\n<blockquote>\n<h2>v7.0.0</h2>\n<h2>What's Changed</h2>\n<ul>\n<li>blo\n[…]\nnless you reopen the\nPR or upgrade to it yourself)\n\n\n</details>\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump actions/checkout from 6 to 7 (#8)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-30T11:55:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e110d6143475d05ebd890c9a2e6f87eeae60f389",
          "body": "Bumps\n[charm.land/bubbletea/v2](https://github.com/charmbracelet/bubbletea)\nfrom 2.0.2 to 2.0.7.\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a\nhref=\"https://github.com/charmbracelet/bubbletea/releases\">charm.land/bubbletea/v2's\nreleases</a>.</em></p>\n<blockquote>\n<h2>v2.0.7</h2>\n\n[…]\nnless you reopen the\nPR or upgrade to it yourself)\n\n\n</details>\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump charm.land/bubbletea/v2 from 2.0.2 to 2.0.7 (#6)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-30T11:55:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ddab07191a1bbdc664291501bb6a1422d1d2c731",
          "body": "…0 (#5)\n\nBumps\n[github.com/Masterminds/semver/v3](https://github.com/Masterminds/semver)\nfrom 3.4.0 to 3.5.0.\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a\nhref=\"https://github.com/Masterminds/semver/releases\">github.com/Masterminds/semver/v3's\nreleases</a>.</em></p>\n<blockquote>\n[…]\nnless you reopen the\nPR or upgrade to it yourself)\n\n\n</details>\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump github.com/Masterminds/semver/v3 from 3.4.0 to 3.5.…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-30T11:55:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a9073acc0173f3237b09ce7d8af729b8fa22c851",
          "body": null,
          "is_bot": false,
          "headline": "ci: bump golangci-lint from v2.11 to v2.12",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-06-30T11:51:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66449666c32aaaa821f6a5be85372aad55589cc1",
          "body": "Resolves goconst findings surfaced by golangci-lint v2.12 (counts\ntest-file occurrences): cmdRun/cmdList, boolFalse, flagHelp, keyEnter/\nkeyEsc, labelYes/labelNone.",
          "is_bot": false,
          "headline": "style(lint): extract repeated literals into named constants",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-06-30T11:51:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "999962f15de49e4feddb73e5667065256b0b0b90",
          "body": null,
          "is_bot": false,
          "headline": "chore(graphify): ignore output dir and add query-first hooks",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-06-30T11:19:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf1a7e7e254524ee6f832cf350815ff6022c77ff",
          "body": null,
          "is_bot": false,
          "headline": "docs(claude): document command/extra.go in architecture tree",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-06-30T11:06:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4cc4371066d125615eeea21098d507d0555ccbec",
          "body": "- Group RunPins/newPinsModel 7 positional params into PinsParams struct\n- Move shared test helpers (stripANSI, key, specialKey) to helpers_test.go\n- Fix preset name validation to use filepath.IsLocal() matching store\n- Extract magic numbers in parse.go to named constants",
          "is_bot": false,
          "headline": "refactor: minor cleanup across wizard, generate, and presets",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-04-02T21:46:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49942064d065c35885042fe147fd4719223ba56a",
          "body": null,
          "is_bot": false,
          "headline": "build(goreleaser): add post-install hook to remove macOS quarantine",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-04-02T21:20:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23b34fafdb2f9aded89e508aadfb21554750e585",
          "body": "brews was deprecated in goreleaser v2.10. homebrew_casks is the proper\nway to distribute pre-compiled binaries via Homebrew. Also adds\nauto-generated shell completions for bash, zsh, and fish.",
          "is_bot": false,
          "headline": "build(goreleaser): migrate from deprecated brews to homebrew_casks",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-04-02T21:08:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "366dcadbb0257bb18017df9d8228b8e5a93114f6",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps): update all dependencies",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-04-02T20:58:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a6f3d1f210e2307d8fd824331c121241ea1bb91",
          "body": "Bumps [charm.land/bubbles/v2](https://github.com/charmbracelet/bubbles)\nfrom 2.0.0 to 2.1.0.\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a\nhref=\"https://github.com/charmbracelet/bubbles/releases\">charm.land/bubbles/v2's\nreleases</a>.</em></p>\n<blockquote>\n<h2>v2.1.0</h2>\n<h1>Shri\n[…]\nnless you reopen the\nPR or upgrade to it yourself)\n\n\n</details>\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump charm.land/bubbles/v2 from 2.0.0 to 2.1.0 (#1)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-02T20:55:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6c17c97b9ac920d38f1f0b1c6d5b5ab928b3be64",
          "body": null,
          "is_bot": false,
          "headline": "build(goreleaser): use GitHub changelog with short SHA and @logins",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-04-02T20:53:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4192ed22b583d07b205946786256c8101c875cb8",
          "body": "Remove GitHub-style changelog (includes full SHA and author email).\nFilter out non-user-facing commits (docs, test, chore, ci, build).",
          "is_bot": false,
          "headline": "build: clean up goreleaser changelog format",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-04-02T20:41:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16931a83ef64987ff4341202c6f5f614c1e159a1",
          "body": null,
          "is_bot": false,
          "headline": "docs: set v0.1.0 release date",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-04-02T20:31:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3e292b3b3c7c3c16554fce36014c2b3a2f40ae0",
          "body": "- Overhaul README with install options, available wizards, features\n- Add CONTRIBUTING.md with dev setup and wizard contribution guide\n- Add Contributor Covenant v2.1 code of conduct\n- Add issue templates (bug, feature, wizard) and PR template\n- Add VHS demo tape for recording demo GIF\n- Configure dependabot for Go modules and GitHub Actions",
          "is_bot": false,
          "headline": "docs: add README, contributing guide, code of conduct, and templates",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-04-02T20:30:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a471ba190337bf1a0801a79c5ccbe9890f456ae",
          "body": "- G602: replace manual slice comparison with slices.Equal\n- G703: sanitize wizard name via filepath.Base to prevent path traversal",
          "is_bot": false,
          "headline": "fix(lint): properly resolve gosec G602/G703 issues",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-04-02T20:21:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eef8c4b08d45a2160c78064b5ca765aa93e67949",
          "body": "Use strconv.FormatBool instead of string literals in FieldValue.\nExclude gosec G602/G703 rules (false positives for CLI tools).",
          "is_bot": false,
          "headline": "fix(lint): resolve golangci-lint v2.11 compatibility issues",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-04-02T20:12:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "122494c8db707062749504d050263e4455ca9697",
          "body": null,
          "is_bot": false,
          "headline": "Create dependabot.yml",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-04-02T20:10:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e2a7244027ebc6b849cfa59286e7da5c5a17d28",
          "body": null,
          "is_bot": false,
          "headline": "docs: finalize changelog for v0.1.0 release",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-04-02T20:05:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c914b800e6708b00e4c5cf9452d0b4c5bb93885",
          "body": null,
          "is_bot": false,
          "headline": "build: add goreleaser config for cross-platform releases",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-04-02T20:03:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bf8472e1d632e8d2cc24813d820fb2c32986fbb",
          "body": null,
          "is_bot": false,
          "headline": "ci: add release workflow with goreleaser",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-04-02T19:58:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87b11a10842520e36e061af1cbdf1cc0c0166118",
          "body": null,
          "is_bot": false,
          "headline": "ci: add lint and test workflow",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-04-02T19:54:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2dd3709f3479bacfbcb651994868774f3fbbbe25",
          "body": "Parse CLI args after -- against wizard option definitions: flags\nmatching wizard options override their values, positional args fill\nrequired positional options, and unrecognized args are appended raw\nto the built command. This enables running presets with dynamic\npositional args (e.g., `oz run rails-new -p api -- myapp`).\n\nAlso adds MissingRequired validation to catch unfilled required\noptions at runtime, and fixes a nil pointer when preset path\nreturns successfully from runWizardLoop.",
          "is_bot": false,
          "headline": "feat(run): add passthrough args via -- with smart option matching",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-16T16:14:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5848efbdd88c6734e81d16787bfd03932002559c",
          "body": null,
          "is_bot": false,
          "headline": "feat(add): add 'a' alias for add command",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-16T15:30:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5f8143d17feb03ae14b9e37aa024c75ed6a8c46",
          "body": "Default output changed from stdout to ~/.config/oz/wizards/<name>.yml.\nAdded --force/-f for overwrite protection. Removed --stdin and --install\nflags that added complexity without clear value.",
          "is_bot": false,
          "headline": "feat(generate): write to config directory by default",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-16T15:14:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "690c87a6e5ca264a28f6795daf62b6bc42247966",
          "body": "Errors and warnings were printing plain unstyled text to stderr while\nthe rest of the app used the lipgloss theme. Add WarningStyle,\nErrorMsgf, and WarnMsgf to the theme package and replace all 14\nunstyled fmt.Fprintf(os.Stderr, ...) calls. Also style metadata labels\nin the show command with MutedStyle for consistency.",
          "is_bot": false,
          "headline": "fix(ui): style all error, warning, and metadata output with theme colors",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-15T15:38:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe294904047f6f914623d305e5745eb7a1ba1e43",
          "body": "…CLAUDE.md",
          "is_bot": false,
          "headline": "docs: add registry, add/update commands, and missing wizard files to …",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-15T15:16:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce9d7bc18e8dbf87b859311f908daa03a1017c28",
          "body": "Remove nonexistent compat block, update workflow to use oz generate,\nadd \"Writing Self-Sufficient Descriptions\" section with three-question\nframework and before/after examples. Enrich all choice descriptions\nso users can pick without reading tool docs. Add markdown lint hook\nto project settings.",
          "is_bot": false,
          "headline": "docs(skill): rewrite wizard-scaffold with self-sufficient descriptions",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-15T15:09:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eed0404ef128d943034db7200718e09d3a281106",
          "body": "Add regex patterns to clean Clap [possible values: ...], Azure CLI\nAllowed values, [env: VAR=] hints, and standalone [default] markers.\nCollapse double spaces left by metadata stripping. Update fixture\ntests with new enum and description assertions.",
          "is_bot": false,
          "headline": "fix(generate): strip more CLI metadata from scaffold descriptions",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-15T15:08:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd20ecdd0083a41636eae073bcae9e716b37770e",
          "body": "Rewrite Thor preprocessor to intelligently handle multi-flag lines:\nstrip negation variants (--no-X, --skip-X) when base form exists,\nresolve aliases to canonical bracketed form (--js → --javascript),\nand prefer flags with =PLACEHOLDER for correct type inference.\n\nAdd bare Default: value extraction \n[…]\nails new generating wrong types (--javascript as confirm\ninstead of select), polluted descriptions (negation variants leaking),\nalias flags chosen over canonical forms, and unextracted defaults/enums.",
          "is_bot": false,
          "headline": "feat(generate): improve Thor-style help parsing quality",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-15T14:38:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4b022a956692ba0d57d5ab00df1e7405b0556570",
          "body": "Hooks receive JSON on stdin, not via $CLAUDE_TOOL_INPUT. Also fix\nJSON path from .file_path to .tool_input.file_path.",
          "is_bot": false,
          "headline": "fix(hooks): read tool input from stdin instead of nonexistent env var",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-15T13:39:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8002187ef7200e51ecc45183503ec4b351bc717f",
          "body": "Document oz generate in README with usage examples, flag reference,\nand supported help format list. Update CLAUDE.md architecture tree\nwith generate.go, internal/generate/ package, and key abstractions.",
          "is_bot": false,
          "headline": "docs: add generate command to README and CLAUDE.md",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-14T22:45:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9589f1106d729b5986d1bc0af8d803186ad2977a",
          "body": "…code\n\nRevert var-based function overrides (confirmPrompt, promptPresetSave,\nExecCommand) and io.Writer indirection (ui.Output, PrintCommand) that\nadded mutable global state to production code solely for test mocking.\nRemove tests that depended on these overrides.\n\nCoverage drops from 86.2% to 83.6% — the lost tests covered TTY-dependent\ncode paths that aren't unit-testable without the mocks. Accepting this\ngap keeps production code clean.",
          "is_bot": false,
          "headline": "revert: remove testability-only architecture changes from production …",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-14T22:43:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6739bda6f222110dd6d394525c30bb1097eb51ad",
          "body": "Add `oz generate <tool> [subcommand...]` command that parses any CLI\ntool's --help output and scaffolds a wizard YAML config. Supports GNU,\nCobra, kubectl, Clap, argparse, Thor, Hanami, npm, man page, and\nheaderless formats with automatic format detection.\n\nParser heuristics include ANSI/man-page st\n[…]\nlicate name dedup.\n\nTested against 59 real-world CLI tools (60 fixture files, 188 test\nsubtests) spanning Ruby, Python, Node, Go, Rust, Docker, Kubernetes,\nAWS, GCP, Azure, and general CLI ecosystems.",
          "is_bot": false,
          "headline": "feat(generate): scaffold wizard YAML from CLI --help output",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-14T22:35:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "88e08418b0959e96454a57aee80384299e70ef54",
          "body": "Add comprehensive tests across all packages and refactor key\ninterfaces for testability:\n\n- Extract io.Writer params for PrintCommand and ui.Output for\n  SuccessMsgf/InfoMsgf to enable output assertions in tests\n- Convert confirmPrompt/promptPresetSave to overridable function\n  variables for testing\n[…]\nements by package:\n  compat:  71.2% → 100.0%\n  ui:      62.3% →  98.1%\n  config:  89.0% →  96.4%\n  command: 69.7% →  92.0%\n  wizard:  69.3% →  87.2%\n  store:   77.3% →  84.4%\n  cmd/oz:  43.0% →  74.5%",
          "is_bot": false,
          "headline": "test: increase code coverage from 65.8% to 86.2%",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-14T21:31:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1bb71b3d858f505e4667a840eb2015988fabe510",
          "body": "… functions\n\nExtract cursorUp, cursorDown, numberKeyIndex, and choiceCursor helpers to\neliminate duplicated cursor navigation and rendering logic across select,\nmulti-select, and confirm field types. Merge confirmPrompt and\nconfirmDangerousPrompt into a single parameterized function with proper\nerror handling for huh.Run() failures. Add ui package tests (0% → 62%).",
          "is_bot": false,
          "headline": "refactor(wizard): extract shared field helpers and consolidate prompt…",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-14T20:41:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fab92c20a4ebf0b182bc49248cce260c5a2f37fc",
          "body": "Add MIT LICENSE, comprehensive test coverage for the wizard TUI package\n(engine, field_confirm, field_multi, version_loader, values_editor),\ndefensive bounds check in presets.go, updated README with registry/version\ncontrol/visibility/dynamic choices docs, and CHANGELOG for v0.1.0.\n\nWizard package coverage: 42.4% → 69.4%.",
          "is_bot": false,
          "headline": "chore: prepare v0.1.0 release",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-14T20:22:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3dcf7876064f9ec472b819f6dffa95f7c037fb8a",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps): update lipgloss to v2.0.2",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-14T14:55:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2c7f3cffb4678727345589bbf590f634141b849",
          "body": "- Fix update command printing \"Added\" instead of \"Updated\" by\n  parameterizing installWizard with a verb string\n- Add cobra.NoArgs to 8 leaf commands that silently ignored extra args\n- Tighten update Args to reject extra args with --all and require\n  exactly 1 arg without it\n- Print \"Cancelled\" on d\n[…]\nto remove for cleaning up state, pins, and presets\n- Add \"u\" alias for update command\n- Show wizard name in validate success message\n- Document NO_COLOR support and preset immediate execution behavior",
          "is_bot": false,
          "headline": "fix(cli): improve command consistency, argument validation, and UX",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-14T14:51:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "965cb62db4b7677e20f47f65656d2a635615b2e6",
          "body": "- Replace 10 repetitive NavHint functions in ui/theme.go with a generic\n  NavHints(hints ...Hint) builder and reusable hint constants\n- Replace manual column padding in list output with lipgloss/table\n- Replace manual bufio stdin prompts with charmbracelet/huh/v2 for\n  styled, keyboard-navigable confirmations and inputs\n- Replace hardcoded ~/.config/oz with adrg/xdg for proper\n  $XDG_CONFIG_HOME support\n- Replace manual path validation in store.go with filepath.IsLocal",
          "is_bot": false,
          "headline": "refactor: adopt external packages to reduce manual code",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-14T14:23:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0951245751f91f4c59cb2210374281209841674",
          "body": "The concatenation approach (a + \", \" + b) broke OR (||) handling: an OR\nbranch in either constraint escaped the AND, causing false positives.\nFix by checking probes against both constraints separately.\n\nAdd 24 option/choice mismatch tests covering tilde, caret, wildcard,\nOR, exact version, and large version boundaries. Replace fvptr helpers\nwith Go 1.26 new(expr) syntax to fix modernize lint warnings.",
          "is_bot": false,
          "headline": "fix(compat): check constraints independently in overlap detection",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-14T14:14:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78cfe26afef501fa4f1cc7f93a418d1fea56ddbc",
          "body": "…ints\n\nCover all constraint syntax (hyphen ranges, tilde, caret with 0.x,\nwildcards, multi-group OR), boundary conditions (strict inequalities,\ntouching ranges), large version numbers (calendar versioning, high\nminors), v-prefix handling, pre-release semantics, and invalid inputs.\nAdd direct TestConstraintsOverlap tests for the probe-based heuristic.",
          "is_bot": false,
          "headline": "test(compat): add comprehensive edge case coverage for semver constra…",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-14T14:06:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6973a989325d8964f43779764e74b9fda0c28d62",
          "body": "…semver/v3\n\nReplace ~166 lines of duplicated version comparison, constraint matching,\nand boundary probing code with the battle-tested semver library. Wizard\nYAML configs now support the full semver constraint syntax: tilde (~),\ncaret (^), wildcards (x/X/*), hyphen ranges, OR (||), and != operator.",
          "is_bot": false,
          "headline": "refactor(compat): replace hand-rolled version logic with Masterminds/…",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-14T13:59:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f312dd4caa08f4cd5ca521df8d31a29b8fa032b7",
          "body": "…ons and choices\n\nMove version constraints from a separate compat section to inline\n`versions` fields on Option and Choice structs. This eliminates the\nindirection of cross-referencing compat entries with option names and\nremoves the need to duplicate options when only choices differ by\nversion (e.g\n[…]\nemove MatchedRanges (no longer needed)\n- Add version-gating validation: unreachable choices, defaults in\n  versioned choices, visibility refs to versioned options\n- Migrate rails-new.yml to new format",
          "is_bot": false,
          "headline": "refactor(compat): replace compat section with inline versions on opti…",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-14T12:50:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "14b939f58411ee2703d275147d7bb51c06a97b5f",
          "body": "Extract shared value-editing logic from PinsModel into ValuesEditor,\nthen build a new PresetsModel that composes it for preset CRUD\noperations. Bare `oz run <wizard> presets` now launches the TUI\nwhile existing subcommands remain for scripting.\n\n- Extract ValuesEditor (cycle, toggle, field edit, row\n[…]\ndelete, edit\n- Validate required options on exit with force-exit on second Esc\n- Show required indicator (*) and compat hints in values view\n- Add RenamePreset to store, UI nav hints, and preset tests",
          "is_bot": false,
          "headline": "feat(wizard): add interactive TUI for preset management",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-14T12:31:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4fb59a96c93064a66ab58d776ccb40979435bdc9",
          "body": "… --remote\n\nIntroduce registry client for fetching and installing wizards from a\nremote index. Add `oz add` and `oz update` commands, and extend\n`oz list` with a `--remote` flag that shows available wizards with\ninstalled status.",
          "is_bot": false,
          "headline": "feat(registry): add remote wizard registry with add, update, and list…",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-14T10:13:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40de81f19166080f84e5be28fdd957675091ec0e",
          "body": "Allow quick value cycling with ←/h and →/l keys in the pins list view,\nremoving the need to enter edit mode for select and confirm options.\nCycling wraps through all choices plus an unpinned state.",
          "is_bot": false,
          "headline": "feat(wizard): add h/l arrow key cycling in pins TUI",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-14T10:13:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea96415dcac14241d6383d6f32857a94ffcaa3e5",
          "body": "Hide frontend options (javascript, css, asset_pipeline, skip_hotwire)\nwhen api mode is selected. Move api/minimal before selects so\nhide_when references resolve correctly.\n\nUpdate wizard-scaffold skill: remove advanced_mode pattern (pins\nhandle this), document additive compat semantics, replace examples\nwith practical hide_when/show_when patterns.",
          "is_bot": false,
          "headline": "feat(wizard): add hide_when for API mode and update scaffold skill",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-13T16:39:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15e43f60f43729d0dc34684ea426e7c7faa1201b",
          "body": "Change FilterOptions from first-match allowlist to additive semantics:\noptions not in any compat entry are always shown, gated options appear\nonly when their entry's version matches. This eliminates redundant\nfull-option lists in compat entries.\n\nAdd --for-version flag to the show command to inspect options for a\nspecific version without requiring the tool to be installed.\n\nRename MatchedRange to MatchedRanges (returns []string) since multiple\nentries can now match simultaneously.",
          "is_bot": false,
          "headline": "feat(compat): make compat entries additive and add --for-version to show",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-13T16:25:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58c30bfa5ab5a64004b7d03c7b3214fd81e7769a",
          "body": null,
          "is_bot": false,
          "headline": "docs: fix markdownlint line-length violations in CLAUDE.md",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-13T15:14:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2dcbac376a0b8f2c1776eb80059b255d21d61e3d",
          "body": "Add markdownlint-cli2 as a post-edit hook for .md files, configure\n.markdownlint.jsonc with 120-char line limit (code blocks and tables\nexcluded), and fix all lint violations in wizard-scaffold SKILL.md.",
          "is_bot": false,
          "headline": "chore(claude): add markdownlint hook and fix skill markdown issues",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-13T15:12:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fea8ebfe90c0a650e5abe3a1bff116c60c3417b",
          "body": "…validation rules\n\nAdd 7-step workflow driven by CLI help output, type selection guide,\nlabel/description guidelines, common YAML patterns, and full type\nconstraint rules covering all features from schema.go and validator.go.",
          "is_bot": false,
          "headline": "docs(skill): expand wizard-scaffold with help parsing, patterns, and …",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-13T14:52:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "568602405835a354b8481b7f2e85146faf8082b3",
          "body": null,
          "is_bot": false,
          "headline": "docs: add blank lines before markdown lists for consistent formatting",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-13T14:28:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a107f23052e6947da7a2f9ae442f5c2345b976a",
          "body": "Auto-run golangci-lint and go test for the edited package\nafter every .go file edit.",
          "is_bot": false,
          "headline": "chore(claude): add post-edit lint and test hooks",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-13T14:23:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e428e5681f1dd23d29ebb34828b9d6376c290bd",
          "body": "Add Claude Code automations for the oz project:\n- wizard-scaffold skill for interactive YAML config generation\n- code-reviewer agent for convention-aware Go code review",
          "is_bot": false,
          "headline": "chore(claude): add wizard-scaffold skill and code-reviewer agent",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-13T14:22:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6dcf37c35f5d5a2afb1084b65a721a7d870f36ce",
          "body": "… config path",
          "is_bot": false,
          "headline": "docs: fix linter count, add missing linter rules, and document wizard…",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-13T12:31:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "970d404c7c915c2283b0b2a0b16e025a00e9816b",
          "body": "Expand Go Conventions with subsections for error handling, type safety,\nperformance, style, modern Go, and string constants — matching the\nproject's golangci-lint rules so code is written correctly from the start.",
          "is_bot": false,
          "headline": "docs: add linter-aligned coding guidelines to CLAUDE.md",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-13T12:29:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97316558e95f3d64724fb0363f6b59a58b15f4fa",
          "body": "…LAUDE.md",
          "is_bot": false,
          "headline": "docs: add working style, pre-commit checklist, and UI guidelines to C…",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-13T12:04:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4506168dcd50184341ab27a48d23b61fa6cf02e",
          "body": "Add CyanBoldStyle and Width() to internal/ui/theme.go, replace direct\nlipgloss calls in builder.go, pins.go, and version_loader.go with\nui package exports.",
          "is_bot": false,
          "headline": "refactor(ui): encapsulate all lipgloss usage in ui package",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-13T11:40:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88b126e2778d3414be700a36846a0b13d18dca90",
          "body": "…elpers\n\nAdd GreenStyle, SuccessMsgf, and InfoMsgf to ui/theme.go, then replace\nad-hoc fmt.Print calls across all commands with consistent green success\nconfirmations and accent-colored empty-state messages, each padded with\nblank lines to match the list command's formatting.",
          "is_bot": false,
          "headline": "refactor(ui): unify output formatting with SuccessMsgf and InfoMsgf h…",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-13T11:35:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89f047dde9edcbd2ed6fdbc72da218eee4c61e38",
          "body": "Add musttag, forcetypeassert, fatcontext, wastedassign, nilnesserr,\ngoconst, nestif, usestdlibvars, usetesting, asciicheck,\ngocheckcompilerdirectives, reassign, and iface linters. Enable all\ngovet analyzers including fieldalignment and shadow.\n\nFix all violations: extract key constants to eliminate goconst hits,\nadd checked type assertions, fix variable shadowing, reorder struct\nfields for alignment, and extract helpers to reduce nesting complexity.",
          "is_bot": false,
          "headline": "chore(lint): add 14 linters and enable all govet analyzers",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T15:32:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8bcbdc1ab104b1948237ca512ca3dd83713e226b",
          "body": "Move --dry-run and --preset to run command as PersistentFlags so they\nappear in `oz run -h`. Rename --with-preset to --preset for brevity.\nDrop ambiguous `v` alias from validate (conflicts with `oz -v`).\nAdd wizard subcommand listing to run help text.",
          "is_bot": false,
          "headline": "refactor(cli): improve flag discoverability and naming consistency",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T15:04:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36d161d7d02be45941d5850e86264af142a85dad",
          "body": null,
          "is_bot": false,
          "headline": "style(wizard): add blank line between top-level declarations",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T14:50:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e01e8abd882c90fc72eb4368bf38992dad2e992",
          "body": null,
          "is_bot": false,
          "headline": "docs: add missing godoc comments",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T14:50:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3af997935cc8d353e5c94a35fb602b8a8b6d42f",
          "body": null,
          "is_bot": false,
          "headline": "refactor(store): rename DeletePreset to RemovePreset",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T14:49:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "059785a9be53d02c88b9ea95448f50e59973b50c",
          "body": null,
          "is_bot": false,
          "headline": "refactor(config): add OptionType.IsValid method",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T14:49:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db87b74d2b1067f2629be605436fe5c6c7efdec9",
          "body": null,
          "is_bot": false,
          "headline": "refactor(config): encapsulate validator error collector",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T14:48:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfbe887a119a22b5ddc38a481d8efcce42f95622",
          "body": "Add missing top-level commands (list, validate, edit, create, remove),\nexpand file map with new modules (schema, value, validator_graph,\nversion_loader, pins, choices, state), and document FieldValue sum type\nand hide_when visibility.",
          "is_bot": false,
          "headline": "docs: update CLAUDE.md architecture to reflect current codebase",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T14:31:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fce2edee15664fed69c1ba0c4417c25b248d20ab",
          "body": "… into show -v\n\nRename wizard-level inspect → show (alias s), merge presets inspect\ninto presets show --verbose, change bare presets to show help, add\nLong descriptions and Examples to all commands, and fix README/CLAUDE.md\nto match actual CLI surface.",
          "is_bot": false,
          "headline": "refactor(cli): unify inspect/explain into show, merge presets inspect…",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T14:26:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2c9185b803d4a939cd576fab6bf64591686a25c",
          "body": "Introduce FieldValue discriminated union (string | bool | []string) and\nValues named map type to eliminate ~150 occurrences of any and\nmap[string]any. All wizard answers, pins, presets, defaults, and\nvisibility conditions are now statically typed.\n\n- Add config.FieldValue with constructors, accessor\n[…]\n resolveDefault helpers\n- Rename Engine receiver e → m (Bubbletea convention)\n- Rename pinnedCnt → pinnedCount, SetPinnedAnswers → SetPinnedValues\n- Add named const for spinner delay in version_loader",
          "is_bot": false,
          "headline": "refactor: replace any with typed FieldValue sum type across codebase",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T11:08:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c2bc54c6a85509544e6bdba7df9b51e3438036cf",
          "body": "Add concise Long descriptions to run, create, doctor, inspect, and\npins commands where Short alone was insufficient.",
          "is_bot": false,
          "headline": "docs(cli): add Long descriptions to key commands",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T10:33:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43c1190cefe22b13c6495abfbbb92da8fc6802a9",
          "body": "Consistent periods on status messages, %q for user-provided names,\ntype qualifiers in prompts, AccentStyle for identifiers in list output.",
          "is_bot": false,
          "headline": "fix(cli): normalize output formatting and punctuation",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T10:32:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "60848513f06afbbd3e5a1dba4d2c4a83a6b7594f",
          "body": "Bare \"presets\" now lists presets (like bare \"pins\" launches TUI)\ninstead of showing help text.",
          "is_bot": false,
          "headline": "refactor(cli): make bare presets command list presets",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T10:31:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c71330ac652d43269473ea04cd372e3f9f68263f",
          "body": "Matches pins clear and presets remove, enabling scripted usage.",
          "is_bot": false,
          "headline": "feat(cli): add --force flag to root remove command",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T10:30:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f396d76bc947c42614b6805595d4c0abe14dfeb0",
          "body": "Match the \"list\" verb used by presets for enumerating items.",
          "is_bot": false,
          "headline": "refactor(cli): rename pins show to pins list",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T10:30:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44f7ab045ac13db19d4d1d3454d2b0f2f6d04c53",
          "body": "Unify on \"inspect\" for annotated views — both wizard-level and\npresets now use the same verb.",
          "is_bot": false,
          "headline": "refactor(cli): rename wizard-level explain to inspect",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T10:29:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e793667193b3c466c2d80b094b4271c86828a336",
          "body": "…ebase\n\nIntroduce OptionType and FlagStyle custom types with constants, replacing\nbare string literals across switches in validator, builder, engine, state,\nand pins. Centralize NoneValue constant in config package. Unify field\nconstructors to all accept config.Option. Extract RunParams struct for\nw\n[…]\nePins helper (DRY),\nand prompt helpers into cmd/oz/prompt.go. Simplify FormatCommand to reuse\nPlainParts, remove trivial DryRun wrapper, and use wizard.Answers type\nalias consistently for answer maps.",
          "is_bot": false,
          "headline": "refactor: improve type safety, consistency, and modularity across cod…",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T10:26:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1caa53d0edb6484be880fda02a8fe3dade5cceb0",
          "body": "- Add RunE to presetsCmd so bare `oz run <w> presets` shows help\n- Add confirmDangerousPrompt (default-no) for destructive ops with --force flag\n- Make `validate` accept wizard name or path, add `v` alias and completion\n- Rename `presets explain` → `presets inspect`, `presets delete` → `presets remo\n[…]\nompletion to show, inspect, save, remove\n- Add Example strings to run, create, validate, and wizard commands\n- Improve bare `oz run` error to suggest `oz list`\n- Add --no-edit flag to `create` command",
          "is_bot": false,
          "headline": "feat(cli): audit and improve CLI API consistency and ergonomics",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T09:54:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4d88adb1f0c8eca294dc004b21305e702dedbf09",
          "body": "Add 20+ new checks that catch logical errors at config-load time:\n\nSemantic checks: default not in choices, duplicate choices, required +\nallow_none conflict, confirm flag ambiguity, type-field mismatches\n(allow_none/flag_true/flag_false/flag_none/choices), InputRule bounds,\nmulti_select scalar defa\n[…]\nhen\nwith correct AND-semantics (subset-based conflict detection).\n\nAccept empty-string default on select with allow_none as \"default to\nnone\" to avoid leaking the internal _none sentinel into configs.",
          "is_bot": false,
          "headline": "feat(config): add semantic and visibility graph validation",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-10T09:50:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "515d52c370ccb0d9585c9084f542261e97cb2389",
          "body": null,
          "is_bot": false,
          "headline": "fix(cli): add missing version_control.label to create template",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-09T17:24:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "629632eca7386c72b1e87d502d2c3260c3e84659",
          "body": "…s in pins UI\n\nShow (default) tag on select and confirm fields in both wizard run and\npins edit mode. Fix description indent in pins edit view after replacing\nthe step counter with the shorter \"pin\" indicator. Add up/down nav hints\nfor select, confirm, and multi-select fields in pins edit mode.",
          "is_bot": false,
          "headline": "fix(wizard): add default tags, fix header alignment, and add nav hint…",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-09T17:15:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5610adcbf0c346bdae70f48cae752453cab41140",
          "body": "Pass opt.Validate and opt.Required to NewInputField in buildPinsField\ninstead of nil/false. Space-toggle now validates resolved values for\ninput fields and falls back to edit mode when invalid or missing.",
          "is_bot": false,
          "headline": "fix(wizard): validate input fields when pinning",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-09T16:58:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05fae4d54e4802da4e3f9d9174fa3daddf961eda",
          "body": null,
          "is_bot": false,
          "headline": "chore: add .plans/ to gitignore",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-09T16:38:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ec7505d277d5131473ea04bb4d748013d024558",
          "body": "Validate custom version pins using compat.VerifyVersion() at both entry\npoints: the pins TUI (on submit) and the version loader (at wizard run\ntime). Invalid pins now show an error in the pins editor or fall through\nto the normal version selector with a stderr warning.",
          "is_bot": false,
          "headline": "feat(wizard): verify pinned versions before use",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-09T16:24:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0e53dff9f3758528f10b8279b5b400b1b50323b",
          "body": "…sion pin UX\n\nPins are now stored at the top level of VersionedState (not per-version),\nwith dedicated LoadPins/SavePins and LoadPinnedVersion/SavePinnedVersion\nAPIs replacing the old version-scoped approach. Version pin sentinel\nchanges from \"default\" to \"current\", blank input stores \"current\", and\n[…]\nting a \"current\" pin starts with an empty field. NumberGutter gains a\nwidth parameter for right-aligned multi-digit lists. Pins UI shows\ncompat version hints per option and filters stale keys on load.",
          "is_bot": false,
          "headline": "refactor(store): move pins to version-independent storage and fix ver…",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-09T16:03:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4a4eacf5e67939bc7e0bbc23257dae772ea8df1c",
          "body": "During completion, detectWizardName no longer bails on __complete\ntokens. Instead it skips them and finds the wizard name after run/r,\nenabling cobra to register the wizard subcommand with its children\n(doctor, explain, pins, presets, flags). Partial input (e.g. \"cre\")\nis excluded by checking whether the candidate is the last arg (the\nword currently being typed). completeWizardNames also guards against\nsuggesting wizard names for subsequent positions.",
          "is_bot": false,
          "headline": "fix(cli): stop suggesting wizards after first arg in completion",
          "author_name": "Leonid Svyatov",
          "author_login": "svyatov",
          "committed_at": "2026-03-09T14:43:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 2,
      "commits_last_year": 127,
      "latest_release_at": "2026-07-01T14:32:26Z",
      "latest_release_tag": "v0.2.0",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 6,
      "days_since_latest_release": 20,
      "mean_days_between_releases": 89.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 85,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/svyatov/oz",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/svyatov/oz",
          "is_deprecated": false,
          "latest_version": "v0.2.0",
          "repository_url": "https://github.com/svyatov/oz",
          "versions_count": 2,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-01T14:30:28Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 20
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 2,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [
          {
            "date": "2026-04-06",
            "count": 1
          },
          {
            "date": "2026-06-30",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 2,
        "total_stars": 2
      },
      "open_issues_and_prs": 4
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Taskfile.yml"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 27545,
      "source_files_sampled": 77,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 10464
    },
    "dependencies": {
      "manifests": [
        "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": 31,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "charm.land/bubbles/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.1.0"
        },
        {
          "name": "charm.land/bubbletea/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.7"
        },
        {
          "name": "charm.land/huh/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.3"
        },
        {
          "name": "charm.land/lipgloss/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.4"
        },
        {
          "name": "github.com/Masterminds/semver/v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.5.0"
        },
        {
          "name": "github.com/adrg/xdg",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.5.3"
        },
        {
          "name": "github.com/charmbracelet/x/term",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.2.2"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "charm.land/bubbles/v2",
            "direct": true,
            "version": "v2.1.0",
            "ecosystem": "go"
          },
          {
            "name": "charm.land/bubbletea/v2",
            "direct": true,
            "version": "v2.0.7",
            "ecosystem": "go"
          },
          {
            "name": "charm.land/huh/v2",
            "direct": true,
            "version": "v2.0.3",
            "ecosystem": "go"
          },
          {
            "name": "charm.land/lipgloss/v2",
            "direct": true,
            "version": "v2.0.4",
            "ecosystem": "go"
          },
          {
            "name": "github.com/adrg/xdg",
            "direct": true,
            "version": "v0.5.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/x/term",
            "direct": true,
            "version": "v0.2.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/masterminds/semver/v3",
            "direct": true,
            "version": "v3.5.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/spf13/cobra",
            "direct": true,
            "version": "v1.10.2",
            "ecosystem": "go"
          },
          {
            "name": "gopkg.in/yaml.v3",
            "direct": true,
            "version": "v3.0.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/atotto/clipboard",
            "direct": false,
            "version": "v0.1.4",
            "ecosystem": "go"
          },
          {
            "name": "github.com/catppuccin/go",
            "direct": false,
            "version": "v0.3.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/colorprofile",
            "direct": false,
            "version": "v0.4.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/ultraviolet",
            "direct": false,
            "version": "v0.0.0-20260525132238-948f4557a654",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/x/ansi",
            "direct": false,
            "version": "v0.11.7",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/x/exp/ordered",
            "direct": false,
            "version": "v0.1.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/x/exp/strings",
            "direct": false,
            "version": "v0.1.0",
            "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/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/dustin/go-humanize",
            "direct": false,
            "version": "v1.0.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/inconshreveable/mousetrap",
            "direct": false,
            "version": "v1.1.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/lucasb-eyer/go-colorful",
            "direct": false,
            "version": "v1.4.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mattn/go-runewidth",
            "direct": false,
            "version": "v0.0.23",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mitchellh/hashstructure/v2",
            "direct": false,
            "version": "v2.0.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/muesli/cancelreader",
            "direct": false,
            "version": "v0.2.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/rivo/uniseg",
            "direct": false,
            "version": "v0.4.7",
            "ecosystem": "go"
          },
          {
            "name": "github.com/spf13/pflag",
            "direct": false,
            "version": "v1.0.10",
            "ecosystem": "go"
          },
          {
            "name": "github.com/xo/terminfo",
            "direct": false,
            "version": "v0.0.0-20220910002029-abceb7e1c41e",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/sync",
            "direct": false,
            "version": "v0.20.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/sys",
            "direct": false,
            "version": "v0.45.0",
            "ecosystem": "go"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 31,
        "direct_count": 9,
        "indirect_count": 22
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 4,
        "merged_prs": 5,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 4
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "svyatov",
          "commits": 123,
          "avatar_url": "https://avatars.githubusercontent.com/u/310043?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "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": 3,
            "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": 8,
            "reason": "4 out of 5 merged PRs checked by a CI test -- score normalized to 8",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/26 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "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": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "20 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 8,
            "reason": "SAST tool is not run on all commits -- score normalized to 8",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "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": "a15b781fe1c1075157294bfc5c5700fd267e2c4f",
        "ran_at": "2026-07-22T09:31:05Z",
        "aggregate_score": 5.3,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-18T14:06:52Z",
      "oldest_open_prs": [
        {
          "number": 10,
          "created_at": "2026-07-09T10:33:50Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 11,
          "created_at": "2026-07-09T10:33:56Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 12,
          "created_at": "2026-07-09T10:34:02Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 13,
          "created_at": "2026-07-16T10:33:38Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-01T14:01:45Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/svyatov/oz",
    "host": "github.com",
    "name": "oz",
    "owner": "svyatov"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 59,
      "inputs": {
        "security": 62,
        "vitality": 74,
        "community": 43,
        "governance": 45,
        "engineering": 72
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 74,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "commits_last_year": 127,
              "human_commit_share": 0.96,
              "days_since_last_push": 5,
              "active_weeks_last_year": 6
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "6/52 weeks with commits",
                "points": 4.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "127 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 127
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "20 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "releases_count": 2,
              "latest_release_tag": "v0.2.0",
              "releases_from_tags": false,
              "days_since_latest_release": 20,
              "mean_days_between_releases": 89.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "2 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 20 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 20
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~89.7 days",
                "points": 19.8,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 89.7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "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": 43,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 2,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "2 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "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 (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "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": 13.5,
                "status": "met",
                "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": "at_risk",
        "name": "Sustainability & Governance",
        "value": 45,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "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 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "at_risk",
            "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": 40,
            "inputs": {
              "merged_prs": 5,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 4
            },
            "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": "5/9 decided PRs merged",
                "points": 21.2,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 5,
                      "decided": 9
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/26 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 54,
            "inputs": {
              "followers": 33,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "svyatov",
              "public_repos": 27,
              "account_age_days": 5875
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "33 followers of svyatov",
                "points": 11,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 33,
                      "login": "svyatov"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "27 public repos, account ~16 yr old",
                "points": 22.5,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 27
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 16
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "packages": [
                "github.com/svyatov/oz"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 20
            },
            "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 20 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 20
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "2 published versions",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": 72,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".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": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "4 out of 5 merged PRs checked by a CI test -- score normalized to 8",
                "points": 16,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "topics": [
                "cli",
                "go",
                "terminal",
                "utility",
                "bubbletea",
                "cli-tool",
                "code-generator",
                "command-line",
                "golang",
                "interactive",
                "scaffold",
                "tui",
                "wizard",
                "yaml"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "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": "14 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 62,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 53,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 5.3
            },
            "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": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "4 out of 5 merged PRs checked by a CI test -- score normalized to 8",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/26 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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 not fuzzed",
                "points": 0,
                "status": "missed",
                "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": "20 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 8",
                "points": 4,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "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 31 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": 31
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 31,
              "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": 31,
              "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": "excellent",
        "name": "AI Readiness",
        "value": 85,
        "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": 0.99,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 10464
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.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": "95 of 96 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 95,
                      "sampled": 96
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Taskfile.yml"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0.04
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Taskfile.yml",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Taskfile.yml"
                    }
                  }
                ],
                "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.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".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": "4 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 4,
                      "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 0",
                "points": 0,
                "status": "missed",
                "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": 27545,
              "source_files_sampled": 77,
              "oversized_source_files": 0
            },
            "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": "0/77 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 77,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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": [],
  "report_type": "repository",
  "generated_at": "2026-07-22T09:31:13.370792Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/svyatov/oz.svg",
  "full_name": "svyatov/oz",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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