Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-27 00:46 UTC

may-journal / fitness-runner

Node fitness runner that runs checks so local dev, CI/CD, and GenAI workflows stay aligned with your intended rules and quality bar.

GoMIT★ 1 estrella⑂ 0 forksdesde feb 2026Ver en GitHub ↗

may-journal/fitness-runner tiene un índice de salud de 53 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es AI Readiness (79/100) y la más baja, Community & Adoption (24/100). Se actualizó por última vez hace 7 días. Una sola persona concentra la mayor parte del trabajo reciente.

53
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.

53
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

may-journalOrganización
0 seguidores2 repositorios públicosdesde feb 2026

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/may-journal/fitness-runner/gov0.20260719.934-3hace 7 días

Métricas por categoría

Vitalidad

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

78Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 7 días
5.5/36Cadencia de commits — 8/52 semanas con commits
18/18Volumen de commits — 158 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year158
human_commit_share1
days_since_last_push7
active_weeks_last_year8
Cómo se puntúa
27/27Publica versiones — 3 versiones publicadas
36/36Recencia de las versiones — última versión hace 7 días
27/27Cadencia de publicación — una versión cada ~0 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count3
latest_release_taggo/v0.20260719.934
releases_from_tagsno
days_since_latest_release7
mean_days_between_releases0

Comunidad y Adopción

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

24Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 1 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

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
27/46.8Resolución de issues — 58% de issues cerradas
34.6/38.3Aceptación de PR — 19/21 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs19
open_issues11
closed_issues15
issue_closed_ratio0,577
closed_unmerged_prs2
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
0/25Alcance del propietario — 0 seguidores de may-journal
4.4/25Trayectoria — 2 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers0
owner_typeOrganization
is_verified
owner_loginmay-journal
public_repos2
account_age_days163
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 7 días
12/20Historial de versiones — 3 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/may-journal/fitness-runner/go
ecosystemsgo
any_deprecatedno
min_days_since_publish7

Calidad de Ingeniería

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

74Bueno · 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 — eslint.config.mjs
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

65Moderado
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
0/10Wiki
Datos de entrada utilizados
topics
has_wikino
homepage
has_readme
has_docs_dir
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?

36En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 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
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
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_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,6
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, packaging. Los pesos restantes se han renormalizado.

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.

79Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — .cursor/rules/fitness-checks.mdc, .cursor/rules/no-workarounds.mdc
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 100 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_files.cursor/rules/fitness-checks.mdc, .cursor/rules/no-workarounds.mdc
agent_instruction_max_bytes388
Cómo se puntúa
12.6/18Arranque con un solo comando — go/go.mod (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
11/11Configuración de lint / formato — eslint.config.mjs
11/11Verificación estática de tipos — Go (tipado estático)
0/10Entorno reproducible
10/10Práctica demostrada con agentes — 82 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan 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
lockfiles
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configs
agent_commit_share0,82
toolchain_manifestsgo/go.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
55/55Tamaños de archivo manejables — 0/110 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes18.416
source_files_sampled110
oversized_source_files0

Datos clave

1estrellas de GitHub
1contribuidores
158commits en los últimos 12 meses
7días desde el último push
3versiones publicadas
1factor bus
11issues abiertas
Goecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 3.6 / 10
3.6agregado

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-27 00:46 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
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
Todas las dependencias 0

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

RegistroPaqueteVersiónRelación
Avisos de dependencias sin evaluar

El cotejo de avisos no pudo ejecutarse para este informe: No resolved dependencies to assess

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 2031,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Go": 571626,
        "Shell": 435,
        "JavaScript": 10689
      },
      "pushed_at": "2026-07-19T14:34:51Z",
      "created_at": "2026-02-15T16:01:05Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-19T14:34:53Z",
      "description": "Node fitness runner that runs checks so local dev, CI/CD, and GenAI workflows stay aligned with your intended rules and quality bar.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "may-journal",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/261468068?v=4",
      "created_at": "2026-02-13T16:36:21Z",
      "is_verified": null,
      "public_repos": 2,
      "account_age_days": 163
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "go/v0.20260719.934",
          "kind": "other",
          "published_at": "2026-07-19T14:36:33Z"
        },
        {
          "tag": "go/v0.20260719.852",
          "kind": "other",
          "published_at": "2026-07-19T13:54:41Z"
        },
        {
          "tag": "go/v0.20260719.844",
          "kind": "other",
          "published_at": "2026-07-19T13:49:21Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "7c5a9f57d37286386ef168d85cfa820b8c370618",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(checks): add markdown-links — relative links must resolve",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-19T14:34:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "14f7aeed120414595eb13a0e995717f9950123da",
          "body": "…ADME link\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(architecture): counts, layout tree, index links, and a broken RE…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-19T14:14:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0b7cdeced3f9e50d86862f8e0216cd07f00d49dc",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): real install instructions for the live channels",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-19T14:09:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bed7330f4ec37a3ed8a11a61f9eadf92bd9d8223",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(publish): repo public, go install verified, tap deferred to #47",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-19T13:59:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0292993fe7736c0393ffd706dc23758bfc03137c",
          "body": "…matches\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(release): asset names drop the stray v prefix so the tap formula …",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-19T13:51:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3fe3c116489902a1b5566326c76964d727c0535e",
          "body": "…thority\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(release): tags derive from the changelog heading — one version au…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-19T13:44:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "759c921c189b56867ac522f2170d2c5fb143948b",
          "body": "…ap bump\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(release): tag-triggered releases with tarballs, checksums, and t…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-19T13:37:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b2f7fa1ced4e84e216eccd598ee5172352a9538a",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): distribution channels — go install, releases, brew tap",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-19T13:21:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a4193201ecefeb6efe18b54a0c5c91080be21a32",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(checks): add text-readability — ensemble readability smoke detector",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-19T13:12:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5ec425779d627acd4e421829a533591e77373369",
          "body": "…lexity experiment\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(research): plans corpus replaces the changelog as the prose-comp…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-19T00:40:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8ea28acc9e2826de83ef96a5ce7b2f8f7c020cb3",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(research): number research docs starting at 0001",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-19T00:31:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6521e9b17492cdb12d06371cd0efc885a264a572",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(research): can a check judge the cognitive complexity of prose?",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-19T00:30:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dcb837617af9dc74464a12bf210a7535aa71110a",
          "body": "…ory into compliance\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(changelog-bullets): judge every section and bring the whole hist…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-19T00:08:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ad8db283342bff7cd950c6bd5034ec63a2511ddb",
          "body": "The newest CHANGELOG section must be 3-5 bullets, each under 365\ncharacters, each with a semantic type prefix; older sections are\nhistory. Enabled in the dogfood list (19 checks, 29 catalog names).\nThe previous entry — one 1,230-character bullet — was rewritten to\ncomply, and this commit is gated by the standard it introduces.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(checks): add changelog-bullets — entries stay tight or fail",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T23:48:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "17ab7ff36e71cfd25fe2628e1a36bef84a7a345e",
          "body": "Spell lookups binary-search the embedded sorted bytes (no 217k-word map\nbuild at launch; sync.Map memo) — 7.2x on small repos, byte-identical\noutput proven differentially. Clone detection hashes tokens directly\n(FNV-1a 64, no shared interning) so window hashing parallelizes — 2.3x\ndetect phase at half the memory, identical statistics. Suite ~65ms.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(engines): zero-startup cspell dictionary and parallel jscpd hashing",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T23:44:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d4c728f1ca9690b6d7ef09aa24dff6a3d1884bb3",
          "body": "internal/par is a deterministic generic worker pool (results in input\norder — parallelism can never change output) backing walkfs.ScanFiles,\nthe cspell engine, jscpd's lex phase, and go-complexity's parsing. The\nsuite was already concurrent across checks; removing the serial floor\ninside the slowest ones takes the 18-check suite from ~111ms to ~70ms.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(checks): parallelize file scanning inside the heavy checks",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T23:21:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cda00880d26a38cb0c7ff303b8a5e2d311affb3e",
          "body": "…iling\n\nThe Go-native counterpart of the house eslint complexity rule (max 5,\nconfigurable via goComplexity.max): go/ast scoring with separately\nscored function literals and _test.go exempt. All 78 functions it\nflagged were refactored under the ceiling behavior-identically (the\nvitestconf and cloned\n[…]\n with\n40 test packages green and no exported API changes. Enabled in this\nrepo's dogfood list — this commit is gated by the check it introduces.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(checks): add go-complexity and bring the whole tree under its ce…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T23:19:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f6b372cdfd79386666067e6c70341f1ae65d4485",
          "body": "All 27 check READMEs correct their era (JSON config snippets, fitness\ninvocations, peer-tool and native-engine truths, Go equivalents for TS\ninternals, three-step config resolution) with rule docs preserved\nbyte-identical; architecture and strategy docs drop the last stale npm\nclaims; the index leads with the completed milestone plans.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(checks): align every document with the Go-only, npm-free reality",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T22:49:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f1e61d843d32d65b9827986568c906d299c36ae0",
          "body": "architecture/, plans/, the architecture index, and the strategy docs\nmove together so relative links between them survive; front matter\ndepths and README boundary links updated. mermaid-level-bleed keeps\nworking via its unanchored architecture/ path pattern.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(docs): consolidate all documentation under docs/",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T22:42:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "94946c632a990948672c4e016af04de190f75dad",
          "body": "go build -o bin errors when the gitignored directory is absent; hooks,\nCI, README, and the architecture docs now mkdir -p first. Verified by a\nclean-clone simulation running the full suite from an empty checkout.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(build): create go/bin before building on fresh clones",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T22:21:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "06d4f6d9dda5db63e32cb37fc604b4c59701338c",
          "body": "Plan 02 complete and archived. Shared configs embed in the binaries\n(internal/sharedconf, materialize-on-demand with npm-install compat),\nfitness-stamp-changelog replaces the node stamping script, hooks call\ngo build and the binaries directly, and package.json, the lockfile,\nnode_modules, .npmrc, .n\n[…]\nnode-version/dependency-currency\n(nothing to judge npm-free; all stay in the catalog). CI is two Go\njobs. Cloning and building requires only Go.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(go): npm-free — the toolchain is exactly one language",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T22:20:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a7261d857902e73400f6bf06fb8cccbc0685d94c",
          "body": "The Go suite is the only fitness runner now. Deletes packages/runner,\nall 26 TS check packages, the checks bundle, .fitnessrc.js, and the\ngo-parity harness (parity was proven before deletion). Check rule docs\nmove to go/cmd/fitness-check-<name>/README.md; packages/shared survives\nas a configs-only n\n[…]\nt scripts, CI, devDependencies, and\nthe dogfood check list slim to the Go-only world; README and the\narchitecture C4 docs rewritten accordingly.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(go): retire the TypeScript implementation",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T20:56:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "104da014831cee5bf01afec1be0a49d108c9d002",
          "body": "Fast-forwarded main to the go-rewrite branch tip and moved plan 01 to\nplans/archive with status: completed front matter; README links to the\narchived plan.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(plans): archive the completed go-rewrite milestone plan",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T20:24:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "47324200cb8ac5e90719a73cb4ec99d0a22b6754",
          "body": "Plan 01 section 5 completes the milestone: scripts/go-parity diffs all\n27 checks against the TS twins (27/27 agree), CI gains go/go-parity/\nfitness-ts jobs, and this repo now gates its own commits on the Go\nrunner (npm run fitness -> go/bin/fitness, 23 checks in under 2s; the\nTS suite stays supporte\n[…]\nsition).\nDistribution decided: GitHub Releases + go install first, npm shim\nonly if consumers want npx continuity. Every plan 01 box is checked.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(go): lock it in — parity harness, CI, dogfood cutover, distribution",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T20:21:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c732d5175ec59b696221ee722062cbcec7d3b1ab",
          "body": "…alog\n\nPlan 01 section 4: prettier, eslint, vitest-coverage-full, and\nswiftlint exec the real tools (binaries resolved from node_modules/.bin\nthen PATH, never npx; one-line install hints when missing). All four\nbyte-match their TS twins on this repo and on violating fixtures; 122\nnew Go tests with scripted-fake tool mocks. Full-catalog sweep: 26/27\nnames byte-match; jscpd differs only in documented count semantics.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(go): port section 4 — the four tool-exec checks complete the cat…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T20:11:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "24f882517799e63e7da72dc423cfdf33253e5c44",
          "body": "Plan 01 section 3 complete: internal/spell (camelCase-aware extraction,\ncspell-compatible directives, 14 committed wordlists generated from the\ninstalled @cspell packages) proven byte-identical to real cspell on an\nadversarial corpus and ~7x faster on this repo; internal/clonedetect\n(generic lexer, \n[…]\nes the TS cspell check hanging\nthe hook on staged wordlists: the staged filter now honors non-glob\nignorePaths entries from the resolved config.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(go): port section 3 — native cspell and jscpd souls",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T18:12:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d685c74e48a68c022325dee2d47f50c55c37f8a2",
          "body": "…ependency-currency\n\nPlan 01 section 2 complete: internal/mermaid ports mermaid.ts with\nRE2 lookahead emulation (differentially verified against the JS parser\nover the whole repo), five thin mermaid check binaries on top, a\ntext-level vitest config scanner (internal/vitestconf), and a native\nnet/htt\n[…]\ny client replacing the npm outdated shell-out with\nidentical offline-degrade semantics. All seven side-by-sides agree\nwith the TypeScript twins.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(go): port section 2 — mermaid family, vitest-coverage-exclude, d…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T17:08:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c280ac6980cb31d83df42d6be23e69425b0a9e29",
          "body": "Plan 01 section 1 complete: twelve new check binaries landed in one\nparallel pass, each with table-driven tests and side-by-side parity\nagainst its TS twin on this repo (failing checks fail byte-identically).\nAlso: jscpd now ignores Go _test.go fixtures like .test.* ones, the two\nreal production clo\n[…]\ntracted (walkfs.ScanFiles,\nrender.ColorsEnabled), and .fitnessrc.json carries the allow baseline\nfor the Go runner during the config transition.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(go): port all thirteen pure-logic checks to Go binaries",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T16:40:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "238b49af78d3fa729ee0234f72ec7370b50ccdd5",
          "body": "Plan 01 section 0: stdlib-only go/ module with the fitness runner\n(exec protocol, --describe handshake, parallel pool, process-group\ntimeout kills, table renderer) and fitness-check-node-version, which\nagrees with the TS check on this repo. Shared internals (walker, git,\nmarkdown parsing, renderer) land with go test coverage. Also fixes the\nprettier check erroring on staged go/ paths (no parser for Go).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(go): scaffold the Go runner and the first check binary",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T16:13:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b2c63d89878ac3be759f02f3b313566e929ed822",
          "body": "One static binary per check plus a fitness runner binary, stdlib-only,\nported one check at a time with side-by-side parity against the TS\nchecks; dep-heavy checks last, each approach decided on arrival.\nAlso bumps @typescript-eslint 8.64.0, eslint-plugin-jsdoc 63.1.0, and\nknip 6.27.0 to keep dependency-currency green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(plans): add the go-rewrite milestone plan",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-18T15:57:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "59d673bf326e49de0fce4aef475e6f7d750e6677",
          "body": "Add an opt-in fitness check that validates a commit message discloses AI\nusage via two git trailers after the subject line: AI-Tools: and AI-Models:\n(each present with a non-empty value on its own line). Merge and revert\ncommits are exempt. Mirrors semantic-commit's contextInline /\nproposedCommitMes\n[…]\nitest / @vitest/coverage-v8 to ^4.1.10 repo-wide to satisfy the\ndependency-currency check (4.1.10 published upstream).\n\nCloses #7.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(checks): add commit-attribution check (#34)",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-11T04:22:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "10797b6e64936aad65c5b76321110f33692b4cae",
          "body": "Encapsulates the eslint-check timeout fix (#45) as a general decision: a check's\ndefault timeout is a budget (breach = wasted work, not a limit to raise),\ntimeoutMs overrides are reserved for external latency, and a lint tool does only\nthe analysis its active rules require. Follows the may-journals/may-photos ADR\ntemplate, placed under this repo's architecture/ C4 docs.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(adr): record 0001 — fix the work, not the limit (#46)",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-11T03:49:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2dd515cd1d46e73383b753846af01b1b1721a85e",
          "body": "…ng the whole repo (#45)\n\nThe eslint check ran type-aware linting (a full TS type-checker program over the\nwhole repo, ~5.4s on CI) but no enabled rule reads type information, so it paid\n~5s for zero findings and tripped the default 5s check timeout on main. Parse .ts\nsyntactically instead: identica\n[…]\n FITNESS_TSCONFIG_ROOT,\ntsconfig.lint.cjs + its lint compiler profile). Also bump eslint 10.6.0 -> 10.7.0\nfor dependency-currency.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(checks): eslint check parses syntactically instead of type-checki…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-11T00:47:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "11f43418d7c618caa71d65ad8213b3c0375b0f89",
          "body": "…hecks (#37)\n\n* feat(checks): add build-output-untracked check\n\nAdds an opt-in fitness check that enforces two repo-hygiene rules for\nthe `dist` build output:\n- dist must be git-ignored (git check-ignore -q dist) and have no\n  tracked files (git ls-files -- dist / '**/dist/**'), with git rm hints.\n-\n[…]\n are the CLI binary name and the check name sharing a spelling.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(checks): add build-output-untracked + repeated-string-literals c…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-10T21:01:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "50f5e437b7e70b577c5cd42ae8afbcfb72557886",
          "body": "…ames (kebab-case + camelCase) (#36)\n\n* feat(checks): add markdown-filename-convention check\n\nAdd an opt-in fitness check that enforces every .md basename is\nkebab-case or camelCase, with standard root docs (README.md,\nCHANGELOG.md, CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md,\nLICENSE.md) exemp\n[…]\nk after overnight upstream releases.\n\nCloses #11.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(checks): markdown-filename-convention — one package, two check n…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-07T14:55:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09327c161deefd5917070f0de375f7db48aca2b5",
          "body": "Add an opt-in fitness check that fails when any source file\n(.ts, .tsx, .js, .mjs, .cjs, .mts, .cts, test files included)\ncontains an ESLint disable directive (eslint-disable,\neslint-disable-line, eslint-disable-next-line, block and file\nforms), reporting `path:line: directive` per hit. Registered i\n[…]\nge-v8 to 4.1.10 so the enabled\ndependency-currency check passes (4.1.10 published after the last\ndependency refresh).\n\nCloses #10.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(checks): add no-eslint-disable check (#35)",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-06T19:50:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "11aa0842a402518cddc832603df32d77456fffc4",
          "body": "* feat(checks): add gitignore-why check\n\nAdds an opt-in fitness check that requires every .gitignore pattern line\nto be immediately preceded by a non-empty explanatory # comment, so\nignores are never unexplained and stay easy to audit. Passes with\nfilesChecked 0 when .gitignore is absent; reports on\n[…]\next.js, Nuxt, Gatsby, Sveltekit, Firebase, etc.).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(checks): add gitignore-why check (#33)",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-06T17:37:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eb68bc7547ca457f71b88359879d24e440724d8c",
          "body": "`dependency-currency` runs `npm outdated`, which queries the registry and can\nexceed the runner's 5s default check timeout on a cold CI cache (observed ~5.5s),\nfailing the fitness job. Added an optional `timeoutMs` to the `Check` type — the\nrunner uses it over the default for both in-process and worker checks — and set\n`dependency-currency` to 30s.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(runner): allow per-check timeout; give dependency-currency 30s (#32)",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-06T00:47:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fb3ffbffa01aac02eac2204fca0d7c77dc5e9491",
          "body": "…n, enable full suite (#31)\n\n* feat(checks): add dependency-currency check (flag deps behind latest)\n\nFails when any declared npm dependency is behind its latest published version —\nan installable update means the project isn't at peak fitness. Runs\n`npm outdated --json` (direct declared deps only),\n[…]\n(test/spec ignored,\nduplication under threshold).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(checks): dependency-currency + migrate to TS 6 / latest toolchai…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-06T00:36:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4c75901f2f86f2c60f87bea06d5f4521b288f772",
          "body": "…(#29)\n\nAdds five opt-in checks enforcing the mermaid-diagram + numbered-callout-table\nconvention used in the architecture docs: mermaid-callouts (1-1 diagram↔table\nmatch), mermaid-callout-why (Why column), mermaid-diagram-prose (relationship\nlabels carry numbers, not prose), mermaid-legend (classDe\n[…]\n\ncausing false check failures), and standardize package.json scripts across all\ncheck packages to one set (build, ci, knip, test).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(checks): add mermaid check set, dogfood all checks on this repo …",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-05T20:33:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "044a558718f0aae55398caebe77031ee00e77dcb",
          "body": "semantic-commit (conventional-commit-types) and read-repo-first (boxen) both failed with \"Cannot find package\" for real external consumers - their dependencies never reached a published package, masked by this monorepo's workspace hoisting. Added the missing deps to @mayjournal/fitness-shared and dropped boxen entirely in favor of a small chalk-based helper.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(checks): propagate check runtime deps; drop boxen",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-03T05:00:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "df862b45168a9c9ce4774394f8aa5d5783a70175",
          "body": "- Add jscpd (duplicate-code detection, joins defaultChecks) and swiftlint (opt-in, shells out to a brew-installed binary) checks, modeled on bottom-line/may-journals' existing setup\n- jscpd bundled as a real dependency of @mayjournal/fitness-shared; ignores markdown/JSON/lockfiles to avoid false-pos\n[…]\n/architecture cleanup: fixed stale @mayjournal/fitness-check-* references, moved Config next to Install, promoted Git hooks out of \"(optional)\"\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(checks): add jscpd and swiftlint checks",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-03T04:27:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b36e03512ca10707a1d7afa467d60f54c34a6898",
          "body": "- `.fitnessrc` `checks` accepts local module paths mixed with npm check names, in order — missing/invalid paths fail loud, `disabledChecks` never removes them\n- Added C4 architecture level 5 (user journey) and updated levels 1-4 for local check paths\n- Fixed stale `@mayjournal/fitness-check-*` package references in README/architecture docs\n- README cleanup: Config moved next to Install, Git hooks promoted to its own non-optional section\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(config): support local check paths in .fitnessrc checks (#23)",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-07-03T01:13:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8278e704688babbe5eddfb4ab2af47c4d8d0dda0",
          "body": "Drop setup:npm-trust and audit:publish:comment; provision:npm and CI already cover those workflows.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore(scripts): remove redundant root npm script aliases",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-21T00:52:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "10a3f2c0f53c9cf8f0ac5a0f184743847a85624b",
          "body": "Drop husky and use tracked githooks/ with core.hooksPath on prepare.\nShip starter hooks in @mayjournal/fitness and document cp -a for consumers.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore(hooks): replace Husky with native githooks",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-21T00:45:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "11f660245f54ed252eba25c92d4bca3ecb958553",
          "body": "Move finished design docs out of plans/ and fix relative links in docs that reference them.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore(docs): archive completed plans under plans/archive",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-21T00:27:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b646d54ab004a1e24e748962aacc2576f40f7766",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix(ci): publish npm workspaces sequentially for clearer retries",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-21T00:21:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a5091d833d54b78fc9928f4b1403a09631490c54",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore(release): publish fitness-checks and fitness packages",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-21T00:17:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6544f4f8f5995031383c5eb9b2353200b3d16675",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix(ci): build monorepo before npm publish in Publish workflow",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-21T00:14:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "017bec1c7d075060c16084023d933276ad9db5b8",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore(release): publish checks bundle and runner after token auth fix",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-21T00:12:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8bce82edc283eb9947925135a937ae48929a18c6",
          "body": "Token auth does not need GitHub id-token; provenance was blocking publish.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix(ci): drop provenance for NPM_TOKEN publish path",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-21T00:09:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "31555ce81d61d8568208797dc196dcbda6aa5de7",
          "body": "Restore token auth via NODE_AUTH_TOKEN so the granular npm secret in\nrepository settings is used; OIDC registry-url was ignoring it.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix(ci): publish with NPM_TOKEN secret instead of OIDC",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-21T00:08:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6dde39748397655bbf0c12654a47990ed4c29a78",
          "body": "Add --provenance and workflow_dispatch so Publish can authenticate via\nOIDC and be triggered manually after npm trust is configured.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix(ci): enable npm OIDC provenance for trusted publishing",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-21T00:05:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "479b10a544fb31d22211e7c937cc4839a1b1ca39",
          "body": "* refactor(publish): ship only runner, shared, and checks bundle\n\nBundle all check implementations into @mayjournal/fitness-checks/checks/*,\nmark individual check workspaces private, and publish three public packages\nso provision and CI no longer need per-check npm setup.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n* style(scripts): format list-publishable-packages for Prettier CI\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "refactor(publish): ship only runner, shared, and checks bundle (#19)",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-20T23:51:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a4e71062f2f417573a4896b6c380037bd589aa0c",
          "body": "Consumer repos reference @mayjournal/fitness-shared configs but npm does not\ninstall devDependencies, so Prettier plugins and Vitest failed to resolve.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix(shared): ship Prettier and Vitest as runtime dependencies (#18)",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-20T22:39:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0db12e4fd8bf5499b9d0f085fe3de8dfd518e320",
          "body": "Published bin was spawning the runner with cwd set to node_modules, so\n.fitnessrc and disabledChecks were ignored. Drop the cwd override and\nrun fitness from monorepo root locally.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix(runner): inherit consumer cwd in bin/fitness.js (#16)",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-20T22:28:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "db745229875495eba66eaa6ef4cd9234a3044692",
          "body": "…ig (#15)\n\n* feat(perf): add publish audit, per-workspace knip, and dependency cleanup for issue #13.\n\nIntroduce audit:publish with publint and tarball sizing, CI PR comments, loadCheck benches, and trim redundant deps while fixing exports types-first across publishable packages.\n\nCo-authored-by: Cu\n[…]\nrsor.com>\n\n* fix(publish-audit): track vitest types stub and stop noisy PR comment sections\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat(perf): publish audit, knip per workspace, and single cspell conf…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-20T22:18:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5121b7a084a1c8c660410255e8e5dc4f36be0a18",
          "body": "Publish only runs OIDC workspace publish. Provision workflow and publish-time\nseed/trust checks are removed so maintainers configure new packages on npmjs.com.\n\nAdds colocated node:test coverage for scripts, repository fields on publishable\npackages, and optional local provision/trust helpers.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "ci(publish): drop npm provision workflow; add script tests",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-20T21:27:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "54118cc5f8c36c5f973cfc84353047330320dd41",
          "body": "feat(release): automate npm package provisioning for new workspaces",
          "is_bot": false,
          "headline": "Merge pull request #14 from may-journal/feat/npm-provision-automation",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-20T20:47:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7f3cf1d721d3d791d8ce134b072c7786fdf06d5",
          "body": "Fix CI format and fitness prettier check failures on PR #14.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "style(scripts): run prettier on provision and related scripts",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-20T20:44:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "463c847d70ef561d315b76f0cb9ff4f620a6a315",
          "body": "Add JS provision scripts in per-folder layout with READMEs, a Provision\nworkflow for new @mayjournal packages, and publish-time checks so CI can\nseed the registry and configure trusted publishing without manual steps.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat(release): automate npm package provisioning for new workspaces",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-20T20:37:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "301752dfa9a435a2df8b427d9ff9b0d2dca4dde6",
          "body": "* docs(plan): add split runner and check packages architecture plan\n\nDocument monorepo split, per-check npm packages, bundle defaultChecks runtime, and publish strategy.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n* chore(workspace): scaffold npm workspaces for runner and check packages\n\nLay g\n[…]\non from package scripts;\nbuild logic stays in the fitness-shared bin like other workspaces.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat(monorepo): split runner, check packages, and dynamic loading (#12)",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-20T20:22:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9cf753ec55f15ae8d8b15151abfd77fe1419dabe",
          "body": "Consumer repos can run fitness without local cspell, prettier, vitest, or tsconfig; ESLint gets a temp tsconfig from package defaults.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat(checks): fall back to package configs when consumer has none",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-20T16:20:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0a098a9ca2cfc920700e2721b996a9892996783a",
          "body": "Replace NPM_TOKEN secret auth with GitHub Actions OIDC so npm publish works via the trusted publisher configured on npmjs.com.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore(release): switch publish workflow to npm trusted publishing (OIDC)",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-05-20T15:58:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e8fde79ce5a0a87ca1f0d4560e855579fcdfe6f8",
          "body": "Point the vitest subpath at vitest.config.mjs, add ambient types for importers,\nand resolve Prettier plugins from this package so consumers do not need local\nplugin installs.\n\nMade-with: Cursor",
          "is_bot": false,
          "headline": "fix(fitness): Vitest config export and Prettier plugin resolution",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-04-04T22:48:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1f9f05ceae40a8c762bce865c5e51478975a510",
          "body": "- Use ESLint Node API with overrideConfigFile and cwd=consumer root\n- Add getFitnessRunnerRoot util and tests; vitest-coverage-full imports it\n- runInProcess for eslint; RunContext _eslintRunForTesting for tests\n- Runner tests: mock eslint run and execSync for git log --pretty\n- Document behavior in eslint README; CHANGELOG entry\n\nMade-with: Cursor",
          "is_bot": false,
          "headline": "feat(eslint): run ESLint from fitness package against parent cwd",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-04-04T22:12:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d704a7ffeba20e815aa24a5b2551b4fe464fec14",
          "body": "- Extract JSON array from output when stderr is mixed in (extractJsonArray)\n- On parse failure with non-zero exit, append truncated ESLint output to fallback\n- Add tryParseJsonArray to keep complexity under limit; export for tests\n- Add tests for leading stderr, invalid bracket span, invalid JSON between brackets\n\nMade-with: Cursor",
          "is_bot": false,
          "headline": "fix(eslint): show file/line errors and raw output when JSON parse fails",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-03-08T18:07:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ca4c1ccc21228059ae1de324f212eb39f548998",
          "body": "…rkflow, and deps-check plan\n\nMade-with: Cursor",
          "is_bot": false,
          "headline": "chore(release): scope to @mayjournal/fitness, add LICENSE, publish wo…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-03-08T16:07:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8552ed055a730e658b2b1cd4e25fec86a203b8d",
          "body": "- Add prettier-plugin-packagejson for conventional package.json field order\n- Ignore package-lock.json in .prettierignore so Prettier does not touch it\n- Keep prettier-plugin-sort-json for other JSON (alphabetical)\n\nMade-with: Cursor",
          "is_bot": false,
          "headline": "chore(prettier): package.json sort and ignore package-lock",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-03-08T15:34:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f8516f09b43f025c46fc888a2bc8444e78edca1",
          "body": "- Add optional Check.folder and RunContext.checkFolderByName (serializable for worker); runner builds map from registry\n- Remove CHECK_TO_FOLDER from read-repo-first; rules-front-matter sets folder: rules-front-matter\n- Add registry.test.ts to assert CheckName enum and registry stay in sync\n- Document add-a-check steps in src/checks/README.md\n\nMade-with: Cursor",
          "is_bot": false,
          "headline": "refactor(checks): single source of truth for check registration",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-03-08T01:34:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aae3bdc15ef21d375cabdad75017432086be5b5d",
          "body": "- Add quoteForShell() in src/utils/shellQuote.ts; use in eslint, prettier, cspell\n- Add src/checks/vitest-config with loadVitestConfig, getCoverageExcludeFromConfig, getThresholdsFromConfig\n- vitest-coverage-exclude and vitest-coverage-full use shared loader; remove duplicated isObject, configFromMod, tryLoadConfigFile, tryLoadPackageJsonVitest\n\nMade-with: Cursor",
          "is_bot": false,
          "headline": "refactor(checks): shared quoteForShell and Vitest config loader",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-03-08T01:30:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9666c6b97d207291326ffbd30d2b9e86d2255221",
          "body": "… checks\n\n- Add execSyncResult() and EXEC_OPTS in src/utils/execSyncResult.ts\n- Add buildExecCheckResult() in checkResult.ts for exec-based check results\n- Use shared helpers in eslint, prettier, cspell, vitest-coverage-full, changelog-updated\n- Add tests for execSyncResult and buildExecCheckResult\n\nMade-with: Cursor",
          "is_bot": false,
          "headline": "refactor(checks): shared exec helper and buildExecCheckResult for CLI…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-03-08T01:27:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "31dbf536c8042cca228d6073659ca183627a0698",
          "body": "…t](url)\n\n- stripLinkBlocks() removes [text](url) before emphasis check\n- underscores in URLs or link text no longer falsely flagged as italic\n- add tests and README note\n\nMade-with: Cursor",
          "is_bot": false,
          "headline": "fix(markdown-no-bold-italic): ignore emphasis inside link blocks [tex…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-03-08T01:22:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71145f9f8d11c6c4674a10a3bd591895b3a756b2",
          "body": "- checksFromConfigList: keep first occurrence per check name\n- add test when config.checks has duplicate names\n- extract runImpl to satisfy eslint complexity; add re-entry guard test\n\nMade-with: Cursor",
          "is_bot": false,
          "headline": "fix(runner): dedupe config.checks by name so each check runs once",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-03-07T20:31:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "396d6e934c68a15310376c5a46d54f927d7e5050",
          "body": "- eslint: add max-lines 200 (skipBlankLines, skipComments)\n- run-resolve: getChecks, config/spec resolution, context building\n- run-execute: runOneCheck, worker and in-process execution\n- run-output: buildTable, buildTotalLine, ResultRow\n- run.ts: orchestration only\n\nMade-with: Cursor",
          "is_bot": false,
          "headline": "feat(runner): add max-lines 200 and split run.ts into focused modules",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-03-07T20:06:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4232333d891d4a2a65a5ff7a6664931d3f0626c5",
          "body": "…d fixes\n\n- Check.runInProcess: checks declare in-process vs worker (read-repo-first, vitest-coverage-full, markdown, rules-front-matter)\n- run(): accept testOverrides; _checkTimeoutMsForTesting shortens timeout tests to ~10ms\n- contextInlineFromArgs extracted and tested; resolveChecks refactored fo\n[…]\n read-repo-first table col widths\n- CHANGELOG backticks for markdown check; remove vitest.config.cjs\n- ESLint: sort-keys (run before runInProcess), JSDoc, complexity fixes; Prettier\n\nMade-with: Cursor",
          "is_bot": false,
          "headline": "feat(runner): runInProcess per check, fast timeout tests, coverage an…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-03-07T19:54:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d55461766026bc0faf82b0d5284f3bf40bbe8f83",
          "body": "Each check runs with Promise.race against a 5s timeout. On timeout\nthe check is reported as failed with 'Check timed out after 5s' and\nthe runner continues with remaining checks.\n\nMade-with: Cursor",
          "is_bot": false,
          "headline": "feat(runner): add 5s per-check timeout",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-03-07T17:23:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7f6f4c61621c3e8b0a1bfb9e773102ba1b9bf50",
          "body": "Log 'Resolving checks...' before getChecks, 'Running checks:' then\n'  → <name>' before each check so users can see where the run is\nor which check is hanging when run via npx from a parent project.\n\nMade-with: Cursor",
          "is_bot": false,
          "headline": "feat(runner): add progress messages to stderr",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-03-07T17:19:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "383ba7f1cb02eeff08be54631d710e24f36687bb",
          "body": "Resolve argv[1] and import.meta.url to real paths before comparing\nso that npx fitness from a parent project runs the CLI instead of\nexiting silently. npm installs bin as node_modules/.bin/fitness\nsymlink to the package dist; isMainModule now treats that as main.\n\nMade-with: Cursor",
          "is_bot": false,
          "headline": "fix(utils): detect main module when run via npx (argv symlink)",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-03-07T17:15:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84a81618e4dc6939bba7b5d0cd1b88ee3920a7e3",
          "body": "…rcement\n\n- New check runs vitest run --coverage and fails unless exit 0\n- Requires consumer project and fitness-runner package to have coverage\n  thresholds set to 100 for branches, functions, lines, statements\n- enUS strings for user-facing messages; explicit threshold validation\n- Allow **/index.ts in vitest-coverage-exclude for barrel files\n- ESM vitest.config.mjs for Vitest 4; runner test vitest config for full pass\n\nMade-with: Cursor",
          "is_bot": false,
          "headline": "feat(checks): add vitest-coverage-full check with 100% threshold enfo…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-03-07T17:03:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5811a2739ef672add6f0211ea2fff58aedbbaa60",
          "body": "Made-with: Cursor",
          "is_bot": false,
          "headline": "refactor(cspell): add runCspell, enUS dict, isMainModule util and tests",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-03-07T16:07:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "574fe5d6125d271cc75e4aa8c467d6a5d4b275a3",
          "body": "- utils: checkResult(ok, errors?, filesChecked?), getStagedFiles, getExecSync\n- All checks use checkResult and context helpers where applicable\n- RunContext: add _now for changelog-updated tests\n- CHANGELOG: entry for plan first part\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "refactor(checks): add checkResult and runContext, migrate all checks",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-22T23:17:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dba964433e321c80c7741678d6a84ea70d5a835c",
          "body": "…spell trim\n\n- plans/plan-checks-abstractions.md: repeating patterns in checks, abstraction options\n- README: flowchart node renamed to PassthroughArgs\n- cspell.json: trim words list\n- CHANGELOG: entry for above\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "docs(plans): add plan-checks-abstractions, README flowchart rename, c…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-22T23:01:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d43c87b3cf64f966bbe5fc91407b40cf99ac4319",
          "body": "…er override\n\n- Move all packages into dependencies (remove devDependencies)\n- Prettier: override for package.json to use json parser so sort-json runs; enables recursive key sort including exports paths and conditions\n- Remove prettier-plugin-packagejson; add comments in prettier.config.cjs\n- CHANGELOG: entry for dependency flatten and Prettier package.json override\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore(deps): flatten deps, fix package.json recursive sort via Pretti…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-22T22:51:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2276e4853ed4a5c9d211d0ad52a2751f7f3e503c",
          "body": "…r enum/interface\n\n- Add enUS enum (runner/enUS.ts) and run logic (runner/run.ts); index is barrel only\n- Move human-facing copy into enUS; total line uses interpolate(enUS.TotalLine, ...)\n- Add utils/interpolate for {{key}} replacement and tests\n- ESLint: typescript-sort-keys (string-enum + interface), align @typescript-eslint to ^8.55\n- package.json overrides for eslint-plugin-typescript-sort-keys eslint peer\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat(runner): enUS i18n, barrel index, interpolate util, sort-keys fo…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-22T22:20:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f336b190cf00973c2aee82cdae17580dac30194b",
          "body": "…names\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore(prettier): single config, .prettierignore, types export, check …",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-22T21:11:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "581287fca6d45e0b5c5986719ed1619802723dff",
          "body": "…s message\n\n- semantic-commit returns error when subject empty (no repo, empty HEAD, or empty --message=)\n- commit-msg hook: use --message=$(cat \"$1\") so proposed message is validated\n- Export MSG_EMPTY; update runner tests to expect exit 1 for empty message cases\n- Prettier: skip .husky and unparseable paths in staged list\n- CHANGELOG and version 0.1.0-2026.02.22.1454\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix(semantic-commit): fail when nothing to check; commit-msg hook pas…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-22T20:54:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "782a6be88d96cc18ae2968dc9eac5e41027cf961",
          "body": "- Replace findMd with findFilesByExtension(root, extension) e.g. .md\n- getSkipDirs: use skipTheseDirectories from .fitnessrc if present, else cspell.json ignorePaths (dir names only); no default list\n- Add FitnessConfig.skipTheseDirectories; add .git, .husky to cspell.json ignorePaths\n- Add getSkipD\n[…]\ns.test.ts; tests that need skip dirs write cspell.json in temp dir\n- JSDoc and complexity fixes for eslint; CHANGELOG and version 0.1.0-2026.02.22.1431\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "refactor(utils): findFilesByExtension + getSkipDirs from config",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-22T20:44:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "84a8acc9c40aeb133952a937a64278f7bd22e891",
          "body": "- Add CheckName enum in src/types/check-name.ts\n- Type Check.name as CheckName in check.types.ts\n- Update all 11 checks to use enum instead of string literals\n- Remove READ_REPO_FIRST_NAME constant from read-repo-first\n- Cast config check names to CheckName in runner resolveChecks\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "refactor(checks): use CheckName enum for all check names",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-22T20:08:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9d7f86828dc73df6c4555b0ff12037e1e99b78c0",
          "body": "… color\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix(docs): make Mermaid flowchart edge labels readable with linkStyle…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-22T19:59:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "38fdb88b75734ee2d8af4d4990c32bc467206e6e",
          "body": "- Check type: optional contextInline { argName, contextKey }; export ContextInline\n- semantic-commit: register --message -> proposedCommitMessage\n- Runner: getContextInlineFromArgs, getInlineContextFragment, getPassthroughArgs from check; no semantic-commit branches\n- Commit-msg hook: use --message=\"$(cat \\\"$1\\\")\"; README and semantic-commit README updated\n- Flow diagram: getInlineContextFragment(argsAfterSpec, check.contextInline)\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat(runner): check-registered contextInline, remove check-name logic",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-22T19:32:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ad4fc6ee076f90866dda47755850d0d310095eab",
          "body": "… change\n\n- Plan: runner uses Check.contextInline (and future contextPath) for context;\n  fitness config unchanged\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "docs(plan): check-registered contextInline/contextPath, no .fitnessrc…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-22T19:22:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fb7be1f8b35c9ce8c4f8b4f387bf8148f28d3515",
          "body": "…etCommitMsgPath to getContextFilePath\n\n- Add plans/plan-runner-no-check-names.md with front matter and no bold/italic for checks\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "refactor(runner): rename specFromPositional to checkNameIsFirstArg, g…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-22T18:59:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "222efacb0dca0b9324fc4564ab9caa0e74e12717",
          "body": "- Add src/utils/terminal.ts with getColumns() so runner has no check-specific imports\n- Runner now imports getColumns from utils/terminal instead of read-repo-first\n- Remove getColumns from read-repo-first; move tests to utils/terminal.test.ts\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "refactor(runner): abstract check deps; move getColumns to utils/terminal",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-22T18:47:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "38842d84ef5fa4d1dd844c4da1ce6654b1ff524f",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "docs(readme): align Mermaid flowchart with runner code flow",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-22T18:41:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7568525ea7149b90572ff5323b7c8fa0277b362f",
          "body": "…ch CHANGELOG first heading\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat(changelog): require package.json and package-lock version to mat…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-16T22:46:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b8a67d9a1db9e367a5b2f8aac00b89caa9831ed9",
          "body": "…and time\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat(changelog-updated): require section heading to use current date …",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-16T22:34:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "31b13263692cb62ea429b74e96d5a56d80e947b6",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore(changelog-updated): export message consts and use in tests",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-16T22:28:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d06905ee3a20139490266b74906cc245d90b316a",
          "body": "…er --write)\n\n- Runner: add passthroughArgs to RunContext when running single check\n- Prettier check: forward args to underlying Prettier CLI\n- Reduce ESLint complexity in prettier check\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat(prettier): passthrough args to Prettier (e.g. npx fitness pretti…",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-16T22:17:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f271862abc2ff4d98a510a599d5aeffa43eb2c29",
          "body": "Move eslint, prettier, vitest, and related plugins from devDependencies\nto dependencies so consumers can use the exported configs. Keep TS\ntooling (@types/node, tsconfig.js, tsx, typescript) as devDependencies.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "refactor(package): move config-related deps to dependencies",
          "author_name": "Jason Vanderslice",
          "author_login": "jasonvanderslice",
          "committed_at": "2026-02-16T22:10:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 3,
      "commits_last_year": 158,
      "latest_release_at": "2026-07-19T14:36:33Z",
      "latest_release_tag": "go/v0.20260719.934",
      "releases_from_tags": false,
      "days_since_last_push": 7,
      "active_weeks_last_year": 8,
      "days_since_latest_release": 7,
      "mean_days_between_releases": 0
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/may-journal/fitness-runner/go",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/may-journal/fitness-runner/go",
          "is_deprecated": false,
          "latest_version": "v0.20260719.934",
          "repository_url": "https://github.com/may-journal/fitness-runner",
          "versions_count": 3,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-19T14:34:47Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 7
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 11
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go/go.mod"
      ],
      "largest_source_bytes": 18416,
      "source_files_sampled": 110,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        ".cursor/rules/fitness-checks.mdc",
        ".cursor/rules/no-workarounds.mdc"
      ],
      "agent_instruction_max_bytes": 388
    },
    "dependencies": {
      "manifests": [
        "go/go.mod"
      ],
      "advisories": {
        "error": "No resolved dependencies to assess",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [],
        "collected": true,
        "truncated": false,
        "total_count": 0,
        "direct_count": 0,
        "indirect_count": 0
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 19,
        "open_issues": 11,
        "closed_ratio": 0.577,
        "closed_issues": 15,
        "closed_unmerged_prs": 2
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "jasonvanderslice",
          "commits": 158,
          "avatar_url": "https://avatars.githubusercontent.com/u/915584?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": true,
      "linter_configs": [
        "eslint.config.mjs"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "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/30 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": 0,
            "reason": "no 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": "30 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": null,
            "reason": "packaging workflow not 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": 0,
            "reason": "no SAST tool detected",
            "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": "7c5a9f57d37286386ef168d85cfa820b8c370618",
        "ran_at": "2026-07-27T00:46:10Z",
        "aggregate_score": 3.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-19T14:36:44Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-11T04:22:26Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 2,
          "created_at": "2026-02-19T15:19:38Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 3,
          "created_at": "2026-02-19T15:20:32Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 5,
          "created_at": "2026-02-22T23:23:30Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 9,
          "created_at": "2026-04-04T23:08:19Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 13,
          "created_at": "2026-05-20T19:26:26Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 38,
          "created_at": "2026-07-06T16:46:22Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 39,
          "created_at": "2026-07-06T17:16:09Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 40,
          "created_at": "2026-07-06T19:24:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 43,
          "created_at": "2026-07-10T19:31:15Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 44,
          "created_at": "2026-07-10T19:31:42Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 47,
          "created_at": "2026-07-19T13:57:48Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/may-journal/fitness-runner",
    "host": "github.com",
    "name": "fitness-runner",
    "owner": "may-journal"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 53,
      "inputs": {
        "security": 36,
        "vitality": 78,
        "community": 24,
        "governance": 45,
        "engineering": 74
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 78,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "commits_last_year": 158,
              "human_commit_share": 1,
              "days_since_last_push": 7,
              "active_weeks_last_year": 8
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 7 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "8/52 weeks with commits",
                "points": 5.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "158 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 158
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 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": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 3,
              "latest_release_tag": "go/v0.20260719.934",
              "releases_from_tags": false,
              "days_since_latest_release": 7,
              "mean_days_between_releases": 0
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "3 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 7 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0
                    }
                  }
                ],
                "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": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 62,
            "inputs": {
              "merged_prs": 19,
              "open_issues": 11,
              "closed_issues": 15,
              "issue_closed_ratio": 0.577,
              "closed_unmerged_prs": 2
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "58% of issues closed",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 58
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "19/21 decided PRs merged",
                "points": 34.6,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 19,
                      "decided": 21
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 34,
            "inputs": {
              "followers": 0,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "may-journal",
              "public_repos": 2,
              "account_age_days": 163
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "0 followers of may-journal",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "may-journal"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "2 public repos, account ~0 yr old",
                "points": 4.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 2
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "packages": [
                "github.com/may-journal/fitness-runner/go"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 7
            },
            "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 7 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "3 published versions",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": 74,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "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": "eslint.config.mjs",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.mjs"
                    }
                  }
                ],
                "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 36,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 36,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 3.6
            },
            "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 not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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/30 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": "no update tool detected",
                "points": 0,
                "status": "missed",
                "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": "30 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 not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "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": "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": 1
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 79,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                ".cursor/rules/fitness-checks.mdc",
                ".cursor/rules/no-workarounds.mdc"
              ],
              "agent_instruction_max_bytes": 388
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".cursor/rules/fitness-checks.mdc, .cursor/rules/no-workarounds.mdc",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".cursor/rules/fitness-checks.mdc, .cursor/rules/no-workarounds.mdc"
                    }
                  }
                ],
                "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": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 67,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.82,
              "toolchain_manifests": [
                "go/go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go/go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go/go.mod"
                    }
                  }
                ],
                "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": "eslint.config.mjs",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.mjs"
                    }
                  }
                ],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "82 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 82,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "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": 18416,
              "source_files_sampled": 110,
              "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/110 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 110,
                      "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": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T00:46:14.726411Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/may-journal/fitness-runner.svg",
  "full_name": "may-journal/fitness-runner",
  "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.27.0 — metodología completa · wiki de métricas.

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