Public record
Software health reportschema 0.26.0 · metrics 1.13.0 · 2026-07-22 09:31 UTC

svyatov / oz

Config-driven CLI wizard framework

GoMIT★ 2 stars⑂ 0 forkssince Apr 2026View on GitHub ↗

svyatov/oz holds a health index of 59 out of 100, placing it in the Moderate band. It scores highest on AI Readiness (85/100) and lowest on Community & Adoption (43/100). It was last updated 5 days ago. A single contributor accounts for most of its recent work.

59
overall / 100
Moderate

Software health index

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

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

Score profile

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

Ownership

Leonid SvyatovPersonal account
33 followers27 public repossince Jun 2010

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
Gogithub.com/svyatov/ozv0.2.0-220 days ago

Metrics by category

Vitality

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

74Good · 22% of overall
How it's scored
36/36Push recency — last push 5 days ago
4.2/36Commit cadence — 6/52 weeks with commits
18/18Commit volume — 127 commits in the last year
10/10OpenSSF Scorecard: Maintained — 20 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year127
human_commit_share0.96
days_since_last_push5
active_weeks_last_year6
How it's scored
27/27Ships releases — 2 releases published
36/36Release recency — latest release 20 days ago
19.8/27Release cadence — a release every ~89.7 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count2
latest_release_tagv0.2.0
releases_from_tagsno
days_since_latest_release20
mean_days_between_releases89.7

Community & Adoption

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

43At risk · 18% of overall
How it's scored
0/60Stars — 2 stars
0/25Forks — 0 forks
0/15Watchers — 0 watchers
Inputs used
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold

Community health

92Excellent
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
18/18CONTRIBUTING guide
13.5/13.5Code of conduct
0/7.2Issue template
6.3/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductyes
has_pull_request_templateyes

Sustainability & Governance

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

45At risk · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
0/46.8Issue resolution — no issues or no data
21.2/38.3PR acceptance — 5/9 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/26 approved changesets -- score normalized to 0
Inputs used
merged_prs5
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs4
Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
11/25Owner reach — 33 followers of svyatov
22.5/25Track record — 27 public repos, account ~16 yr old
Inputs used
followers33
owner_typeUser
is_verified
owner_loginsvyatov
public_repos27
account_age_days5,875
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on go
35/35Publish recency — latest publish 20 days ago
12/20Version history — 2 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesgithub.com/svyatov/oz
ecosystemsgo
any_deprecatedno
min_days_since_publish20

Engineering Quality

Are baseline engineering and documentation practices in place?

72Good · 20% of overall
How it's scored
24/24CI workflows — 2 workflow(s)
24/24Tests present
16/16Linter config — .golangci.yml
0/9.6Pre-commit hooks
0/6.4.editorconfig
16/20OpenSSF Scorecard: CI-Tests — 4 out of 5 merged PRs checked by a CI test -- score normalized to 8
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno

Documentation

60Moderate
How it's scored
30/30README
0/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
10/10Topics — 14 topics
10/10Wiki
Inputs used
topicscli, go, terminal, utility, bubbletea, cli-tool, code-generator, command-line, golang, interactive, scaffold, tui, wizard, yaml
has_wikiyes
homepage
has_readmeyes
has_docs_dirno
has_descriptionyes

Security

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

62Moderate · 16% of overall
How it's scored
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.5License — 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
Inputs used
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate5.3
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
0/25Indirect dependencies free of known advisories — transitive set not separable from development and test dependencies in this scope
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages31
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
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.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

85Excellent · 0% of overall
How it's scored
45/45Agent instructions — CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 95 of 96 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.99
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes10,464
How it's scored
18/18One-command bootstrap — Taskfile.yml
22/22Automated tests
11/11Lint / format config — .golangci.yml
11/11Static type checking — Go (statically typed)
10/10Reproducible environment — lockfile
0/10Demonstrated agent practice — no agent-authored commits among the last 100
8/8Automated maintenance — 4 of the last 100 commits are automated dependency updates
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilesgo.sum
has_dockerfileno
typed_languageyes
bootstrap_filesTaskfile.yml
has_devcontainerno
has_linter_configyes
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0.04
How it's scored
45/45Type-checkable code — Go (statically typed)
55/55Manageable file sizes — 0/77 source files over 60KB
Inputs used
primary_languageGo
largest_source_bytes27,545
source_files_sampled77
oversized_source_files0

Key facts

2GitHub stars
1contributors
127commits, last 12 months
5days since last push
2releases
1bus factor
0open issues
Gopackage ecosystems

More detail

Star and fork history 2 ★ / 0 ⇿
2Stars

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

111222212026-042026-052026-06
OpenSSF Scorecard 5.3 / 10
5.3aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-22 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
Direct dependencies 9
RegistryPackageVersion constraintManifest
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
All dependencies 31

Full resolved dependency set from the GitHub dependency graph: 9 direct and 22 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
Gocharm.land/bubbles/v2v2.1.0direct
Gocharm.land/bubbletea/v2v2.0.7direct
Gocharm.land/huh/v2v2.0.3direct
Gocharm.land/lipgloss/v2v2.0.4direct
Gogithub.com/adrg/xdgv0.5.3direct
Gogithub.com/charmbracelet/x/termv0.2.2direct
Gogithub.com/masterminds/semver/v3v3.5.0direct
Gogithub.com/spf13/cobrav1.10.2direct
Gogopkg.in/yaml.v3v3.0.1direct
Gogithub.com/atotto/clipboardv0.1.4indirect
Gogithub.com/catppuccin/gov0.3.0indirect
Gogithub.com/charmbracelet/colorprofilev0.4.3indirect
Gogithub.com/charmbracelet/ultravioletv0.0.0-20260525132238-948f4557a654indirect
Gogithub.com/charmbracelet/x/ansiv0.11.7indirect
Gogithub.com/charmbracelet/x/exp/orderedv0.1.0indirect
Gogithub.com/charmbracelet/x/exp/stringsv0.1.0indirect
Gogithub.com/charmbracelet/x/termiosv0.1.1indirect
Gogithub.com/charmbracelet/x/windowsv0.2.2indirect
Gogithub.com/clipperhouse/displaywidthv0.11.0indirect
Gogithub.com/clipperhouse/uax29/v2v2.7.0indirect
Gogithub.com/dustin/go-humanizev1.0.1indirect
Gogithub.com/inconshreveable/mousetrapv1.1.0indirect
Gogithub.com/lucasb-eyer/go-colorfulv1.4.0indirect
Gogithub.com/mattn/go-runewidthv0.0.23indirect
Gogithub.com/mitchellh/hashstructure/v2v2.0.2indirect
Gogithub.com/muesli/cancelreaderv0.2.2indirect
Gogithub.com/rivo/unisegv0.4.7indirect
Gogithub.com/spf13/pflagv1.0.10indirect
Gogithub.com/xo/terminfov0.0.0-20220910002029-abceb7e1c41eindirect
Gogolang.org/x/syncv0.20.0indirect
Gogolang.org/x/sysv0.45.0indirect
Dependency advisories 0

This repository publishes no package the index resolves, so its own dependency graph was assessed — 31 packages, which also include development and test pins that never ship: 0 carry known advisories, of which 0 are direct.

No known advisories affect the assessed dependencies.

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

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

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

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

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