Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.8 KiB
id, title, status, type, domain, scope, priority, depends, blocks, related, created, updated, tags
| id | title | status | type | domain | scope | priority | depends | blocks | related | created | updated | tags |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0062 | Politica de deprecacion para funciones del registry sin consumidores | completado | feature | multi-app | baja | 2026-05-17 | 2026-05-17 |
0062 — Politica de deprecacion para funciones del registry sin consumidores
APP Metadata
| Campo | Valor |
|---|---|
| ID | 0062 |
| Estado | resuelto 2026-05-13 |
| Prioridad | baja |
| Tipo | research + policy — .claude/rules/, docs/ |
Resolucion (2026-05-13)
Decision: opcion 2 (deprecar via tag) — NO se borra, NO se mantiene en limbo. Se marca con pendiente-usar para hacer visible "disponible, sin consumidor todavia".
Implementacion: pipeline tag_unused_pending_py_pipelines (Python). Cruza fn doctor unused --json con registry.db.functions.file_path y modifica el frontmatter YAML del .md de cada funcion. Idempotente — re-ejecutar:
- Anade el tag a funciones nuevas en la lista de unused.
- Retira el tag de funciones que han adquirido un consumer real (mantener coherencia).
Comando: python/.venv/bin/python3 python/functions/pipelines/tag_unused_pending.py && ./fn index.
Filtro: mcp__registry__fn_search 'tags:"pendiente-usar"' o
sqlite3 registry.db "SELECT id FROM functions WHERE tags LIKE '%pendiente-usar%'".
Estado actual: 631 funciones marcadas pendiente-usar (de 1249 totales). El tag persiste mientras fn doctor unused las liste; desaparece cuando alguna app/funcion las declare en uses_functions.
Dependencias
find_unused_functions_go_infra(existe, lista 704 funciones sin consumidores al 2026-05-07).fn doctor unused.
Contexto
Sesion 2026-05-07: el registry tiene 1066 funciones. fn doctor unused reporta 704 sin consumidores (66%). La mayoria son utilities core puras (compose2_go_core, curry2_go_core, chunk_go_core, flat_map_slice_go_core, etc.) construidas especulativamente — esperando que alguna app las consuma.
Sin politica explicita de "que hacer con unused", el registry crece sin freno. Posibles destinos:
- Mantener indefinidamente (libreria publica disponible).
- Deprecar via tag (
tags: [deprecated]) — sigue presente pero senala "no usar para codigo nuevo". - Borrar despues de N meses sin consumidor.
Decision pospuesta: cualquier eleccion afecta cientos de archivos y la velocidad de scaffold de nuevas apps que pueden recogerlas.
Objetivo
Definir y documentar una politica formal:
- Criterios cuantitativos: cuanto tiempo (en dias) sin consumidor justifica deprecar.
- Excepciones: funciones con tag
core-utilityolibrary-qualityse mantienen. - Workflow de deprecacion: tag → 90 dias → borrar.
- Hook automatico:
fn doctor unused --propose-deprecationabre proposals.
Arquitectura
Archivos afectados
- NUEVA regla
.claude/rules/unused_functions.md. - NUEVO ADR
docs/adr/0005-unused-functions-policy.md. find_unused_functions_go_infra— opcionalmente extender conAgeDaysdesdeupdated_at(ya lo tiene) y filtrar por edad.cmd/fn/doctor.go— anadir flag--older-than <days>al subcomandounused.
Tareas
Fase 1 — definir politica (humano)
1.1 Decidir umbrales: tag deprecated tras 60 dias sin consumidor; borrar tras 180 dias.
1.2 Decidir excepciones: tag core-utility exime, tag library-quality exime, dominios core puros mas tolerantes que dominios infra.
1.3 Decidir si la deprecacion es manual (humano via proposal) o automatica (cron).
Fase 2 — escribir ADR + regla
2.1 ADR 0005 con la decision, alternativas, consecuencias.
2.2 Regla .claude/rules/unused_functions.md operacional.
2.3 Update INDEX.md.
Fase 3 — extender herramienta
3.1 fn doctor unused --older-than 60 filtra por edad.
3.2 fn doctor unused --propose-deprecation crea proposals automaticas con kind=deprecate_function.
3.3 Workflow humano: revisar proposals, aprobar, agente aplica el tag.
Fase 4 — primera ronda
4.1 Correr fn doctor unused --older-than 90.
4.2 Decidir caso por caso (o lote por dominio): mantener / deprecar / borrar.
4.3 Aplicar tags. Re-indexar. Update CHANGELOG.
Riesgos
- Borrar funciones que el usuario planeaba usar pronto. Mitigacion: ventana larga (180 dias) + proposal manual antes de borrar.
- Tags desfasados: una funcion deprecated puede seguir siendo usada. Mitigacion: el indexer puede warn si una app declara una
deprecatedenuses_functions. - Deprecation como excusa para no usar (cosmica). Mitigacion: revisiones trimestrales, no que se acumule.
Decisiones de diseno
- NO borrar nunca automaticamente. Borrado siempre humano via PR/proposal aprobada.
- Tag
deprecatedes el verbo automatizable: un agente puede aplicarlo via proposal. - Para funciones nuevas creadas tras adoptar la politica, exigir que tengan al menos UN consumidor previsto al merge — sino van directo con tag
experimental.