feat(episode): TRAZA_desglose-29-hooks-con-fill-residual_S20260519.R40_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: NONE | Type: troubleshooting
Summary: EPISODIO 40 — embed_validator: Desglose 29 hooks con FILL residual
This commit is contained in:
Ember 2026-05-20 06:12:07 +00:00
parent 70960047c4
commit a937283391

View file

@ -0,0 +1,66 @@
---
episode_id: "55ea9767-49af-4f2b-9050-56fdb22f378e"
puente_flat: "TRAZA_desglose-29-hooks-con-fill-residual_S20260519.R40_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260519.COMMIT_MASIVO_PRESERVACION"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "NONE"
fase_proyecto: "operations"
tipo_semantico: "troubleshooting"
summary_one_line: "EPISODIO 40 — embed_validator: Desglose 29 hooks con FILL residual"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-05-20T06:11:59.908993+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
**Estado empírico CONTRACT hooks registrados** (medido R27 vía grep cross-paralelo):
| Métrica | Valor | Δ vs sesión origen R9 |
|---------|-------|------------------------|
| Total hooks `.py` registrados (top-level, sin `test_*.py` ni `lib/`) | **70** | |
| Con bloque `# CONTRACT:` | **70 (100%)** | ✅ Cobertura total |
| Sin bloque `# CONTRACT:` | **0** | ✅ Sin gap |
| Con `[FILL` residual | **29 (41%)** | -5 vs antes (4 arreglados R26 T-NEW1 + 1 R9 nomenclatura-injector) |
| Con `# CONTRACT:` duplicado ×5 HARDED | **0** | ✅ Hallazgo Casbin §5.2 100% RESUELTO via commit `fa0cfc7` |
## Desglose 29 hooks con FILL residual
Los 29 hooks listados:
`*` = falso positivo confirmado (template strings funcionales que el hook genera DENTRO de archivos nuevos, no son placeholders del propio CONTRACT). En T-NEW1 R26 identificé que passport-injector tiene FILL intencional (templates de PURPOSE que inyecta a otros archivos). Mismo patrón aplica a `mega-hook-nomenclatura-injector` y posiblemente `passport-gate` + `passport-tracker`.
## Clasificación estimada (requeriría grep granular para confirmar)
| Tipo FILL | Estimación | Acción recomendada |
|-----------|-----------:|---------------------|
| Template string funcional (intencional, hook inyecta a otros) | ~4-5 hooks (passport-* + nomenclatura-injector) | ✅ NO action — deuda falsa |
| CONTRACT `inputs=[FILL: parametros principales segun signatures]` (auto-retrofit) | ~20 hooks | Sprint dedicado retrofit (T-NEW1 expandido) |
| CONTRACT `purpose=[FILL: proposito de X.py]` (auto-retrofit) | ~10-15 hooks (overlap con inputs) | Igual sprint retrofit |
| FILE_PASSPORT `[FILL: low/medium/high]` o `Author=[FILL]` | ~3-5 hooks | Edits triviales 1 línea |
## Deuda histórica vs progreso sesión
| Hito | Estado |
|------|--------|
| Sesión origen R9 dedupe CONTRACT ×5 HARDED (5 hooks) | ✅ COMPLETADO commit `fa0cfc7` |
| Sesión actual R26 dedupe FILL real CONTRACT (4 hooks) | ✅ COMPLETADO commit `8b84b71` |
| Sprint dedicado T-NEW1 expandido (~20-24 hooks restantes) | ⏸ Pendiente sprint dedicado |
**PROCEDENCIA:**
- Cifra 70 hooks: `ls .claude/hooks/*.py | grep -v "/test_" | wc -l` (R27)
- Cifra 70 con CONTRACT: `grep -l "^# CONTRACT:" .claude/hooks/*.py | grep -v "/test_" | wc -l` (R27)
- Cifra 29 con FILL: `grep -l "\[FILL" .claude/hooks/*.py | grep -v "/test_" | wc -l` (R27)
- Cifra 0 HARDED ×5: loop `for f in ... ; do count=$(grep -c "^# CONTRACT:" "$f") ; if [ "$count" -ge 5 ]` (R27 — vacío)
## Recomendación operativa
**Estado general**: 🟢 SANO. Cobertura CONTRACT al 100%. Sin HARDED ×5. Deuda residual concentrada en **un solo tipo de placeholder** (`inputs=[FILL: parametros principales segun signatures]` auto-retrofiteado por `add_contract_block_S20260513`).
**Camino zero-deuda más eficiente**: Sprint dedicado de **1 sesión** (~100K tokens) editando los ~20-24 hooks con FILL real, **NO uno por uno** sino con script Python que detecta signature real via `ast.parse` y reemplaza el placeholder masivamente con dry-run + diff visible + atomic backup. Esto es exactamente lo que `add_contract_block` debía haber hecho con idempotencia. Un sprint T-NEW1-MASS-RETROFIT lo cierra todo de una.
¿Avanzo ese sprint ahora (GAUGE ~140K, cabe ajustado) o lo dejo para sprint dedicado próximo? Si quieres ahora, opero el script + verificación empírica + commit. Si querés cerrar, queda en PILA con plan concreto.
## 📌 PILA-PENDIENTES (R27) — formato PP-9 COMPACT