Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-30 11:43 UTC

amarbel-llc / tommy

Go TOML library and CLI with round-trip-preserving CST and codegen for type-safe Decode/Encode methods — keeps comments, whitespace, and formatting intact — read-only mirror of code.linenisgreat.com/tommy

GoMIT★ 0 estrellas⑂ 0 forksdesde mar 2026Ver en GitHub ↗

amarbel-llc/tommy tiene un índice de salud de 57 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (81/100) y la más baja, Community & Adoption (24/100). Se actualizó por última vez hace 1 día. Una sola persona concentra la mayor parte del trabajo reciente.

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

57
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

amarbel llcOrganización
0 seguidores56 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
Gocode.linenisgreat.com/tommyv0.5.0-21hace 9 días

Métricas por categoría

Vitalidad

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

81Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 1 días
11.8/36Cadencia de commits — 17/52 semanas con commits
18/18Volumen de commits — 333 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_year333
human_commit_share1
days_since_last_push1
active_weeks_last_year17
Cómo se puntúa
16.2/27Publica versiones — 21 etiquetas de versión (sin releases de GitHub)
36/36Recencia de las versiones — última versión hace 9 días
27/27Cadencia de publicación — una versión cada ~4,8 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count21
latest_release_tagv0.5.0
releases_from_tags
days_since_latest_release9
mean_days_between_releases4,8
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

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 — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
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?

55Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
4.7/22.5Distribución de commits — el principal contribuyente firma el 79% de los commits
4.1/13.5Amplitud de contribuyentes — 3 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled3
top_contributor_share0,793
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
38.2/38.3Aceptación de PR — 4/4 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs4
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
0/25Alcance del propietario — 0 seguidores de amarbel-llc
13.7/25Trayectoria — 56 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers0
owner_typeOrganization
is_verified
owner_loginamarbel-llc
public_repos56
account_age_days169
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 9 días
20/20Historial de versiones — 21 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagescode.linenisgreat.com/tommy
ecosystemsgo
any_deprecatedno
min_days_since_publish9

Calidad de Ingeniería

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

70Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 1 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
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_configno
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

85Excelente
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
10/10Topics — 8 topics
10/10Wiki
Datos de entrada utilizados
topicscli, codegen, cst, formatter, go-library, golang, parser, toml
has_wiki
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?

47En 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.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
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 — sin datos
6.8/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_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate4,7
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, packaging, signed_releases. 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.

75Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
35.7/40Historial de commits legible — 67 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,67
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes10.290
Cómo se puntúa
18/18Arranque con un solo comando — justfile, zz-tests_bats/justfile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — Nix, lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
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_nix
has_tests
lockfilesgo.sum
has_dockerfileno
typed_language
bootstrap_filesjustfile, zz-tests_bats/justfile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
54.1/55Tamaños de archivo manejables — 1/63 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes310.789
source_files_sampled63
oversized_source_files1

Datos clave

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

Advertencias de recopilación de datos

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

OpenSSF Scorecard 4.7 / 10
4.7agregado

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-30 11:43 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
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
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
n/dSigned-Releasesno releases found
9Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 3
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/dave/jenniferv1.7.1go.mod
Gogolang.org/x/toolsv0.44.0go.mod
Gomvdan.cc/gofumptv0.10.0go.mod
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "cli",
        "codegen",
        "cst",
        "formatter",
        "go-library",
        "golang",
        "parser",
        "toml"
      ],
      "is_fork": false,
      "size_kb": 1041,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 881271,
        "Nix": 23555,
        "Just": 12914,
        "Shell": 27306
      },
      "pushed_at": "2026-07-28T16:55:18Z",
      "created_at": "2026-03-18T13:43:57Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-28T16:57:18Z",
      "description": "Go TOML library and CLI with round-trip-preserving CST and codegen for type-safe Decode/Encode methods — keeps comments, whitespace, and formatting intact — read-only mirror of code.linenisgreat.com/tommy",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "amarbel.net",
      "name": "amarbel llc",
      "type": "Organization",
      "login": "amarbel-llc",
      "company": null,
      "location": "United States of America",
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/260668089?v=4",
      "created_at": "2026-02-10T12:45:42Z",
      "is_verified": null,
      "public_repos": 56,
      "account_age_days": 169
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-20T12:31:36Z"
        },
        {
          "tag": "v0.4.7",
          "kind": "patch",
          "published_at": "2026-06-14T14:58:04Z"
        },
        {
          "tag": "v0.4.6",
          "kind": "patch",
          "published_at": "2026-06-14T13:54:22Z"
        },
        {
          "tag": "v0.4.5",
          "kind": "patch",
          "published_at": "2026-06-13T18:32:21Z"
        },
        {
          "tag": "v0.4.4",
          "kind": "patch",
          "published_at": "2026-06-10T13:05:46Z"
        },
        {
          "tag": "v0.4.3",
          "kind": "patch",
          "published_at": "2026-06-08T17:59:59Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-06-08T17:43:32Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-06-08T15:39:57Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-06-08T14:31:16Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2026-06-07T13:45:05Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2026-06-06T20:11:06Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-06-04T22:33:34Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-06-04T12:42:29Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-05-24T17:57:21Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-05-23T17:27:11Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-05-23T16:56:58Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-05-23T13:31:51Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-05-16T20:01:23Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-04-23T19:37:45Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-04-23T19:34:06Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-04-23T19:27:42Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "b215621f711075bcbc463bcc9125504852a5e7db",
          "body": "Lowercase the pre-existing single-line descriptions and drop their\ntrailing periods, so the --list column reads as one uniform list\nrather than two styles side by side. Where such a comment was two\nsentences, the extra sentence moves above a bare `#` separator.\n\nAlso rewrite descriptions that satisf\n[…]\nnot. The linter checks that a\nsummary stands alone, never that it says anything.\n\nSigned-off-by: Clown 0.4.2+0201796\nhttps://code.linenisgreat.com/clown/commit/02017963c3ed4f5a3354c7d2ccfcd5305695142e",
          "is_bot": false,
          "headline": "justfile: normalize --list summary style",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-28T14:33:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3f3f6ca6b01277330150c224b69d24b05a4e546a",
          "body": "`just --list` shows only the last comment line above a recipe, so\nmulti-line comment blocks were surfacing their tail as the\ndescription. Insert a bare `#` separator above a written one-line\nsummary, per conformist-justfile(7) RECIPE DESCRIPTIONS. Prose is\npreserved above the separator.\n\nSigned-off-by: Clown 0.4.2+0201796\nhttps://code.linenisgreat.com/clown/commit/02017963c3ed4f5a3354c7d2ccfcd5305695142e",
          "is_bot": false,
          "headline": "justfile: give every recipe a standalone --list summary",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-28T14:02:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "321c59041898890516937e8f0c39961c54e87393",
          "body": null,
          "is_bot": false,
          "headline": "bump transitive flake inputs",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-21T18:53:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b04a9c206878fef31e7abc1308d501ad179d290",
          "body": null,
          "is_bot": false,
          "headline": "bump transitive flake inputs",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-21T15:38:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f8aa6d5e13ae9fb428610cb68a24e90b844f5f0",
          "body": "…ep #20)\n\nSigned-off-by: Clown 0.3.22+dirty <https://code.linenisgreat.com/clown/commit/dirty>",
          "is_bot": false,
          "headline": "docs: repoint living-doc URLs to code.linenisgreat.com (fleet doc swe…",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-20T20:44:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f65a99b5fe57ad1c7bad325e86347f3512c7a3e9",
          "body": "…m/tommy\n\nRepo-root module rename, wave-3 leg A1. No first-party requires (base\nlibrary). Rewrites cover the go.mod module line, all internal .go\nimports, the synthetic-consumer go.mod scaffolding in justfile/\nzz-tests_bats/common.bash and the generate/ test suite (fixtures that\nbuild a scratch modu\n[…]\n per pilot convention).\n\nPer playbook: docs/plans/2026-07-19-go-module-rename-playbook.md\n(WAVE 3 PLAN, leg A1).\n\n🤡 Generated with Clown 0.3.22+dirty (https://code.linenisgreat.com/clown/commit/dirty)",
          "is_bot": false,
          "headline": "rename Go module github.com/amarbel-llc/tommy -> code.linenisgreat.co…",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-20T12:31:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e7ec8e7bd846e5ac65c92879027417cd46177236",
          "body": null,
          "is_bot": false,
          "headline": "bump transitive flake inputs",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-17T23:58:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e2497cfe3a68ef7ae7aa5024edde93c2daa31e7d",
          "body": null,
          "is_bot": false,
          "headline": "bump transitive flake inputs",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-17T13:36:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "470536b85c62643fe6906c3d35365ad2eecee745",
          "body": "The follows retarget (previous commit) changed the input graph without\nregenerating the lock; the first nix evaluation rewrote it in place,\nleaving the tree dirty and tripping the cascade's dirty-guard\n(\"working tree is dirty — refusing to bump\", the 2026-07-17 rerun).\nShip the lock the inputs change should have carried.\n\n:clown: Clown 0.3.22+1cb8383 — https://code.linenisgreat.com/clown/commit/1cb8383ef3006e1179952e14c7031d8ec2dc127e",
          "is_bot": false,
          "headline": "flake.lock: sync with the treefmt-nix follows fix",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-17T12:12:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e6b33fe5e2f617abd14819989e1b43880e3c74ab",
          "body": "bats retired its treefmt-nix input in the conformist migration\n(bats 6f57aff, eng#246), so every follows anchored on\n\"bats/treefmt-nix\" now hard-fails `nix flake update` with\n\"follows a non-existent input\" — before the cascade's post-update\ndead-follows repair can run (chicken-and-egg; this broke th\n[…]\nigloo/treefmt-nix\" and\ndrop the circular igloo.inputs.treefmt-nix override entirely.\n\n:clown: Clown 0.3.22+1cb8383 — https://code.linenisgreat.com/clown/commit/1cb8383ef3006e1179952e14c7031d8ec2dc127e",
          "is_bot": false,
          "headline": "flake: fix treefmt-nix follows broken by bats dropping the input",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-17T11:46:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3092ae77c4515aef212b4e2f43030d180fa50c4e",
          "body": "bats: cdaa14c → ?\nconformist: 2099b7b → ?\nigloo: e04bba9 → ?\ntap: 4531c9f → ?",
          "is_bot": false,
          "headline": "bump flake inputs: bats, conformist, igloo (+1 more)",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-17T02:00:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68213be3d7b789ed9d3369876e7f490ed56d44a9",
          "body": "bats: 5a5ed04 → cdaa14c\nconformist: ffaed59 → 2099b7b",
          "is_bot": false,
          "headline": "bump flake inputs: bats, conformist",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-15T10:54:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65f9ceec75d7c97798b613cc51cd5afec2ae4d83",
          "body": "bats: cd0e743 → 5a5ed04\nconformist: 1985c0c → ffaed59",
          "is_bot": false,
          "headline": "bump flake inputs: bats, conformist",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-14T14:34:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d9d65588e4af3e095d906cf4abf4fd4eff328dbb",
          "body": "bats: 99b2c2b → cd0e743",
          "is_bot": false,
          "headline": "bump flake inputs: bats",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-14T01:36:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a8f6a9468af2ed9451d94f0828cc01f6fcc76d5",
          "body": "bats: ea3ac3d → 99b2c2b\nconformist: 2759686 → 1985c0c\nigloo: 0dab674 → e04bba9",
          "is_bot": false,
          "headline": "bump flake inputs: bats, conformist, igloo",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-13T13:57:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d70b76bedf333bd1ff14bd90c256985c9121d872",
          "body": "bats: 7f64db7 → ea3ac3d\nigloo: d1c081d → 0dab674",
          "is_bot": false,
          "headline": "bump flake inputs: bats, igloo",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-12T21:52:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edfabae9d47b279c8cd0d0454e17a161c41cf743",
          "body": "Wires tommy's own repo through conformist, following maneater's adoption\npattern (amarbel-llc/maneater@4373689). Tommy already exports a\nconformistModule for downstream consumers; this makes tommy consume it too.\n\n- conformist input follows tommy's own igloo/nixpkgs-master/utils\n- pure eval: presets\n[…]\nte, build, test) green.\n\n🤡 Generated with Clown (https://github.com/amarbel-llc/clown, build 0.3.19+0655f7e)\nCommit: https://github.com/amarbel-llc/clown/commit/0655f7e98a7fb26ee47013a46305823bd89b0a3",
          "is_bot": false,
          "headline": "Adopt conformist for tommy's own tree (dogfoods conformistModule)",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-12T20:44:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9a2ca690e977e09cf65de2632ead734d39b6cf00",
          "body": "tap: 9ab6246 → 4531c9f",
          "is_bot": false,
          "headline": "bump flake inputs: tap",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-07-08T13:26:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b449da93c3a705cea4aeacd668d59834ad6d9de0",
          "body": "bats: bef4c81 → 7f64db7\nigloo: 991d36f → d1c081d\ntap: 357559d → 9ab6246",
          "is_bot": false,
          "headline": "bump flake inputs: bats, igloo, tap",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-06T13:31:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92ffdffd426493a3c8b54cc7b859322a680147b9",
          "body": "bats: 0004521 → bef4c81\nigloo: e27cfa4 → 991d36f\ntap: 34e7b7d → 357559d",
          "is_bot": false,
          "headline": "bump flake inputs: bats, igloo, tap",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-06T11:33:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d54a5a054a499decc1a91f0e2a98919b5f9c17d9",
          "body": "bats: 70141ac → 0004521\nigloo: 534b764 → e27cfa4\ntap: cb01f7a → 34e7b7d",
          "is_bot": false,
          "headline": "bump flake inputs: bats, igloo, tap",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-06T03:53:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "273162b0a7e4529947a178a5fd5bbd23a6677864",
          "body": "tap: 0e7f8b2 → cb01f7a",
          "is_bot": false,
          "headline": "bump flake inputs: tap",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-05T11:21:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26a1a2ff809466061e839e2b4a4a6c66baccf19f",
          "body": "tap: eed0cc1 → 0e7f8b2",
          "is_bot": false,
          "headline": "bump flake inputs: tap",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-04T11:51:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dec0a3d4f75b2868a20806e76fe8c703d688720a",
          "body": "tap: 593ed21 → eed0cc1",
          "is_bot": false,
          "headline": "bump flake inputs: tap",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-04T11:01:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08b43e585ed8fbf36cc5f10788a7dc86efb43179",
          "body": null,
          "is_bot": false,
          "headline": "refresh flake.lock",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-07-03T18:23:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5f445e2d7439163a6ce62e497c9cb35a24955f4",
          "body": null,
          "is_bot": false,
          "headline": "refresh flake.lock",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-29T17:16:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b504d1e392756e55a027ec1ef1de97ac74de125b",
          "body": null,
          "is_bot": false,
          "headline": "refresh flake.lock",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-26T15:36:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a867842a2e772803db92aba6804b563cbf8e4198",
          "body": "The conformist-tommy-codegen repair lane relied on an ambient `go` and\nskipped (exit 0) when it was missing. spinclass's git pre-commit and\npre-merge hooks run the repair command in a bare env (plain os.Environ(),\nno devShell/direnv), so go was absent and the repair silently no-op'd —\nletting tommy \n[…]\non-insensitive here (load Mode requests no NeedModule).\n\nCloses #138\n\n🤡 Generated with Clown (build 0.3.14+6f3b8bc)\nhttps://github.com/amarbel-llc/clown/commit/6f3b8bc78adf1ffa1015faff48109de8a4a2120d",
          "is_bot": false,
          "headline": "flake: bake go into conformist-tommy-codegen so repair works bare",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-25T17:57:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "720f21a27f2850ca8eddd551a4e3f78ee8c36695",
          "body": null,
          "is_bot": false,
          "headline": "bump nixpkgs-master: d233902 → 567a49d",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-25T17:15:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f27c1d54d70a6440b5c9fdd77d7ec0904e3b980",
          "body": "#137 reported a generated decoder silently dropping a [parent.subtable]\nwhen the parent header carried a scalar key before the sub-table header.\nInvestigated against HEAD: tommy's decode path handles the shape\ncorrectly at both layers, so these are regression guards, not a fix.\nThe silent drop is do\n[…]\nble): the full codegen pipeline\n  populates Dotenv from envrc-before-[direnv.dotenv].\n\n:clown: Clown 0.3.14+295fae7\nhttps://github.com/amarbel-llc/clown/commit/295fae7bf5b2cb8a13578d2af6fc7e9984bc98bd",
          "is_bot": false,
          "headline": "test: pin #137 decode shape (scalar key before [parent.subtable])",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-24T13:32:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d71e1b5fa8786ca6f990de90dc60b40b876eda0d",
          "body": null,
          "is_bot": false,
          "headline": "refresh flake.lock",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-24T10:22:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a520b6c28bc15e832897fd8e28a8a40cbfea579",
          "body": null,
          "is_bot": false,
          "headline": "refresh flake.lock",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-23T15:55:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6d613a86252c3f53c55209709a20586fba8768e",
          "body": null,
          "is_bot": false,
          "headline": "refresh flake.lock",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-18T15:21:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1db38351a2491483c166d2e8a8c206b534db4773",
          "body": null,
          "is_bot": false,
          "headline": "refresh flake.lock",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-17T20:35:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2254505033d69dc2b138519c28652e68e39df9f7",
          "body": null,
          "is_bot": false,
          "headline": "refresh flake.lock",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-15T15:54:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14364c72cd5ac102cf8690924114838ad2bb6668",
          "body": null,
          "is_bot": false,
          "headline": "refresh flake.lock",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-14T15:34:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "181ce45686bca770f494d69279a3550f081737f7",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.4.7",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-14T14:58:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b03d488c993acccb160c4e42d9a25b0ea58d5c8f",
          "body": "The [linter.tommy-codegen] check is `true` to avoid false drift in a\nsandboxed `conformist check` lane. The prior comment justified this partly\nby \"tommy generate --check diverges from gofumpt'd committed files\" — but\nsince #134 tommy gofumpt's its own generated output (generate.go, version-\nmatched\n[…]\nThe\nonly remaining reason check is a no-op is that `tommy generate` needs the go\ntoolchain a sandbox check lane lacks; drift enforcement belongs in a\ngo-available lane (`tommy generate` + `git diff`).",
          "is_bot": false,
          "headline": "docs(flake): correct conformistModule check=true rationale post-#134",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-14T14:29:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "41efed39bbfd893600e47cc81a7f200675f02032",
          "body": "Bumps version 0.4.5 -> 0.4.6 and folds in two review simplifications to the\nconformist integration added after v0.4.5 (the conformist-tommy-codegen driver\n+ conformistModule) that did not land in the prior merge:\n\n- driver: collapse the check/repair if-else into a single gen_args array\n- conformistM\n[…]\nthe redundant \"**/*.go\" — conformist\n  compiles globs via gobwas/glob with no separator arg, so \"*\" matches across \"/\")\n\nEnables tag-pinning consumers (spinclass, cutting-garden) to adopt the feature.",
          "is_bot": false,
          "headline": "chore: release v0.4.6",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-14T13:54:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4cc70c9ec05d774b7e42cb6bb04f8d46b81824f0",
          "body": "Adds the tommy side of the conformist integration so consumers stop\nduplicating the codegen driver and the flake resolves which tommy backs it:\n\n- packages.<system>.conformist-tommy-codegen: a self-gating codegen driver\n  with THIS flake's tommyBin baked into its PATH (go comes from the consumer's\n \n[…]\nnto a\n  conformist evalModule and the binary is resolved by the flake.\n\nBecause a consumer pins tommy as a flake input, both the driver's tommy and\nthe bridged codegen library resolve to the same rev.",
          "is_bot": false,
          "headline": "Export conformist integration from tommy's flake",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-13T21:20:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "031c87764a572d1c9178b7da50f1af3eec3460f3",
          "body": null,
          "is_bot": false,
          "headline": "refresh flake.lock",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-13T19:32:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b412730c30ec8b5fbd42b245e543d10c658edf56",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.4.5",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-13T18:32:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "880e216b3a518412958da5b71f639d0bc0b554a4",
          "body": "Records the design decision for tommy#133: a stable, versioned JSON\nexport of a struct's TOML schema, derived from the existing TypeExpr/\nspkType analyzer model, so downstream Nix (home-manager module\ngeneration) can be derived from the same source instead of hand-\nshadowing the struct.\n\nThis is opt\n[…]\nxplicitly out of scope. status: proposed; no emitter implemented yet.\n\n:clown: generated with Clown (0.4.1+bc5b0cd)\nhttps://github.com/amarbel-llc/clown/commit/bc5b0cd637fa3aaaed226f50c3464676011bec25",
          "is_bot": false,
          "headline": "docs(rfc): specify TOML schema export format (#133)",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-13T18:15:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "394fb5807ffb2b37a2c54869eedf6793d6d154c8",
          "body": "tommy generate ran emitted bytes only through goimports (FormatOnly =\ngofmt), which leaves consecutive top-level declarations packed with no\nblank line between them. That is valid Go but not gofumpt-canonical, so\nfreshly generated *_tommy.go failed any downstream treefmt/gofumpt gate\nuntil a manual \n[…]\nthe bats lane PATH). goModCache hash rebumped\nfor the new dependency.\n\n:clown: generated with Clown (0.4.1+bc5b0cd)\nhttps://github.com/amarbel-llc/clown/commit/bc5b0cd637fa3aaaed226f50c3464676011bec25",
          "is_bot": false,
          "headline": "fix: format generated code with gofumpt (closes #134)",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-13T17:59:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "054f61d3520d1b76f868589ebfee3556ddd0d077",
          "body": null,
          "is_bot": false,
          "headline": "refresh flake.lock",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-12T10:31:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6605e00e018ec6bde45fd5f5803769539b7f68e7",
          "body": null,
          "is_bot": false,
          "headline": "refresh flake.lock",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-11T18:12:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25b1580895fa5e4bce348671f59ad5184fdc186c",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.4.4",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-10T13:05:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59ceaeb138447bf367bdf373c571349d29afa798",
          "body": "The codegen encode path no longer routes through the document API (it\nemits pkg/cst calls directly since the compositional cutover), and the\nmethod has zero callers in the repo or any downstream consumer. Its\narray-table-entry scoping bug was never fixed — removing the method\nremoves the bug surface.\n\nCloses #59\n\n🤡 Generated with Clown 0.4.0+cd38c2d (https://github.com/amarbel-llc/clown/commit/cd38c2d6298ea4b271bfa70c6476212c2d35e29e)",
          "is_bot": false,
          "headline": "refactor(document): delete unused EnsureTableInContainer",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-10T11:25:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f077673bd70ec709f7c846c4af45fee6a25acab",
          "body": "Behavior-preserving cleanups from the review/simplify pass:\n\n- cdArrayTable: drop TrackHandles; HandleType non-empty is the one fact\n  (set only in receiver context for a same-package element), making the\n  IR comment's invariant true instead of aspirational.\n- comp_render: hoist the twice-defined s\n[…]\nerSrc.\n- handleTypeName: note the accepted concatenation-ambiguity residue.\n\n🤡 Generated with Clown 0.4.0+cd38c2d (https://github.com/amarbel-llc/clown/commit/cd38c2d6298ea4b271bfa70c6476212c2d35e29e)",
          "is_bot": false,
          "headline": "refactor(generate): post-review simplify pass on the #127 changes",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-10T10:54:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2ab65638715b5ec18d9f21254fd67e25c913ec5a",
          "body": "What the empirical probe established (each claim now a conformance\ncell), the parts of the first prototype it falsified, the bugs it\nsurfaced beyond the value-space axis — including the OPEN stale\narray-table entries on shrink, an instance of the untested\ndocument-state axis (encode output is a func\n[…]\npointers, a decode-mutate-encode harness, marshal\nparity. CLAUDE.md points at the fold, the harness, and the\nflip-cell-and-model-together rule.\n\nhttps://claude.ai/code/session_017gZ28j38vuPePSmc6qVkD2",
          "is_bot": false,
          "headline": "docs(adr): record the 2026-06-09 representability examination",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-10T00:01:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1ca7e338f5c125aadf091c49c7b12a6dd582df80",
          "body": "The value generator's hand-coded exclusion switch was a fifth hand-\nsynced copy of the encoder's value-space rules, written in the fuzzer's\nown parallel td mini-algebra. tdToSpk bridges td onto the TypeExpr\nalgebra so genValue asks reprOf instead: nil is generated for every\nreference field (absent d\n[…]\ntables were previously never\ngenerated anywhere; now they are everywhere outside the guarded\nposition. All three fuzzers verified at seeds 1-7.\n\nhttps://claude.ai/code/session_017gZ28j38vuPePSmc6qVkD2",
          "is_bot": false,
          "headline": "test(generate): derive the fuzzers' nil/empty policy from the fold",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-10T00:01:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6509082a9a1c791025998b69003cfbfc02975698",
          "body": "…ness\n\nRewrite the prototype fold (ADR 2026-06-08) to model the encoder we\nHAVE, not the one the first prototype assumed, and hold it there with an\nempirical gate:\n\n- Sharpened law: a shape round-trips iff its silent values are exactly\n  the decode-absent default (silent ⊆ {absent}). MayBeSilent alo\n[…]\n drift and renderer drift both fail with\n  the cell named. Lossy cells are pinned so closing one later flips the\n  cell and the model together.\n\nhttps://claude.ai/code/session_017gZ28j38vuPePSmc6qVkD2",
          "is_bot": false,
          "headline": "feat(generate): truthful representability fold + cell conformance har…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-10T00:01:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "46678cf16ecf37dbc7b751c6a76e490cb18895fa",
          "body": "…ollided\n\nTwo live bugs surfaced by empirically probing the representability\nboundary cells (ADR 2026-06-08):\n\n- Encoding a []*Struct (same-package or delegated) containing a nil\n  element dereferenced it and panicked. Nil elements are now skipped,\n  the policy compEncMapStruct and compSlicePrimSet \n[…]\n. Handles are now named struct+field\n  (configServersHandle) via handleTypeName, threaded through the decode\n  fold as cdArrayTable.HandleType.\n\nhttps://claude.ai/code/session_017gZ28j38vuPePSmc6qVkD2",
          "is_bot": false,
          "headline": "fix(generate): nil []*Struct elements panicked encode; handle types c…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-10T00:00:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c865a27e668bfed1cf98147055010701f8e2427d",
          "body": null,
          "is_bot": false,
          "headline": "refresh flake.lock",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-09T10:31:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ae69d31ec4f092f1fbec8a44ca19a3377731cae",
          "body": null,
          "is_bot": false,
          "headline": "refresh flake.lock",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-08T20:25:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d86c1e173d33e77005534f4ce9b1ea7e5370d89",
          "body": "… ./generate/)\n\ndebug-test was hardcoded to ./generate/, so library unit tests (pkg/..., internal/...)\nhad no fast paved path — they only ran in the nix checkPhase. Add an optional pkg\nparam defaulting to ./generate/ (matching the local `param='default'` convention),\nso `just debug-test TestName` is\n[…]\n/ suite). Document\nthe pkg arg in CLAUDE.md's local-iteration block.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "chore(justfile): generalize debug-test to take a package arg (default…",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T19:58:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "13416cb6bdae38b253ccb507b24ac06f3e887c47",
          "body": "…mment (closes #126)\n\ndocument.Set, adding a new top-level key when the document's leading content is a\ncomment, spliced the key onto the comment's line — `# commenttitle = \"...\"` —\nproducing malformed TOML. A comment's trailing newline is a SIBLING NodeNewline,\nnot part of the comment node, so keyV\n[…]\nd.\n\nRegression test: TestSetNewKeyAfterLeadingComment.\n\nCloses #126.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "fix(document): keep a newline when inserting a key after a leading co…",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T19:47:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "66b70edd12e0001f50ec2df318d387b8379ed773",
          "body": "Releases the decoder-agnostic undecoded-key API on top of v0.4.2: cst.DecomposeBytes\n+ Value.GetPath, the spelling-correct, model-based way to compute unknown keys\nwithout decoding through tommy. Cut so downstreams (e.g. moxy's hybrid\nnative/config.go) can retire their localized undecodedKeys/markAllConsumed copies\nagainst a pinnable release.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "chore: release v0.4.3",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T17:59:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7bf193b6e08efed06f108b54a6b0b3e6f0f1096a",
          "body": "…oseBytes + GetPath)\n\nA consumer that decodes TOML outside tommy (e.g. via another library) had no\nergonomic way to compute unknown/undecoded keys after the 0.4 rewrite removed the\nraw-CST document.UndecodedKeys/MarkAllConsumed free functions — the model's\nMarkSeen/MarkConsumed/Undecoded primitives \n[…]\n it\ncan later drop that copy and gain the spelling-correct behavior.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "feat(cst): ergonomic decoder-agnostic undecoded-key detection (Decomp…",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T17:53:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "44424a475ee6545f12f5cfea7a2ccbc87b7708b9",
          "body": "Adds the generate consumer-ergonomics work on top of v0.4.1: the `tommy generate`\nrun-log (output path + version) and `tommy generate --check` (CI staleness/skew\nguard). Cut so downstreams pinning a release (e.g. moxy via flake-input-go_mod)\nget the diagnostics, not just master.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "chore: release v0.4.2",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T17:43:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d53f366e5ad638c262535f18a0a13de58a1cfe4",
          "body": "…e --check`\n\nTwo consumer-upgrade ergonomics fixes drawn from the v0.4.0 migration incidents\n(maneater hit an output-filename mismatch + a binary↔library skew that took a\nhuman to diagnose):\n\n- Diagnostics: `tommy generate` now prints \"tommy <version> (<commit>): writing\n  <path>\" to stderr on each \n[…]\nn-log. The manpage documents\nDIAGNOSTICS and CHECK MODE.\n\nRefs #125.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "feat(generate): report output path+version on run; add `tommy generat…",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T16:03:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bce2bf3e4810bf0a07446a5aba871bf0e99f8b1f",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.4.1",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T15:39:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c113f1f27c86af889734386f5611373447e14fe0",
          "body": "…loses #125)\n\nThe header was \"// Code generated by tommy; DO NOT EDIT.\" with no version, so a\nbinary↔library skew — a stale `tommy` codegen binary run against a newer tommy\nlibrary — was invisible until compile. A downstream consumer hit exactly this on\na v0.2.3 → v0.4.0 bump (library at v0.4.0, cod\n[…]\n documents the stamp and the skew-detection rationale.\n\nCloses #125.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "feat(generate): stamp tommy version+commit in the generated header (c…",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T15:23:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fb7ab8098f7c9b6ad5ed6a23a6cc975f400e0a5d",
          "body": "The decode-normalization rewrite (ADR 2026-06-07, shipped in v0.4.0) moved decode\nemission to comp_decode_model.go (a walk over cst.Decompose's normalized Value\nmodel) and retired comp_render.go's per-spelling decode renderer — but the\norientation doc still described a single RenderFile emitting dec\n[…]\nte DecodeXInto now takes a *cst.Value.\n\nSurfaced by /eng:loose-ends.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "docs: update CLAUDE.md for the model-based decode (post-rewrite drift)",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T14:57:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "555d686f60d8ae195febf3657a223c15a874a403",
          "body": "…he fold\n\nRecords the structural direction the value-space bugs (#1/#94/#121/#122/#123)\npoint at: model representability as a fold over the TypeExpr IR so the encoder,\nboth decoders, the fuzzer, and the #122 predicate derive from ONE source instead\nof four hand-synced ones (encoder suppression, deco\n[…]\nision. Refs #122, #123; complements 2026-06-07-decode-normalization.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "docs(adr): propose representability model in the type IR; prototype t…",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T14:37:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c3f47725036551c727435d683297171536ab0a93",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.4.0",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T14:31:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e470a8b0e8a7ff73e1504454a7d47bcdeb419fa5",
          "body": "…n) (refs #107)\n\nA round-trip fuzzer only decodes encoder OUTPUT, so it cannot catch decode bugs\non inputs the encoder never produces — exactly where #1 (empty array-of-tables)\nand #121 (empty primitive slice) hid, both \"the two decode paths disagree\" bugs.\n\nAdd a differential decode test: scaffold \n[…]\nrate known capability gap, not a divergence to fix here.\n\nRefs #107.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "test(generate): prototype differential decode (generated vs reflectio…",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T13:21:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "42624689df9b05c1cefca9a56c91d0a045ccd47f",
          "body": "…ay-of-tables exclusion (closes #94)\n\n#94 asked the round-trip fuzzer to exercise empty/nil collections and nil\npointers. The decode rewrite already implemented that for every representable\nposition — nil pointers, nil/empty primitive slices, nil/empty map[string]string,\nnil map[string]Struct — gate\n[…]\ne the actual nil/empty policy and the exclusions above.\n\nCloses #94.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "test(generate): correct stale nil/empty doc in genValue; document arr…",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T13:11:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "be8176424210e34705f3637903cc3a093b50fc3e",
          "body": "… (closes #121)\n\nThe reflection UnmarshalDocument path returned a nil slice for a present-but-empty\nprimitive array (`tags = []` -> nil []string), while the generated decoder\nnormalizes the same input to a non-nil empty slice (the #21 rule). Same\ngenerated-vs-reflection disagreement class as the emp\n[…]\n\ndecodeSliceValue for them), so this only touches present-but-empty.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "fix(marshal): normalize present-but-empty primitive slices to non-nil…",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T12:53:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "016e9d6a54c05e670df76b72a2289b3379eab121",
          "body": "…enerated file can't block regen\n\ntommy generate loaded the whole target package — including its own *_tommy.go\noutput — and hard-failed on any package type error. A generated file from an\nolder tommy that still references a since-removed cst symbol (e.g. the deleted\nFindChildTable/FindChildInlineTa\n[…]\n lint that actively nudges codegen isolation is a planned follow-up.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "fix(generate): ignore tommy's own output during analysis so a stale g…",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T12:43:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2eabf6a28bac783edf03b8f05ccded274bddfd7a",
          "body": "…InlineTable\n\nThese were the read side of the old enumerative CST-pattern decoder:\nFindChildTable located a [parent.key] sub-table within ChildScope, and\nFindChildInlineTable its inline `key = {...}` dual (#106). The decode rewrite\n(ADR 2026-06-07) resolves every spelling — header table, inline tabl\n[…]\ns, and FindChildSubTables stay\n— the encode path is still CST-based.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "refactor(cst): remove dead read-side finders FindChildTable/FindChild…",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T12:14:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6c756d416f9ac190c03b270cb2d3b58573a258c0",
          "body": "…review #4)\n\nA struct implementing Validate() is validated automatically by its generated\ntop-level DecodeX/Encode, but the delegated entry points DecodeXInto and\nEncodeXFrom — used when a parent in another package embeds the struct as a\nfield — skipped the call. So an invalid cross-package nested c\n[…]\n writing. Validation now runs bottom-up across delegated boundaries.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "fix(generate): validate delegated structs in DecodeXInto/EncodeFrom (…",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T12:14:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fc7e4312fd2ca9f1287c5d04565b398788d95765",
          "body": "The Extract*Slice helpers (ExtractIntSlice, ExtractStringSlice, …) iterated\nan array's children and appended only the elements matching the target kind,\nsilently dropping any others. So a heterogeneous array decoded into a primitive\nslice lost data with no signal:\n\n  ports = [1, 2.5, 3]   -> []int{1\n[…]\nElements and\nIsEmptyArray) into one shared cst.isArrayTrivia helper.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "fix(cst): reject heterogeneous arrays in slice extractors (review #2/#6)",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T12:14:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5bbe37f781524b84ac34042038a6c37fdc218086",
          "body": "An explicit empty array `xs = []` for a []struct field decomposes to a\nVLeaf: Decompose can't tell an empty array-of-tables from an empty scalar\narray — the emptiness erases the distinction (no inline tables to inspect).\nThe struct-slice consumers all guarded Kind==VArray, so an empty array fell\nthr\n[…]\ntegration test; a bats generate-lane test (empty + populated array).\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "fix(cst,generate,marshal): decode an empty array-of-tables",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T12:14:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "723dcfd9cd0891088ee59880fb2461e7966dc296",
          "body": "- cst: KeyValueName delegates to a shared keyValueSegments (moved beside\n  the parallel TableHeaderSegments/TableHeaderKey pair), dropping a\n  duplicated dotted-key walk.\n- cst/respell: extract spliceHoist for the three byte-identical\n  hoist-before-first-header tails (RespellInlineTables / RespellD\n[…]\nHeader) from the\n  comp_render package comment.\n\nNo behavior change.\n\n🤡 Generated with Clown (build 0.3.10+44f75d5)\nhttps://github.com/amarbel-llc/clown/commit/44f75d56cb4c2d1c2558da8ceb2c0cd1032871be",
          "is_bot": false,
          "headline": "refactor(cst,generate): simplify cleanups from review",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-08T11:34:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d82685eaf4f02f5c1b90b87b399645f95dc28d04",
          "body": "…malization ADR\n\nhttps://claude.ai/code/session_01XswPx1jvQaFeWqWxuSw9VN",
          "is_bot": false,
          "headline": "docs: note marshal migration + completed helper cleanup in decode-nor…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-08T00:50:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e416e5349d52f9966f0c7a6e65558e2991fb974e",
          "body": "With decode normalized through cst.Decompose, the helpers built for the old\nper-renderer spelling approach have no remaining caller. Remove them:\n\n- cst.CheckNoDuplicateKeys (#110) — Decompose detects duplicate keys intrinsically.\n- cst.FindImplicitChildTable + implicitScope + Node.Synthetic (#113/#\n[…]\n\nExtractStringMap) and the encode-side ChildScope/FindChildArrayTableNodes are\nkept. Net -539 lines. Full suite + gating spelling fuzzer green.\n\nhttps://claude.ai/code/session_01XswPx1jvQaFeWqWxuSw9VN",
          "is_bot": false,
          "headline": "refactor(cst,document): retire the enumerative-era decode machinery",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-08T00:49:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a87764397ed28c390617eb392f1d45726f99d360",
          "body": "Route the reflection-based UnmarshalDocument/UnmarshalReader decode through\ncst.Decompose, the same normalization layer the generated decoder adopted (ADR\n2026-06-07). The decode walk now reads a *cst.Value tree by reflection instead\nof canonical-spelling CST lookups (document.Get / FindArrayTableNo\n[…]\n free via the cst extractors. Covered by a\nspelling-acceptance test (the five dualities decode identically) and a\nduplicate-key rejection test.\n\nhttps://claude.ai/code/session_01XswPx1jvQaFeWqWxuSw9VN",
          "is_bot": false,
          "headline": "feat(marshal): decode via the normalized value model",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-08T00:43:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "746f6e18131ad9496670a1561f8d9cfc2e93c263",
          "body": "All-variants-gating spelling fuzzer green across seeds; model-walk decoder\nshipped; old CST-pattern decode renderer deleted. Notes the preserved #55\nflat-key fallback and the deferred cleanup of now-dead enumerative-era helpers.\n\nhttps://claude.ai/code/session_01XswPx1jvQaFeWqWxuSw9VN",
          "is_bot": false,
          "headline": "docs: mark decode-normalization ADR accepted (promotion criteria met)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-08T00:18:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "809b996fd9b2d70c76cc0a0613a4a63883eff489",
          "body": "The model-walk decoder (comp_decode_model.go) fully replaced the CST-pattern\ndecode renderer at the cutover, so remove it: the entire \"Decode walk\" block of\ncomp_render.go (compRenderDecodeBody / compScopedBody and the ~28 per-kind and\nscoped renderers, the inline/flat/implicit fallbacks, the dup gu\n[…]\nyze/classify/TypeExpr/comp_ir/comp_build), lexer, CST, and document are\nuntouched. Full suite + all-variants-gating spelling fuzzer stay green.\n\nhttps://claude.ai/code/session_01XswPx1jvQaFeWqWxuSw9VN",
          "is_bot": false,
          "headline": "refactor(generate): delete the dead CST-pattern decode renderer",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-08T00:16:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "57b6613b619349de1f8ff1e120f58bb38a1ef8b7",
          "body": "…ings\n\nCut the decoder over to the normalization architecture (ADR 2026-06-07). The\ngenerated DecodeX now: parse -> cst.Decompose(root) -> walk the value model into\nthe struct, folding the SAME TypeExpr/cd* algebra but with one reader per kind\nand zero spelling fallbacks. Decompose collapses every T\n[…]\ne-deep,\ndotted-key, inline-array-of-tables, implicit-parents): zero xfails across 14\nseeds x 120 cases. Full ./generate + library suites green.\n\nhttps://claude.ai/code/session_01XswPx1jvQaFeWqWxuSw9VN",
          "is_bot": false,
          "headline": "feat(generate): decode via the normalized value model; gate all spell…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-08T00:13:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1dbae9f33020ba9515572f54d696b3fcc60561fe",
          "body": "…lings\n\nThe normalization foundation of the 2026-06-07 ADR. Decompose resolves a parsed\nCST into a thin value model (Leaf / Table / Array-of-tables) in one\ngrammar-driven pass, collapsing every spelling of a value to a SINGLE shape:\nheader vs inline tables, dotted keys vs nested tables, array-of-tab\n[…]\n spelling axis is enumerated; the decode renderer rewrite\nwill fold the type algebra over this model with one reader per kind and no\nfallbacks.\n\nhttps://claude.ai/code/session_01XswPx1jvQaFeWqWxuSw9VN",
          "is_bot": false,
          "headline": "feat(cst): Decompose — canonical value model collapsing all TOML spel…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-07T22:14:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "44663e8ebc06b3031989144f6b7fef4683b30224",
          "body": "…ing axis)\n\nThe 2026-06-01 ADR collapsed the TYPE-axis flat enumeration into the TypeExpr\nalgebra. This is its exact analog on the SPELLING axis: the generated decoder\nhand-codes one CST matcher per (kind × spelling × position), so closing TOML's\nvalue/table duality is combinatorial and gaps recur (\n[…]\ns, scoped renderer twins, implicit/synthetic machinery, and scattered\ndup guards. Gated by flipping the spelling fuzzer to all-variants-gating.\n\nhttps://claude.ai/code/session_01XswPx1jvQaFeWqWxuSw9VN",
          "is_bot": false,
          "headline": "docs: ADR for decode via a normalized value model (collapse the spell…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-07T22:10:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c6b05d96c51f30f5155da3f948a36afda02fd266",
          "body": "The #111 deep-inline (RespellInlineTables) collected only an exact [a.b] child\nheader, so a map field whose entries appear as deeper headers ([a.m.key] with no\nbare [a.m] intermediate) was CONSUMED (its headers removed) but never folded\ninto the inline value — silently dropping the map. The spelling\n[…]\nd) folds as `m = { key = { … } }`. Now value-preserving; declines\n(stays canonical) on a descendant array-table or a multiline leaf, as before.\n\nhttps://claude.ai/code/session_01XswPx1jvQaFeWqWxuSw9VN",
          "is_bot": false,
          "headline": "fix(cst): make deep-inline respell value-preserving (folds map fields)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-07T22:08:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fbb983d393d2f9b3b9881707dc67ba79eb72277f",
          "body": "…pelling fuzzer (closes #111, closes #117)\n\nTwo spelling-fuzzer (#107) coverage gaps in the round-trip arc:\n\n#111 — RespellInlineTables only inlined leaf tables (single-segment, or\ntwo-segment with a present parent), so it never produced a fully-inline nested\nstruct from a deeply-nested canonical en\n[…]\nellings). Covered by cst unit tests for each\ntransform, including deep nesting, chains, array-table/multiline declines, and\nvalue preservation.\n\nhttps://claude.ai/code/session_01XswPx1jvQaFeWqWxuSw9VN",
          "is_bot": false,
          "headline": "feat(cst): recursive deep-inline + implicit-parents respell for the s…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-07T20:38:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1426dc1610ac1fc72e1213d7bec13e1569495020",
          "body": "…s #116)\n\nimplicitScope recognized FindImplicitChildTable's synthetic implicit-parent\nnode structurally — a NodeTable whose first child is a bare NodeKey and whose\nlast child is the evidence anchor. That was an implicit, collision-prone\ncontract: a future Node-building site producing the same shape \n[…]\n or accepted by\nimplicitScope, and that a hand-built structural look-alike (unflagged) is\nrejected — the flag, not the shape, is authoritative.\n\nhttps://claude.ai/code/session_01XswPx1jvQaFeWqWxuSw9VN",
          "is_bot": false,
          "headline": "refactor(cst): mark synthetic implicit-parent nodes explicitly (close…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-07T20:31:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1cd04d197bf92acf7e1b32a3cabb33a30d5b5e04",
          "body": "… (closes #114)\n\nThe #113 implicit-parent fix (a standalone dotted [a.b] sub-header with no bare\n[a] header still defines [a] implicitly) covered same-package nested struct\nfields, but the delegated (cross-package) renderers found the parent only via\nan exact [a] header match. So a cross-package fie\n[…]\nafter; covered by a\ncross-package integration test exercising value, pointer, and map fields plus\nthe unchanged canonical bare-header spelling.\n\nhttps://claude.ai/code/session_01XswPx1jvQaFeWqWxuSw9VN",
          "is_bot": false,
          "headline": "fix(generate): implicit-parent decode for delegated struct/map fields…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-07T20:29:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "643bd9ec5e74d9fa2440c882b16b6670aeb94f0a",
          "body": "The generated decoder's header form rejected a table defined twice (#92), and\nthe per-leaf #90 _seen guard rejected a repeated scalar leaf, but neither\ncovered a duplicate inline-table OUTER key: `mytable = { a = 1 }` written twice\nsilently took the first (FindChildInlineTable returns the first matc\n[…]\nper\narray-table entry, under different headers) is correctly allowed. Covered by a\ncst unit test, a generate integration test, and a bats case.\n\nhttps://claude.ai/code/session_01XswPx1jvQaFeWqWxuSw9VN",
          "is_bot": false,
          "headline": "fix(generate): reject duplicate keys in every spelling (closes #110)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-07T20:22:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fa030c591446250481a9901eef24bd8f181f2884",
          "body": "UndecodedKeys only walked document-root key-values (one bare-key level) and\ntable headers (one level into their children); it never recursed into a\nNodeInlineTable's entries. So when a generated decoder skipped an inline entry\nit couldn't decode — a type-mismatched or otherwise-dropped inner key — t\n[…]\n already mark consumed keys at every level with full\ndotted paths, so the consumed-set is populated correctly; only the walk needed\nto descend.\n\nhttps://claude.ai/code/session_01XswPx1jvQaFeWqWxuSw9VN",
          "is_bot": false,
          "headline": "fix(document): descend inline tables in UndecodedKeys (closes #109)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-07T20:14:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fa820d9f626f04e5004bfb03470a2b111fa742ac",
          "body": "…header (closes #115)\n\nA child field written as an inline table (`session = { ... }`) under its\nparent's own bare `[exec]` header parses to a NodeKeyValue child of the\n`[exec]` table node, not the document root. The root-relative container\nrenderers ran their #106/#108 inline-table fallback against \n[…]\n]NamedMap (compMapMap) with a focused Go\nintegration test and a bats case; verified the test fails when the fallback\nis reverted to doc.Root().\n\nhttps://claude.ai/code/session_01XswPx1jvQaFeWqWxuSw9VN",
          "is_bot": false,
          "headline": "fix(generate): decode inline-inner spelling under an explicit parent …",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-07T17:50:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "65ba9a6ac2de533a2866571fb0978cb06cbab9da",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.3.3",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-07T13:45:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75834a1ce7e34077544e3bd7fef34658ddc56842",
          "body": null,
          "is_bot": false,
          "headline": "refresh flake.lock",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-07T11:46:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4286df87e7ccab17f0abe1ce1e9e5b740e9f46de",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.3.2",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-06T20:11:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f2556a93a30a89ef9c62f8836e557223fe9e1c6",
          "body": "…13, closes #64)\n\nA document containing only a dotted sub-table header ([direnv.dotenv]\nwith no bare [direnv]) is valid TOML — the parent table is implicit —\nbut the generated decoder only ran the dotted-header consumption scan\ninside the branch entered when the bare parent header was found. The\nhea\n[…]\nmplicit parents inside array-table entries\n(cst unit + integration).\n\n:clown: Generated with Clown 0.3.10+bb6560d (https://github.com/amarbel-llc/clown/commit/bb6560dd30e00f9a8e16d720fcc60ab9f97c15c1)",
          "is_bot": false,
          "headline": "fix(generate): consume standalone dotted sub-table headers (closes #1…",
          "author_name": "friedenberg",
          "author_login": "friedenberg",
          "committed_at": "2026-06-06T20:00:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "04a5ed968b222d1d398d53850928c1c534411c86",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.3.1",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-04T22:33:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "581dde24ccbccc7d5d1055aa304e88fa16755149",
          "body": "The go-generate check runs the three generative fuzzers (TestRoundTripFuzz,\nTestRoundTripFuzzDelegation, TestRoundTripSpellingFuzz) at seed 1 only. Add a\nsibling `fuzz-sweep` flake check that loops the seed over a range\n(fuzzSweepSeeds, currently 10), running `go test -run '^TestRoundTrip'` per seed\n[…]\nibe the third CI coverage lane.\n\nFor ad-hoc local widening past the baked-in seed count, the network-mode\ndebug-fuzz-*-sweep recipes still take an n= arg.\n\n:clown: https://github.com/amarbel-llc/clown",
          "is_bot": false,
          "headline": "ci: add multi-seed fuzz-sweep nix check to the just/flake tree",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-04T22:30:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "561959d4b88559fcdfef02f1fd900d25eda4a84b",
          "body": "…er-relative)\n\nA fully-inline nested struct silently dropped its nested struct field:\n`val = { name = \"a\", inner = { x = 5 } }` decoded Name but left Inner.X zero,\nand Undecoded() did not flag it (UndecodedKeys does not descend inline tables).\nCaught by code review on the axis-1 commits.\n\nRoot cause\n[…]\nruct, and sub-table-still-works; a bats case.\nCanonical round-trip fuzzer (20 seeds), nesting suite, and spelling fuzzer\n(30 seeds) all green.\n\nRefs #108.\n\n:clown: https://github.com/amarbel-llc/clown",
          "is_bot": false,
          "headline": "fix(generate): decode nested fields of a fully-inline struct (contain…",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-04T22:18:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c14402fd23870c794410162acab4db59411dc71",
          "body": "`groups = { editors = { vim = \"x\" } }` now decodes the same as the sub-table\nform `[groups.editors]`. Completes the inline-table axis (#108 axis 1): the last\nstruct/table-bearing kind. When no [field.<k>] sub-tables match, the decoder\niterates the outer inline table; each entry's value is an inner i\n[…]\ne-still-works) and a bats\ncase. Spelling fuzzer 20-seed sweep green; the inline-table xfails across all\nstruct-bearing kinds now log as xpass.\n\nRefs #108.\n\n:clown: https://github.com/amarbel-llc/clown",
          "is_bot": false,
          "headline": "feat(generate): decode inline-table form of map[string]NamedMap fields",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-04T20:50:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "46f80e605d9fcd641f7115f108b8fa2dbfae0ad2",
          "body": "`actions = { build = { command = \"make\" } }` now decodes the same as the\nsub-table form `[actions.build]`. When no [field.<k>] sub-tables are found, the\ndecoder falls back to the outer inline table (cst.FindChildInlineTable): each of\nits entries is a map key whose value is an inner inline table hold\n[…]\nment\nstructs only.\n\nTests: integration test (top-level + scoped + sub-table-still-works) and a bats\ncase. Spelling fuzzer 20-seed sweep green.\n\nRefs #108.\n\n:clown: https://github.com/amarbel-llc/clown",
          "is_bot": false,
          "headline": "feat(generate): decode inline-table form of map[string]struct fields",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-04T20:45:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "790d9b035bed4c5ffb0ac9604e677455acee49ef",
          "body": "…ields\n\nExtends #106's inline-table fallback from map[string]string to nested struct and\n*struct fields: `inner = { name = \"a\" }` now decodes the same as `[inner]`. When\nthe [field] header is absent, the decoder falls back to cst.FindChildInlineTable\nand assigns the returned NodeInlineTable to the s\n[…]\nand\nsub-table-still-works; a bats e2e case. The #107 spelling fuzzer's struct\ninline-table xfails now log as xpass; 20-seed sweep stays green.\n\nRefs #108.\n\n:clown: https://github.com/amarbel-llc/clown",
          "is_bot": false,
          "headline": "feat(generate): decode inline-table form of nested struct / *struct f…",
          "author_name": "sfriedenberg-etsy",
          "author_login": "sfriedenberg-etsy",
          "committed_at": "2026-06-04T20:39:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 21,
      "commits_last_year": 333,
      "latest_release_at": "2026-07-20T12:31:36Z",
      "latest_release_tag": "v0.5.0",
      "releases_from_tags": true,
      "days_since_last_push": 1,
      "active_weeks_last_year": 17,
      "days_since_latest_release": 9,
      "mean_days_between_releases": 4.8
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "code.linenisgreat.com/tommy",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": null,
          "registry_url": "https://pkg.go.dev/code.linenisgreat.com/tommy",
          "is_deprecated": false,
          "latest_version": "v0.5.0",
          "repository_url": null,
          "versions_count": 21,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-20T12:31:36Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 9
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": true,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "justfile",
        "zz-tests_bats/justfile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 310789,
      "source_files_sampled": 63,
      "oversized_source_files": 1,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 10290
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "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": [
        {
          "name": "github.com/dave/jennifer",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.7.1"
        },
        {
          "name": "golang.org/x/tools",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.44.0"
        },
        {
          "name": "mvdan.cc/gofumpt",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.10.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 4,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "friedenberg",
          "commits": 264,
          "avatar_url": "https://avatars.githubusercontent.com/u/181492?v=4"
        },
        {
          "type": "User",
          "login": "sfriedenberg-etsy",
          "commits": 49,
          "avatar_url": "https://avatars.githubusercontent.com/u/239646900?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 20,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        }
      ],
      "contributors_sampled": 3,
      "top_contributor_share": 0.793
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "nix.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 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": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 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": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 9,
            "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": "b215621f711075bcbc463bcc9125504852a5e7db",
        "ran_at": "2026-07-30T11:43:08Z",
        "aggregate_score": 4.7,
        "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-28T17:11:51Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-06-14T11:29:50Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/amarbel-llc/tommy",
    "host": "github.com",
    "name": "tommy",
    "owner": "amarbel-llc"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 47,
        "vitality": 81,
        "community": 24,
        "governance": 55,
        "engineering": 70
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 81,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 333,
              "human_commit_share": 1,
              "days_since_last_push": 1,
              "active_weeks_last_year": 17
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 1 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "17/52 weeks with commits",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 17
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "333 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 333
                    }
                  }
                ],
                "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": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "releases_count": 21,
              "latest_release_tag": "v0.5.0",
              "releases_from_tags": true,
              "days_since_latest_release": 9,
              "mean_days_between_releases": 4.8
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "21 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 21
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 9 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4.8 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "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": "moderate",
        "name": "Sustainability & Governance",
        "value": 55,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 21,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 3,
              "top_contributor_share": 0.793
            },
            "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 79% of commits",
                "points": 4.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 79
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "3 contributors",
                "points": 4.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 4,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "4/4 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 4,
                      "decided": 4
                    }
                  }
                ],
                "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": 44,
            "inputs": {
              "followers": 0,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "amarbel-llc",
              "public_repos": 56,
              "account_age_days": 169
            },
            "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 amarbel-llc",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "amarbel-llc"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "56 public repos, account ~0 yr old",
                "points": 13.7,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 56
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "code.linenisgreat.com/tommy"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 9
            },
            "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 9 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "21 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 21
                    }
                  }
                ],
                "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": 70,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "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": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "cli",
                "codegen",
                "cst",
                "formatter",
                "go-library",
                "golang",
                "parser",
                "toml"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "8 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 47,
        "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, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 47,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 4.7
            },
            "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 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "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": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 6.8,
                "status": "partial",
                "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": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 75,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "good",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 81,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.67,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 10290
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "67 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 35.7,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 67,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "has_nix": true,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "justfile",
                "zz-tests_bats/justfile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "justfile, zz-tests_bats/justfile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "justfile, zz-tests_bats/justfile"
                    }
                  }
                ],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "Nix, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Nix, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "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": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 310789,
              "source_files_sampled": 63,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/63 source files over 60KB",
                "points": 54.1,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 63,
                      "oversized": 1
                    }
                  }
                ],
                "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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-30T11:43:14.340527Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/amarbel-llc/tommy.svg",
  "full_name": "amarbel-llc/tommy",
  "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.