sdd-es 2.0.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/.claude/settings.json +29 -29
  2. package/.claude/settings.local.json +10 -0
  3. package/.claude-plugin/marketplace.json +10 -7
  4. package/.claude-plugin/plugin.json +59 -37
  5. package/.gitignore +20 -0
  6. package/.mcp.json +8 -0
  7. package/LICENSE +21 -0
  8. package/README.md +77 -40
  9. package/agents/architecture-designer.md +211 -0
  10. package/agents/arquitecto.md +16 -1
  11. package/agents/asesor-datos.md +15 -1
  12. package/agents/critico.md +37 -1
  13. package/agents/desarrollador-backend.md +3 -1
  14. package/agents/desarrollador-frontend.md +11 -16
  15. package/agents/disenador-api.md +13 -1
  16. package/agents/documentador.md +3 -1
  17. package/agents/investigador.md +3 -1
  18. package/agents/operaciones.md +3 -1
  19. package/agents/product-designer.md +268 -0
  20. package/agents/revisor.md +25 -1
  21. package/agents/seguridad.md +5 -1
  22. package/agents/tester.md +3 -1
  23. package/claude-hooks/agent-memory.js +288 -0
  24. package/claude-hooks/pre-tool-guard.js +61 -9
  25. package/cli/index.js +1 -2
  26. package/commands/sdd.adr.md +196 -0
  27. package/commands/sdd.analizar.md +23 -2
  28. package/commands/sdd.ayuda.md +13 -0
  29. package/commands/sdd.compliance.md +521 -0
  30. package/commands/sdd.configurar.md +34 -1
  31. package/commands/sdd.constitucion.md +198 -23
  32. package/commands/sdd.construir.md +210 -0
  33. package/commands/sdd.crear-mcp.md +2 -0
  34. package/commands/sdd.defect-report.md +134 -0
  35. package/commands/sdd.descubrir.md +19 -0
  36. package/commands/sdd.dise/303/261ar.md +188 -0
  37. package/commands/sdd.estado.md +120 -3
  38. package/commands/sdd.exportar.md +344 -0
  39. package/commands/sdd.implementar.md +272 -52
  40. package/commands/sdd.interpretar.md +239 -0
  41. package/commands/sdd.md +93 -4
  42. package/commands/sdd.optimizar-memoria.md +47 -0
  43. package/commands/sdd.optimizar.md +164 -0
  44. package/commands/sdd.planificar.md +64 -0
  45. package/commands/sdd.retro.md +74 -0
  46. package/commands/sdd.verificar.md +81 -0
  47. package/configuracion-ejemplo/.claude/CLAUDE.md +106 -0
  48. package/configuracion-ejemplo/sdd.config.yaml +10 -0
  49. package/craft/accessibility-baseline.md +216 -0
  50. package/craft/anti-ai-slop.md +158 -0
  51. package/craft/color.md +160 -0
  52. package/craft/typography.md +121 -0
  53. package/design-systems/bold-brutalist/DESIGN.md +239 -0
  54. package/design-systems/editorial-minimal/DESIGN.md +205 -0
  55. package/design-systems/neutral-modern/DESIGN.md +227 -0
  56. package/design-systems/vibrant-consumer/DESIGN.md +257 -0
  57. package/design-systems/warm-editorial/DESIGN.md +221 -0
  58. package/docs/AGENTES.md +4 -1
  59. package/docs/CASO-COMPLETO.md +206 -0
  60. package/docs/EJEMPLOS.md +61 -185
  61. package/docs/FABRICA.md +163 -115
  62. package/docs/INICIO-RAPIDO.md +27 -79
  63. package/docs/MEMORIA-Y-OBSERVABILIDAD.md +239 -0
  64. package/docs/MODELOS.md +3 -0
  65. package/docs/QUE-PASA-SI-FALLA.md +404 -0
  66. package/docs/README.md +43 -0
  67. package/docs/RELACION-CON-CLAUDE-CODE.md +38 -0
  68. package/docs/SEGURIDAD-PARA-NOTECNICOS.md +280 -0
  69. package/package.json +15 -10
  70. package/plantillas/job-story-mejorar-prompt.md +107 -0
  71. package/presets/enterprise.yaml +6 -0
  72. package/presets/lean.yaml +4 -0
  73. package/presets/startup.yaml +6 -0
  74. package/skills/adr-indexer/SKILL.md +181 -0
  75. package/skills/cache-audit/SKILL.md +163 -0
  76. package/skills/critica-diseno/SKILL.md +193 -0
  77. package/skills/descubrir-idea/SKILL.md +133 -0
  78. package/skills/effort-router/SKILL.md +128 -0
  79. package/skills/elegir-direccion/SKILL.md +184 -0
  80. package/skills/github-connect/IMPLEMENTATION-CHECKLIST.md +297 -0
  81. package/skills/github-connect/INDEX.md +223 -0
  82. package/skills/github-connect/INTEGRATION.md +361 -0
  83. package/skills/github-connect/QUICK-START.md +168 -0
  84. package/skills/github-connect/README.md +414 -0
  85. package/skills/github-connect/RESUMEN_IMPLEMENTACION.txt +374 -0
  86. package/skills/github-connect/SKILL.md +343 -0
  87. package/skills/github-connect/STRUCTURE.txt +252 -0
  88. package/skills/github-connect/example-config.yaml +41 -0
  89. package/skills/github-connect/github-connect.sh +419 -0
  90. package/skills/interpretar-idea/SKILL.md +254 -0
  91. package/skills/mejorar-prompt/SKILL.md +237 -0
  92. package/skills/memory-compactor/SKILL.md +68 -0
  93. package/skills/modo-guiado/SKILL.md +12 -2
  94. package/skills/mutation-detector/SKILL.md +134 -0
  95. package/skills/observabilidad-consumo/SKILL.md +164 -0
  96. package/skills/token-budget/SKILL.md +177 -0
  97. package/skills/vercel-deploy/00-START-HERE.txt +364 -0
  98. package/skills/vercel-deploy/CHECKLIST.md +205 -0
  99. package/skills/vercel-deploy/EXEC-SUMMARY.txt +322 -0
  100. package/skills/vercel-deploy/FLOW.txt +334 -0
  101. package/skills/vercel-deploy/INDEX.md +276 -0
  102. package/skills/vercel-deploy/INTEGRATION.md +328 -0
  103. package/skills/vercel-deploy/MANIFEST.md +310 -0
  104. package/skills/vercel-deploy/README.md +65 -0
  105. package/skills/vercel-deploy/SKILL.md +356 -0
  106. package/skills/vercel-deploy/deploy.sh +298 -0
  107. package/skills/vercel-deploy/estado.json.example +205 -0
  108. package/skills/vercel-deploy/skill.yaml +323 -0
  109. package/skills/vercel-deploy/vercel-deploy.sh +216 -0
  110. package/skills/wireframe-mvp/SKILL.md +157 -0
  111. package/docs/EJEMPLO-PRACTICA.md +0 -383
  112. package/mcp-figma/README.md +0 -158
  113. package/mcp-figma/package.json +0 -7
  114. package/mcp-figma/src/component-generator.js +0 -162
  115. package/mcp-figma/src/design-system-analyzer.js +0 -247
  116. package/mcp-figma/src/figma-client.js +0 -75
  117. package/mcp-figma/src/index.js +0 -114
  118. package/mcp-figma/src/mcp.js +0 -97
  119. package/mcp-figma/src/style-mapper.js +0 -85
  120. /package/skills/{compresion-tokens.md → compresion-tokens/SKILL.md} +0 -0
  121. /package/skills/{constitucion-constraint.md → constitucion-constraint/SKILL.md} +0 -0
  122. /package/skills/{deteccion-stack.md → deteccion-stack/SKILL.md} +0 -0
  123. /package/skills/{enrutador-agentes.md → enrutador-agentes/SKILL.md} +0 -0
  124. /package/skills/{gestion-estado.md → gestion-estado/SKILL.md} +0 -0
  125. /package/skills/{indexador.md → indexador/SKILL.md} +0 -0
  126. /package/skills/{validacion-spec.md → validacion-spec/SKILL.md} +0 -0
  127. /package/skills/{verificador-implementacion.md → verificador-implementacion/SKILL.md} +0 -0
@@ -0,0 +1,134 @@
1
+ ---
2
+ name: mutation-detector
3
+ model: claude-haiku-4-5
4
+ description: Detecta mutaciones (cambios) en archivos para tracking de calidad
5
+ allowed-tools: Read, Bash
6
+ ---
7
+
8
+ # Skill: Mutation Detector
9
+
10
+ **Propósito:** Analizar patrones de cambio en archivos para detectar inestabilidad y calcular defect escape rate.
11
+
12
+ ---
13
+
14
+ ## Cómo Funciona
15
+
16
+ ### Ledger de Mutaciones
17
+
18
+ Cada vez que un agente modifica un archivo (Write, Edit, MultiEdit), el hook registra:
19
+ ```json
20
+ {
21
+ "ts": "2026-06-14T10:30:00Z",
22
+ "agente": "backend-dev",
23
+ "archivo": "src/auth.ts",
24
+ "tool": "Edit",
25
+ "tipo": "partial"
26
+ }
27
+ ```
28
+
29
+ **Campo `tipo`:**
30
+ - `full` — Write (archivo nuevamente escrito desde cero)
31
+ - `partial` — Edit (cambios parciales al archivo)
32
+
33
+ ### Análisis de Estabilidad
34
+
35
+ Mutation Detector agrupa por archivo:
36
+ ```
37
+ src/auth.ts:
38
+ - Mutación 1: backend-dev (full) 2026-06-10 10:00
39
+ - Mutación 2: backend-dev (partial) 2026-06-11 14:30
40
+ - Mutación 3: tester-qa (partial) 2026-06-11 15:00 (test fail)
41
+
42
+ Análisis:
43
+ - Total mutaciones: 3
44
+ - Autor principal: backend-dev
45
+ - Estabilidad: INESTABLE (3 cambios en 2 días)
46
+ - Defect finder: tester-qa encontró 1 bug
47
+ ```
48
+
49
+ ---
50
+
51
+ ## Defect Escape Rate
52
+
53
+ **Fórmula:**
54
+ ```
55
+ Defect Escape Rate = (Bugs encontrados) / (Total bugs presentes)
56
+
57
+ Ejemplo:
58
+ - Backend Dev escribió src/auth.ts
59
+ - QA ejecutó tests, encontró 4 bugs
60
+ - En producción: 1 bug adicional
61
+
62
+ Escape Rate = 1 / 5 = 20%
63
+ ```
64
+
65
+ **Tabla por agente:**
66
+ ```
67
+ AGENTE | ARCHIVOS | BUGS ENCONTRADOS | BUGS EN PROD | ESCAPE RATE
68
+ ───────────────┼──────────┼──────────────────┼─────────────┼──────────
69
+ backend-dev | 12 | 4 | 1 | 20%
70
+ frontend-dev | 8 | 0 | 0 | N/A
71
+ tester-qa | — | 4 encontrados | — | 100% accuracy
72
+ ```
73
+
74
+ ---
75
+
76
+ ## Output: Comando `/sdd.defect-report`
77
+
78
+ **Resumen ejecutivo:**
79
+ ```
80
+ DEFECT REPORT — Sesión 2026-06-14
81
+
82
+ Archivos modificados: 12
83
+ Bugs encontrados (QA): 4
84
+ Bugs en producción (post-release): 1
85
+ ─────────────────────────────────
86
+ Global Escape Rate: 20% (1 de 5)
87
+
88
+ Por agente:
89
+ backend-dev: 4 archivos, 3 bugs encontrados → 75% quality score
90
+ frontend-dev: 8 archivos, 1 bug encontrado → 88% quality score
91
+ tester-qa: Encontró 4 bugs (100% accuracy)
92
+ ```
93
+
94
+ ---
95
+
96
+ ## Implementación Técnica
97
+
98
+ ### Ledger: `.sdd/observabilidad/mutaciones.jsonl`
99
+
100
+ Append-only JSONL donde cada línea es una mutación:
101
+ ```json
102
+ {"ts":"2026-06-14T10:30:00Z","agente":"backend-dev","archivo":"src/auth.ts","tool":"Edit","tipo":"partial"}
103
+ {"ts":"2026-06-14T10:35:00Z","agente":"backend-dev","archivo":"src/auth.ts","tool":"Write","tipo":"full"}
104
+ {"ts":"2026-06-14T15:00:00Z","agente":"tester-qa","archivo":"src/auth.test.ts","tool":"Write","tipo":"full"}
105
+ ```
106
+
107
+ ### Agregación por archivo
108
+
109
+ ```javascript
110
+ const mutacionesPorArchivo = {};
111
+ for (const mut of mutaciones) {
112
+ if (!mutacionesPorArchivo[mut.archivo]) {
113
+ mutacionesPorArchivo[mut.archivo] = [];
114
+ }
115
+ mutacionesPorArchivo[mut.archivo].push(mut);
116
+ }
117
+ ```
118
+
119
+ ### Cálculo de Inestabilidad
120
+
121
+ ```
122
+ Si archivo tiene >2 mutaciones en <24h → INESTABLE
123
+ Si archivo tiene >5 mutaciones → CRÍTICO
124
+ ```
125
+
126
+ ---
127
+
128
+ ## Notas
129
+
130
+ - Fase 1 (v2.6.0): Solo tracking + informe simple
131
+ - Fase 2 (v2.6.1): Dashboard con gráficos
132
+ - Ledger append-only: nunca sobrescrito, histórico completo
133
+ - Reversible: puedes recalcular estadísticas en cualquier momento
134
+
@@ -0,0 +1,164 @@
1
+ ---
2
+ description: Lee .sdd/observabilidad/consumo.jsonl y genera un reporte de actividad de agentes — invocaciones por agente, archivos tocados, picos y señales de fan-out excesivo. Referencia cruzada con orquestacion-ptc y compresion-tokens.
3
+ model: haiku
4
+ allowed-tools: Read, Bash
5
+ ---
6
+
7
+ # Skill: Observabilidad de Consumo
8
+
9
+ ## Propósito
10
+
11
+ Convertir el ledger de consumo en información accionable: ver cuántos agentes se activaron, qué archivos tocaron, en qué momentos hubo picos de actividad y si hay señales de fan-out excesivo que conviene corregir.
12
+
13
+ El ledger es un proxy de magnitud (bytes escritos), no una facturación exacta de tokens — Claude Code no expone el conteo real de tokens al hook. Pero es suficiente para detectar patrones problemáticos.
14
+
15
+ ---
16
+
17
+ ## Lo que lees
18
+
19
+ ```bash
20
+ # Ledger completo
21
+ cat .sdd/observabilidad/consumo.jsonl 2>/dev/null || echo "SIN_LEDGER"
22
+
23
+ # Conteo rápido de líneas
24
+ wc -l .sdd/observabilidad/consumo.jsonl 2>/dev/null || echo "0"
25
+ ```
26
+
27
+ ---
28
+
29
+ ## Análisis que produces
30
+
31
+ ### 1. Resumen por agente
32
+
33
+ ```
34
+ node -e "
35
+ const fs = require('fs');
36
+ const path = '.sdd/observabilidad/consumo.jsonl';
37
+ if (!fs.existsSync(path)) { console.log('Sin datos aún.'); process.exit(0); }
38
+
39
+ const lineas = fs.readFileSync(path, 'utf8').trim().split('\n').filter(Boolean);
40
+ const porAgente = {};
41
+ for (const l of lineas) {
42
+ try {
43
+ const e = JSON.parse(l);
44
+ const a = e.agente || 'main';
45
+ if (!porAgente[a]) porAgente[a] = { invocaciones: 0, bytes: 0, archivos: new Set() };
46
+ porAgente[a].invocaciones++;
47
+ porAgente[a].bytes += e.bytes || 0;
48
+ porAgente[a].archivos.add(e.archivo);
49
+ } catch {}
50
+ }
51
+
52
+ console.log('AGENTE | INVOC | BYTES | ARCHIVOS ÚNICOS');
53
+ console.log('-'.repeat(60));
54
+ for (const [a, d] of Object.entries(porAgente).sort((x,y) => y[1].invocaciones - x[1].invocaciones)) {
55
+ console.log(\`\${a.padEnd(19)} | \${String(d.invocaciones).padStart(5)} | \${String(d.bytes).padStart(6)} | \${d.archivos.size}\`);
56
+ }
57
+ console.log('');
58
+ console.log('Total eventos:', lineas.length);
59
+ "
60
+ ```
61
+
62
+ ### 2. Detección de fan-out excesivo
63
+
64
+ Umbrales por defecto (ajustables en `.sdd/sdd.config.yaml`):
65
+
66
+ | Señal | Umbral | Acción sugerida |
67
+ |-------|--------|-----------------|
68
+ | >5 agentes distintos en una fase | Alto | Revisar si la orquestación PTC puede colapsar en menos agentes |
69
+ | >20 invocaciones de un mismo agente | Medio | Revisar si el agente entra en loop o hace trabajo redundante |
70
+ | >500 KB de bytes escritos totales | Informativo | Considerar comprimir memoria con `compresion-tokens` |
71
+
72
+ ```
73
+ node -e "
74
+ const fs = require('fs');
75
+ const path = '.sdd/observabilidad/consumo.jsonl';
76
+ if (!fs.existsSync(path)) process.exit(0);
77
+
78
+ const lineas = fs.readFileSync(path, 'utf8').trim().split('\n').filter(Boolean);
79
+ const agentes = new Set();
80
+ const invocPorAgente = {};
81
+ let bytesTotal = 0;
82
+
83
+ for (const l of lineas) {
84
+ try {
85
+ const e = JSON.parse(l);
86
+ const a = e.agente || 'main';
87
+ agentes.add(a);
88
+ invocPorAgente[a] = (invocPorAgente[a] || 0) + 1;
89
+ bytesTotal += e.bytes || 0;
90
+ } catch {}
91
+ }
92
+
93
+ const alertas = [];
94
+ if (agentes.size > 5) alertas.push('⚠️ Fan-out alto: ' + agentes.size + ' agentes distintos activos');
95
+ for (const [a, n] of Object.entries(invocPorAgente)) {
96
+ if (n > 20) alertas.push('⚠️ Agente en loop posible: ' + a + ' (' + n + ' invocaciones)');
97
+ }
98
+ if (bytesTotal > 500_000) alertas.push('ℹ️ Escritura alta: ' + Math.round(bytesTotal/1024) + ' KB — considera compresion-tokens');
99
+
100
+ if (alertas.length === 0) {
101
+ console.log('✅ Sin alertas de fan-out');
102
+ } else {
103
+ for (const a of alertas) console.log(a);
104
+ }
105
+ "
106
+ ```
107
+
108
+ ### 3. Picos de actividad (top 5 momentos)
109
+
110
+ ```
111
+ node -e "
112
+ const fs = require('fs');
113
+ const path = '.sdd/observabilidad/consumo.jsonl';
114
+ if (!fs.existsSync(path)) process.exit(0);
115
+
116
+ const lineas = fs.readFileSync(path, 'utf8').trim().split('\n').filter(Boolean);
117
+ const parsed = lineas.map(l => { try { return JSON.parse(l); } catch { return null; } }).filter(Boolean);
118
+
119
+ // Agrupar por minuto
120
+ const porMinuto = {};
121
+ for (const e of parsed) {
122
+ const minuto = e.ts?.slice(0,16) || 'desconocido';
123
+ porMinuto[minuto] = (porMinuto[minuto] || 0) + 1;
124
+ }
125
+
126
+ const top = Object.entries(porMinuto).sort((a,b) => b[1] - a[1]).slice(0, 5);
127
+ console.log('TOP 5 MINUTOS DE MAYOR ACTIVIDAD:');
128
+ for (const [m, n] of top) console.log(' ' + m + ' → ' + n + ' eventos');
129
+ "
130
+ ```
131
+
132
+ ---
133
+
134
+ ## Formato del reporte completo
135
+
136
+ ```
137
+ ╔══════════════════════════════════════════════════════╗
138
+ ║ 📊 CONSUMO DE AGENTES — SDD-ES ║
139
+ ╠══════════════════════════════════════════════════════╣
140
+ ║ AGENTE | INVOC | BYTES | ARCHIVOS ║
141
+ ║ [tabla generada] ║
142
+ ╠══════════════════════════════════════════════════════╣
143
+ ║ ALERTAS DE FAN-OUT ║
144
+ ║ [alertas o "✅ Sin alertas"] ║
145
+ ╠══════════════════════════════════════════════════════╣
146
+ ║ TOP MOMENTOS DE ACTIVIDAD ║
147
+ ║ [top 5 minutos] ║
148
+ ╠══════════════════════════════════════════════════════╣
149
+ ║ RECOMENDACIONES ║
150
+ ║ → Si fan-out alto: revisar skill orquestacion-ptc ║
151
+ ║ → Si bytes altos: ejecutar /sdd.comprimir ║
152
+ ║ → Si loop agente: revisar el agente con /sdd.estado║
153
+ ╚══════════════════════════════════════════════════════╝
154
+ ```
155
+
156
+ ---
157
+
158
+ ## Notas
159
+
160
+ - El ledger se escribe en tiempo real por el hook `agent-memory.js` (PostToolUse)
161
+ - Los `bytes` miden el contenido de cada escritura — son un **proxy de magnitud**, no el consumo real de tokens del modelo
162
+ - Para vaciar el ledger al inicio de una sesión nueva: `echo "" > .sdd/observabilidad/consumo.jsonl`
163
+ - Cruzar con `orquestacion-ptc` para decidir cuándo paralelizar vs. serializar agentes
164
+ - Cruzar con `compresion-tokens` para decidir cuándo comprimir los archivos `.sdd/memoria/`
@@ -0,0 +1,177 @@
1
+ ---
2
+ description: Dado el estado actual del proyecto (fase, tareas pendientes, historial de consumo), estima el presupuesto de tokens por fase restante y recomienda si usar PTC paralelo o serial. Reutiliza criterios de orquestacion-ptc para la recomendación de paralelización.
3
+ model: haiku
4
+ allowed-tools: Read
5
+ ---
6
+
7
+ # Skill: Token Budget
8
+
9
+ ## Propósito
10
+
11
+ Antes de lanzar una fase costosa (planificación, análisis 7-dimensiones, implementación de 10+ tareas), esta skill proyecta el costo estimado en tokens y recomienda la estrategia de ejecución más eficiente. Evita sorpresas de presupuesto a mitad de un proyecto largo.
12
+
13
+ ---
14
+
15
+ ## Lo que lees
16
+
17
+ ```bash
18
+ # Estado general del proyecto
19
+ cat .sdd/estado.json
20
+
21
+ # Tareas pendientes de la spec activa
22
+ SPEC_ID=$(grep -o '"especificacion_activa": "[^"]*"' .sdd/estado.json 2>/dev/null | cut -d'"' -f4)
23
+ [ -n "$SPEC_ID" ] && cat ".sdd/especificaciones/${SPEC_ID}/.estado-tareas.json" 2>/dev/null
24
+
25
+ # Historial de consumo (para calcular velocidad real de la sesión)
26
+ cat .sdd/observabilidad/consumo.jsonl 2>/dev/null | tail -50 || echo "SIN_HISTORIAL"
27
+
28
+ # Configuración de agentes habilitados
29
+ cat .sdd/sdd.config.yaml 2>/dev/null | head -30 || echo "SIN_CONFIG"
30
+ ```
31
+
32
+ ---
33
+
34
+ ## Modelo de estimación
35
+
36
+ ### Costos de referencia por fase (en unidades de "peso relativo")
37
+
38
+ Las unidades son relativas entre sí — no son tokens reales, ya que Claude Code no expone el conteo exacto. Se calibran con los datos del ledger si están disponibles.
39
+
40
+ | Fase | Agentes activos | Peso base | Factor por tarea |
41
+ |---|---|---|---|
42
+ | `especificacion` | arquitecto (Opus) | 8 | +1 por cada requisito ambiguo |
43
+ | `aclaracion` | ninguno dedicado | 2 | fijo |
44
+ | `checklist` | ninguno dedicado | 2 | fijo |
45
+ | `planificacion` | arquitecto, critico (Opus) | 10 | +2 por cada riesgo identificado |
46
+ | `tareas` | ninguno dedicado | 3 | +0.5 por tarea a generar |
47
+ | `analisis` (7 dims) | critico, seguridad (Opus) | 12 | fijo (siempre 7 dimensiones) |
48
+ | `implementacion` | 1-5 agentes (Sonnet) | 4 | ×N tareas pendientes |
49
+ | `verificacion` | ninguno dedicado | 4 | ×N CAs a verificar |
50
+ | `qa` | tester (Sonnet) | 5 | ×N flows a probar |
51
+ | `deploy` | operaciones (Haiku) | 2 | fijo |
52
+
53
+ ### Calibración con ledger histórico
54
+
55
+ Si existe `consumo.jsonl` con datos de la sesión actual:
56
+
57
+ ```
58
+ node -e "
59
+ const fs = require('fs');
60
+ const path = '.sdd/observabilidad/consumo.jsonl';
61
+ if (!fs.existsSync(path)) { console.log('SIN_DATOS'); process.exit(0); }
62
+
63
+ const lineas = fs.readFileSync(path, 'utf8').trim().split('\n').filter(Boolean);
64
+ const parsed = lineas.map(l => { try { return JSON.parse(l); } catch { return null; } }).filter(Boolean);
65
+
66
+ // Bytes totales por fase (agrupando por agente que los escribió)
67
+ const porAgente = {};
68
+ for (const e of parsed) {
69
+ const a = e.agente || 'main';
70
+ porAgente[a] = (porAgente[a] || 0) + (e.bytes || 0);
71
+ }
72
+
73
+ const totalBytes = Object.values(porAgente).reduce((s,v) => s+v, 0);
74
+ console.log('Bytes totales sesión: ' + totalBytes);
75
+ console.log('Velocidad promedio: ' + Math.round(totalBytes / lineas.length) + ' bytes/evento');
76
+ console.log('Eventos totales: ' + lineas.length);
77
+ "
78
+ ```
79
+
80
+ Usar la velocidad promedio como factor de calibración: si el historial muestra >1000 bytes/evento, los pesos base ×1.5.
81
+
82
+ ---
83
+
84
+ ## Recomendación de paralelización (reutiliza orquestacion-ptc)
85
+
86
+ Regla del criterio de independencia (de `orquestacion-ptc`):
87
+
88
+ **Usar PTC paralelo cuando:**
89
+ - Las tareas no se bloquean entre sí (salida de A no es entrada de B)
90
+ - Hay ≥3 tareas del mismo tipo para el mismo agente
91
+ - Las tareas son verificaciones (sin efectos secundarios que se pisen)
92
+ - Ahorro esperado: −70 a −85% en tokens del orquestador
93
+
94
+ **Usar serial cuando:**
95
+ - La tarea N+1 depende del resultado de la tarea N
96
+ - Son acciones sobre infraestructura (migrations, deploys) donde el orden importa
97
+ - Solo hay 1-2 tareas (overhead de PTC no vale)
98
+
99
+ Para la fase `implementacion` con N tareas pendientes:
100
+
101
+ | N tareas pendientes | Estrategia recomendada | Ahorro estimado |
102
+ |---|---|---|
103
+ | 1-2 | Serial (directo) | — |
104
+ | 3-5 independientes | PTC paralelo (lote de 3-5) | ~70% |
105
+ | 6-10 independientes | PTC en 2 lotes de 5 | ~65% |
106
+ | >10 independientes | PTC en lotes de 5 + agrupación por agente | ~60% |
107
+ | Cualquier N con deps | Serial (respetar grafo de dependencias) | — |
108
+
109
+ ---
110
+
111
+ ## Señal de alerta: presupuesto proyectado < 20%
112
+
113
+ Tras calcular el peso total estimado de las fases restantes y compararlo con el presupuesto disponible (calibrado con el ledger), si **el presupuesto proyectado restante cae por debajo del 20%**, emite una alerta destacada antes de cualquier recomendación:
114
+
115
+ ```
116
+ ⚠️ ALERTA DE PRESUPUESTO — proyección < 20% disponible
117
+
118
+ Presupuesto proyectado restante: {X}% (umbral crítico: 20%)
119
+ Fases que aún no caben con el margen actual: {lista}
120
+
121
+ ACCIONES RECOMENDADAS (de mayor a menor impacto):
122
+ 1. Ejecutar /sdd.comprimir aplicar para liberar contexto ahora.
123
+ 2. Degradar modelos con effort-router en las fases restantes.
124
+ 3. Paralelizar con PTC las tareas independientes (ahorro del orquestador).
125
+ 4. Dividir la fase de implementación: ejecutar por lotes y comprimir entre lotes.
126
+ ```
127
+
128
+ Cómo se calcula el porcentaje proyectado: `(peso_disponible − peso_total_estimado_fases_restantes) / peso_disponible × 100`. Si no hay historial para fijar `peso_disponible`, usa el umbral conservador del ledger (velocidad observada × eventos restantes estimados) y marca la alerta como **estimación sin calibrar**.
129
+
130
+ La alerta es informativa y no bloquea: el usuario decide. Pero debe mostrarse SIEMPRE que la proyección cruce el umbral del 20%.
131
+
132
+ ---
133
+
134
+ ## Output que produces
135
+
136
+ ```
137
+ ╔══════════════════════════════════════════════════════════════════╗
138
+ ║ 💰 TOKEN BUDGET — Proyección de Fases Restantes ║
139
+ ╠══════════════════════════════════════════════════════════════════╣
140
+ ║ Fase actual: {fase} | Spec: {SPEC_ID} ║
141
+ ╠══════════════════════════════════════════════════════════════════╣
142
+ ║ FASES RESTANTES | PESO EST. | ESTRATEGIA | AGENTES ║
143
+ ║ ─────────────────────┼───────────┼───────────────┼──────────── ║
144
+ ║ implementacion | ████ 40 | PTC × 3 lotes | 3 agentes ║
145
+ ║ └─ {N} tareas pend.| | serial internamente ║
146
+ ║ verificacion | ██ 16 | Serial (deps) | — ║
147
+ ║ qa | ██ 10 | PTC × flows | tester ║
148
+ ║ deploy | █ 4 | Serial | operaciones ║
149
+ ║ ─────────────────────┼───────────┼───────────────┼──────────── ║
150
+ ║ TOTAL ESTIMADO | ████████ | 70 | ║
151
+ ╠══════════════════════════════════════════════════════════════════╣
152
+ ║ 📊 CALIBRACIÓN CON HISTORIAL ║
153
+ ║ ║
154
+ ║ {datos del ledger o "Sin historial — usando pesos base"} ║
155
+ ╠══════════════════════════════════════════════════════════════════╣
156
+ ║ 🚀 RECOMENDACIÓN DE EJECUCIÓN ║
157
+ ║ ║
158
+ ║ 1. {fase más costosa}: usar effort-router para degradar ║
159
+ ║ modelos donde sea posible (ahorro ~{%}% estimado) ║
160
+ ║ ║
161
+ ║ 2. {fase con tareas independientes}: usar PTC con lotes ║
162
+ ║ de {N} → comando: /sdd.implementar ptc={N} ║
163
+ ║ ║
164
+ ║ 3. Si el presupuesto es ajustado: comprimir memoria antes ║
165
+ ║ de lanzar la fase de implementación ║
166
+ ╚══════════════════════════════════════════════════════════════════╝
167
+ ```
168
+
169
+ ---
170
+
171
+ ## Notas
172
+
173
+ - Los pesos son relativos, no tokens reales. Claude Code no expone el conteo exacto de tokens al contexto.
174
+ - La calibración con el ledger mejora la precisión: si la sesión actual ya tiene datos, los pesos se ajustan a la velocidad real observada.
175
+ - Para proyectos con presupuesto de API estricto, usar junto con `effort-router` para maximizar el ahorro antes de lanzar fases costosas.
176
+ - Esta skill se invoca desde `/sdd.optimizar presupuesto` y como PASO 6 de `/sdd.optimizar`.
177
+ - Reutiliza los criterios de independencia de `orquestacion-ptc` — si esa skill tiene más detalle sobre cuándo paralelizar, referenciarlo directamente.