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.
- package/.claude/settings.json +29 -29
- package/.claude/settings.local.json +10 -0
- package/.claude-plugin/marketplace.json +10 -7
- package/.claude-plugin/plugin.json +59 -37
- package/.gitignore +20 -0
- package/.mcp.json +8 -0
- package/LICENSE +21 -0
- package/README.md +77 -40
- package/agents/architecture-designer.md +211 -0
- package/agents/arquitecto.md +16 -1
- package/agents/asesor-datos.md +15 -1
- package/agents/critico.md +37 -1
- package/agents/desarrollador-backend.md +3 -1
- package/agents/desarrollador-frontend.md +11 -16
- package/agents/disenador-api.md +13 -1
- package/agents/documentador.md +3 -1
- package/agents/investigador.md +3 -1
- package/agents/operaciones.md +3 -1
- package/agents/product-designer.md +268 -0
- package/agents/revisor.md +25 -1
- package/agents/seguridad.md +5 -1
- package/agents/tester.md +3 -1
- package/claude-hooks/agent-memory.js +288 -0
- package/claude-hooks/pre-tool-guard.js +61 -9
- package/cli/index.js +1 -2
- package/commands/sdd.adr.md +196 -0
- package/commands/sdd.analizar.md +23 -2
- package/commands/sdd.ayuda.md +13 -0
- package/commands/sdd.compliance.md +521 -0
- package/commands/sdd.configurar.md +34 -1
- package/commands/sdd.constitucion.md +198 -23
- package/commands/sdd.construir.md +210 -0
- package/commands/sdd.crear-mcp.md +2 -0
- package/commands/sdd.defect-report.md +134 -0
- package/commands/sdd.descubrir.md +19 -0
- package/commands/sdd.dise/303/261ar.md +188 -0
- package/commands/sdd.estado.md +120 -3
- package/commands/sdd.exportar.md +344 -0
- package/commands/sdd.implementar.md +272 -52
- package/commands/sdd.interpretar.md +239 -0
- package/commands/sdd.md +93 -4
- package/commands/sdd.optimizar-memoria.md +47 -0
- package/commands/sdd.optimizar.md +164 -0
- package/commands/sdd.planificar.md +64 -0
- package/commands/sdd.retro.md +74 -0
- package/commands/sdd.verificar.md +81 -0
- package/configuracion-ejemplo/.claude/CLAUDE.md +106 -0
- package/configuracion-ejemplo/sdd.config.yaml +10 -0
- package/craft/accessibility-baseline.md +216 -0
- package/craft/anti-ai-slop.md +158 -0
- package/craft/color.md +160 -0
- package/craft/typography.md +121 -0
- package/design-systems/bold-brutalist/DESIGN.md +239 -0
- package/design-systems/editorial-minimal/DESIGN.md +205 -0
- package/design-systems/neutral-modern/DESIGN.md +227 -0
- package/design-systems/vibrant-consumer/DESIGN.md +257 -0
- package/design-systems/warm-editorial/DESIGN.md +221 -0
- package/docs/AGENTES.md +4 -1
- package/docs/CASO-COMPLETO.md +206 -0
- package/docs/EJEMPLOS.md +61 -185
- package/docs/FABRICA.md +163 -115
- package/docs/INICIO-RAPIDO.md +27 -79
- package/docs/MEMORIA-Y-OBSERVABILIDAD.md +239 -0
- package/docs/MODELOS.md +3 -0
- package/docs/QUE-PASA-SI-FALLA.md +404 -0
- package/docs/README.md +43 -0
- package/docs/RELACION-CON-CLAUDE-CODE.md +38 -0
- package/docs/SEGURIDAD-PARA-NOTECNICOS.md +280 -0
- package/package.json +15 -10
- package/plantillas/job-story-mejorar-prompt.md +107 -0
- package/presets/enterprise.yaml +6 -0
- package/presets/lean.yaml +4 -0
- package/presets/startup.yaml +6 -0
- package/skills/adr-indexer/SKILL.md +181 -0
- package/skills/cache-audit/SKILL.md +163 -0
- package/skills/critica-diseno/SKILL.md +193 -0
- package/skills/descubrir-idea/SKILL.md +133 -0
- package/skills/effort-router/SKILL.md +128 -0
- package/skills/elegir-direccion/SKILL.md +184 -0
- package/skills/github-connect/IMPLEMENTATION-CHECKLIST.md +297 -0
- package/skills/github-connect/INDEX.md +223 -0
- package/skills/github-connect/INTEGRATION.md +361 -0
- package/skills/github-connect/QUICK-START.md +168 -0
- package/skills/github-connect/README.md +414 -0
- package/skills/github-connect/RESUMEN_IMPLEMENTACION.txt +374 -0
- package/skills/github-connect/SKILL.md +343 -0
- package/skills/github-connect/STRUCTURE.txt +252 -0
- package/skills/github-connect/example-config.yaml +41 -0
- package/skills/github-connect/github-connect.sh +419 -0
- package/skills/interpretar-idea/SKILL.md +254 -0
- package/skills/mejorar-prompt/SKILL.md +237 -0
- package/skills/memory-compactor/SKILL.md +68 -0
- package/skills/modo-guiado/SKILL.md +12 -2
- package/skills/mutation-detector/SKILL.md +134 -0
- package/skills/observabilidad-consumo/SKILL.md +164 -0
- package/skills/token-budget/SKILL.md +177 -0
- package/skills/vercel-deploy/00-START-HERE.txt +364 -0
- package/skills/vercel-deploy/CHECKLIST.md +205 -0
- package/skills/vercel-deploy/EXEC-SUMMARY.txt +322 -0
- package/skills/vercel-deploy/FLOW.txt +334 -0
- package/skills/vercel-deploy/INDEX.md +276 -0
- package/skills/vercel-deploy/INTEGRATION.md +328 -0
- package/skills/vercel-deploy/MANIFEST.md +310 -0
- package/skills/vercel-deploy/README.md +65 -0
- package/skills/vercel-deploy/SKILL.md +356 -0
- package/skills/vercel-deploy/deploy.sh +298 -0
- package/skills/vercel-deploy/estado.json.example +205 -0
- package/skills/vercel-deploy/skill.yaml +323 -0
- package/skills/vercel-deploy/vercel-deploy.sh +216 -0
- package/skills/wireframe-mvp/SKILL.md +157 -0
- package/docs/EJEMPLO-PRACTICA.md +0 -383
- package/mcp-figma/README.md +0 -158
- package/mcp-figma/package.json +0 -7
- package/mcp-figma/src/component-generator.js +0 -162
- package/mcp-figma/src/design-system-analyzer.js +0 -247
- package/mcp-figma/src/figma-client.js +0 -75
- package/mcp-figma/src/index.js +0 -114
- package/mcp-figma/src/mcp.js +0 -97
- package/mcp-figma/src/style-mapper.js +0 -85
- /package/skills/{compresion-tokens.md → compresion-tokens/SKILL.md} +0 -0
- /package/skills/{constitucion-constraint.md → constitucion-constraint/SKILL.md} +0 -0
- /package/skills/{deteccion-stack.md → deteccion-stack/SKILL.md} +0 -0
- /package/skills/{enrutador-agentes.md → enrutador-agentes/SKILL.md} +0 -0
- /package/skills/{gestion-estado.md → gestion-estado/SKILL.md} +0 -0
- /package/skills/{indexador.md → indexador/SKILL.md} +0 -0
- /package/skills/{validacion-spec.md → validacion-spec/SKILL.md} +0 -0
- /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.
|