Registro público
Informe de salud del softwareesquema 0.26.0 · métricas 1.13.0 · 2026-07-22 09:31 UTC

svyatov / oz

Config-driven CLI wizard framework

GoMIT★ 2 estrellas⑂ 0 forksdesde abr 2026Ver en GitHub ↗

svyatov/oz tiene un índice de salud de 59 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es AI Readiness (85/100) y la más baja, Community & Adoption (43/100). Se actualizó por última vez hace 5 días. Una sola persona concentra la mayor parte del trabajo reciente.

59
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

59
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

Leonid SvyatovCuenta personal
33 seguidores27 repositorios públicosdesde jun 2010

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/svyatov/ozv0.2.0-2hace 20 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

74Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 5 días
4.2/36Cadencia de commits — 6/52 semanas con commits
18/18Volumen de commits — 127 commits en el último año
10/10OpenSSF Scorecard: Maintained — 20 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year127
human_commit_share0,96
days_since_last_push5
active_weeks_last_year6
Cómo se puntúa
27/27Publica versiones — 2 versiones publicadas
36/36Recencia de las versiones — última versión hace 20 días
19.8/27Cadencia de publicación — una versión cada ~89,7 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count2
latest_release_tagv0.2.0
releases_from_tagsno
days_since_latest_release20
mean_days_between_releases89,7

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

43En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 2 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
18/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conduct
has_pull_request_template

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

45En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
21.2/38.3Aceptación de PR — 5/9 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/26 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs5
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs4
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
11/25Alcance del propietario — 33 seguidores de svyatov
22.5/25Trayectoria — 27 repos públicos, cuenta de ~16 años
Datos de entrada utilizados
followers33
owner_typeUser
is_verified
owner_loginsvyatov
public_repos27
account_age_days5875
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 20 días
12/20Historial de versiones — 2 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/svyatov/oz
ecosystemsgo
any_deprecatedno
min_days_since_publish20

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

72Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — .golangci.yml
0/9.6Hooks de pre-commit
0/6.4.editorconfig
16/20OpenSSF Scorecard: CI-Tests — 4 out of 5 merged PRs checked by a CI test -- score normalized to 8
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno

Documentación

60Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
10/10Topics — 14 topics
10/10Wiki
Datos de entrada utilizados
topicscli, go, terminal, utility, bubbletea, cli-tool, code-generator, command-line, golang, interactive, scaffold, tui, wizard, yaml
has_wiki
homepage
has_readme
has_docs_dirno
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

62Moderado · 16% del índice global
Cómo se puntúa
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.5Licencia — 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
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate5,3
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
0/25Dependencias indirectas libres de avisos conocidos — el conjunto transitivo no es separable de las dependencias de desarrollo y prueba en este alcance
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages31
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Dependencias indirectas libres de avisos conocidos, Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejaron 31 dependencias resueltas con OSV. Este repositorio no publica ningún paquete que el índice resuelva, por lo que se evaluó en su lugar el grafo de dependencias del repositorio. Ese grafo mezcla fijaciones de desarrollo y prueba con las dependencias distribuidas, de modo que solo se puntúan las dependencias declaradas en tiempo de ejecución; los hallazgos transitivos se informan como contexto y quedan excluidos de la puntuación. No se analiza la alcanzabilidad.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

85Excelente · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 95 de 96 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,99
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes10.464
Cómo se puntúa
18/18Arranque con un solo comando — Taskfile.yml
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .golangci.yml
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
8/8Mantenimiento automatizado — 4 de los últimos 100 commits son actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfileno
typed_language
bootstrap_filesTaskfile.yml
has_devcontainerno
has_linter_config
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0,04
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
55/55Tamaños de archivo manejables — 0/77 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes27.545
source_files_sampled77
oversized_source_files0

Datos clave

2estrellas de GitHub
1contribuidores
127commits en los últimos 12 meses
5días desde el último push
2versiones publicadas
1factor bus
0issues abiertas
Goecosistemas de paquetes

Más detalle

Historial de estrellas y forks 2 ★ / 0 ⇿
2Estrellas

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

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

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).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
Dependencias directas 9
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias 31

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 9 paquetes directos y 22 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

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

Este repositorio no publica ningún paquete que el índice resuelva, así que se evaluó su propio grafo de dependencias — 31 paquetes, que incluyen también fijaciones de desarrollo y prueba que nunca se distribuyen: 0 tienen avisos conocidos, de los cuales 0 son directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.26.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasGo.