Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-26 02:23 UTC

tae2089 / code-context-graph

Vectorless code retrieval for AI coding agents — search code by business intent (@intent, @domainRule) over a Tree-sitter graph. Built for MSA via MCP.

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

tae2089/code-context-graph tiene un índice de salud de 56 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (77/100) y la más baja, Security (34/100). Se actualizó por última vez hace 6 días. Una sola persona concentra la mayor parte del trabajo reciente.

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

56
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

taebin limCuenta personal
114 seguidores144 repositorios públicosdesde sept 2018

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ónEtiquetas
Gogithub.com/tae2089/code-context-graphv0.12.0-38hace 6 días
npmcode-context-graph0.12.0188530hace 6 díascode-analysisknowledge-graphtree-sittermcpcypherapache-ageannotations

Métricas por categoría

Vitalidad

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

77Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 6 días
4.8/36Cadencia de commits — 7/52 semanas con commits
18/18Volumen de commits — 694 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year694
human_commit_share1
days_since_last_push6
active_weeks_last_year7
Cómo se puntúa
27/27Publica versiones — 30 versiones publicadas
36/36Recencia de las versiones — última versión hace 6 días
27/27Cadencia de publicación — una versión cada ~8,3 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count30
latest_release_tagv0.12.0
releases_from_tagsno
days_since_latest_release6
mean_days_between_releases8,3

Comunidad y Adopción

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

39En riesgo · 18% del índice global
Cómo se puntúa
19.1/60Estrellas — 16 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars16
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
43.7/80Descargas mensuales — 1885 descargas/mes en go, npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesgithub.com/tae2089/code-context-graph, code-context-graph
dependents
ecosystemsgo, npm
total_downloads
monthly_downloads1885
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

57Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
37/38.3Aceptación de PR — 30/31 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/14 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs30
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs1
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
14.8/25Alcance del propietario — 114 seguidores de tae2089
25/25Trayectoria — 144 repos públicos, cuenta de ~7 años
Datos de entrada utilizados
followers114
owner_typeUser
is_verified
owner_logintae2089
public_repos144
account_age_days2865
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 — 2 paquete(s) en go, npm
35/35Recencia de publicación — última publicación hace 6 días
20/20Historial de versiones — 38 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/tae2089/code-context-graph, code-context-graph
ecosystemsgo, npm
any_deprecatedno
min_days_since_publish6

Calidad de Ingeniería

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

65Moderado · 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 — 6 out of 6 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

Documentación

60Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
10/10Topics — 15 topics
10/10Wiki
Datos de entrada utilizados
topicsagent-skill, ai-coding, claude, claude-code, go, golang, incremental, knowledge-graph, llm, mcp, tree-sitter, code-context, code-search, codex, model-context-protocol
has_wiki
homepage
has_readme
has_docs_dirno
has_description

Seguridad

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

34En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 6 out of 6 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/14 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
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
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 45 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3,4

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.

72Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 84 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,84
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes8690
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — web/wiki/tsconfig.json
10/10Entorno reproducible — Dockerfile, lockfile
10/10Práctica demostrada con agentes — 54 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum, package-lock.json
has_dockerfile
typed_language
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configsweb/wiki/tsconfig.json
agent_commit_share0,54
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
54.1/55Tamaños de archivo manejables — 5/305 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes181.773
source_files_sampled305
oversized_source_files5
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
20/20Servidor MCP
0/40Ejemplos ejecutables
Datos de entrada utilizados
example_dirs
has_mcp_signal
api_schema_files

Datos clave

16estrellas de GitHub
1contribuidores
694commits en los últimos 12 meses
6días desde el último push
30versiones publicadas
1factor bus
0issues abiertas
Go, npmecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 3.4 / 10
3.4agregado

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-26 02:23 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests6 out of 6 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/14 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
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
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities45 existing vulnerabilities detected
Dependencias directas 15
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/go-git/go-git/v5v5.17.2go.mod
Gogithub.com/golang-migrate/migrate/v4v4.19.1go.mod
Gogithub.com/mark3labs/mcp-gov0.47.1go.mod
Gogithub.com/smacker/go-tree-sitterv0.0.0-20240827094217-dd81d9e9be82go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogithub.com/spf13/viperv1.21.0go.mod
Gogithub.com/tae2089/tracev1.0.2go.mod
Gogo.opentelemetry.io/otelv1.38.0go.mod
Gogo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttpv1.38.0go.mod
Gogo.opentelemetry.io/otel/sdkv1.38.0go.mod
Gogo.opentelemetry.io/otel/tracev1.38.0go.mod
Gogo.yaml.in/yaml/v3v3.0.4go.mod
Gogorm.io/driver/postgresv1.6.0go.mod
Gogorm.io/driver/sqlitev1.6.0go.mod
Gogorm.io/gormv1.31.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": [
        "agent-skill",
        "ai-coding",
        "claude",
        "claude-code",
        "go",
        "golang",
        "incremental",
        "knowledge-graph",
        "llm",
        "mcp",
        "tree-sitter",
        "code-context",
        "code-search",
        "codex",
        "model-context-protocol"
      ],
      "is_fork": false,
      "size_kb": 13022,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 2597020,
        "CSS": 6177,
        "HTML": 295,
        "Shell": 39383,
        "PLpgSQL": 4685,
        "Makefile": 3204,
        "Dockerfile": 916,
        "JavaScript": 6818,
        "TypeScript": 66800,
        "Tree-sitter Query": 10778
      },
      "pushed_at": "2026-07-19T02:51:51Z",
      "created_at": "2026-04-12T13:04:21Z",
      "owner_type": "User",
      "updated_at": "2026-07-25T11:06:43Z",
      "description": " Vectorless code retrieval for AI coding agents — search code by business intent (@intent, @domainRule) over a Tree-sitter graph. Built for MSA via MCP.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": "taebin lim",
      "type": "User",
      "login": "tae2089",
      "company": null,
      "location": "Seoul, Korea",
      "followers": 114,
      "avatar_url": "https://avatars.githubusercontent.com/u/43431864?v=4",
      "created_at": "2018-09-20T05:44:49Z",
      "is_verified": null,
      "public_repos": 144,
      "account_age_days": 2865
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-07-19T02:55:40Z"
        },
        {
          "tag": "v0.11.5",
          "kind": "patch",
          "published_at": "2026-07-18T15:19:58Z"
        },
        {
          "tag": "v0.11.4",
          "kind": "patch",
          "published_at": "2026-07-18T07:37:33Z"
        },
        {
          "tag": "v0.11.3",
          "kind": "patch",
          "published_at": "2026-07-16T09:17:40Z"
        },
        {
          "tag": "v0.11.2",
          "kind": "patch",
          "published_at": "2026-07-16T08:25:46Z"
        },
        {
          "tag": "v0.11.1",
          "kind": "patch",
          "published_at": "2026-07-15T23:29:40Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-07-15T14:34:43Z"
        },
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2026-07-14T04:19:30Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-07-11T08:49:33Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-05-05T12:24:40Z"
        },
        {
          "tag": "v0.8.5",
          "kind": "patch",
          "published_at": "2026-04-19T12:18:25Z"
        },
        {
          "tag": "v0.8.4",
          "kind": "patch",
          "published_at": "2026-04-19T11:54:57Z"
        },
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2026-04-19T06:43:02Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-04-19T06:10:49Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-04-19T06:09:29Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-04-19T04:44:08Z"
        },
        {
          "tag": "v0.7.6",
          "kind": "patch",
          "published_at": "2026-04-19T02:13:04Z"
        },
        {
          "tag": "v0.7.5",
          "kind": "patch",
          "published_at": "2026-04-19T02:08:29Z"
        },
        {
          "tag": "v0.7.4",
          "kind": "patch",
          "published_at": "2026-04-18T02:53:12Z"
        },
        {
          "tag": "v0.7.3",
          "kind": "patch",
          "published_at": "2026-04-18T02:41:15Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2026-04-18T02:32:44Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-04-15T05:06:30Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-04-15T04:12:27Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-04-14T09:44:19Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-04-14T00:31:15Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-04-14T00:13:09Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-04-14T00:12:09Z"
        },
        {
          "tag": "v0.5.4",
          "kind": "patch",
          "published_at": "2026-04-12T14:19:22Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2026-04-12T14:03:57Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-04-12T13:49:13Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "ec7252f872c4b12656de4fc8831bf549cb72a753",
          "body": "SyncNamespace issued one ResolveCCGRef round-trip per @see tag and per\ninbound row, although many rows share the same (namespace, path,\nsymbol) target — comment binding alone duplicates every ref across the\nfunction and file node. Memoize matcher outcomes per distinct target\nfor the duration of one \n[…]\no stays valid across the\noutbound and inbound phases because a sync pass rewrites only\ncross_refs rows, never the node tables the matcher reads.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf: resolve each distinct cross-ref target once per sync pass",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-19T02:50:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b6dba0f12e37b8e1b0e72a8efc4af80f282e1f7b",
          "body": "Flow memberships were stamped with the start namespace, so members\nreached through a cross_ref edge carried an unusable label and clients\ncould not resolve foreign node ids. The tracer now batch-loads member\nnodes when the reader supports it and stamps each membership with the\nnode's stored namespac\n[…]\node, keeping single-namespace payloads unchanged. The\npersisted-flow rebuild path is unaffected because FlowRebuildStore has\nno batch node read.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: label cross-namespace trace_flow members with their real namespace",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-19T02:44:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b725e3eede0e3d8db9df7fe5d9dc482d6665e248",
          "body": "The caller's limit was applied to the globally reranked merged pool, so\none namespace with high-scoring hits could push every other namespace\nout of the response entirely. Rank globally without truncation, then\nselect with a per-namespace quota (limit/namespaces, minimum one) and\nfill the remaining slots in global rank order.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: guarantee per-namespace representation in federated search results",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-19T02:44:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5d2530b92a90e806d168982b1ba73ef218c487c0",
          "body": "Add Phase 13: push a ccg:// annotation from sample-go targeting\nsample-calc through the real Gitea webhook pipeline, then assert\nlist_cross_refs (outbound resolved + inbound), cross-namespace impact\nradius with namespace labels, default namespace-scoped impact, and\nfederated search labeling — all ag\n[…]\nuse wait_for_webhook_sync\nreturns as soon as a namespace has any nodes, which is immediate on a\nre-push. Banner updated to 16/18 verified tools.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: verify cross-namespace refs in Postgres integration suite",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-19T02:44:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5d7b9d08726a44301e5b9399089840fab587fa63",
          "body": "The multi-owner collision guard added in 5404e24 rejects wildcard\nowners in --allow-repo, so the integration compose file's '*/*' rule\nmade ccg-server refuse to start and the suite fail before any test\nphase. Pin the rule to the suite's Gitea admin account (testadmin/*)\nand ignore the suite's default artifacts/ output directory.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: unbreak Postgres integration suite allow-repo config",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-19T02:44:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3f5c2b8fdae316216a9bcce5729ce105fa20f69d",
          "body": "Remove leftover // test comment after the import block in\ninternal/app/analyze/ports.go that failed gofmt's blank-line\nseparation. Comment-only change; gofmt now passes and\ninternal/app/analyze tests are green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: remove stray test comment in analyze ports.go",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-19T02:44:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d4113821f72847c1fc3692451b4643e40a151539",
          "body": "…refs\n\nUpdate English and Korean guides (mcp-tools, annotations, architecture,\ncounts in README/development/runtime-layout), CLAUDE.md, and the\nccg-analyze / ccg-namespace skills for the new cross-namespace surface.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: document cross-namespace refs, federated reads, and list_cross_…",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-19T02:44:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "20ce212b8ae2c193b73455f066228050d02bebd7",
          "body": "Add a namespace-agnostic CrossNamespaceReader that reads nodes and\nedges by globally-unique id and merges resolved cross_refs rows into\ntraversal as synthetic cross_ref edges. Existing BFS and flow-trace\nalgorithms run unchanged on top of it.\n\n- get_impact_radius and trace_flow accept cross_namespac\n[…]\n18.\n- The synthetic cross_ref edge kind is never persisted; the flow tracer\n  accepts it as a continuation because regular stores never emit it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: cross-namespace impact/flow analysis and list_cross_refs tool",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-19T02:44:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "13b4a7c068af5d4dab8923b5dddfe438fc07fb0d",
          "body": "… across namespaces\n\nAdd an optional 'namespaces' array parameter to the four read tools.\nFederation fans out per namespace at the handler level so every store\nquery path keeps its single-namespace invariant:\n\n- search merges per-namespace candidate pools, reranks once, and labels\n  each item with i\n[…]\nor instead of failing the call.\n- list_graph_stats and search_docs return per-namespace groups without\n  merging counts across unrelated graphs.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: federate search, query_graph, list_graph_stats, and search_docs…",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-19T02:44:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e9b5edbc95ba674570f72b565fd4a3de1871a873",
          "body": "Add a cross_refs table (migration 000015, SQLite and PostgreSQL) that\nstores every @see ccg://{namespace}/{path}#{symbol} annotation tag as a\nqueryable row with a symbolic target plus derived resolution state\n(resolved_node_id, status resolved|dead, source annotation).\n\nA new crossref.Service syncs \n[…]\nree. Namespace-scope\nrefs resolve without a node target; path-scope refs prefer the file\nnode; malformed refs are skipped (lint owns reporting).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: materialize ccg:// annotation refs into cross_refs",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-19T02:44:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "12247a006b8202b75e4a3c17738efc22cedd5aca",
          "body": "Pull the node-matching query into ccgRefNodeQuery so lint validation and\nthe upcoming cross-ref materialization judge ccg:// targets identically.\nNo behavior change.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: extract shared ccg ref matcher from CCGRefExists",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-19T02:44:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b678d8757d844e68c66a5c0aba926457dc7b70d0",
          "body": null,
          "is_bot": false,
          "headline": "feat: apply repository excludes to webhook sync",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-18T15:14:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e14a16b05ea0933eabef67001faa61c67c004eb",
          "body": null,
          "is_bot": false,
          "headline": "Remove commented test line in ports.go",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-18T11:25:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e612312b809a906825e26b807a5c1cdf14d096d",
          "body": null,
          "is_bot": false,
          "headline": "perf: reuse release artifacts for container images",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-18T07:03:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5404e24cdf0743560b990de100838b438672a54e",
          "body": null,
          "is_bot": false,
          "headline": "fix: address code review safety findings",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-17T00:21:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b50d214f0a6e0e5845f109d017845740f97f952",
          "body": null,
          "is_bot": false,
          "headline": "fix: store graph strings as text",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-16T09:09:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f2ddb77a8ca743cbb29a02e77ec1b3b2c7a5327",
          "body": null,
          "is_bot": false,
          "headline": "test: target postgres migration downgrade versions",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-16T09:08:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0cbde4750b6c750d23838184df9c6b2f376c359e",
          "body": null,
          "is_bot": false,
          "headline": "test: retain reposync queue start signals",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-16T08:19:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b38c7460a690bce730ad40f35a1e6b7a0c4a8bec",
          "body": null,
          "is_bot": false,
          "headline": "perf: batch PostgreSQL graph persistence",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-16T08:19:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8486b25ab7f939ae73b290550109de00848ebdb6",
          "body": "Reuse versioned parse results and unresolved candidates during builds and updates. Batch flow traversal and reduce resolver allocation churn for large Kotlin corpora.",
          "is_bot": false,
          "headline": "perf: cache parsing and batch graph updates",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-16T08:19:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2210713b1e5e0b70d9a9a58f8688b975f7053c0d",
          "body": null,
          "is_bot": false,
          "headline": "fix: rebuild updates for new packages",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-16T08:19:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e71608c7fa0d17e6aac00204c970af2f735dae34",
          "body": null,
          "is_bot": false,
          "headline": "fix: resolve implements before staged calls",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-16T08:19:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e17100d0817bcaea258494eb185aef25b8f8f7d3",
          "body": null,
          "is_bot": false,
          "headline": "perf: replay deferred build edges from spool",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-16T08:19:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30b99946eb00a88dd1dbf28dddc14a27515fa459",
          "body": null,
          "is_bot": false,
          "headline": "refactor: stream edge resolution from repeatable sources",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-16T08:19:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b1ed6b5c9627bf4581b5186faf93b4eddcc139b",
          "body": null,
          "is_bot": false,
          "headline": "perf: batch node persistence during builds",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-16T00:57:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "701b3bc7970944ffa15a04717c3375ddf2904df4",
          "body": null,
          "is_bot": false,
          "headline": "perf: reconcile bulk updates before resolving edges",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-16T00:57:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50af5106bbdb48b5099143be8f982dd9cc9f3803",
          "body": null,
          "is_bot": false,
          "headline": "perf: optimize large graph builds",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-15T23:04:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c9bb5f19bb8f05938047a6cf0cef0f705e843fc",
          "body": null,
          "is_bot": false,
          "headline": "feat: publish container images to GHCR",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-15T12:52:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1e4fcece9c0e0daee2db0c6f9c9ff3588fbcba2",
          "body": "…sertions)\n\nGroup each type with its constructor and methods as a contiguous block\ninstead of scattering methods across the file, and place interface-\nsatisfaction assertions (var _ Iface = (*T)(nil)) directly above the\nmethods they assert rather than at the bottom of the file.\n\nPure structural chan\n[…]\nreen, and the full fts5 test suite passes.\n\nDocuments the convention in guide/development.md (Declaration order) with\na pointer from CLAUDE.md.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: adopt std-lib declaration ordering (cohesion + interface as…",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-14T04:12:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cf813480b6d60bacc039996eac29db1ecd192399",
          "body": "initBareRepo (gitrepo and webhook e2e) created the initial commit on\nwhatever init.defaultBranch resolved to — master on machines where it is\nunset — while the tests request the \"main\" branch, so clone-by-branch\nfailed with `couldn't find remote ref \"refs/heads/main\"`.\n\nPass --initial-branch=main to `git init --bare` so the bare HEAD and\ninitial branch are always main regardless of local git config.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: pin git fixtures to main branch, not machine default",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-14T03:41:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bc152693c873e9e20c1ac8cea45bb0f0c9608e82",
          "body": "Dead code superseded by symbolNodeIDs, which filters file nodes.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: remove unused nodeIDsFrom helper",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-14T02:47:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "953d82dfb06f44747ffa4279bb4b0e48dc232c58",
          "body": "The Twice Rule generated warn-only entries into .ccg/auto-rules.yaml, but\ngenerated rules were action:warn and lint only honors action:ignore, so\nthey never suppressed findings, changed strict pass/fail, or surfaced as\nwarnings. The feature's only observable effect was writing state files,\nwhile add\n[…]\nnd the StateFiles port that\nexisted solely for their state files, the --history-dir and\n--migrate-auto-rules flags, and updates the guide docs.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: remove auto-rules.yaml / Twice Rule lint feature",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-14T02:42:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e75f978e2716a18c849232a19cf0b839c8fd3afa",
          "body": "Add resolveNamespace() so a namespace set only in .ccg.yaml is not masked\nby the --namespace flag's default value. Priority: explicit --namespace\nflag > config namespace > default. Applied across build, docs, lint,\nsearch, status, and update commands, with tests for search and status.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: honor config-file namespace over flag default in CLI commands",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-14T02:26:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ae09de98440322dda31fa204096d56f7ddedfa16",
          "body": null,
          "is_bot": false,
          "headline": "fix: track docs application package",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-12T00:37:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e76601fff056adc17d8814f6f6c596ac4b53b8d1",
          "body": null,
          "is_bot": false,
          "headline": "refactor: reorganize CCG into hexagonal architecture",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-12T00:26:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58caa729e29a6978be695816003af52178577988",
          "body": null,
          "is_bot": false,
          "headline": "refactor: move CCG guidance into agent skills",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T08:25:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07878b4f14f36ffa47da3954773ad3906db740eb",
          "body": null,
          "is_bot": false,
          "headline": "docs: align documentation with current CLI and MCP surface",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T07:39:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bbe21b0f3cc21b64555d24d93123edf5f7516226",
          "body": "…#24)\n\nThe test waited on `len(RecentRepos) > 0`, but a repo is tracked (and thus\npresent in RecentRepos) as soon as processing starts — before the handler\nreturns and the queue records last_error/last_error_time. Under load the status\nsnapshot could be read in that window, so `last_error` came back\n[…]\nainst `last_success_time`.\n\nReproduced reliably with `-race`; fixed test now passes 40x under `-race`.\nProduction sync-queue code is unchanged.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: fix flaky TestStatusHandler_RecentRepos_FailureHasErrorFields (…",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T07:35:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cd6877dc85758503d6be1f0a40007787f593149a",
          "body": null,
          "is_bot": false,
          "headline": "chore: update database configuration to use PostgreSQL",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T07:19:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8349df35441a8ed4bb0712eb4e17238ca22562fc",
          "body": "`ccg index` only regenerated index.md — exactly what `ccg docs` already writes\nas part of full generation. The dedicated command duplicated a slice of docs\ngeneration with no unique capability.\n\n- delete internal/cli/index.go (+ index_test.go) and its root.go registration\n- remove the now-unused doc\n[…]\nrence / namespace-migration / skills docs\n\nVerified with the real binary: `ccg index` is gone (unknown command) and\n`ccg docs` writes index.md.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: remove the `ccg index` command (subset of `ccg docs`) (#23)",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T07:17:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e80f34ed0018365f6eb93c1e1c2e3f95e102c266",
          "body": "…s (#22)\n\nTwo internal APIs were unused in production and exercised only by their own\ntests:\n\n- changes.Analyze (non-paged) + its private helpers sortRiskEntries /\n  computeRiskScores / computeRiskCandidates. Production uses AnalyzePage. The\n  8 test call-sites now go through a small analyzeAll help\n[…]\niew). ragindex.LoadIndex is kept — it\nverifies live wikiindex builder output in tests.\n\nNo behavior change; -150 lines. Independently reviewed.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: remove dead Analyze/PruneTree APIs, migrate tests to live path…",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T07:07:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ab5723e1174ae32ef0c46189fda9c08c19bf0689",
          "body": "Dead internal helpers with zero callers in production and tests, found via\n`deadcode` (scanned against both binaries) and confirmed with git grep:\n\n- incremental.WithResolveOptions — unused SyncerOption constructor\n- treesitter typescriptDeclaredTypeName + collectTypedMembersInto +\n  typedNameAndTyp\n[…]\n ragindex.PruneTree/LoadIndex) are intentionally kept — their tests\nstill exercise them. No behavior change; -96 lines. Independently reviewed.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: remove unreachable internal helper functions (#21)",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T06:52:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fb71f0d1d8d0c8260de687610eb7f064b3b67161",
          "body": "Cleanup of code that became unreachable after earlier tool removals:\n\n- delete internal/mcp/handler_analysis_io.go — decodeListPageRequest,\n  normalizeListPaging, encodePagedListResponse, and pagedListResponse[T]\n  served find_dead_code / find_large_functions / find_suspect_fallback_edges,\n  all rem\n[…]\n\n\nAll removed symbols verified to have zero remaining references (deadcode +\ngit grep, independently reviewed). No behavior change; -492 lines.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: remove dead code left over from trimmed features (#20)",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T06:43:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "73aafb4d4482c433b73b5963a456ce41abf4a939",
          "body": "The webhook clone and gitops e2e tests create bare repos and expect a\n`refs/heads/main` ref. GitHub's ubuntu runner leaves git's default branch at\n`master`, so those tests fail with `couldn't find remote ref \"refs/heads/main\"`\neven though they pass locally. Configure git (default branch + a CI identity)\nbefore running the suite.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: set git init.defaultBranch=main for clone/gitops tests (#19)",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T06:30:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "91a3ba7c67895f85021ea3540e49a697a07aa148",
          "body": "Postprocess steps (stored-flow + search-index rebuild) run on every\nbuild/update; the escalation layer on top of them — auto fail_closed after\nrepeated failures, per-namespace run-log history, and two inspection tools —\nwas operational overhead the project's purpose does not need. Step failures\nare \n[…]\nhe `ccg status` postprocess section (+ --errors/--recent flags)\n- delete guide/postprocess-failure-policy.md (EN + ko) and sweep doc references\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove the automatic postprocess failure-policy machine (#18)",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T06:23:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aba5d3aec113f5d9e6680c9a11d1e6deade06029",
          "body": "find_suspect_fallback_edges reported fallback call edges whose source/target\nannotations don't overlap — a graph-hygiene quality diagnostic in the same\noff-purpose family as the removed dead-code/coupling/coverage analyzers, and its\nFallbackAnalyzer was never wired to a real implementation in produc\n[…]\nd: EdgeKindFallbackCalls, the\n--fallback-calls build/update flag, the ccg status fallback ratio, and\ntrace_flow's fallback metadata all remain.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove the find_suspect_fallback_edges MCP tool (#16)",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T03:49:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c9c012653908bfc884cc70e551e9c7383b950fce",
          "body": "… (#15)\n\nretrieve_docs was search_docs (find relevant docs) + get_doc_content (read one)\ncomposed into a single call, plus opt-in scoring \"explain\" diagnostics agents\nrarely use. It overlapped the core doc-search surface, so drop it and let\ncallers compose search_docs -> get_doc_content.\n\n- remove t\n[…]\niki\nare unchanged — they only ever used the non-explain path, so their behavior is\nbyte-identical (independently reviewed). MCP tools 26 -> 25.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove the retrieve_docs MCP tool; keep search_docs + get_doc_content…",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T03:37:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "73a0b07af58e051de65b4ec46fa5cc7d6caaba71",
          "body": "The namespace file-workspace was a generic base64 blob store (upload/list/\ndelete files under a server root) — a redundant ingestion path next to local\n`ccg build` and webhook clone/pull, and off the project's purpose (annotation +\ngraph + search for code context). Drop it, but keep namespace *disco\n[…]\nhe webhook\n  clone->build pipeline)\n\nPath-traversal and symlink-escape checks are preserved verbatim (independently\nreviewed). Net -2235 lines.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove the file-upload workspace feature; keep namespace discovery (#14)",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T03:35:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "30b57de42a45f17c0a95c253d42563ead12812b6",
          "body": "* Extract identtoken package from searchrank\n\nMove the identifier splitter (camelCase / separator / letter-digit boundaries)\nout of searchrank into a leaf internal/identtoken package so search indexing can\nshare it. Pure structural change: searchrank behavior is unchanged.\n\nCo-Authored-By: Claude Op\n[…]\n; sanitizeTokens now\nderives from it, so exact-name promotion is unchanged.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "camelCase-aware search tokenization (#13)",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T02:59:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c6c930073dd450be80292cd231fb79b2d6f18adc",
          "body": "The CLI `ccg search` and the MCP `search` tool returned FTS candidates in\nraw BM25 order. Introduce internal/searchrank, a dependency-free reranker that\nfuses the FTS rank with two structural signals via Reciprocal Rank Fusion:\n\n- name fuzzy similarity (rune Levenshtein over the whole name and camel\n[…]\nh surfaces over-fetch a wider candidate pool (searchrank.FetchLimit)\nso reranking can promote good matches FTS ranked below the caller's limit.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add structural reranking to code search (#12)",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T02:43:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0dd2b7f34effebd398470900c639018c2611c3af",
          "body": "* Remove the directory-community feature and its MCP tools\n\nModule cohesion (community) was a coarse directory-based rollup with no\neffect on retrieval or relation lookup (edges + ref annotations already\ncover those), and it was the weakest-value feature per its cost. Remove:\n\n- internal/analysis/co\n[…]\nysis_io.go\n- update tests and guide/skill docs to match the reduced tool set\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove the directory-community feature and its MCP tools (#9)",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T02:08:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "480a8c19b3fe3aec4e4689edb5168f04c5b4a630",
          "body": "The pre-commit hook ran \"ccg build .\" — a full re-parse of the entire\nrepo on every commit. A commit only changes a few files, so use\n\"ccg update .\" which re-parses just the changed files (hash-based) and\npreserves existing graph state. Verified with the real binary that\nupdate builds correctly from an empty graph (first commit) and skips\nunchanged files on subsequent runs.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Use incremental update in the pre-commit hook (#6)",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T01:30:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e2d38b3eb32c189fb16af0cfe5f15f777c75634c",
          "body": "* Delete dead tree-retrieval scoring subsystem from ragindex\n\nragindex's Retrieve/RetrieveWithOptions and their ~25-function scoring\nsubsystem (query expansion, whole-word matching, per-bucket scoring,\nmatch capping) had zero callers: retrieve_docs went DB-backed and uses\nonly the ragindex result ty\n[…]\nthat retrieve_docs, search_docs, and the wiki still use. MCP tools: 33 -> 31.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Trim the ragindex RAG builder and dead retrieval scoring (#7)",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T01:30:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "62625746c341c0fc424b39913d990a46c980b05d",
          "body": "* Drop Bounded* analyzer interfaces and their dead fallback branches\n\nBoundedImpactAnalyzer and BoundedFlowTracer were obtained via runtime\ndowncast from the base ImpactAnalyzer/FlowTracer, but the sole concrete\ntypes (*impact.Analyzer, *flows.Tracer) and the test mock all implement\nthe bounded meth\n[…]\n already took the metadata path and\nDeps.Parser was never read outside tests.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Refactor/drop test seams bounded (#5)",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T00:27:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b2df7290cd0b78a2ff12b3e3cc323e11ce202422",
          "body": "…rides (#4)\n\n* Drop Bounded* analyzer interfaces and their dead fallback branches\n\nBoundedImpactAnalyzer and BoundedFlowTracer were obtained via runtime\ndowncast from the base ImpactAnalyzer/FlowTracer, but the sole concrete\ntypes (*impact.Analyzer, *flows.Tracer) and the test mock all implement\nthe\n[…]\nglobal.\nThe production var literally named testBuildBatchReleaseHook is gone.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove test-driven seams: Bounded* interfaces and package-global over…",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T00:16:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bb6d8b57f56df0de95818269d9bd88b95816aa40",
          "body": "PostgresBackend.Migrate hand-wrote the tsvector column, trigger, and GIN\nindex that migration 000001 already creates, with a drift (namespace\nDEFAULT '' vs 'default'), and it created the pg_trgm extension + trigram\nindexes that no production path ever called — so fuzzy search ran without\nits indexes\n[…]\nsion log assertions for v6.\n\nVerified against a live Postgres: migrations create pg_trgm, both trigram\nindexes, and namespace DEFAULT 'default'.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make SQL migrations the single source of the Postgres search schema (#3)",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-11T00:04:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d89de18340b3241fbbd56806216ea64f7d39c98a",
          "body": "indexer.go was 2,456 lines mixing the build pipeline, update pipeline,\nspool, package discovery, search refresh, graph-state loading, and file\nI/O. Move each concern into its own file within the same package:\nbuild.go, update.go, spool.go, packages.go, search.go, graphstate.go,\nfileio.go. indexer.go\n[…]\nes).\n\nPure structural change: no declaration added or removed (114 top-level\ndecls before and after), imports pruned per file, full suite green.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Split indexer.go god file into cohesive service files (#2)",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T22:48:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "21988d548e60cd8a05cf91fdb0e63860a759f280",
          "body": "Community rebuild issued one INSERT per community and one per membership\n(N+1: a namespace with thousands of nodes meant thousands of round\ntrips), and loaded full node rows only to read id/file_path. Use\nCreateInBatches for both community and membership rows and Select only\nthe columns grouping needs.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Batch community and membership inserts during rebuild",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T22:41:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f29ac5bfa9dbb687a6a09dba4a60f0f913262d11",
          "body": null,
          "is_bot": false,
          "headline": "새로운 문서 파일 CLAUDE.md 추가: 코드 분석 도구 및 MCP 서버 기능 설명",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T14:03:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "10008ffa39255e129dc919a0d8208a0ddd050e47",
          "body": "Trim peripheral features, improve search, and fix review findings",
          "is_bot": false,
          "headline": "Merge pull request #1 from tae2089/refactor/trim-peripheral-features",
          "author_name": "taebin lim",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T14:02:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb7bcd8a2c21c8df6758e7efde42fe7049699267",
          "body": "updateGraphWithoutTx (the path taken by the MCP build_or_update_graph /\nparse_project tools, whose injected syncer is not transactional) passed\nthe full existing-file set to the first normal batch. Because\nSyncWithExisting deletes existing files absent from the batch, a\nmulti-record spool deleted fi\n[…]\nntirely when no normal batch ran. Mirror the transactional path: normal\nbatches carry no existing files and deletions run once, unconditionally.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix non-transactional incremental update delete protocol",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T13:41:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "836b70159b47c25f0aec8b735510a8eb8a38ae05",
          "body": "mapDefTypeToNodeKind marked any declaration whose name started with the\nlanguage test prefix as a test node, so a production type TestConfig or a\nfunction testimonialCard (prefix \"test\" + lowercase continuation) was\nmiscategorized, which then excluded it from dead-code analysis and\nchanged its searc\n[…]\nthod\ndeclarations and require a word boundary after a bare-word prefix\n(separator-terminated prefixes like \"test_\" already encode the boundary).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Only classify test-named functions as test nodes",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T13:41:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b05b3aff4e82336cee8efb2c2a5903dcb57bb51b",
          "body": "Delete verified-unused symbols: existingFilesMissingFrom,\nimportPackageNames, rebuildSearch, newParsedBuildEdgeBatch (service);\ncountNonIgnored, lintRuleDoc (cli/lint). Run gofmt -w over the 13\ndrifted files.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove dead code and fix gofmt drift",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T13:24:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8f1ef58e5f52620fb5cf2a0bc4fcc60fddf747ea",
          "body": "- RebuildNodes tests staged a stale tsv via UPDATE, but the BEFORE\n  UPDATE trigger recomputed tsv from content and erased the stale state,\n  failing both tests against a real Postgres. Disable the trigger during\n  staging so RebuildNodes' own SQL is what gets verified.\n- The rapid-push dedup test r\n[…]\n type renamed to\n  migration.MigrationSchemaVersion; the postgres-tagged file no longer\n  compiled (unnoticed because CI never builds that tag).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Repair broken and flaky tests exposed by live-Postgres and load runs",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T13:23:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "54ef7c5cb3c20244b8db5c9c1273ae77f2158717",
          "body": "UpsertAnnotation's lookup was namespace-scoped but its create path was\nnot, so a caller could attach an annotation to another namespace's node\nor to a nonexistent node id. Verify the node belongs to the caller's\nnamespace inside the create transaction.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Enforce namespace ownership on annotation create",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T13:23:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a2782efad3d2de1c238105e55769bcbf077b8c7c",
          "body": "find_suspect_fallback_edges returned an empty zero-value Result with a\nnil error whenever any edge endpoint node was missing, silently hiding\nevery other suspect on the page. Skip edges with missing endpoints.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Skip dangling fallback edges instead of dropping the whole page",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T13:23:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3ab9d099c608ce556f2c703c580f0cfa3713dd06",
          "body": "An explicit namespace:\"default\" resolved files under namespaces/default/\nwhile resolvedRagIndexPath and retrieve_docs treat default as the shared\ndocs root, so the same document was reachable with namespace omitted but\nnot with it spelled out. Route default through the shared branch. Also\ndrop the redundant retrieveDocsFromDB keep-alive var.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Map the default namespace to the shared docs root in get_doc_content",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T13:23:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2b2d3ae88faf5bd1fecb67898d2c3d458d44d233",
          "body": "resolveDocPath listed \".\" among its roots, so /wiki/api/doc and\n/wiki/api/context could read any file under the process CWD (.env,\ngo.mod, source) as a \"doc\". Resolve shared docs against the docs/\ndirectory itself for both relative and absolute paths. Also drop the\norphaned retrieveResult type.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Confine wiki doc API to the docs subtree, not the working directory",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T13:23:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b332f516b593592dc6735970f6564ffd1834c9f3",
          "body": "/status serializes sync-queue repo names, branches, and raw error\nstrings; it was registered without the auth middleware that protects\n/mcp and /wiki/api/. /health and /ready stay open for probes.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Require bearer auth on /status",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T13:23:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "448485d21b4e5db6dd28d9f8ab2d39c34a20d3dd",
          "body": "The caller-supplied base ref of detect_changes/get_affected_flows sat\nbefore \"--\" with no validation, so values like --output=<path> were\nparsed as git diff options. Reject refs starting with '-' and add the\n\"--\" separator to ChangedFiles.\n\nAlso run diff with core.quotePath=false: quoted octal output for\nnon-ASCII paths broke hunk-to-file attribution and file matching.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Block git option injection via base ref and handle non-ASCII paths",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T13:23:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "72bee1e64bb241fc9eecee75c5ab3ed2d6e7b008",
          "body": "- scanDBCandidates now warns when the fallback scan hits scanRowCap, so a\n  silently truncated result set is observable instead of looking complete.\n- Remove the pointless `var ( _ = dbCandidateFloor; _ = dbCandidateCap )`\n  block: both constants are used by DBCandidateLimit.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Log fallback-scan truncation and drop dead blank-assignment block",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T12:53:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "61a01fe4ac3c2e6d6433d7cee391450be5aebbd6",
          "body": "Address code-review findings on the fuzzy fallback:\n\n- Use the index-accelerated `<%` operator (rewritten to `%>`, which\n  gin_trgm_ops supports) instead of `word_similarity(?, col) >= const`,\n  which can never use the trigram indexes. Confirmed via EXPLAIN that the\n  operator form yields a Bitmap I\n[…]\n  operator cutoff matches the tuned value; log real failures at Warn while\n  still degrading gracefully, and do not log on context cancellation.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make pg_trgm fuzzy indexable, precise, and corpus-scoped",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T12:53:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a610422cc52b4f986de6c4d442fa03fb968a570e",
          "body": "The symlink-walk, canonicalization, and Rel-based containment mechanics\nwere duplicated across namespacefs and the docs/analysis/parse MCP\nhandlers. Extract the three genuinely-shared primitives —\nEnsureNoSymlinkInPath, Canonical(path, allowMissingLeaf) (merging the\nformer canonicalPath/canonicalExi\n[…]\ns: merging them would change\nsecurity behavior. Structural change only; all handler path-traversal and\nsymlink-escape tests unchanged and green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Extract shared path-safety mechanics into internal/safepath",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T12:40:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dcf4c54a9f09da27cdccd1df3cd8c12f8b3fc6b3",
          "body": "Exact tsquery cannot match misspelled queries. When tsquery underfills\nthe requested limit, supplement with pg_trgm trigram similarity on\nnodes.name / nodes.qualified_name so typos still return candidates.\n\nThe extension and its GIN indexes are created best-effort in Migrate:\nif pg_trgm is unavailab\n[…]\nrch.\n\nBehaviorally validated only against a live Postgres via the postgres\nbuild tag (TEST_POSTGRES_DSN); not exercised by the default/CI suite.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add pg_trgm fuzzy symbol fallback to Postgres search",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T12:27:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8390f073ac5c0ccfb9e699c9f30baa1a0a89ee18",
          "body": "FTS/ts_rank candidate order was discarded and results were sorted purely\nby the hand-tuned annotation score, so a high-scoring scan supplement\ncould bury a genuine search-engine hit. Capture each file's search-engine\nrank before the scan merge and sort engine-first: backend hits keep their\nrelevance order and outrank scan-only supplements, with the annotation\nscore as the refining tie-break.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Rank search-engine hits above scan supplements in retrieve_docs",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T12:14:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "444d0d290c7f9a6af31e488407c152cf774f69e3",
          "body": "The DB-scan fallback fired whenever FTS returned fewer distinct files\nthan the wide candidate ceiling (50-500), which is nearly always, making\nretrieval O(namespace size) instead of O(matches). Gate the scan on the\ncaller's actual result limit so it only supplements genuinely sparse-FTS\nqueries, and cap the fallback load at scanRowCap to bound worst cases.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Stop full-namespace scan on every retrieve_docs query",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T12:10:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0c2e9a966ba7a34634389029208ac23c09065b37",
          "body": "CI previously ran only vet + builds; the Go test suite was never\nexercised. Add a fts5-tagged test step so regressions are caught.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: run go test in CI",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T12:10:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "98456ad63112eedb938071db86e65f6924cd5738",
          "body": "Trim dev-only feature surface to lighten the tool. The benchmark and\neval packages are self-contained harnesses (benchmark shells out to the\nexternal claude CLI; eval compares golden corpora) reachable only from\ntheir own CLI commands. docker-compose.langfuse.yaml was orphaned\nobservability infra re\n[…]\no build target or code.\n\nDrops the two cobra registrations and the test helpers orphaned by the\ndeleted tests. No core build/query path touched.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove benchmark/eval harnesses and orphaned langfuse compose",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-07-10T12:10:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a5e8a489f194ea9e34eb36b614dd56a08700e401",
          "body": "…nifest support and add tests for foreign document handling",
          "is_bot": false,
          "headline": "Lint improvements: enhance document file collection with namespace ma…",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T13:17:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "baee53eca4fd1e5942866f1cb87abe3b8a0ee8c6",
          "body": null,
          "is_bot": false,
          "headline": "fix incremental update fingerprint handling",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T13:17:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae3a61559220d70872f2049af4bcb4a0a536f69f",
          "body": "…ree builds",
          "is_bot": false,
          "headline": "Prevent duplication of top-level files under the root package in subt…",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T12:35:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e916062842e3e100f0c70d68e7aa28a69cc2d532",
          "body": "…d context retrieval",
          "is_bot": false,
          "headline": "Enhance CLI and API functionality with improved namespace handling an…",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T12:35:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3b164b5f077c0d6bf39f7d8f834c0a66c29c484",
          "body": null,
          "is_bot": false,
          "headline": "Document evidence-driven retrieve philosophy",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T10:08:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00efa4159bf183abbe60a21e9a04c7e15e051565",
          "body": null,
          "is_bot": false,
          "headline": "Improve DB-backed retrieve scoring",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T09:18:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee6a1b9e081ae31a17bdca97b9d762b42090317b",
          "body": null,
          "is_bot": false,
          "headline": "Remove fallback to doc/wiki index snapshots for doc APIs",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T08:21:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75d9cd31c07795755ced0f6d50cc9bbe786765c0",
          "body": null,
          "is_bot": false,
          "headline": "Make wiki retrieval DB primary",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T08:02:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c9d44693ba56c3adc35c5a122588e1463f2cc98",
          "body": null,
          "is_bot": false,
          "headline": "Improve wiki DB fallback rendering",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T05:58:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03f25e55cab82b9fdb8e320d4e9ba161fbdf207f",
          "body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "feat(wikiserver): use DB fallback for wiki APIs",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T05:21:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49b37bd32bda33821e2f48e0c72444011d1b2506",
          "body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "feat(wikiindex): expose DB wiki tree builder",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T05:21:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f090e0ebc1d1d47c7f6fc7e1ef5434735e2ffc00",
          "body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "feat(mcp): fall back to DB for docs tools",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T05:21:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72d3d881a14f6d423b457bee0061518bde2675ce",
          "body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "feat(retrieval): add DB docs fallback service",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T05:21:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66568275b4c664f8b96c25d639d8d91ba2791cab",
          "body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "feat(ragindex): expose DB tree builder",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T05:21:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e24175b73514356c262e74637abd9907992395a",
          "body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "feat(mcp): add retrieve docs explain diagnostics",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T02:29:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "221895007bfdc48134175196d7083d7f7a01be3f",
          "body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "feat(ragindex): add deterministic query expansion",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T02:29:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a490d25fa85de74e9fc7c0527a74cbbb6c16dc18",
          "body": "…ests",
          "is_bot": false,
          "headline": "Add namespace support to benchmark command and create corresponding t…",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-06T01:57:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2cf93e42d31f07bd932765d2e79cefbb12b576e6",
          "body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "Add structured retrieval scoring evidence",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-05T23:57:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "becb8526813ce3ac2517c9e233bd9cbfb27b1f1e",
          "body": null,
          "is_bot": false,
          "headline": "Write namespace RAG indexes under namespace dirs",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-05T21:50:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0608ba59f763468971402280087bbeef19e164a3",
          "body": null,
          "is_bot": false,
          "headline": "Link wiki CCG refs to docs and graph",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-05T15:57:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e571b7914f0755ba69e6800fd5f9ec632425f1b0",
          "body": null,
          "is_bot": false,
          "headline": "Add CCG refs for cross-namespace annotations",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-05T15:43:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12eff69b0b712c3f1e335f3ca650ec524190a66f",
          "body": null,
          "is_bot": false,
          "headline": "Remove workspace aliases in favor of namespaces",
          "author_name": "tae2089",
          "author_login": "tae2089",
          "committed_at": "2026-05-05T15:30:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 30,
      "commits_last_year": 694,
      "latest_release_at": "2026-07-19T02:55:40Z",
      "latest_release_tag": "v0.12.0",
      "releases_from_tags": false,
      "days_since_last_push": 6,
      "active_weeks_last_year": 7,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 8.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/tae2089/code-context-graph",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/tae2089/code-context-graph",
          "is_deprecated": false,
          "latest_version": "v0.12.0",
          "repository_url": "https://github.com/tae2089/code-context-graph",
          "versions_count": 38,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-19T02:50:07Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        },
        {
          "name": "code-context-graph",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "code-analysis",
            "knowledge-graph",
            "tree-sitter",
            "mcp",
            "cypher",
            "apache-age",
            "annotations"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/code-context-graph",
          "is_deprecated": false,
          "latest_version": "0.12.0",
          "repository_url": "https://github.com/tae2089/code-context-graph",
          "versions_count": 30,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 1885,
          "first_published_at": "2026-04-12T13:53:58.487000Z",
          "latest_published_at": "2026-07-19T02:55:54.175000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 16,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": true,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "web/wiki/tsconfig.json"
      ],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 181773,
      "source_files_sampled": 305,
      "oversized_source_files": 5,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 8690
    },
    "dependencies": {
      "manifests": [
        "go.mod",
        "npm/package.json"
      ],
      "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",
        "npm"
      ],
      "dependencies": [
        {
          "name": "github.com/go-git/go-git/v5",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v5.17.2"
        },
        {
          "name": "github.com/golang-migrate/migrate/v4",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v4.19.1"
        },
        {
          "name": "github.com/mark3labs/mcp-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.47.1"
        },
        {
          "name": "github.com/smacker/go-tree-sitter",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20240827094217-dd81d9e9be82"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "github.com/spf13/viper",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.21.0"
        },
        {
          "name": "github.com/tae2089/trace",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.2"
        },
        {
          "name": "go.opentelemetry.io/otel",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.38.0"
        },
        {
          "name": "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.38.0"
        },
        {
          "name": "go.opentelemetry.io/otel/sdk",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.38.0"
        },
        {
          "name": "go.opentelemetry.io/otel/trace",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.38.0"
        },
        {
          "name": "go.yaml.in/yaml/v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.4"
        },
        {
          "name": "gorm.io/driver/postgres",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "gorm.io/driver/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "gorm.io/gorm",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.31.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": 30,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "tae2089",
          "commits": 694,
          "avatar_url": "https://avatars.githubusercontent.com/u/43431864?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "6 out of 6 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/14 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 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": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "45 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "ec7252f872c4b12656de4fc8831bf549cb72a753",
        "ran_at": "2026-07-26T02:23:33Z",
        "aggregate_score": 3.4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-19T02:57:54Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-19T02:44:37Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/tae2089/code-context-graph",
    "host": "github.com",
    "name": "code-context-graph",
    "owner": "tae2089"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 56,
      "inputs": {
        "security": 34,
        "vitality": 77,
        "community": 39,
        "governance": 57,
        "engineering": 65
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 77,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 69,
            "inputs": {
              "commits_last_year": 694,
              "human_commit_share": 1,
              "days_since_last_push": 6,
              "active_weeks_last_year": 7
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "7/52 weeks with commits",
                "points": 4.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "694 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 694
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 30,
              "latest_release_tag": "v0.12.0",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 8.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "30 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 30
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~8.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 8.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": "at_risk",
        "name": "Community & Adoption",
        "value": 39,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 19,
            "inputs": {
              "forks": 0,
              "stars": 16,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "16 stars",
                "points": 19.1,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 55,
            "inputs": {
              "packages": [
                "github.com/tae2089/code-context-graph",
                "code-context-graph"
              ],
              "dependents": null,
              "ecosystems": "go, npm",
              "total_downloads": null,
              "monthly_downloads": 1885
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "1,885 downloads/month across go, npm",
                "points": 43.7,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 1885,
                      "ecosystems": "go, npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 57,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 69,
            "inputs": {
              "merged_prs": 30,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 1
            },
            "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": "30/31 decided PRs merged",
                "points": 37,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 30,
                      "decided": 31
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/14 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 62,
            "inputs": {
              "followers": 114,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "tae2089",
              "public_repos": 144,
              "account_age_days": 2865
            },
            "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": "114 followers of tae2089",
                "points": 14.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 114,
                      "login": "tae2089"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "144 public repos, account ~7 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 144
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 7
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/tae2089/code-context-graph",
                "code-context-graph"
              ],
              "ecosystems": "go, npm",
              "any_deprecated": false,
              "min_days_since_publish": 6
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on go, npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "go, npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 6 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "38 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 38
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 65,
        "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": "6 out of 6 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "topics": [
                "agent-skill",
                "ai-coding",
                "claude",
                "claude-code",
                "go",
                "golang",
                "incremental",
                "knowledge-graph",
                "llm",
                "mcp",
                "tree-sitter",
                "code-context",
                "code-search",
                "codex",
                "model-context-protocol"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "15 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "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": 34,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 34,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3.4
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "6 out of 6 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/14 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow 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 not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "45 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": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 72,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.84,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 8690
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "84 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 84,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "web/wiki/tsconfig.json"
              ],
              "agent_commit_share": 0.54,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "web/wiki/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "web/wiki/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "54 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 54,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 181773,
              "source_files_sampled": 305,
              "oversized_source_files": 5
            },
            "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": "5/305 source files over 60KB",
                "points": 54.1,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 305,
                      "oversized": 5
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "critical",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "example_dirs": [],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-26T02:23:45.738083Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/t/tae2089/code-context-graph.svg",
  "full_name": "tae2089/code-context-graph",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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