Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6.2 KiB
ADR 0004 — Telemetria de ejecuciones de Claude como motor de crecimiento del registry
- Fecha: 2026-05-14
- Estado: accepted
- Relacionados: issue 0085 (telemetry + call_monitor), issue 0086 (delegation + capability groups), issue 0087 (capability discovery acceleration)
Contexto
Hasta 0085, el registry crecia "manualmente": el humano (o Claude bajo supervision) detectaba patrones repetidos, redactaba proposals y un agente los implementaba. Costes observados en sesiones reales:
- Claude reinventaba inline logica que ya existia como funcion. Caso reciente (2026-05-13/14):
taskkill + cp Desktop + cmd /c startejecutado 5 veces seguidas pese a quedeploy_cpp_exe_to_windows_bash_infraya cubria el caso. - Funciones recien creadas quedaban huerfanas (
calls_90d=0) porque Claude no las encontraba via FTS5 con queries genericas. - Tres pasos del bucle reactivo (
MEJORAR → APROBAR → CONSTRUIR) requerian humano en el loop incluso para gaps obvios.
Sin medir lo que el agente realmente hace, las reglas (registry_first.md, delegation.md) son aspiracion no auditable. No se puede mejorar lo que no se mide.
Decision
Tratar las ejecuciones de Claude como senal de primera clase del registry. Tres componentes encadenados:
-
Capturar todo (issue 0085) — Hook
PostToolUseparsea cada Bash + cadamcp__registry__*y persiste enprojects/fn_monitoring/apps/call_monitor/operations.db. Tablas:calls,code_writes,test_runs,e2e_runs_fn,violations,patterns,sessions. Vistafunction_statsagrega porfunction_id. -
Agrupar por capability (issue 0086) — Tags planos (
notebook,metabase,deploy,cpp-windows, ...) sobre funciones afines + pagina madredocs/capabilities/<grupo>.mdcon lista, ejemplo canonico y fronteras. Cargar un grupo cuesta 1 read, no N busquedas FTS5. -
Acelerar descubrimiento (issue 0087) — 5 capas escalonadas por coste de lookup:
- Top-20 + fresh-7d en bloque autogenerado de CLAUDE.md (coste 0, contexto base).
- Hook
UserPromptSubmitinjectaFRESH:/TOP:cada turno (coste 0). - Hook
PreToolUseconfn_matchfuzzy FTS5 sugiereUSE: ./fn run <id>mid-flight (coste <50ms). docs/capabilities/<grupo>.mdcargado solo si tarea matchea dominio (coste 1 read).MEMORY.mdcon insights cross-session (coste 0, persistente).
Las 3 metricas norte (en Monitor tab del registry_dashboard):
Reg %— fraccion de calls confunction_id != ''. Sube cuando Claude usa registry en vez de heredoc.MCP ratio— fraccion detool_used IN (mcp_*, fn_run). Mide adopcion canonica.violations_24h— antipatrones detectados. Baja con cada vuelta del bucle.
Cualquier decision tecnica que choque con estas metricas esta mal priorizada.
Alternativas consideradas
- Reglas mas estrictas sin telemetria. Descartado: ya teniamos
registry_first.mdy se ignoraba sin que nada lo detectase. Reglas sin metricas son aspiracion. - Auto-merge de proposals desde el bucle reactivo. Descartado: el agente decide que construir, pero el humano sigue revisando antes de escribir codigo permanente. Limite duro en
/fn_claude: max 5 funciones por invocacion, no push automatico. - MCP-only sin hooks de telemetria. Descartado: heredocs y
sqlite3directo seguirian invisibles. El hookPostToolUsees la red de captura unica que cubre todos los canales (MCP, fn_run, heredoc, Edit, Write). - Indice estatico (lista plana de IDs) en lugar de capability groups. Descartado: una lista de 800 funciones no cabe en contexto. Grupos con pagina madre densa (~80 lineas) cubren 80% del trabajo con coste de lectura asumible.
Consecuencias
Nuevo (visible en este repo)
- Carpeta
docs/capabilities/con pagina madre por grupo. Indice endocs/capabilities/INDEX.md. Auditado porfn doctor capabilities. - Hook
UserPromptSubmitinjecta cada turno:REGISTRY-FIRST+CAPABILITY-GROWTH: created_this_session=X used=Y orphan=Z. - Hook
PostToolUse(en.claude/settings.local.json) escribe acall_monitor.operations.db. Soloargs_hash, NUNCA valores de argumentos (privacidad). - Slash command
/fn_claude— auto-auditoria: detecta gaps en la sesion, lanzafn-constructoren paralelo, valida que la proxima sesion usara la nueva funcion. - Subagente
fn-constructormandatorio cuando se vaya a escribir >=5 lineas reutilizables inline.
Reglas nuevas / endurecidas
.claude/rules/delegation.md— STOP + spawnfn-constructormismo turno, paralelo cuando >1 funcion independiente, tag de grupo obligatorio..claude/rules/capability_groups.md— convencion de tag plano + pagina madre + auditoria viafn doctor capabilities..claude/rules/registry_calls.md— 3 patrones canonicos (inspect / run / compose), antipatrones, excepciones parasqlite3directo.
Boundary explicito
La telemetria cubre al agente y a invocaciones canonicas. Quedan fuera:
- Funcion Go/C++ llamada internamente por app ya compilada.
- Service de produccion recibiendo HTTP sin pasar por
fn run. - Sub-agente (
Agenttool) sin telemetria heredada (mitigado por env varFN_TELEMETRY=1propagada).
Compensar runtime invisible con e2e_checks (issue 0068) y fn doctor uses-functions (audit estatico).
Riesgos asumidos
- Latencia de
fn_match(capa 3). Objetivo <50ms. Si supera 100ms, degradar a "solo en comandos largos" o "al final del turno". - Falsos positivos en propuestas automaticas. Limite duro: max 5 por invocacion, evidencia obligatoria (snippet real), sin auto-merge.
- Telemetria genera datos sensibles. Mitigacion estructural: solo se guarda
args_hash. Snippets de error redactados por allowlist.
Aprendizaje
A 2026-05-14, primer grupo cpp-windows creado en respuesta directa al patron taskkill+cp+start repetido: is_cpp_app_running_windows_bash_infra, launch_cpp_app_windows_bash_infra, pipeline redeploy_cpp_app_windows_bash_pipelines, pagina madre docs/capabilities/cpp-windows.md. Validacion empirica del bucle: detectar -> construir -> agrupar -> documentar -> esperar reduccion de violations en proximas sesiones.
Pendiente: medir el delta de Reg % y violations_24h a 7d para confirmar que el coste de descubrimiento bajo de "FTS5 N veces" a "1 read de pagina madre".