Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-28 03:05 UTC

ThatCatDev / tanrenai

Tanrenai — a self-evolving local LLM system

Go · TypeScriptSin licencia detectada★ 1 estrella⑂ 0 forksdesde feb 2026Ver en GitHub ↗

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

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

50
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

ThatCatDevOrganización
0 seguidores14 repositorios públicosdesde nov 2021

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/ThatCatDev/tanrenaiv1.33.4-61hace 18 días

Métricas por categoría

Vitalidad

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

75Bueno · 22% del índice global
Cómo se puntúa
28.8/36Recencia de push — último push hace 18 días
9/36Cadencia de commits — 13/52 semanas con commits
17.4/18Volumen de commits — 85 commits en el último año
10/10OpenSSF Scorecard: Maintained — 16 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year85
human_commit_share1
days_since_last_push18
active_weeks_last_year13
Cómo se puntúa
27/27Publica versiones — 63 versiones publicadas
36/36Recencia de las versiones — última versión hace 18 días
27/27Cadencia de publicación — una versión cada ~3,5 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count63
latest_release_tagvscode-v1.0.2
releases_from_tagsno
days_since_latest_release18
mean_days_between_releases3,5

Comunidad y Adopción

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

12Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 1 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
0/22.5Licencia — no se detectó ningún archivo de licencia
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_licenseno
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?

50Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
30.4/38.3Aceptación de PR — 27/34 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs27
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs7
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 ThatCatDev
18/25Trayectoria — 14 repos públicos, cuenta de ~4 años
Datos de entrada utilizados
followers0
owner_typeOrganization
is_verified
owner_loginThatCatDev
public_repos14
account_age_days1715
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 18 días
20/20Historial de versiones — 61 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/ThatCatDev/tanrenai
ecosystemsgo
any_deprecatedno
min_days_since_publish18

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 — 4 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — .golangci.yml
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 27 out of 27 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno

Documentación

50Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dirno
has_description

Seguridad

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

36En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 27 out of 27 merged PRs checked by a CI test -- score normalized to 10
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
0/2.5Licencia — license file not detected
7.5/7.5Maintained — 16 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
5/5SAST — SAST tool is run on all commits
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 52 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3,6

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.

86Excelente · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 85 de 85 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes5577
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .golangci.yml
11/11Verificación estática de tipos — clients/vscode/tsconfig.json
10/10Entorno reproducible — Dockerfile, lockfile
10/10Práctica demostrada con agentes — 76 de los últimos 85 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum, package-lock.json
has_dockerfile
typed_language
bootstrap_filesMakefile
has_devcontainerno
has_linter_config
typecheck_configsclients/vscode/tsconfig.json
agent_commit_share0,894
toolchain_manifestsclients/cli/go.mod, clients/desktop/go.mod, clients/shared/go.mod, infra/go.mod, server/go.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
55/55Tamaños de archivo manejables — 0/301 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes53.708
source_files_sampled301
oversized_source_files0

Datos clave

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

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

OpenSSF Scorecard 3.6 / 10
3.6agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-28 03:04 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests27 out of 27 merged PRs checked by a CI test -- score normalized to 10
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
0Licenselicense file not detected
10Maintained16 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
10SASTSAST tool is run on all commits
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities52 existing vulnerabilities detected
Dependencias directas 6
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/charmbracelet/bubbleteav1.3.10infra/go.mod
Gogithub.com/spf13/cobrav1.10.2infra/go.mod
Gogolang.org/x/cryptov0.39.0infra/go.mod
Gogithub.com/google/uuidv1.6.0server/go.mod
Gogithub.com/philippgille/chromem-gov0.7.0server/go.mod
Gogithub.com/spf13/cobrav1.10.2server/go.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": [],
      "is_fork": false,
      "size_kb": 43494,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 1310578,
        "CSS": 42489,
        "HTML": 7077,
        "NSIS": 12390,
        "Shell": 10970,
        "Makefile": 4174,
        "Dockerfile": 357,
        "JavaScript": 3906,
        "TypeScript": 319628
      },
      "pushed_at": "2026-07-09T18:20:20Z",
      "created_at": "2026-02-21T00:36:38Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-09T18:19:50Z",
      "description": "Tanrenai — a self-evolving local LLM system",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": null,
      "primary_language": "Go",
      "significant_languages": [
        "Go",
        "TypeScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "ThatCatDev",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/94362358?v=4",
      "created_at": "2021-11-15T10:35:26Z",
      "is_verified": null,
      "public_repos": 14,
      "account_age_days": 1715
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "vscode-v1.0.2",
          "kind": "other",
          "published_at": "2026-07-09T18:22:32Z"
        },
        {
          "tag": "v1.33.4",
          "kind": "patch",
          "published_at": "2026-07-09T18:20:06Z"
        },
        {
          "tag": "v1.33.3",
          "kind": "patch",
          "published_at": "2026-07-09T18:13:08Z"
        },
        {
          "tag": "vscode-v1.0.1",
          "kind": "other",
          "published_at": "2026-06-25T13:15:02Z"
        },
        {
          "tag": "v1.33.2",
          "kind": "patch",
          "published_at": "2026-06-25T13:12:53Z"
        },
        {
          "tag": "vscode-v1.0.0",
          "kind": "other",
          "published_at": "2026-06-25T11:41:34Z"
        },
        {
          "tag": "v1.33.1",
          "kind": "patch",
          "published_at": "2026-06-25T11:41:31Z"
        },
        {
          "tag": "v1.33.0",
          "kind": "minor",
          "published_at": "2026-06-25T11:37:33Z"
        },
        {
          "tag": "v1.32.0",
          "kind": "minor",
          "published_at": "2026-06-25T11:31:53Z"
        },
        {
          "tag": "v1.31.0",
          "kind": "minor",
          "published_at": "2026-06-08T15:48:59Z"
        },
        {
          "tag": "v1.30.0",
          "kind": "minor",
          "published_at": "2026-06-08T15:47:35Z"
        },
        {
          "tag": "v1.29.0",
          "kind": "minor",
          "published_at": "2026-06-08T15:04:20Z"
        },
        {
          "tag": "v1.28.0",
          "kind": "minor",
          "published_at": "2026-05-24T03:00:00Z"
        },
        {
          "tag": "v1.27.0",
          "kind": "minor",
          "published_at": "2026-05-23T19:00:06Z"
        },
        {
          "tag": "v1.26.0",
          "kind": "minor",
          "published_at": "2026-05-23T02:11:42Z"
        },
        {
          "tag": "v1.25.0",
          "kind": "minor",
          "published_at": "2026-05-22T12:02:30Z"
        },
        {
          "tag": "v1.24.1",
          "kind": "patch",
          "published_at": "2026-05-22T03:02:52Z"
        },
        {
          "tag": "v1.24.0",
          "kind": "minor",
          "published_at": "2026-05-10T03:32:00Z"
        },
        {
          "tag": "v1.23.1",
          "kind": "patch",
          "published_at": "2026-04-20T03:55:26Z"
        },
        {
          "tag": "v1.23.0",
          "kind": "minor",
          "published_at": "2026-04-20T03:51:39Z"
        },
        {
          "tag": "v1.22.2",
          "kind": "patch",
          "published_at": "2026-04-12T00:26:03Z"
        },
        {
          "tag": "v1.22.1",
          "kind": "patch",
          "published_at": "2026-04-12T00:07:56Z"
        },
        {
          "tag": "v1.22.0",
          "kind": "minor",
          "published_at": "2026-04-06T01:02:50Z"
        },
        {
          "tag": "v1.21.0",
          "kind": "minor",
          "published_at": "2026-04-05T19:33:05Z"
        },
        {
          "tag": "v1.20.0",
          "kind": "minor",
          "published_at": "2026-04-05T18:19:38Z"
        },
        {
          "tag": "v1.19.0",
          "kind": "minor",
          "published_at": "2026-04-05T03:50:03Z"
        },
        {
          "tag": "v1.18.0",
          "kind": "minor",
          "published_at": "2026-04-02T04:43:50Z"
        },
        {
          "tag": "v1.17.0",
          "kind": "minor",
          "published_at": "2026-03-18T03:15:00Z"
        },
        {
          "tag": "v1.16.0",
          "kind": "minor",
          "published_at": "2026-03-17T02:24:26Z"
        },
        {
          "tag": "v1.15.0",
          "kind": "minor",
          "published_at": "2026-03-15T21:51:02Z"
        },
        {
          "tag": "v1.14.0",
          "kind": "minor",
          "published_at": "2026-03-15T21:48:11Z"
        },
        {
          "tag": "v1.13.4",
          "kind": "patch",
          "published_at": "2026-03-15T21:13:07Z"
        },
        {
          "tag": "v1.13.3",
          "kind": "patch",
          "published_at": "2026-03-15T20:52:14Z"
        },
        {
          "tag": "v1.13.2",
          "kind": "patch",
          "published_at": "2026-03-15T20:49:53Z"
        },
        {
          "tag": "v1.13.1",
          "kind": "patch",
          "published_at": "2026-03-15T20:45:10Z"
        },
        {
          "tag": "v1.13.0",
          "kind": "minor",
          "published_at": "2026-03-15T19:15:11Z"
        },
        {
          "tag": "v1.12.2",
          "kind": "patch",
          "published_at": "2026-03-15T18:25:37Z"
        },
        {
          "tag": "v1.12.1",
          "kind": "patch",
          "published_at": "2026-03-15T18:23:34Z"
        },
        {
          "tag": "v1.12.0",
          "kind": "minor",
          "published_at": "2026-03-15T18:14:21Z"
        },
        {
          "tag": "v1.11.1",
          "kind": "patch",
          "published_at": "2026-03-15T16:58:40Z"
        },
        {
          "tag": "v1.11.0",
          "kind": "minor",
          "published_at": "2026-03-15T16:46:53Z"
        },
        {
          "tag": "v1.10.0",
          "kind": "minor",
          "published_at": "2026-03-15T02:12:46Z"
        },
        {
          "tag": "v1.9.0",
          "kind": "minor",
          "published_at": "2026-03-15T01:47:38Z"
        },
        {
          "tag": "v1.8.0",
          "kind": "minor",
          "published_at": "2026-03-14T05:46:03Z"
        },
        {
          "tag": "v1.7.8",
          "kind": "patch",
          "published_at": "2026-03-14T05:33:24Z"
        },
        {
          "tag": "v1.7.7",
          "kind": "patch",
          "published_at": "2026-03-12T15:02:53Z"
        },
        {
          "tag": "v1.7.6",
          "kind": "patch",
          "published_at": "2026-03-12T14:55:01Z"
        },
        {
          "tag": "v1.7.5",
          "kind": "patch",
          "published_at": "2026-03-12T14:50:39Z"
        },
        {
          "tag": "v1.7.4",
          "kind": "patch",
          "published_at": "2026-03-12T14:20:35Z"
        },
        {
          "tag": "v1.7.3",
          "kind": "patch",
          "published_at": "2026-03-12T06:11:02Z"
        },
        {
          "tag": "v1.7.2",
          "kind": "patch",
          "published_at": "2026-03-12T05:18:12Z"
        },
        {
          "tag": "v1.7.1",
          "kind": "patch",
          "published_at": "2026-03-12T04:48:05Z"
        },
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2026-03-12T04:02:13Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2026-03-12T03:00:28Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-03-11T23:36:27Z"
        },
        {
          "tag": "v1.3.3",
          "kind": "patch",
          "published_at": "2026-03-11T23:34:16Z"
        },
        {
          "tag": "v1.3.2",
          "kind": "patch",
          "published_at": "2026-03-11T23:14:43Z"
        },
        {
          "tag": "v1.3.1",
          "kind": "patch",
          "published_at": "2026-03-11T22:56:37Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-03-11T22:40:05Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-03-11T22:32:46Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-03-11T21:48:16Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-03-11T21:36:58Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-03-11T21:29:11Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "38c1bbeaaa9f58cf675829f247468436c3a6cec0",
          "body": "…eady' + usage dump (#34)\n\nWhen agent-rpc failed during startup (dead credentials being the common\ncase) the extension showed the generic 'tanrenai agent-rpc exited (exit\ncode 1) before ready' plus a 400-char stderr tail dominated by cobra's\nusage dump — even though the CLI had already reported the \n[…]\nt strings the CLI emits.\n\nCompanion to the CLI-side fix (#33), which removes the refresh-token\nrotation race that caused most of these failures.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(vscode): surface the CLI's real error instead of 'exited before r…",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-07-09T18:19:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d3d0eb94b83523e207030f012014e913e2688571",
          "body": "…errors (#33)\n\nThe platform rotates the refresh token on every use, so concurrent CLI\nprocesses sharing credentials.json (a terminal session plus an\neditor-spawned agent-rpc, or two editor windows) raced to refresh: the\nloser presented an already-rotated token, got 400 'Invalid Refresh\nToken: Alread\n[…]\noot command: runtime failures are not usage\n  errors, and the flag dump was burying the real message in the VS Code\n  extension's error surface.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): serialize token refresh across processes + actionable auth …",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-07-09T18:12:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a6d59fe3e7d756e291803ebd61abe0811cab8866",
          "body": "…ookup (#32)\n\nThree related fixes so the published VS Code extension works out of the box.\n\n**1. Installer picked the wrong \"latest\" release.** The repo publishes the CLI\non `v*` tags and the VS Code extension on a separate `vscode-v*` tag line.\nGitHub's /releases/latest returns the most recent rele\n[…]\nains only its own binary; resolveCliPath unit tests +\nfull extension suite (47) pass.\n\nCo-authored-by: James Trotter <james@MacBook-Pro-2.local>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(vscode): bundle CLI per-platform + fix installer latest-release l…",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-06-25T13:12:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4391ddd796a187fd9fa9e93ec4506d756a6ae5a5",
          "body": "* feat(vscode): add Marketplace icon, MIT license, set publisher\n\n- icon.png (256x256, from the website logo) + top-level \"icon\" field so\n  the Marketplace listing has a real icon instead of a placeholder\n- LICENSE (MIT) + \"license\" field; clears vsce's missing-license warning\n- set \"publisher\" to t\n[…]\nt a branch push), so it's unaffected by the rule.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(vscode): unblock Marketplace release + add icon/license (#31)",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-06-25T11:40:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "df80bbe1268a52c3846883f1f7257182fb38191b",
          "body": "Publish the VS Code extension like the repo does — conventional commits,\nno manual version bumps — but on its OWN version line so it stays\ndecoupled from the repo's v1.x (the Marketplace requires monotonic semver\nper extension).\n\n- vscode-release.yml: on push to main, runs semantic-release scoped to\n[…]\nds\n  for a proper Marketplace listing.\n\nRequires repo secrets: VSCE_PAT (Azure DevOps Marketplace token), and\noptionally OVSX_PAT for Open VSX.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(vscode): automated publishing via scoped semantic-release (#29)",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-06-25T11:37:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e229616db00d3cd77a7cb9787da3263370fe076d",
          "body": "…tion (#30)\n\n* feat(clients): live context-usage + subagent-isolated mid-turn compaction\n\nFooter percentage now updates as tool results land mid-turn instead of\nfreezing at the pre-turn value, and the agent loop folds older history\ninto a summary as soon as it crosses the high-water mark — no more\n\"\n[…]\nAuthored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: James Trotter <james@Mac.localdomain>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(clients): live context-usage + subagent-isolated mid-turn compac…",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-06-25T11:31:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bec604e6b807ee9c971d723348f6d26480694b0f",
          "body": "…ystem (#28)\n\nThe page the browser lands on after `tanrenai login` was a bare,\nunstyled snippet. Replace it with a polished, self-contained page using\nthe web app's palette (#0e0f11 bg, #16171a card, #00b4a0 accent), Inter,\nand a centered card with a status badge — success (check) and error (x)\nvari\n[…]\nerror, missing token) now render the\nsame styled page instead of plain http.Error text. Messages are\nHTML-escaped; no external assets required.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): style the browser auth-callback page to match the design s…",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-06-08T15:48:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e23c09918d67d815552e808fd2b0cbf759701cf2",
          "body": "… (#27)\n\n* refactor(cli): move agent system prompt to an embedded file\n\nThe default agent system prompt was a long inline const in run.go, hard\nto find and awkward to iterate on. Move it to\nclients/cli/cmd/agent_system_prompt.md and load it via //go:embed, so the\nprompt is a plain editable file. Tri\n[…]\ne.\nHolistic edit to the existing working-directory concern, not a new rule.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): embed agent prompt in a file + sharpen it for decisiveness…",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-06-08T15:47:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d0003efd00eb8514629ad6bec663790cdc8985ad",
          "body": "…vscode) (#26)\n\n* feat(cli): activate command + readable plan-gate errors\n\nThe platform now gates GPU access behind a plan. Surface that in the CLI:\n\n- `tanrenai activate <code>` redeems a single-use invite code (POST\n  /api/activate) and reports the granted plan.\n- platformGet/platformPost now rend\n[…]\nvered\nby the shared apiclient change in this PR.)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(clients): plan-gate handling, activate cmd, hosted-model (CLI + …",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-06-08T15:03:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "331029ea060a9fe28ab169556d2799995d44a51f",
          "body": "Adds a structured JSONL output mode to `tanrenai run --pipe`, opt-in via\n`--format json` (default `text` preserves the existing behavior exactly).\nProgrammatic consumers (IDE plugins, agent runners, CI scripts, the\nOpen Design daemon) can now drive tanrenai without parsing the\nhuman-friendly text fo\n[…]\n: `--format text` is the default and behaves identically\nto today — `---END---` framing, bracketed `[status]` on stderr, no JSON\non stdout. Existing scripts and the human TUI/repl flow are unaffected.",
          "is_bot": false,
          "headline": "feat(cli): add --format json to pipe mode for programmatic hosts (#25)",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-05-24T02:59:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c8866ede05a2462b0847098b1615b1fec619acec",
          "body": "…#24)\n\n* feat(mcp): wire external MCP servers into the agent's tool registry\n\nAdds an MCP client layer so tanrenai's agent can use tools exposed by\nany external MCP server — Playwright, filesystem-mcp, GitHub MCP,\ncustom in-house servers, etc. Config matches Claude Code's\nmcpServers schema so existi\n[…]\nL, malformed header).\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: James Trotter <james@Mac.localdomain>\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mcp): wire external MCP servers into the agent's tool registry (…",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-05-23T18:59:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d3743edaf2f528369a2b5fe15c8aae262cd3b32e",
          "body": "* feat(cli): add agent-rpc subcommand for editor extensions\n\nIntroduces the JSON-over-stdio protocol that lets external clients\n(e.g. the upcoming VS Code extension) drive the existing agent loop\nwithout re-implementing it in another language.\n\nWire format: NDJSON, init/ready handshake with a protoc\n[…]\n0ms.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\nCo-authored-by: James Trotter <james@MacBook-Pro-2.local>",
          "is_bot": false,
          "headline": "feat: VS Code extension v1 (hybrid Go agent + TS UI) (#20)",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-05-23T02:11:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0abb7bc71c8ad4579b433b6a8ea95b35113e7938",
          "body": "TUI status bar now appends \"  45 t/s\" next to the existing ctx counter\nduring streaming, and pipe mode emits a \"[gen: 192 tokens, 42.3 t/s]\"\nsummary line on stderr at the end of each turn. The rate refreshes on\nevery content/reasoning delta so users get live feedback on how the\nmodel is performing, \n[…]\nig)\n\nReset at iteration boundaries so back-to-back turns don't bleed\ninto each other.\n\nCo-authored-by: James Trotter <james@MacBook-Pro-2.local>\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): show generation tokens-per-second (#23)",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-05-22T12:02:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0902d894547b35c5ca3dc38befcc3655b36cb439",
          "body": "…rt (#22)\n\nb8277 errors with `missing tensor 'blk.40.ssm_conv1d.weight'` when loading\nQwen3.6-A3B-MTP GGUFs — llama.cpp didn't fully support hybrid MTP\narchitectures yet. b9274 (~1000 builds newer) recognizes the MTP head\nand enables speculative decoding via the model's own checkpoints, so the\nload \n[…]\nip at b9274. No code changes needed elsewhere; the\nbundled binary swap is sufficient.\n\nCo-authored-by: James Trotter <james@MacBook-Pro-2.local>\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump bundled llama-server b8277 → b9274 for MTP suppo…",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-05-22T11:50:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8e86228fe554a1a7235b7d106c0655780f45617b",
          "body": "`tanrenai --local list` silently ignored --local and hit the configured\nremote URL. `tanrenai --local pull hf://.../<repo>-GGUF/<quant>` saved the\nfile under the source GGUF's filename instead of the bare name derived from\nthe repo, so a subsequent `tanrenai --local run <bare-name>` couldn't find\nwh\n[…]\nI pass-through, and the wire-level invariant\nthat the Name field reaches the backend.\n\nCo-authored-by: James Trotter <james@MacBook-Pro-2.local>\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): --local list + on-disk basename matches user-typed name (#21)",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-05-22T03:02:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1cd3869d6b4c1fe95247d4e5c76c2cbe6e45147e",
          "body": "* feat(pull): plumb optional name through /api/pull (CLI + server + apiclient)\n\nAdds a `name` field to the PullRequest API type and wires it through every\nlayer that talks to /api/pull on the GPU:\n\n- `clients/shared/pkg/api`, `server/pkg/api`: PullRequest gains `Name string`\n- `clients/shared/apicli\n[…]\ntui_agent.go / tui_input.go / run.go: integration\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): bare-name pull resolution + swarm progress panel (#19)",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-05-10T03:31:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d7494c0b238e624ff5f34abaff909897f8384e02",
          "body": "The `success` step of @semantic-release/github tries to comment on\nevery issue/PR referenced in the release's commit messages. When any\nof those refs fails to resolve (as happened with #13 — closed PR that\nsemantic-release couldn't query for reasons still unclear), the entire\nrelease step errors out\n[…]\nComment\n- failComment\n- labels\n- releasedLabels\n\nNet effect: fewer moving parts during the release; builds fire\ncorrectly when a new version is cut.\n\nCo-authored-by: ThatCatDev <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): disable semantic-release success/fail comments (#18)",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-04-20T03:55:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "417350ecfd6ecf9f4b94a7df1b1aba07f54c2d10",
          "body": "… remote-auto (#17)\n\n* feat: pre-built GPU Docker image, eliminate build-from-source on deploy\n\nAdd gpu/docker/Dockerfile that builds llama-server (CUDA, multi-arch)\nand tanrenai-gpu into a single image pushed to Docker Hub as\nthatcatdev/tanrenai-gpu. On vast.ai deploy, binaries are extracted from\nt\n[…]\n them. GPU CI now lives in the tanrenai-gpu repo.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: consolidated — platform extraction + GPU image + Supabase CLI +…",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-04-20T02:56:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7b04cab68df013b5d54bc449f8b38e5c94abb198",
          "body": "…og errors (#12)\n\n- Suppress \"failed to load memory index\" warning on first run when the\n  index file doesn't exist yet (os.IsNotExist check)\n- Add memory search + injection to simple chat mode (startChatTurn),\n  which previously only worked in agent/swarm modes\n- Log memory search failures instead of silently swallowing errors in\n  all three modes (simple, planned agent, swarm)\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: memory system — suppress false warning, enable in simple chat, l…",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-04-12T00:25:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "64796645b7a187ca52881e85ccf0e127322db480",
          "body": "The installer previously overwrote all files in the bin directory,\nincluding user-compiled shared libraries (CUDA/GPU .so/.dylib files).\nNow skips shared libraries that already exist to avoid breaking\nGPU acceleration setups.\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: preserve user-built GPU libraries during installer upgrades (#11)",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-04-12T00:07:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "eeb0caf710e04d228ceed0c508e9bb7c0fc77fa2",
          "body": "…limits (#10)\n\n* feat: improve swarm quality with architecture spec and smart recursion\n\nThree fixes for small model quality in swarm mode:\n\n1. Architecture spec phase: before planning tasks, the orchestrator\n   generates a shared technical spec (framework, structure, conventions).\n   Every worker g\n[…]\nupposed to\nset up package.json and config files).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: improve swarm quality — architecture spec, smart recursion, no …",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-04-06T01:02:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e873e63fae7da13f9191cf9c1d79d3b1a8b2ab23",
          "body": "Expose llama-server's MoE-specific flags through the full stack:\n\nGPU server flags:\n- --cpu-moe: keep all MoE expert weights on CPU (attention/router on GPU)\n- --n-cpu-moe N: keep first N layers' MoE experts on CPU\n- --no-kv-offload: keep KV cache on CPU to save VRAM for weights\n- --fit: auto-adjust\n[…]\nfload all 999 layers.\n\nClient CLI (--local mode): --cpu-moe, --no-kv-offload, --fit flags\npass through to the embedded GPU server.\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add MoE model optimization flags and auto-detection (#9)",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-04-05T19:32:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "859acc8a3bcf173c4ef17a02fde089d1e0c3ce86",
          "body": "* feat: add --swarm mode for recursive multi-agent orchestration\n\nAdd a new --swarm flag that coordinates multiple sub-agents with fresh\ncontexts. An orchestrator plans the task into file-level work units, then\nsequential workers each get an isolated context with only their specific\ntask description\n[…]\n are\nindented under their parent with tree lines.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: recursive multi-agent swarm mode (--swarm) (#8)",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-04-05T18:19:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "76db6bba295ff4a99639d73b336343c58d8e317e",
          "body": "…l (#7)\n\nAgent improvements:\n- Add \"no code in thinking\" rule to system prompt — prevents models from\n  writing files inside <think> blocks instead of calling file_write\n- Remove default 16384 max_tokens cap — when --max-tokens is unset, don't\n  send max_tokens in the API request, letting the model \n[…]\nh TypeScript scroll covering OOP, SOLID\n  principles, design patterns, React component architecture, and\n  frontend best practices\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: agent quality improvements, docs, and prebuilt TypeScript scrol…",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-04-05T03:49:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d279e0403b5b09166e5e04548b68aebe39e63b3",
          "body": "* feat: show reasoning content + remove iteration limit + CI coverage check\n\n- Display LLM reasoning/thinking text in gray in the chat view instead\n  of silently discarding it. Makes the agent's thought process visible\n  between tool calls.\n- Change default --max-iterations from 200 to 0 (unlimited)\n[…]\n nothing-to-clean\n\nCLI cmd coverage: 6.9% → 13.5%\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: reasoning display, agent fixes, go-test-coverage CI (#3)",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-04-02T04:43:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "632b0076603506a62c165b61f7b673d5bf0a1765",
          "body": "Display matched scroll names in the TUI when procedural knowledge\nis injected into context, so users know which scrolls are being used.\n\nCo-authored-by: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: show UI feedback when scrolls are matched (#2)",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-03-18T03:14:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f6a970f5286c8d107e558f66d71805a62cc8b02b",
          "body": "* feat: add scrolls for automatic procedural knowledge injection\n\nScrolls are markdown files with YAML frontmatter (name, description, tags)\nstored in .tanrenai/scrolls/ (project) or ~/.tanrenai/scrolls/ (global).\nThey are automatically matched against user input each turn via keyword/tag\nscoring an\n[…]\ny fails. The comment should always update on PRs.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add scrolls for automatic procedural knowledge injection (#1)",
          "author_name": "James",
          "author_login": "bludot",
          "committed_at": "2026-03-17T02:24:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "457689f75215f9308f099a1325e43ae35cd92fb4",
          "body": "Configurable via CLI flag, wired through to agent config.\nAgent already auto-continues on finish_reason=\"length\".\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add --max-tokens flag for controlling response length",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-15T21:50:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c8b2e66693e27f65e9d477ee3f911ea341da7244",
          "body": "4096 was too small for code generation — model output got cut off\nmid-response. 16384 gives plenty of room while still capping runaway\ngeneration.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: bump default max response tokens from 4096 to 16384",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-15T21:47:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9ccec11a2f85b68e721e3d5f4f33d0983b3b0cbb",
          "body": "…ry request\n\nThe runner stored the full filename (e.g. model-00001-of-00003.gguf) as\nthe model name, but clients send the base name (model). The mismatch\ncaused LoadModel to be called on every chat request, killing and\nrestarting llama-server each time.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: strip split GGUF suffix from model name to prevent reload on eve…",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-15T21:12:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "079043b3540daf11e138b943f8a64f6b6498f111",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: symlink llama-server and shared libs to tanrenai bin dir on deploy",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-15T20:51:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7c0a54319609e9a75aac90f64e67f1eec7221be1",
          "body": "filepath.Walk does not follow symlinks to directories.\nUse filepath.EvalSymlinks to resolve the models dir first.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: resolve symlinks before walking models directory",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-15T20:49:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0f5d1547c6b3b3aeac5324f16915f01b50080f54",
          "body": "Split files like model-00001-of-00003.gguf now show as one model\nwith combined size and first part's path for loading.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: group split GGUFs into single model entry in list",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-15T20:44:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "88f46bab5da54ebfb008edca5221f6b0e78a1ef6",
          "body": "- Cloud deployment section (vast.ai + Headscale)\n- Docker backend images with auto-discovery\n- HuggingFace hf:// pull examples\n- Model size → VRAM/disk table\n- Infra CLI commands reference\n- Prefer persistent storage over tmpfs in deploy setup\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add cloud deployment, infra CLI, and HF pull to README",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-15T19:43:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "333ea5d12b9e7fb9089af31e2aea5e77a573b673",
          "body": "- DiskForModelSize: 2x model size + 50GB headroom, min 100GB, round to 50GB\n- --model-size flag now auto-sets --disk-gb (e.g. 120b → 200GB)\n- Deploy shows disk in search/create UI\n- storage-setup stage finds largest writable mount (shm, workspace, etc.)\n  and symlinks models dir there\n- Fix GPU server restart: use Python to isolate signal handling\n- Add .gitignore for infra binary\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: auto-calculate disk from model size, storage setup on deploy",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-15T19:14:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a2818c920a3193a188641522338e0eb92de6b6fd",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: force fresh clone on deploy to ensure new GPU code",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-15T18:25:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "275085a4a431b2944d8e5c477b5369b614e894cf",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: kill old GPU server on redeploy, clear Go build cache",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-15T18:23:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "47b09694b2320b3784d16bddd56e3672608b1db5",
          "body": "…ixes\n\n- Add hf:// model references (hf://owner/repo/quant) to pull command\n  - Resolves repo files via HuggingFace API\n  - Supports split GGUFs (multi-part downloads with per-file progress)\n  - Auto-picks Q4_K_M quant when none specified\n  - Lists available quants on mismatch\n- Add tanrenai-infra n\n[…]\nrver from Headscale nodes\n  - Auto-generate auth key from Headscale API\n- Always rebuild tanrenai-gpu on deploy (pull latest code)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: HuggingFace GGUF pull support, network CLI, Docker entrypoint f…",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-15T18:13:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5c5a47699a3fca58f207ef93c09f3a7de5380af6",
          "body": "…r Blackwell\n\n- Use net.JoinHostPort instead of fmt.Sprintf for IPv6 compatibility\n- Auto-upgrade CUDA toolkit when GPU arch requires newer nvcc\n- Install modern cmake, make all setup stages idempotent\n- Clear cmake build cache on re-runs\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: IPv6 vet error, idempotent setup stages, CUDA toolkit upgrade fo…",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-15T16:58:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0750a41af3e5fcaffd11d35087bde7f47efdb722",
          "body": "- New infra/ module with CLI for deploying GPU servers to vast.ai\n  - Interactive TUI for instance selection and offer browsing\n  - Headscale/Tailscale/none network tunnel support\n  - SSH-based remote setup (llama.cpp, tanrenai-gpu, model pull)\n  - Spinners for all long-running operations, verbose m\n[…]\nst/vet\n- Makefile updated with build-infra, test, clean targets\n- CLAUDE.md updated with infra module docs and deployment workflow\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add infra module for vast.ai GPU deployment and Docker images",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-15T16:46:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3847be11698abd4fee5536bba08058852348fb45",
          "body": "…inary\n\nAllow running GPU server, backend server, or both from the single\ntanrenai binary instead of requiring separate builds. Expands\npkg/serve.Config structs with missing fields (chat template, reasoning\nformat, VastAI, idle timeout) so the unified binary has full parity\nwith the standalone binaries.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add gpu serve, server serve, and serve subcommands to unified b…",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-15T02:12:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5c30453bdd36af0d66f68f323e0812b9b0080688",
          "body": "…gement\n\n- Add plan-execute agent with sub-agents: decomposes complex requests into\n  steps, runs each as an isolated sub-agent with fresh context, then\n  synthesizes results. Auto-detects when planning is needed based on input\n  complexity. Falls back to direct mode for simple requests.\n- Add slash\n[…]\nsses.\n- Parse reasoning_content for plan generation (thinking models).\n- Remove artificial token caps on planning/synthesis calls.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: plan-execute agent architecture, autocomplete, and process mana…",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-15T01:47:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f7ede972bf990dcc226aef6647d3ca2307c9c358",
          "body": "- Replace single-line InputField with multiline TextArea (3 rows)\n- Enter submits, Shift+Enter inserts a newline\n- Enable bracket paste mode so pasted multiline text is handled correctly\n- Detect NVIDIA GPU on Linux and warn if llama-server lacks CUDA support\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: multiline input support and CUDA detection warning",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-14T05:43:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ed3b0202de9b97d5c994b9f9155beae5ff89e3ff",
          "body": "- Copy .so files alongside llama-server in Linux release builds (fixes\n  exit code 127 due to missing libllama/libggml shared libraries)\n- Fail CI if llama-server binary is missing from the bundle\n- Document Linux CUDA build instructions for GPU users\n- Add Development Setup section with prerequisites and build steps\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: bundle shared libraries with llama-server and add dev setup docs",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-14T05:32:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "faeb45443d298f484bc8b491206654a72b1d84f1",
          "body": "…llback\n\nRemove the family registry that auto-detected Qwen model architectures\nand instead prefer GGUF embedded templates, then HuggingFace sidecar,\nthen a generic ChatML fallback. This makes template resolution\nmodel-agnostic and prioritizes model-specific templates from upstream.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: replace Qwen-specific template logic with generic ChatML fa…",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-14T04:05:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "47f0577c9cff335a326fbe49288cace29c05c244",
          "body": "macOS uses DYLD_LIBRARY_PATH, not LD_LIBRARY_PATH. This fixes\n\"Library not loaded: @rpath/libmtmd.0.dylib\" errors when running\nllama-server with bundled shared libraries.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: use DYLD_LIBRARY_PATH on macOS for shared library lookup",
          "author_name": "James Trotter",
          "author_login": "bludot",
          "committed_at": "2026-03-12T15:02:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2001889537ad40c00363f32fbd1c94f284f26165",
          "body": "GNU tar --wildcards works on Ubuntu CI, but the approach of extracting\nthe full tarball and then copying dylibs is more reliable and easier\nto debug.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: extract full tarball then copy dylibs (avoid --wildcards)",
          "author_name": "James Trotter",
          "author_login": "bludot",
          "committed_at": "2026-03-12T14:54:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d8e95e76438130daa0ec858983655f8bfd70e7f2",
          "body": "The tarball has files under llama-{V}/ directory, so the wildcard\npattern needs to match 'llama-*/*.dylib' not just '*.dylib'.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: correct dylib extraction pattern for llama.cpp tarball",
          "author_name": "James Trotter",
          "author_login": "bludot",
          "committed_at": "2026-03-12T14:50:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d7694aa75fcab979bee633a9a6e9a5e1e36c2ef9",
          "body": "macOS llama-server requires libggml, libllama, and libmtmd dylibs at runtime.\nPreviously only the executable was extracted from llama.cpp releases, causing\n\"dyld: Library not loaded\" errors. Now extracts all .dylib files alongside\nllama-server for both CLI and desktop macOS builds.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: bundle shared libraries (.dylib) for macOS llama-server",
          "author_name": "James Trotter",
          "author_login": "bludot",
          "committed_at": "2026-03-12T14:19:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "348b388f7a33b3d363b00cab8cf61f57dd21145e",
          "body": "- Add ReasoningContent field to MessageDelta across all three API type files\n  so thinking model deltas aren't silently dropped by JSON deserialization\n- Detect reasoning-only responses and nudge the model to produce visible content\n- Skip GGUF-embedded chat templates instead of overriding with gene\n[…]\nnking model compatibility\n- Generate synthetic tool_call IDs when backends omit them\n- Add agent tests for tool message formation and streaming\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: support thinking models in agent loop (reasoning_content handling)",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-12T06:10:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4b486d191dbb3633f2346f24f2dfa69899fe740c",
          "body": "The template resolver skipped the chat_template already present in GGUF\nmetadata, jumping straight to a HuggingFace fetch when the family\nregistry didn't match. Now uses the model's own template directly,\nwhich fixes tool-calling for models whose architecture isn't in the\nhardcoded registry.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: use GGUF-embedded chat template before falling back to HuggingFace",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-12T05:17:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8a71a2dd06aac6046b68314d122b3fe5190a5349",
          "body": "Windows lacks Linux's Pdeathsig, so llama-server would survive if\ntanrenai exited or crashed. Now assigns the subprocess to a Windows\nJob Object with KILL_ON_JOB_CLOSE — the OS auto-terminates all\nchild processes when the parent's handles are closed.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: kill orphaned llama-server on Windows using Job Objects",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-12T04:47:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a55f53516b694ee3d082c6af4bd7fd88a4a32f07",
          "body": "Replace old box-drawing animation with ASCII art hammer+anvil matching\nthe logo. Hammer moves with cubic ease-in/ease-out motion, colored\nper-character (orange hammer, red handle, steel anvil), with spark\neffects on impact. Fix QueueUpdateDraw deadlock that blocked TUI startup.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: colored ASCII art loading animation with eased hammer strike",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-12T04:01:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7becf9f183bf75e2d6b3e2130a5bcdec915b25d4",
          "body": "Shows an animated hammer striking an anvil (鍛錬 = forging) in the\nchat view while the model and servers are loading. Orange hammer,\nsteel-gray anvil, yellow sparks on impact.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: anvil forging animation during startup loading",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-12T03:04:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a9de090caffaacdf620d0352a0bc0871252f62a9",
          "body": "- Read-only tools (file_read, list_dir, etc.) can be blanket-approved\n- File-writing tools can be approved per-path or blanket\n- Shell commands can only be approved by command prefix (e.g. \"git *\"),\n  never blanket-approved, for safety\n- Permission rules support exact match, prefix wildcards (cmd *), and\n  path wildcards (dir/*)\n- Add permission tests for matching logic\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: granular tool permissions based on risk level",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-12T03:00:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d5b177d82180dccd5477300f9c088cb2b372a9bf",
          "body": "- Add installers/install.sh: one-line curl installer that auto-detects\n  OS/arch, downloads latest release, and installs to ~/.local/bin\n- Add build-deb CI job: builds .deb package from Linux CLI release\n- Update README with install instructions for Linux, macOS, and Windows\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add Linux/macOS install script and .deb packaging",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-11T23:36:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "77e5a3efaa20293f5a37bbf950eef1d66cdb75af",
          "body": "- Convert Go-level tool execution errors to ErrorResult instead of\n  returning early, so the LLM always sees the error and can respond\n- Extract processToolCalls/checkStuck helpers in CLI agent (matching\n  shared agent) to eliminate duplicated inline logic\n- Blocked tools no longer count toward stuck detection\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: agent no longer stops when a tool fails",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-11T23:33:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2aacb18b91c2ed64cf49614eecf6bde2f3a6477c",
          "body": "Uses cmd /C on Windows and sh -c on other platforms.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: make shell_exec cross-platform for Windows, macOS, and Linux",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-11T23:14:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a14da56b4ffcff05a2b6b949c635aedb5b2603e4",
          "body": "… build\n\n- CLI installer: install NSIS with choco, run makensis directly instead\n  of using joncloud/makensis-action (which expects NSIS pre-installed)\n- Desktop Windows: add mingw-w64-ucrt-x86_64-gobject-introspection to\n  msys2 packages (fixes pkg-config missing gobject-introspection-1.0)\n- Desktop installer: same choco + direct makensis approach\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: install NSIS via choco and add gobject-introspection for desktop…",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-11T22:56:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "39d6dae69355320221b9cfd8e546565a1bc51a9a",
          "body": "- NSIS installer scripts for both CLI and Desktop with icon, PATH setup,\n  Start Menu shortcuts (desktop), and Add/Remove Programs entries\n- EnvVarUpdate.nsh for reliable user PATH manipulation\n- Generated logo.ico from logo.png (256/128/64/48/32/16px)\n- Release workflow builds .exe installers along\n[…]\n artifact and packages\n  on windows-latest; Desktop installer runs in existing windows job\n- Update README with installer download instructions\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add Windows NSIS installers for CLI and Desktop",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-11T22:39:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f980cef21425028fc4b275af6baca8102e614b84",
          "body": "- Show colored inline unified diffs in TUI when patch_file/file_write edit\n  files (green added, red removed, blue hunk headers with background tints)\n- Add tool approval system: Allow / Always Allow / Block modal with keyboard\n  navigation. Permissions saved to .tanrenai/permissions.json (project-l\n[…]\nefile with build/install/test/clean targets (installs to ~/.local/bin)\n- Update README with tool permissions docs and make install instructions\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: colored diffs, tool permissions, Pdeathsig, and Makefile installer",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-11T22:32:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a1c0f3dbf7b8e5c664dfad1b0f9a1edf576a62be",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add logo to README",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-11T21:52:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "80e57730371402a5e3730ba256602256e04af3c6",
          "body": "Download pre-built llama-server from llama.cpp releases during CI and\ninclude it in the bin/ subdirectory of each release archive. Windows\nbuilds include CUDA 12.4 support with bundled cudart DLLs.\n\nUpdate resolveBinary to check bin/ next to the executable in addition\nto the data directory, so bundled llama-server is found automatically.\nSet LD_LIBRARY_PATH/PATH to include the binary directory for CUDA\nshared library resolution.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: bundle llama-server with release builds",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-11T21:47:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "33a6a78b55b3d47a26b1c703a8eba982ea4f7d4a",
          "body": "Add Flush() method to responseWriter in both GPU and backend server\nlogging middleware so http.Flusher interface is preserved through the\nmiddleware chain. This fixes \"streaming not supported\" errors on\n/api/pull and other SSE endpoints.\n\nAlso fix desktop CI/release builds:\n- Add libgirepository1.0-dev for Linux GTK4 builds\n- Add gobject-introspection for macOS Homebrew builds\n- Remove deprecated macos-13 runner (only arm64 via macos-14)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: streaming middleware and CI/CD desktop build failures",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-11T21:36:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8365431d50c7c3caa25719e9f93ea006bec82d9d",
          "body": "Add GitHub Actions release workflow using semantic-release to automate\nversioning from conventional commits. Builds CLI (linux/darwin/windows\namd64+arm64) and desktop GTK4 app (linux, macOS Intel+ARM, Windows\nwith bundled DLLs via MSYS2). Also adds desktop to CI pipeline,\nlocal server embedding for CLI, desktop session/settings, and removes\ndeprecated server-old directory.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add semantic release with cross-platform CI/CD builds",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-11T21:28:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c9d20920a7c5d6e8dad1778d7167de5c7c09929e",
          "body": "The GPU server now reads the model's native context length from GGUF\nmetadata during load and returns it in the /api/load response. The\nbackend proxies this through to the CLI, which uses it for context\nwindowing. The --ctx-size flag defaults to 0 (auto-detect) and acts\nas an explicit override when set.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: auto-detect context size from GGUF model metadata",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-07T04:48:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9f697fdf8e47c86e827494da289c43dfd841e0d3",
          "body": "- Add request body size limits (MaxBytesReader) to all GPU and server handlers\n- Add HTTP client timeouts with separate streaming/non-streaming clients\n- Fix VastAI race condition in EnsureRunning with double-check locking\n- Fix context propagation in embeddings handler\n- Fix memory Add to use *Entr\n[…]\nwith apiclient.PullModel\n- Add CI workflow (.github/workflows/ci.yml)\n- Add 59 new tests across memory, handlers, apiclient, and tools packages\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: production hardening across all three services",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-07T04:02:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a220d3d7a3ec600942fc5e222d4fa30765ec5ae5",
          "body": null,
          "is_bot": false,
          "headline": "feat: slash commands",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-07T03:08:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a908f5329252a8d18b5b6735e7298b1de8001af5",
          "body": "Move apiclient, tools, and pkg/api from clients/cli into clients/shared/\nso both the CLI and the new desktop client can depend on them. Add\nclients/desktop/ (Gio-based GUI), gpu/pkg/serve, and server/pkg/serve\nhelper packages.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: extract shared packages for multi-client reuse",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-06T00:55:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a174043a382fbf9dff09cd18cbf01dde35032346",
          "body": "The escapeJinja helper was double-escaping quotes that were already\nproperly escaped in backtick strings (\\\" → \\\\\"), causing llama-server's\nJinja lexer to reject the template.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: remove double-escaping in generated Jinja templates",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-01T03:05:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4a0487f683b70f6a6b76adc2089c58505eff8461",
          "body": "Replace hardcoded Jinja template constants with a generator that produces\ntemplates programmatically from a ChatMLConfig struct. At model load time,\nthe server reads GGUF metadata (architecture + name), matches it against a\nfamily registry, and generates the appropriate template automatically.\n\n- Ad\n[…]\nth HF repo provenance at download time\n- Add --no-auto-template flag to disable auto-detection\n- Remove static qwen25/qwen35 template constants\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: generate chat templates at runtime from GGUF metadata",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-03-01T03:01:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0af99dd170245ff56fae89d9dbc876bc49fd43a2",
          "body": "…gress\n\nAdd --reasoning-format flag for thinking mode support (e.g. deepseek for\nQwen3.5) and expose --flash-attn as a CLI flag on the GPU server.\n\nStream model download progress as SSE events through all three tiers\n(GPU → backend → client) so the CLI shows a live progress bar during\nmodel pulls.\n\nAlso moves client/ to clients/cli/ and updates .gitignore for binaries.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add --reasoning-format, --flash-attn flags and SSE download pro…",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-02-28T23:02:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6c6588e1e70dfdcaa76bb09a9bab873e8ac121b0",
          "body": null,
          "is_bot": false,
          "headline": "fix: underline issue",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-02-28T22:29:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "94dce704fae28cacbe9115869628699c29279bb1",
          "body": null,
          "is_bot": false,
          "headline": "fix: small fixes",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-02-28T15:12:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eaa24ca0418a457181ede07e19184d4ddb7fa7cb",
          "body": null,
          "is_bot": false,
          "headline": "feat: new TUI",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-02-28T02:23:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "736ff659f3187b213046534aed53b36a3a7d2288",
          "body": null,
          "is_bot": false,
          "headline": "feat: tui bubbletea",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-02-28T01:55:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0f016f32fcfe6b35449ef49aba2dd2840a27542",
          "body": null,
          "is_bot": false,
          "headline": "feat: split and TUI",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-02-28T00:58:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b93c67e59f7cb557c95147154336d82cb7227ec6",
          "body": "Add patch_file tool for surgical find-and-replace edits to prevent the\nLLM from destroying files with file_write. Update file_write description\nto warn about full-file overwrites and direct users to patch_file.\n\nFix web_search by switching from DuckDuckGo HTML (CAPTCHA-blocked) to\nDDG Lite POST endp\n[…]\n00, 0 = unlimited) instead of hardcoded 20.\n\nUpdate system prompt with rules to prefer patch_file for edits and\nverify changes with build/test.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add patch_file tool, fix web_search, make iterations configurable",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-02-24T00:40:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f7f6c26aa2baf1ac14a65975dc7002e599c09497",
          "body": "Consolidate shared subprocess logic into a new Subprocess helper used by\nboth ProcessRunner and EmbeddingRunner. This adds graceful shutdown\n(SIGTERM with 5s fallback to SIGKILL), dynamic port allocation to avoid\nconflicts, crash detection with auto-restart (max 3 attempts), structured\nlog prefixing, health check progress feedback, and an optimized HTTP\nclient transport for loopback communication.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: harden llama-server process management",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-02-23T03:55:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2e15ee65314f21c01ab014285abcc166d44b8d79",
          "body": null,
          "is_bot": false,
          "headline": "fix: imports",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-02-22T15:59:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d628a9a86be0ada607d2d08b980f356307bee1f2",
          "body": null,
          "is_bot": false,
          "headline": "feat: less tokens, faster response",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-02-22T15:57:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1461f9d95614c13bb1a840b7f38698673fe6fdd9",
          "body": "Qwen3-70B doesn't exist. Replaced with Llama-3.3-70B-Instruct Q4_K_M\n(~42GB, fits A100 80GB). Fixed embedding model URL to use leliuga repo.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix model download URLs in server_setup.sh",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-02-22T02:20:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "65e86041f1e5edfe172918995c4a1bcdbfe4de09",
          "body": "…p.sh\n\nThe models/ gitignore rule was matching server/internal/models/ (the Go\npackage for model store/download). Changed to /models/ so it only matches\nthe top-level data directory. Also rewrote server_setup.sh to use a direct\nGo install instead of Homebrew.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix gitignore excluding internal/models package, clean up server_setu…",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-02-22T02:17:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e78109b359d3bfb6aa32656a6033a40794465c1d",
          "body": "- Agent framework with streaming support, tool execution, and stuck detection\n- Context manager with token budgeting, windowed history, and auto-summarization\n- Built-in tools: file_read, file_write, list_dir (with depth), shell_exec\n- Memory/RAG via chromem-go: hybrid search (semantic + keyword), p\n[…]\n\n- Server-side agent handler (POST /v1/agent/completions)\n- REPL commands: /memory, /context, /tokens, /clear\n- CLAUDE.md project documentation\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Phase 2-4: Agent loop, context management, tools, and memory/RAG",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-02-22T01:15:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8bbc118384a2fa2ed5b2f843ba133a2f48bdac6f",
          "body": "Tanrenai server with OpenAI-compatible API that manages llama-server\nas a subprocess for GGUF model inference. Includes CLI commands for\nserve, run, chat, list, and pull.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Phase 1: Model serving via llama-server subprocess",
          "author_name": "ThatCatDev",
          "author_login": "bludot",
          "committed_at": "2026-02-21T00:36:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 63,
      "commits_last_year": 85,
      "latest_release_at": "2026-07-09T18:22:32Z",
      "latest_release_tag": "vscode-v1.0.2",
      "releases_from_tags": false,
      "days_since_last_push": 18,
      "active_weeks_last_year": 13,
      "days_since_latest_release": 18,
      "mean_days_between_releases": 3.5
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/ThatCatDev/tanrenai",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/ThatCatDev/tanrenai",
          "is_deprecated": false,
          "latest_version": "v1.33.4",
          "repository_url": "https://github.com/ThatCatDev/tanrenai",
          "versions_count": 61,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-09T18:19:35Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 18
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "clients/vscode/tsconfig.json"
      ],
      "toolchain_manifests": [
        "clients/cli/go.mod",
        "clients/desktop/go.mod",
        "clients/shared/go.mod",
        "infra/go.mod",
        "server/go.mod"
      ],
      "largest_source_bytes": 53708,
      "source_files_sampled": 301,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 5577
    },
    "dependencies": {
      "manifests": [
        "infra/go.mod",
        "server/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/charmbracelet/bubbletea",
          "manifest": "infra/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.10"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "infra/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "golang.org/x/crypto",
          "manifest": "infra/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.39.0"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/philippgille/chromem-go",
          "manifest": "server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.7.0"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "server/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        }
      ],
      "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": 27,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 7
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "bludot",
          "commits": 85,
          "avatar_url": "https://avatars.githubusercontent.com/u/2181540?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "docker.yml",
        "release.yml",
        "vscode-release.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "package-lock.json"
      ],
      "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": 10,
            "reason": "27 out of 27 merged PRs checked by a CI test -- score normalized to 10",
            "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": 0,
            "reason": "license file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "16 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 10,
            "reason": "SAST tool is run on all commits",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "52 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "38c1bbeaaa9f58cf675829f247468436c3a6cec0",
        "ran_at": "2026-07-28T03:04:47Z",
        "aggregate_score": 3.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-09T18:45:37Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-09T18:19:35Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/ThatCatDev/tanrenai",
    "host": "github.com",
    "name": "tanrenai",
    "owner": "ThatCatDev"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 50,
      "inputs": {
        "security": 36,
        "vitality": 75,
        "community": 12,
        "governance": 50,
        "engineering": 70
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 75,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "commits_last_year": 85,
              "human_commit_share": 1,
              "days_since_last_push": 18,
              "active_weeks_last_year": 13
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 18 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 18
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "13/52 weeks with commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 13
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "85 commits in the last year",
                "points": 17.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 85
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "16 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 63,
              "latest_release_tag": "vscode-v1.0.2",
              "releases_from_tags": false,
              "days_since_latest_release": 18,
              "mean_days_between_releases": 3.5
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "63 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 63
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 18 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 18
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~3.5 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 3.5
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 12,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "critical",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "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": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "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": 50,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "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": 57,
            "inputs": {
              "merged_prs": 27,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 7
            },
            "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": "27/34 decided PRs merged",
                "points": 30.4,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 27,
                      "decided": 34
                    }
                  }
                ],
                "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": 48,
            "inputs": {
              "followers": 0,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "ThatCatDev",
              "public_repos": 14,
              "account_age_days": 1715
            },
            "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 ThatCatDev",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "ThatCatDev"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "14 public repos, account ~4 yr old",
                "points": 18,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 14
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 4
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/ThatCatDev/tanrenai"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 18
            },
            "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 18 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 18
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "61 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 61
                    }
                  }
                ],
                "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": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "27 out of 27 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": 36,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3.6
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "27 out of 27 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/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 not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "16 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is run on all commits",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "52 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "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": "excellent",
        "name": "AI Readiness",
        "value": 86,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 5577
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "85 of 85 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 85,
                      "sampled": 85
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "clients/vscode/tsconfig.json"
              ],
              "agent_commit_share": 0.894,
              "toolchain_manifests": [
                "clients/cli/go.mod",
                "clients/desktop/go.mod",
                "clients/shared/go.mod",
                "infra/go.mod",
                "server/go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "clients/vscode/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "clients/vscode/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "76 of the last 85 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 76,
                      "sampled": 85
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 53708,
              "source_files_sampled": 301,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/301 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 301,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T03:05:04.415681Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/t/ThatCatDev/tanrenai.svg",
  "full_name": "ThatCatDev/tanrenai",
  "license_state": "absent",
  "license_spdx": null
}

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.