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

AgustinCastanol / glia

Memory adapter sync layer that unifies engram and claude-mem under a canonical, git-tracked store

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

AgustinCastanol/glia 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 Engineering Quality (71/100) y la más baja, Community & Adoption (24/100). Se actualizó por última vez hace 38 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

Agustin CastañolCuenta personal
1 seguidor28 repositorios públicosdesde may 2020

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/agustincastanol/gliav1.4.0-7hace 38 días

Métricas por categoría

Vitalidad

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

59Moderado · 22% del índice global
Cómo se puntúa
18/36Recencia de push — último push hace 38 días
2.8/36Cadencia de commits — 4/52 semanas con commits
18/18Volumen de commits — 116 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year116
human_commit_share1
days_since_last_push38
active_weeks_last_year4
Cómo se puntúa
27/27Publica versiones — 7 versiones publicadas
36/36Recencia de las versiones — última versión hace 38 días
27/27Cadencia de publicación — una versión cada ~3 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count7
latest_release_tagv1.4.0
releases_from_tagsno
days_since_latest_release38
mean_days_between_releases3

Comunidad y Adopción

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

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

Sostenibilidad y Gobernanza

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

52Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
38.2/38.3Aceptación de PR — 15/15 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/26 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs15
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
2.2/25Alcance del propietario — 1 seguidores de AgustinCastanol
22.6/25Trayectoria — 28 repos públicos, cuenta de ~6 años
Datos de entrada utilizados
followers1
owner_typeUser
is_verified
owner_loginAgustinCastanol
public_repos28
account_age_days2252
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 38 días
20/20Historial de versiones — 7 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/agustincastanol/glia
ecosystemsgo
any_deprecatedno
min_days_since_publish38

Calidad de Ingeniería

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

71Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 5 out of 5 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

Seguridad

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

35En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
3.8/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 5 out of 5 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/26 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file 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 — 13 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3,5

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.

58Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 99 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,99
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
12.6/18Arranque con un solo comando — go.mod (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
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
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
54.5/55Tamaños de archivo manejables — 1/114 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes62.044
source_files_sampled114
oversized_source_files1

Datos clave

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

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 3.5 / 10
3.5agregado

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

10Binary-Artifactsno binaries found in the repo
5Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests5 out of 5 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/26 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities13 existing vulnerabilities detected
Dependencias directas 11
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/cespare/xxhash/v2v2.3.0go.mod
Gogithub.com/charmbracelet/bubblesv0.20.0go.mod
Gogithub.com/charmbracelet/bubbleteav1.3.5go.mod
Gogithub.com/charmbracelet/glamourv1.0.0go.mod
Gogithub.com/charmbracelet/lipglossv1.1.1-0.20250404203927-76690c660834go.mod
Gogithub.com/charmbracelet/x/exp/teatestv0.0.0-20260519012233-798e623c8447go.mod
Gogithub.com/gofrs/flockv0.13.0go.mod
Gogithub.com/oklog/ulid/v2v2.1.1go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Gogopkg.in/yaml.v3v3.0.1go.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": 988,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 806713
      },
      "pushed_at": "2026-06-14T03:32:05Z",
      "created_at": "2026-05-26T23:06:39Z",
      "owner_type": "User",
      "updated_at": "2026-06-14T03:32:09Z",
      "description": "Memory adapter sync layer that unifies engram and claude-mem under a canonical, git-tracked store",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "https://acastanol.com.ar/",
      "name": "Agustin Castañol",
      "type": "User",
      "login": "AgustinCastanol",
      "company": null,
      "location": "Argentina",
      "followers": 1,
      "avatar_url": "https://avatars.githubusercontent.com/u/65740891?v=4",
      "created_at": "2020-05-21T22:31:20Z",
      "is_verified": null,
      "public_repos": 28,
      "account_age_days": 2252
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-06-14T02:52:08Z"
        },
        {
          "tag": "v1.3.1",
          "kind": "patch",
          "published_at": "2026-06-02T03:56:25Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-06-01T18:45:11Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-05-29T04:18:56Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-05-28T18:38:41Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-05-27T02:55:52Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-05-26T23:29:41Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "3bfb974705bd79955295ba45c6bc5a792c8c1b34",
          "body": "docs(openspec): document static-file-sources and commit local glia store",
          "is_bot": false,
          "headline": "Merge pull request #15 from AgustinCastanol/docs/static-file-sources",
          "author_name": "Agustin Castañol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-06-14T03:32:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5bd2d2539f2878e2ba5ad807950fabc92ad46611",
          "body": null,
          "is_bot": false,
          "headline": "docs(openspec): document static-file-sources and commit local glia store",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-06-14T03:30:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4777233e3fdbb9c5b1fcfda5eba86f9387638cdd",
          "body": "fix(sync): compute newest-artifact timestamp for source status (PRD-11 §10)",
          "is_bot": false,
          "headline": "Merge pull request #14 from AgustinCastanol/fix/openspec-status-newest",
          "author_name": "Agustin Castañol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-06-14T00:20:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6628a8d56c3f1704f83ffe4362fd43d74107bfd4",
          "body": "…ewest",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into fix/openspec-status-n…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-06-14T00:17:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ad0ad6c79c26da3bb8e90f2800c638af2c01eb5",
          "body": "…1 §10)",
          "is_bot": false,
          "headline": "fix(sync): compute newest-artifact timestamp for source status (PRD-1…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-06-14T00:16:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f68f234802b87f98ed7fc10b20b104ce6a88e3a",
          "body": "…very\n\ndocs(claudemem): document that supervisor.json publishes no port (v13.2.0)",
          "is_bot": false,
          "headline": "Merge pull request #13 from AgustinCastanol/docs/claudemem-port-disco…",
          "author_name": "Agustin Castañol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-06-13T23:34:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e53796ba1dbf5aa5a7c06a61c136031f3274a6b4",
          "body": "….2.0)",
          "is_bot": false,
          "headline": "docs(claudemem): document that supervisor.json publishes no port (v13…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-06-13T23:33:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62581340c0f85ef3aad0cb97b5bffd39fb61ba5f",
          "body": "…e ingestion fix (PRD-11, PR 2/2) (#12)\n\n* feat(status): add sources block to glia status for read-only adapters (PRD-11 §10)\n\n* feat(tui): extend kind/type filter cycles with spec_artifact and SDD types (PRD-11)\n\n* feat(sync): ingest read-only sources in Push via activeSources() (PRD-11 §9)\n\nEngine\n[…]\n status sources block (PRD-11 §10)\n\n* test(openspec): add integration and e2e coverage for source ingestion (PRD-11)\n\n* docs(prd-10): mark claude-mem file source Deferred — upstream export unavailable",
          "is_bot": false,
          "headline": "feat(source/openspec): status sources block, TUI filters, e2e + engin…",
          "author_name": "Agustin Castañol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-06-13T23:24:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "47104e526298ef71036a7457da3e6cb601e792eb",
          "body": "…n (PRD-11, PR 1/2) (#11)\n\n* feat(store): add spec_artifact to validKinds and document PRD-0 §5.1 amendment\n\nAdds \"spec_artifact\" to the validKinds map so records ingested by the\nopenspec adapter pass store validation (PRD-11). Updates the error\nmessage to list the expanded set. Amends PRD-0 §5.1 ki\n[…]\nec.path: ~/openspec\nwould receive a literal tilde. Adds the missing expandHome call and a\ncorresponding test (verify SUGGESTION-02).\n\n* refactor(source/openspec): use slices.Sort and strings.CutPrefix",
          "is_bot": false,
          "headline": "feat(source/openspec): read-only openspec artifact source — foundatio…",
          "author_name": "Agustin Castañol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-06-13T02:57:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d50dcaae3f2cdd852e4eae601f07107be3eb5320",
          "body": "The Observations and Conflicts tabs showed nothing because reloadCmd\npassed the project root to loadRecords/loadIndexFile, which join\nmemory.jsonl/index.json directly. Those files live under .glia, so the\nreads silently hit a missing path and returned an empty store.\n\nSub-models must keep the projec\n[…]\nss --dir calls\nneed it), so resolve the .glia subdir at the file-read call sites via a\nnew storeSubdir helper. Add a regression test asserting the\nObservations model loads records written under .glia.",
          "is_bot": false,
          "headline": "fix(tui): read store files from .glia subdir, not project root (#10)",
          "author_name": "Agustin Castañol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-06-02T03:54:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2606db27cd07f9060fdbecbbda64f3d566b1ed4a",
          "body": "SECURITY.md documents supported versions, private vulnerability reporting via\nGitHub advisories (email fallback), response expectations, and scope.\nCODEOWNERS assigns @AgustinCastanol as default reviewer for all paths.",
          "is_bot": false,
          "headline": "chore(security): add SECURITY.md and CODEOWNERS for OSS launch (#9)",
          "author_name": "Agustin Castañol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-06-02T01:09:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69e0c1a743be8b7a137747914f3415a7020ab4d0",
          "body": "docs(prds): add PRD-10 (claude-mem file source) and PRD-11 (openspec source)",
          "is_bot": false,
          "headline": "Merge pull request #8 from AgustinCastanol/docs/prd-static-sources",
          "author_name": "Agustin Castañol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-06-02T01:03:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5bde3de229741e0c8f601591ef6f03a2ef70cb6",
          "body": "fix(tui): route async loads to owning sub-model and redesign tab nav",
          "is_bot": false,
          "headline": "Merge pull request #7 from AgustinCastanol/fix/tui-load-routing-and-nav",
          "author_name": "Agustin Castañol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-06-02T01:03:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e160f7277142c07ecaee69f699f6e041f042dfb",
          "body": "…source)\n\nTwo draft PRDs introducing read-only on-disk ingest sources for glia — no\ndaemon, no HTTP required.\n\nPRD-10 adds a `transport: file` peer to the existing claude-mem HTTP transport,\nreusing the PRD-2 field mapping so both transports converge to identical\ncanonical records (idempotent via th\n[…]\nocking PRD-0 amendment for a new kind:spec_artifact to keep streams\nhonest, and proposes a first-class `sources` concept (read-only inputs) distinct\nfrom bidirectional `providers`, shared with PRD-10.",
          "is_bot": false,
          "headline": "docs(prds): add PRD-10 (claude-mem file source) and PRD-11 (openspec …",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-06-01T01:59:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c7334fd639be18b6684c0f639e567e0ff952aa4",
          "body": "Async load results (statusDataMsg, conflictReloadMsg, obsReloadMsg) were\nrouted by the active tab instead of their owning sub-model. At startup the\nObservations tab is active, so the Conflicts and Status startup loads were\ndelivered to the Observations model and silently dropped — those tabs never\np\n[…]\ny dispatch stole characters from the filter input.\n\nTab bar, status hint, and the Help cheatsheet updated to teach the new keys;\ngolden files regenerated. Adds routing and navigation regression tests.",
          "is_bot": false,
          "headline": "fix(tui): route async loads to owning sub-model and redesign tab nav",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-30T05:32:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "006c072a1bb7d2d6bf4d35c1a21fe47d530426d1",
          "body": "docs: public OSS README + glia rename across docs/PRDs",
          "is_bot": false,
          "headline": "Merge pull request #6 from AgustinCastanol/docs/oss-readme-and-rename",
          "author_name": "Agustin Castañol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-30T05:10:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "359a4b1ae2184a27bf4bd83f4dbc88c66d6fae6c",
          "body": "- README: public-facing rewrite (pitch, install, commands, config, roadmap)\n- docs/internals.md: preserved former README as architecture reference\n- docs/: migrate wrapper-mems -> glia, fix stale facts (Go 1.26, real resolve\n  syntax 'sync resolve --keep', remove fictional 'show --history' flag),\n  convert absolute file:// links to relative paths\n- .gitignore: un-ignore /docs/ so the README's doc links resolve",
          "is_bot": false,
          "headline": "docs: rewrite README as public OSS guide, promote docs/ out of drafts",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-30T05:03:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7721a58e0ae29c136770166838e65cd149e6f18",
          "body": "- PRD-8: claude-mem server-beta evaluated and shelved, with decision record\n- PRD-9: local store backup & rollback proposal (glia-local scope only)\n- PRD-0..5: rename obsolete tool name wrapper-mems -> glia (binary, module\n  path, .glia/ store dir, user config dir ~/.config/glia/, CLI commands)",
          "is_bot": false,
          "headline": "docs(prds): add PRD-8 (shelved) and PRD-9 (backup), rename tool to glia",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-30T05:03:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c28510698d6f47e7df92ab2921b96c3ecffdae82",
          "body": "…naming\n\nfeat: per-provider project naming (PRD-6) — v1.2.0",
          "is_bot": false,
          "headline": "Merge pull request #5 from AgustinCastanol/feat/per-provider-project-…",
          "author_name": "Agustin Castañol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T04:15:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4341bf6837a15680d1466a1bfd8bb03711ae47d0",
          "body": "The previous TestStatus_TableShowsResolvedEffectiveProject ran\nexecuteStatus, which triggers live Health and WriteSupported probes\nagainst provider endpoints not present in CI — claude-mem worker on\nlocalhost:37701 is not reachable in the GitHub Actions runner, and the\nresulting degraded status caus\n[…]\nution chain (config.Load -> buildAdapters ->\nEffectiveProject -> buildStatusJSON) without running runStatus, so it is\nCI-safe while still covering the PRD-6 happy path with a real per-provider\nconfig.",
          "is_bot": false,
          "headline": "test(status): replace happy-path test with CI-safe wiring integration",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T04:13:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d0fd8cb880df06f13a96bcb324e8c9bc7a4c2b55",
          "body": "…-path status test\n\nWARNING-01 from sdd-verify: the project-required check belonged in\nbuildSyncEngine after the --project CLI flag merge, not in validate() at\nload time. Load() now succeeds with an empty global project; downstream\nbuildSyncEngine fails with a clear error when no source resolves a p\n[…]\nject.\n\nSUGGESTION-01: add TestStatus_TableShowsResolvedEffectiveProject, a\nhappy-path test that seeds a real per-provider config and asserts the\nresolved value appears in the EFFECTIVE_PROJECT column.",
          "is_bot": false,
          "headline": "fix(config): remove project-required check from validate(), add happy…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T04:04:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7861de0e80c47492026d7d2c1eaf899b9d1adab8",
          "body": "…tegration smoke test",
          "is_bot": false,
          "headline": "docs(per-provider-project): add README docs, CHANGELOG v1.2.0, and in…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T03:53:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d764b06324e089eab825d46f88abf8349435977",
          "body": "…able and JSON",
          "is_bot": false,
          "headline": "feat(status): surface effective project per provider in glia status t…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T03:51:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "844ef71931603d813ea0922f630b0f73231e0698",
          "body": "…6 phases 4-5)\n\nIn ListNative for both engram and claudemem: when cfg.Project is\nnon-empty (resolved at wiring time), use it as the project filter\ninstead of the engine-supplied parameter. Backward compat: empty\ncfg.Project falls through to the parameter unchanged.\n\nIn engram FromCanonical: stamp rec.Project from cfg.Project so\nWriteNative passes --project <P> to the CLI. Previously Project was\nalways empty and engram would save the record without a project tag.",
          "is_bot": false,
          "headline": "feat(adapters): use cfg.Project in ListNative and FromCanonical (PRD-…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T03:46:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4949b6de16ede596a9b6875d2cab4854520de061",
          "body": "Add Project field to engram.Config and claudemem.Config carrying the\neffective project resolved at wiring time via config.ResolveProject\n(CLI flag > providers.<x>.project > global Config.Project).\n\nAdd EffectiveProject() accessor to both adapters for testability.\nRefactor buildAdapters to accept cli\n[…]\ns (sync, status, doctor) pass rootFlags.project explicitly.\nAdd resolveEngineProject pure helper that enforces non-empty project\nbefore any adapter I/O, replacing the silent empty-string fall-through.",
          "is_bot": false,
          "headline": "feat(wiring): wire per-provider project into adapters (PRD-6 phases 2-3)",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T03:46:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6e53ce8cc31d22b0c486c647281f65d566e1e0ae",
          "body": "Add optional Project field to EngramProviderConfig and ClaudeMemProviderConfig\nwith yaml tag project,omitempty. Add pure ResolveProject(cliFlag, providerOverride,\nglobal) helper implementing PRD-6 precedence: CLI > per-provider > global.\nWire project key into mergeEngram and mergeClaudeMem two-pass merge logic.",
          "is_bot": false,
          "headline": "feat(config): add per-provider project field and ResolveProject helper",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T02:03:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a053ff4009e39a353b26acd13b456a0a8367218",
          "body": "…integration-tests\n\ntest(claudemem): integration + e2e bidirectional sync (PRD-7 PR 3)",
          "is_bot": false,
          "headline": "Merge pull request #4 from AgustinCastanol/feat/cm-write-support-pr3-…",
          "author_name": "Agustin Castañol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T00:57:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9db050b6bb3c6998087f1088a43d043df173b290",
          "body": "…ation test",
          "is_bot": false,
          "headline": "refactor(test/claudemem): use atomic.Int32 in 400 pass-through integr…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T00:51:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5080457455effede5be496808c476752fb780b7",
          "body": "Spin up a fake claude-mem worker via httptest.Server and exec the compiled\nbinary against it to verify the full canonical→provider write path end-to-end.\n\n- TestE2E_ClaudeMemWritePath_EngramRecordPushed: seeds an engram-origin\n  canonical record, runs glia sync, asserts the fake server received at\n \n[…]\ne read path (empty\n  observations page) does not hard-error alongside the write path.\n\nThis test was RED before the wiring.go fix (saveCalls=0 despite write_enabled=true\nin config) and GREEN after it.",
          "is_bot": false,
          "headline": "test(e2e): add bidirectional write path e2e tests for claude-mem",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T00:40:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f5bcacc32810c134c73720f3e2dc7f987db5bbe5",
          "body": "config.ClaudeMemProviderConfig.WriteEnabled is a *bool; buildAdapters was\nconstructing claudemem.Config without the WriteEnabled field, so the adapter\nalways received the zero value (false) and WriteNative short-circuited with\nErrUnsupported regardless of config. Dereference the pointer and forward the\nvalue. Add unit tests for both write_enabled=true and write_enabled=false paths.",
          "is_bot": false,
          "headline": "fix(wiring): propagate write_enabled from config into ClaudeMemAdapter",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T00:40:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce3e3ebfdaef9d15b016eacee2d202ece854047b",
          "body": "… test",
          "is_bot": false,
          "headline": "refactor(test/claudemem): use atomic.Int64 in idempotency integration…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T00:33:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adcd62d9b8a834d00059d6166893ee669f92427e",
          "body": "…teNative write path",
          "is_bot": false,
          "headline": "test(adapter/claudemem): add httptest-based integration tests for Wri…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T00:32:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71b34d4347e9255d5e5b1150e0f311dc72dc86fb",
          "body": "…write-path\n\nfeat(claude-mem): write path, drift detection, write-error counters, status reporting (PR 2/3)",
          "is_bot": false,
          "headline": "Merge pull request #2 from AgustinCastanol/feat/cm-write-support-pr2-…",
          "author_name": "Agustin Castañol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T00:23:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b6e4fc397832ef4f939ac0c1b5f138ba69a6aca2",
          "body": "…ive payload branches\n\nCloses verify W-01 from PR 2 (text payload triangulation gap).",
          "is_bot": false,
          "headline": "test(adapter/claudemem): cover title-only and narrative-only WriteNat…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T00:20:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9caf49530c525fea79b448e1cd69547097bfadea",
          "body": "- claudemem.deriveTitle: use range over int\n- claudemem_test.TestListNative_ThreePagePagination: use range over int\n- claudemem_test: remove unused idStr helper\n- sync/engine.mergeReports: use maps.Copy",
          "is_bot": false,
          "headline": "chore: modernize loops and remove dead test helper",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T00:20:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bfdab32faf451bdc7bf3739a5c1f7b6920b8d87f",
          "body": null,
          "is_bot": false,
          "headline": "refactor(sync/pull): use slices.Contains for supported-kinds check",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T00:20:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5eeceadeb2e915c5bc42712d17f15404626a8522",
          "body": null,
          "is_bot": false,
          "headline": "feat(status): add write_capability column and JSON field to glia status",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T00:20:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cba2929eacbf4fccf4b1adab57a339d52a151750",
          "body": null,
          "is_bot": false,
          "headline": "feat(sync): add WriteErrors counter for non-fatal write failures",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T00:20:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f57ab2378df958f3bef542a37094f695cd32a5b1",
          "body": "… after write",
          "is_bot": false,
          "headline": "feat(sync/pull): add drift detection and use BindProviderWithRevision…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T00:20:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47f0699c3d94be0e2cf929aeb3d2164e5d9bc702",
          "body": null,
          "is_bot": false,
          "headline": "feat(adapter/claudemem): implement WriteNative via POST /api/memory/save",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T00:20:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a1a0313e91cfca55d195d4272535984fd3939ba",
          "body": "fix(ci): make e2e and perf tests tolerant of CI environment",
          "is_bot": false,
          "headline": "Merge pull request #3 from AgustinCastanol/fix/ci-flakes",
          "author_name": "Agustin Castañol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T00:20:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "133d6a3c36e0be0118694bd344f230ff9e7fd876",
          "body": "- TestE2E_StatusJSONOnFreshStore: drop exit-code assertion; status returns\n  non-zero when a provider is unhealthy (e.g. engram CLI not on $PATH in CI).\n  The test contract is 'stdout is valid JSON with provider_health', not\n  'all providers reachable'.\n- TestE2E_SyncDevBinarySatisfiesAnyMinVersion:\n[…]\n CI env var is set. The 500ms\n  budget is calibrated for developer-class hardware (M-series) and the race\n  detector overhead on shared CI runners blows past it without indicating\n  a real regression.",
          "is_bot": false,
          "headline": "fix(ci): make e2e and perf tests tolerant of CI environment",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-29T00:10:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1f2b26e85155c8bbf74972134a6ddbd7989d608c",
          "body": "…foundation\n\nfeat(claude-mem): PR 1/3 — foundation for bidirectional sync (transport, adapter, config, store)",
          "is_bot": false,
          "headline": "Merge pull request #1 from AgustinCastanol/feat/cm-write-support-pr1-…",
          "author_name": "Agustin Castañol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-28T02:36:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8896bbb37726ba7078907f23d536edc28c997a0",
          "body": null,
          "is_bot": false,
          "headline": "docs(store): clarify ByProviderRevision nil intent in loadIndex",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-28T01:56:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f24b8603ca8dbe87a10a0b5c831b55c29b189d30",
          "body": "…vision",
          "is_bot": false,
          "headline": "feat(store): add ByProviderRevision map and atomic BindProviderWithRe…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T23:49:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "269942ff3ae58b8bfb47e8d71206b83218540cdb",
          "body": null,
          "is_bot": false,
          "headline": "feat(config): add write_enabled to claude-mem provider config",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T23:48:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e38eb2e9cfa036e006d321ec3a72d64bffd727f",
          "body": null,
          "is_bot": false,
          "headline": "feat(adapter): add WriteCapability method to Adapter interface",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T23:47:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1eb481501419f5ec34757735bb56c9d02123e8c3",
          "body": "…probe",
          "is_bot": false,
          "headline": "feat(adapter/claudemem): add SaveMemory transport and WriteSupported …",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T23:44:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f557600b3d4d1503479c0cbf299f56cf104c5575",
          "body": "ReadNative was failing with 400 'invalid observation id' on every\nrecord because engram v1.15.x exposes no working sync_id lookup:\n\n  - CLI `engram search <sync_id>` runs FTS over title/content and\n    never matches the sync_id literal string.\n  - HTTP GET /observations/:id only accepts integer DB i\n[…]\now does one /export plus zero per-record\ncalls, instead of one /export plus N broken per-record calls.\n\nAlso adds .glia/.lock to .gitignore (housekeeping discovered during\nthe same debugging session).",
          "is_bot": false,
          "headline": "fix(adapter/engram): cache full records in ListNative for ReadNative",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T02:52:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7a05097dbf01eaadb7d5f6787499179b2c8178a8",
          "body": "`glia sync` was always passing rootFlags.project (the --project CLI\nflag) to the sync engine, ignoring config.yaml's project field\nentirely. Users running `glia sync` without --project got Project=\"\"\nforwarded to the engine, which then forwarded \"\" to ListNative.\nclaude-mem and engram both do strict\n[…]\nrs do strict equality, not 'all').\n\nOut of scope for this fix: revisiting whether adapters SHOULD treat\nempty project as \"all projects\". For v1, strict equality is the\ndocumented contract (REQ-CM-07).",
          "is_bot": false,
          "headline": "fix(cmd/sync): fall back to config.Project when --project flag is empty",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T02:52:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "74333383cf8bb1717eec36a19d9fa8331ff56d42",
          "body": "…n JSON\n\nThe 'first observation raw JSON' log.Printf was added during initial\nadapter development to inspect the claude-mem API envelope and was\nnever removed. It fired on every `glia sync` run, dumping the full\nJSON of one observation to stderr.\n\nRemoved the log and its firstObsLogged sentinel.",
          "is_bot": false,
          "headline": "fix(adapter/claudemem): remove leftover debug log of first observatio…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T02:52:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79ceb5d85ec1f6073061bc5db160172055a02198",
          "body": null,
          "is_bot": false,
          "headline": "chore: gitignore README-LOCAL.md (local-only install/test notes)",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T01:30:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d8beed4aef5ab737927b67b68a80b1a3cd5e5a5",
          "body": "Required for public distribution and resolves the goreleaser warning\n'no files matched glob=LICENSE*'. Future release archives will include\nLICENSE alongside README.md per .goreleaser.yaml archives.files.",
          "is_bot": false,
          "headline": "docs: add MIT LICENSE",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T01:05:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e9cb74a6a9dd830e254e0e9109bcb521df0de792",
          "body": "- .goreleaser.yaml builds linux/darwin/windows on amd64/arm64 (skips\n  windows/arm64), injects Version via ldflags into\n  cmd/glia/cmd.Version, emits tar.gz (zip for windows) and a\n  changelog grouped by conventional-commit type.\n- .github/workflows/release.yml triggers goreleaser on tag push (v*).\n\n[…]\nvet + go build + go test -race on\n  every push and PR against main.\n\nValidated locally with goreleaser release --snapshot --clean: all 5\ntarget archives built, binary smoke-tested (\"glia 0.0.1-next\").",
          "is_bot": false,
          "headline": "ci: add goreleaser config and GitHub Actions for release + ci",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T01:05:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "55d74fd0bbc90b22bb0b1532e7779c9519511d60",
          "body": "…/ drafts",
          "is_bot": false,
          "headline": "chore: ignore .glia/index.json (renamed), local agent state, and docs…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T01:05:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87050d2de957d329e5d02b70f3ff4094aa4329cc",
          "body": "The project is being published to GitHub for the first time. Renaming\nnow (before v1.0.0 ships) avoids a v2 breaking change later. The new\nname evokes glial cells, complementing the engram metaphor.\n\nScope of rename:\n- Go module path: github.com/agustincastanol/wrapper-mems -> .../glia\n- Binary name\n[…]\nept as historical design documents (they describe the\n  project as it was being designed)\n- Commit messages prior to this commit reference the old name; that is\n  immutable git history and intentional",
          "is_bot": false,
          "headline": "chore: rename project from wrapper-mems to glia",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T01:05:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "df223f2c3f5a352a0be5b027c1db8980e72a1819",
          "body": "…tor, version refusal\n\nAdds internal/e2e package that builds wrapper-mems once via TestMain and execs\nit against temporary stores. Covers:\n\n- version output (REQ-VER-01)\n- init scaffolding (REQ-INIT-01..06)\n- init --force / refusal without --force (REQ-INIT-07)\n- status --json on fresh store (valid \n[…]\nbinary\n(CompareVersion treats 'dev' as infinite); that path is covered by the\nTestEnforceMinVersion_BinaryTooOldRefuses unit test in cmd/wrapper-mems/cmd\nwhich can mutate the Version package variable.",
          "is_bot": false,
          "headline": "test(e2e): end-to-end tests via compiled binary for init, status, doc…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T01:05:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f946df10e35706eb3b8a110ecbd9693c6a3bb73e",
          "body": "…EQ-CFG-04)\n\n- Add enforceMinVersion helper in version.go that reads schema.json via\n  store.ReadSchema and delegates to config.Refuse. Missing schema is\n  permissive; corrupt/unreadable schema surfaces the error rather than\n  silently passing.\n- Wire enforceMinVersion at the entry of sync and status so a too-old\n  binary refuses to operate on a forward-versioned store.\n- Tests cover the 6 branches: missing schema, empty min, refusal,\n  binary-at-or-above, dev-satisfies-any, and corrupt schema.",
          "is_bot": false,
          "headline": "feat(cmd): enforce version refusal in sync and status entry points (R…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T01:05:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "161e4ee411a5273aeeac221be185e6c05a8e142d",
          "body": "… (T-3.3)\n\nCovers REQ-DOC-01 (healthy + memory.jsonl in gitignore), REQ-DOC-02\n(exit codes), REQ-DOC-03 (safe-only --fix repairs, idempotent).\nOne test per checker with temp-dir fixtures and faked adapters.",
          "is_bot": false,
          "headline": "test(cmd/doctor): unit tests for all 7 checkers and --fix idempotence…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T01:05:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c21562aa20e0041dac4bd4a3c4462fed1e004f7f",
          "body": "Implements all 7 checks: canonical store, schema version, index.json, engram\nhealth, claude-mem health, gitignore (including memory.jsonl D2 detection),\nand stale lock detection. --fix repairs gitignore, rebuilds index, removes\nstale locks, and truncates partial memory.jsonl lines (REQ-DOC-01..03).\n\nAlso exports store.RecoverPartialLine() so doctor --fix can invoke partial-line\nrecovery without holding the advisory lock.",
          "is_bot": false,
          "headline": "feat(cmd/doctor): health check command with --fix flag (T-3.1, T-3.2)",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T01:05:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6b10a1d6764c3c39d7eb3f37497b6456569976e",
          "body": "….5, T-3.3)\n\n- version.go: var Version=\"dev\" (ldflags-injectable), const SchemaVersionRange=\"v1\",\n  runVersion prints \"wrapper-mems <ver> (schema <range>)\" (REQ-VER-01)\n- root.go Long: explicit \"No telemetry is collected. Ever.\" statement (REQ-TEL-01)\n- version_test.go: default output, format, ldflags-injected, schema range, help text\n  telemetry assertion (5 tests covering REQ-VER-01 and REQ-TEL-01)",
          "is_bot": false,
          "headline": "feat(cmd): add version command and no-telemetry help text (T-3.4, T-3…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T01:04:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b77e1973f6268908334dfdec6a74d97c61fcbe2",
          "body": "Replace the legacy enginesync.Load(configPath) call with toEngineConfig()\nderived from the already-loaded config.Config, eliminating the duplicate\nconfig-load path flagged in PR-A verify-report WARNING-03.",
          "is_bot": false,
          "headline": "refactor(cmd/status): remove redundant enginesync.Load() call (T-3.7)",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T01:03:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4f5463bf70867fa94fb8c5397d0fc91fc503a00",
          "body": "- REQ-INIT-01: refuse without --force; --force overwrites sentinel files\n- REQ-INIT-02: project detection (flag > env > git remote basename > dir basename)\n  including gitRemoteBasename URL parsing table test\n- REQ-INIT-03: provider probe injection; engram-only, claude-mem-only,\n  --providers flag s\n[…]\nREQ-INIT-06: CI mode with --project + --providers completes without stdin\n- REQ-INIT-07: next-steps block present in stdout\n- T-2.3/REQ-PRV: privacy.excluded_session_ids section present in config.yaml",
          "is_bot": false,
          "headline": "test(cmd/init): unit tests for all REQ-INIT-01..07 scenarios and T-2.3",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T00:04:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6cc3c0b5938e17a5fd7513a0a7fcb6193c103c11",
          "body": "…nd provider detection\n\n- Adds --force flag (REQ-INIT-01): refuse if .wrapper-mems/ exists unless forced\n- Adds --project flag and detection chain: flag > WRAPPER_MEMS_PROJECT env >\n  git remote basename > dir basename > TTY prompt (REQ-INIT-02)\n- Adds --providers flag; injectable probeFn probes eng\n[…]\n.wrapper-mems/memory.jsonl from gitignoreEntries (D2, REQ-INIT-05)\n- Prints next-steps block on success (REQ-INIT-07)\n- Non-interactive CI mode: --project + --providers skips all prompts (REQ-INIT-06)",
          "is_bot": false,
          "headline": "feat(cmd/init): redesign with --force, --providers, --project flags a…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-27T00:04:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1ed66915dd745f0d175e5127676f02cce9639509",
          "body": "…ig shim\n\nReplaces hard-wired engram/claudemem construction in buildSyncEngine with a\ncall to the shared buildAdapters helper, loading the full PRD-5 typed config\nvia internal/config. Adds toEngineConfig() to translate config.SyncConfig\ninto the legacy enginesync.Config shape so internal/sync stays unchanged in\nthe PR-A slice (D5).",
          "is_bot": false,
          "headline": "refactor(cmd/sync): wire adapters via buildAdapters; add toEngineConf…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-26T22:22:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d254c642ae1ab16c206c1998e18a4f81b2b81410",
          "body": "Threads CLIPath and HTTPBaseURL through engram.Config; updates engram.go,\nexec.go, transport.go, and engram_test.go to the new API. Companion to\na61213f which only included integration_test.go.",
          "is_bot": false,
          "headline": "refactor(adapter/engram): complete Config-based New() signature",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-26T03:00:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a41a9ac896a3d3b72b2a186a1fc09142f7d6e209",
          "body": "…lth populates",
          "is_bot": false,
          "headline": "fix(cmd/status): wire real adapters via buildAdapters so provider_hea…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-26T02:59:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bbb2d826958258e530bd13ac400c76409a924912",
          "body": null,
          "is_bot": false,
          "headline": "feat(cmd): buildAdapters wiring helper for shared adapter construction",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-26T02:58:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88e1aec922451d32249774be74d4ef751ea3d6fa",
          "body": "…ssionIDs in ListNative",
          "is_bot": false,
          "headline": "refactor(adapter/claudemem): take claudemem.Config; filter ExcludedSe…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-26T02:57:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "60de8fd71ed2e856bdc8bef6d793e08582461a08",
          "body": "… and HTTPBaseURL",
          "is_bot": false,
          "headline": "refactor(adapter/engram): take engram.Config in New(); thread CLIPath…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-26T02:54:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "378d248ec442fa554ecdc9e9525ba299cc862711",
          "body": "…ReadSchema\n\n- schemaFile.WrapperMemsMinVersion string with json/yaml omitempty (D6)\n- SchemaInfo public type for cross-package access\n- ReadSchema(storeDir) reads schema.json and returns SchemaInfo\n- Tests: round-trip, omitempty assertion, ReadSchema happy path (T-1.7)",
          "is_bot": false,
          "headline": "feat(store/schema): add WrapperMemsMinVersion field with omitempty + …",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-26T02:15:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b1dcfe87da0f5d468fde9131de064a5c3b7d5a1",
          "body": "- Default() returns hostname:username using stdlib only (no internal deps)\n- Resolve(userCfgAuthor) applies env > param > Default() precedence (REQ-IDN-01)\n- WRAPPER_MEMS_AUTHOR env var is read here, not in config, to keep adapter→config\n  import edge absent (ADR-D3)\n- Tests cover all REQ-IDN-01 scenarios",
          "is_bot": false,
          "headline": "feat(identity): new internal/identity package with Default and Resolve",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-26T02:15:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14c3a705b044e688172858edc447fc126e5640de",
          "body": "…ay, version guard\n\n- Config, ProvidersConfig, EngramProviderConfig, ClaudeMemProviderConfig,\n  SyncConfig, PrivacyConfig, IdentityConfig structs (PRD-5 §4.2 shape)\n- Default() with canonical defaults\n- Load(projectDir, userConfigPath) — 6-step: defaults→project→user→env→paths→validate\n- Two-pass ya\n[…]\nCLIPath, WorkerPIDPath, ProjectPathMapping\n- validate: schema_version==1, project non-empty, transport enum, DefaultAction enum\n- Table-driven tests covering REQ-CFG-01..05, REQ-PRV-02, ADR-D2, ADR-D7",
          "is_bot": false,
          "headline": "feat(config): new internal/config package with Load, merge, env overl…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-26T02:14:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cde2359a446f1a5cd24f2eaaa161337d7508743b",
          "body": "…smoke test, 100k benchmark",
          "is_bot": false,
          "headline": "test(tui): unit tests for all tabs, golden layout snapshots, teatest …",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-23T03:22:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "262ffd3980860634f7565dfe7aa333e561e940ce",
          "body": "…ider health and sync actions",
          "is_bot": false,
          "headline": "feat(tui): conflicts tab with w/l/s keybindings; status tab with prov…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-23T03:22:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c1510d0872165eccd905a96af41df2f1ea0c791",
          "body": "…r render, OSC52 clipboard",
          "is_bot": false,
          "headline": "feat(tui): observations tab with filterable list, detail pane, glamou…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-23T03:22:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ac98bbf114e95590a473dfbfc205782167f562b",
          "body": "…ub-models",
          "is_bot": false,
          "headline": "feat(tui): lazy-index loadRecords with LazyRecord type; remove stub s…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-23T03:22:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25d11f72c77a75102e2e450dc60dbd68e4023071",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps): add glamour and teatest direct dependencies for PR-3",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-23T03:22:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d37c86770b44d82fc1472a516a2e2f7993198426",
          "body": "…ort, nil-runner panic, vacuous test",
          "is_bot": false,
          "headline": "fix(tui): pointer-receiver sub-models, callStatusJSON guard, stable s…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-23T02:54:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11f181ded8530705475fbc35bc5ddbec978786a5",
          "body": "data_test.go: 9 table-driven cases covering collapse, skip-deleted, blank\nlines, future-schema, empty store, conflict parsing, missing index, and\ncallStatusJSON with injected fake runner (circular-exec guard per tasks risk).\nexec_test.go: 6 cases asserting argv for sync/pull/push/resolve variants\nan\n[…]\n on success and failure — no real subprocess.\nmodel_test.go: 12 cases for tab switching, quit (q/ctrl+c), window sizing,\noverlay install/dismiss, syncDoneMsg handling, and View rendering. (T-12..T-14)",
          "is_bot": false,
          "headline": "test(tui): unit tests for data loader, exec runner, and root model",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-23T02:47:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c7c9ccd567a9c5e5d4b23517ef7b3b0a4da9fd48",
          "body": "Both commands resolve projectDir, verify store exists, then launch\ntea.NewProgram(tui.New(dir), tea.WithAltScreen()). rootCmd registration\ndone in init() — no-args path still prints help and exits 0 (D4, REQ-TUI-01).",
          "is_bot": false,
          "headline": "feat(cmd/tui): register tui and ui cobra commands",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-23T02:47:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5538503bce3dc924d9c9b2dcb0ea1a3e5074f9dd",
          "body": "Root Model owns tab enum (tabObs/Conflicts/Status/Help), WindowSizeMsg\npropagation to all sub-models, global key dispatch (O/C/S/?/q/ctrl+c),\nsync overlay modal (overlayModel with spinner), and syncDoneMsg handling.\nSub-models are stubbed (obsModel, conflictModel, statusModel, helpModel)\nwith the subModel interface contract for PR-3 to fill in. (REQ-TUI-05, D7)",
          "is_bot": false,
          "headline": "feat(tui): add root bubbletea Model with tab routing and overlay system",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-23T02:46:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a62a04f257e2abb6616fea6f756158fcb9fac5cb",
          "body": "- styles.go: lipgloss token set for neutral theme (D6, REQ-DEFER-05)\n- data.go: loadRecords (bufio.Scanner collapse), loadIndexFile, callStatusJSON\n  with injectable commandRunner to avoid circular test execution (T-13 risk)\n- exec.go: syncCmd tea.Cmd with injectable execRunner interface (REQ-TUI-10)",
          "is_bot": false,
          "headline": "feat(tui): add styles, data loader, and exec subprocess runner",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-23T02:46:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1047b331c1aac6b8c001ea5bcbe8f012e2fd5dbc",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps): add charmbracelet TUI dependencies to go.mod",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-23T02:46:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a843ad6e978433414547eb5d5fcb2d2bbfac988",
          "body": "… tags",
          "is_bot": false,
          "headline": "fix(cmd/status): align --json exit codes and add ConflictSummary JSON…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-23T00:50:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bda23796dcb4e451db737f9c93ee350b06bf36a8",
          "body": "Adds bubbletea, bubbles, lipgloss, glamour, and teatest to go.mod so\nPR-2 (internal/tui core) can be compiled without a separate go get step.\nModule graph resolved bubbletea to v1.3.5 and lipgloss to v1.1.0 (patch\nbumps from the pinned versions; no API breakage).",
          "is_bot": false,
          "headline": "chore(deps): add charm TUI dependencies for PR-2 compilation",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-23T00:47:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5a2da3d25aaafb941207e14928d9a6effa8de57",
          "body": "Emits a single JSON object with provider_health, conflicts, sync_state,\nline_count, file_size_bytes, and schema_version. Exit codes mirror the\nhuman-readable path (0 healthy / 1 degraded / 2 conflicts). Satisfies\nD9 and REQ-TUI-08 so the TUI Status tab can shell out status --json.",
          "is_bot": false,
          "headline": "feat(cmd/status): add --json flag for machine-readable status output",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-23T00:47:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0139b6f3101d1c46a6f90b68810eece9c9e77cf",
          "body": "Exports StoreStats struct (LineCount, FileSizeBytes, SchemaVersion)\nand package-level Stats(rootDir) that reads index.json + os.Stat\nwithout acquiring the advisory lock, satisfying REQ-TUI-03 / D2.",
          "is_bot": false,
          "headline": "feat(store): add lock-free Stats() for TUI backend",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-23T00:45:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef05f0f0976b7c5a99f368517c5e99ea9f019b33",
          "body": null,
          "is_bot": false,
          "headline": "feat(sync): resolve command, conflicts table, exit-code 2 polish (PR-E)",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-22T11:37:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2dfa4a57322fbf3daddbfc9f168bdbe4a06111ab",
          "body": "…urable push watermark\n\nbuildSyncEngine constructed adapters with nil transports, so the\nengram Health check nil-panicked and `wrapper-mems sync` crashed at\nruntime. Wire NewExecCommander/NewHTTPTransport for engram and\nNewHTTPTransport for claude-mem.\n\nThe engram update-gap SKIP warning (D9) was un\n[…]\nThe push watermark advanced over every processed record, including\nones a partial AppendBatch did not commit. Track maxUpdatedAt only\nover durably committed records so uncommitted records are retried.",
          "is_bot": false,
          "headline": "fix(sync): wire real adapter transports, reachable update-gap skip, d…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-22T11:33:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bfaff533875f8ce505ea76ae3b8635f05e9133aa",
          "body": "…s, and tests (PR-D)",
          "is_bot": false,
          "headline": "feat(cmd,sync): sync CLI wiring with pull/push subcommands, exit code…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-22T11:28:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64af4b5437a46fcca57b9254501357346b277355",
          "body": "…contracts (PR-D)",
          "is_bot": false,
          "headline": "feat(sync): implement push, pull, mirror flows; extend adapter/store …",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-22T11:28:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c413218a5c932fc014494c374aaea9e0cd7f76a",
          "body": "main() hardcoded exit 1, so a future command returning errConflicts\nwould get exit 1 instead of 2. Export ExitCode and use it in main so\nthe D6 exit-code mapping applies to every command.\n\nThe show --kind/--type doc claimed OR semantics; the implementation\nAND-s the filters (the conventional narrowing behaviour). Fix the doc\nto match.",
          "is_bot": false,
          "headline": "fix(cli): route exit codes through ExitCode, correct show filter docs",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-22T11:17:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "28e5dc80473c71667f38371b9741b065db9df85f",
          "body": "Introduces cmd/wrapper-mems entrypoint and the cobra command tree:\nroot with persistent flags and exit-code handling, init (idempotent\nstore bootstrap + config.yaml + .gitignore), status (provider health\nand watermarks), show (table/JSON rendering with kind/type filters),\nand a build command for index rebuild. sync is registered as a\nplaceholder pending PR-D.",
          "is_bot": false,
          "headline": "feat(cli): add cobra skeleton with init, status, show commands",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-22T11:14:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b206456f687d9c302d3f343ed04c3401d4ad4a5f",
          "body": "Supporting changes for the CLI layer: Store.ListLive for the show\ncommand's read path, ConfigFilename constant for init, and an exported\nConflictSummary type so cmd packages can render conflict state.",
          "is_bot": false,
          "headline": "feat(store,sync): add ListLive, ConfigFilename, export ConflictSummary",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-22T11:14:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ee0f91b18e23f975c4bed05816f5f462c22838b",
          "body": "…micity\n\nThe \"Both tags nil\" test case actually exercises a-has-tags/b-nil;\nrename it to match. Document that watermark read-modify-write is not\natomic and callers must serialize per-provider writes.",
          "is_bot": false,
          "headline": "fix(sync): correct equal_test case name, document watermark write ato…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-22T01:08:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "daf3f02223930a0b657dd125bfcfed67faf7a263",
          "body": "…R-B)\n\n- internal/sync/config.go: Config struct, Load(), Default() (T-16)\n- internal/sync/report.go: ProviderResult, RunReport, StatusReport, WriteSummary (T-17)\n- internal/sync/equal.go: recordsEqualIgnoringMetadata, tagsEqual (T-18)\n- internal/sync/state.go: read/write watermark helpers wrapping s\n[…]\nSync stubs, Status, Resolve (T-20..T-24)\n- internal/store/store.go: export ReadLineAtOffset for Resolve offset access\n- Tests: equal_test.go, config_test.go, engine_test.go, state_test.go (T-25..T-27)",
          "is_bot": false,
          "headline": "feat(sync): Engine skeleton, equal, config, state helpers, Resolve (P…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-22T01:04:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f00579918eea296c9220402ac7617cec1cfd042e",
          "body": "rebuildFromFile cannot reconstruct SyncState since it has no\nrepresentation in memory.jsonl. Carry provider watermarks forward\nin Rebuild so UpdateSyncState writes survive an index rebuild.\n\nAlso document why the conflict-group sort omits the revision term.",
          "is_bot": false,
          "headline": "fix(store): preserve SyncState across Rebuild",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-22T00:48:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "751932d704d59ad0d6e48eb76ce64f203b171924",
          "body": "…PR-A)\n\n- Add ErrCorrupt and ErrSchemaMismatch sentinels to errors.go; ErrSchemaTooNew\n  now wraps ErrSchemaMismatch so errors.Is works for both.\n- Add ProviderSyncState, ConflictEntry, ConflictDuplicate types to index.go;\n  extend index struct with SyncState and Conflicts fields (backward-compatibl\n[…]\ne ErrCorrupt into index parse failure and scanner errors; ErrSchemaMismatch\n  into schema version drift path.\n- Table tests for all new code; regression coverage for rebuild.go (96 total, 0 failures).",
          "is_bot": false,
          "headline": "feat(store): sync-state schema, conflict detection, sentinel errors (…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-22T00:35:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4b38c7f099220f998fcee587d5356f3495f1acc0",
          "body": "…hape\n\nReworks claudeMemRecord, ToCanonical, ListNative, ReadNative, and\ntransport.GetByID against the field shape verified live against the\nclaude-mem v13 worker on 2026-05-20.\n\nStruct changes (verified shape):\n- ID is int64 (was string) — primary hard-break in provisional struct\n- MemorySessionID,\n[…]\nst live worker\n- GATE VERDICT: DISCHARGED (was FAILED in obs #82)\n\nAll tests green:\n- 60 unit tests pass\n- 3/3 integration tests pass against live worker\n- go vet clean (default and -tags=integration)",
          "is_bot": false,
          "headline": "fix(adapter/claudemem): discharge pre-merge gate with verified live s…",
          "author_name": "AgustinCastanol",
          "author_login": "AgustinCastanol",
          "committed_at": "2026-05-20T03:43:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 7,
      "commits_last_year": 116,
      "latest_release_at": "2026-06-14T02:52:08Z",
      "latest_release_tag": "v1.4.0",
      "releases_from_tags": false,
      "days_since_last_push": 38,
      "active_weeks_last_year": 4,
      "days_since_latest_release": 38,
      "mean_days_between_releases": 3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/agustincastanol/glia",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/agustincastanol/glia",
          "is_deprecated": false,
          "latest_version": "v1.4.0",
          "repository_url": "https://github.com/agustincastanol/glia",
          "versions_count": 7,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-06-14T00:20:27Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 38
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 1,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [
          {
            "date": "2026-06-04",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_stars": 1
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 62044,
      "source_files_sampled": 114,
      "oversized_source_files": 1,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/cespare/xxhash/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.3.0"
        },
        {
          "name": "github.com/charmbracelet/bubbles",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.20.0"
        },
        {
          "name": "github.com/charmbracelet/bubbletea",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.5"
        },
        {
          "name": "github.com/charmbracelet/glamour",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.0"
        },
        {
          "name": "github.com/charmbracelet/lipgloss",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.1-0.20250404203927-76690c660834"
        },
        {
          "name": "github.com/charmbracelet/x/exp/teatest",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20260519012233-798e623c8447"
        },
        {
          "name": "github.com/gofrs/flock",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.13.0"
        },
        {
          "name": "github.com/oklog/ulid/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.1.1"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.1"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        }
      ],
      "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": 15,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "AgustinCastanol",
          "commits": 116,
          "avatar_url": "https://avatars.githubusercontent.com/u/65740891?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 5,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "5 out of 5 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/26 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "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": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file 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": "13 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "3bfb974705bd79955295ba45c6bc5a792c8c1b34",
        "ran_at": "2026-07-22T05:42:35Z",
        "aggregate_score": 3.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-06-14T03:32:32Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-06-14T03:32:05Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/AgustinCastanol/glia",
    "host": "github.com",
    "name": "glia",
    "owner": "AgustinCastanol"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 50,
      "inputs": {
        "security": 35,
        "vitality": 59,
        "community": 24,
        "governance": 52,
        "engineering": 71
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 59,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "at_risk",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 39,
            "inputs": {
              "commits_last_year": 116,
              "human_commit_share": 1,
              "days_since_last_push": 38,
              "active_weeks_last_year": 4
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 38 days ago",
                "points": 18,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 38
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "4/52 weeks with commits",
                "points": 2.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "116 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 116
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 7,
              "latest_release_tag": "v1.4.0",
              "releases_from_tags": false,
              "days_since_latest_release": 38,
              "mean_days_between_releases": 3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "7 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 38 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 38
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "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": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 52,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 15,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "15/15 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 15,
                      "decided": 15
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/26 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 44,
            "inputs": {
              "followers": 1,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "AgustinCastanol",
              "public_repos": 28,
              "account_age_days": 2252
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "1 followers of AgustinCastanol",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1,
                      "login": "AgustinCastanol"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "28 public repos, account ~6 yr old",
                "points": 22.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 28
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/agustincastanol/glia"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 38
            },
            "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 38 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 38
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "7 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "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": 71,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "5 out of 5 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": 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": 35,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 35,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3.5
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection is not maximal on development and all release branches",
                "points": 3.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "5 out of 5 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/26 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "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": "13 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": "moderate",
        "name": "AI Readiness",
        "value": 58,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.99,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "99 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go.mod"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "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": 62044,
              "source_files_sampled": 114,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/114 source files over 60KB",
                "points": 54.5,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 114,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T05:42:43.748198Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/AgustinCastanol/glia.svg",
  "full_name": "AgustinCastanol/glia",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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