@saulwade/swl-ses 1.7.4 → 1.9.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.md +196 -196
- package/README.md +579 -579
- package/agentes/auto-evolucion-swl.md +7 -7
- package/agentes/disenador-ui-swl.md +12 -0
- package/agentes/investigador-ux-swl.md +9 -0
- package/agentes/orquestador-swl.md +89 -1
- package/agentes/perfilador-usuario-swl.md +2 -2
- package/agentes/revisor-codigo-swl.md +34 -10
- package/agentes/revisor-seguridad-swl.md +7 -0
- package/agentes/tdd-qa-swl.md +23 -2
- package/agentes/ux-disenador-swl.md +6 -0
- package/comandos/swl/autoresearch.md +102 -6
- package/comandos/swl/evaluar-skill.md +1 -1
- package/comandos/swl/evolucion-estado.md +5 -5
- package/comandos/swl/evolucionar.md +2 -2
- package/comandos/swl/inbox.md +1 -1
- package/comandos/swl/metricas.md +34 -0
- package/comandos/swl/nemesis.md +42 -1
- package/comandos/swl/planear-fase.md +8 -0
- package/comandos/swl/predecir.md +139 -0
- package/comandos/swl/reflect-skills.md +2 -2
- package/comandos/swl/salud.md +1 -1
- package/comandos/swl/verificar.md +50 -7
- package/habilidades/ai-runtime-security/SKILL.md +2 -2
- package/habilidades/angular-moderno/SKILL.md +44 -1
- package/habilidades/auto-evolucion-protocolo/SKILL.md +2 -2
- package/habilidades/autoresearch/SKILL.md +15 -1
- package/habilidades/benchmark-memoria/SKILL.md +2 -2
- package/habilidades/calidad-mutation-testing/SKILL.md +170 -0
- package/habilidades/changelog-generator/scripts/parse-commits.js +2 -1
- package/habilidades/checklist-seguridad/SKILL.md +29 -1
- package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -0
- package/habilidades/css-moderno/SKILL.md +3 -1
- package/habilidades/drift-detection/SKILL.md +3 -3
- package/habilidades/eval-framework/SKILL.md +1 -1
- package/habilidades/fastapi-experto/SKILL.md +56 -5
- package/habilidades/guardrail-semantico/SKILL.md +4 -4
- package/habilidades/patrones-python/SKILL.md +8 -5
- package/habilidades/proceso-ddia-streaming/SKILL.md +4 -4
- package/habilidades/proceso-debate-adversarial/SKILL.md +164 -0
- package/habilidades/proceso-debate-adversarial/recursos/personas.md +105 -0
- package/habilidades/proceso-dynamic-workflows/SKILL.md +138 -0
- package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -0
- package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -0
- package/habilidades/swl-claudemd/SKILL.md +2 -2
- package/habilidades/tdd-workflow/SKILL.md +14 -1
- package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -0
- package/habilidades/testing-python/SKILL.md +1 -1
- package/habilidades/tracing-processor/SKILL.md +1 -1
- package/hooks/actualizar-perfil-usuario.js +2 -2
- package/hooks/aiisms-detector.js +2 -2
- package/hooks/auto-evolucion.js +1 -1
- package/hooks/captura-feedback-usuario.js +2 -2
- package/hooks/claudemd-bloat-detector.js +2 -2
- package/hooks/claudemd-duplicacion-detector.js +1 -1
- package/hooks/contexto-iteracion.js +144 -0
- package/hooks/guardrail-modelo.js +2 -2
- package/hooks/lib/loop-telemetry.js +321 -0
- package/hooks/lib/memory-search.js +1 -1
- package/hooks/lib/nudge-tracker.js +1 -1
- package/hooks/metricas-evolucion.js +3 -3
- package/hooks/notificacion-telegram.js +11 -3
- package/hooks/rotar-audit-auto.js +2 -2
- package/hooks/validar-formato-post-subagente.js +2 -2
- package/hooks/validar-intent-spec.js +1 -1
- package/hooks/validar-planning-paths.js +134 -0
- package/llms.txt +29 -0
- package/manifiestos/hooks-config.json +30 -12
- package/manifiestos/modulos.json +1358 -1351
- package/manifiestos/planning-paths.json +44 -0
- package/manifiestos/skills-lock.json +1275 -1254
- package/package.json +93 -92
- package/plugin.json +375 -372
- package/reglas/arquitectura.evolved.json +7 -0
- package/reglas/arquitectura.md +65 -0
- package/reglas/gobernanza.md +1 -1
- package/reglas/memoria-consolidada.md +7 -7
- package/reglas/seguridad.evolved.json +7 -0
- package/reglas/seguridad.md +144 -0
- package/reglas/sin-duplicacion-reglas-globales.md +1 -1
- package/scripts/auditar-agentes-gaps.js +1 -1
- package/scripts/auditar-cobertura-frameworks.js +2 -2
- package/scripts/auditar-skills-gaps.js +2 -2
- package/scripts/benchmark-memoria.js +3 -3
- package/scripts/generar-inventario.js +64 -1
- package/scripts/inferir-herramientas-permitidas.js +1 -1
- package/scripts/instalador.js +80 -2
- package/scripts/lib/dashboard-widgets.js +3 -3
- package/scripts/lib/drift-detector.js +3 -3
- package/scripts/lib/eval-metrics-store.js +3 -3
- package/scripts/lib/gitignore-manifest.js +3 -3
- package/scripts/mcp-server/README.md +1 -1
- package/scripts/mcp-server/telemetry.js +2 -2
- package/scripts/reflect-skills.js +4 -4
- package/scripts/rotar-audit-logs.js +2 -2
- package/scripts/run-skill-evals.js +2 -2
- package/scripts/smoke-test.js +24 -2
|
@@ -50,7 +50,7 @@ hardGuardrails:
|
|
|
50
50
|
- "Agentes 'evolvable: false' requieren ADR humano explícito antes de cualquier cambio."
|
|
51
51
|
- "@reglas/gobernanza.md § Gate G8 — skills nuevos pasan por _userland/ + score >=70 antes de promover."
|
|
52
52
|
- "Gates G1-G8 son veto: fallo en cualquier gate aborta la evolución, sin override."
|
|
53
|
-
- "@hooks/audit-trail.js — toda evolución registrada en .planning/
|
|
53
|
+
- "@hooks/audit-trail.js — toda evolución registrada en .planning/evolution/evoluciones.jsonl."
|
|
54
54
|
- "Modificaciones a hooks bloqueantes (calidad-pre-commit, escaneo-secretos) requieren HITL."
|
|
55
55
|
fragmentos:
|
|
56
56
|
- _intent-spec
|
|
@@ -91,7 +91,7 @@ ANTES de modificar cualquier agente o skill:
|
|
|
91
91
|
o está en la lista bloqueada (auto-evolucion-swl, red-team-swl, orquestador-swl,
|
|
92
92
|
revisor-seguridad-swl), detente y reporta al usuario. La política completa
|
|
93
93
|
(qué está bloqueado, por qué, y cuándo re-evaluarla) vive en
|
|
94
|
-
`.planning/
|
|
94
|
+
`.planning/evolution/politica-evolvable.md`.
|
|
95
95
|
|
|
96
96
|
**1a. Normalizar el frontmatter** usando `scripts/lib/skill-normalizer.js`:
|
|
97
97
|
```bash
|
|
@@ -149,19 +149,19 @@ campo `data.diagnosis` con la clasificación del fallo dominante:
|
|
|
149
149
|
| `timeout` | Excedió presupuesto de turnos/tiempo | `toolBudget.complex`, `maxTurnos` |
|
|
150
150
|
| `schema_violation` | Output violó schema declarado | `schemas/agent-output-*.schema.json` + template de output |
|
|
151
151
|
| `task_incomplete` | Terminó con scope parcial | Protocolo de cierre, definición de "done" |
|
|
152
|
-
| `unknown` | No clasificable | Leer últimas 3 trazas de `.planning/auto-
|
|
152
|
+
| `unknown` | No clasificable | Leer últimas 3 trazas de `.planning/auto-evolution/agentes.jsonl` |
|
|
153
153
|
|
|
154
154
|
### Cómo leer el diagnosis de la sesión actual
|
|
155
155
|
|
|
156
156
|
```bash
|
|
157
157
|
# Últimos nudges con su diagnosis
|
|
158
|
-
tail -20 .planning/
|
|
158
|
+
tail -20 .planning/evolution/nudges.jsonl | node -e "process.stdin.on('data',b=>b.toString().split(/\r?\n/).filter(Boolean).forEach(l=>{try{const j=JSON.parse(l);if(j.kind==='auto-evolucion')console.log(j.target,'->',j.data?.diagnosis?.tipo_fallo);}catch{}}))"
|
|
159
159
|
|
|
160
160
|
# Trazas raw del agente objetivo en los últimos 14 días
|
|
161
161
|
node -e "
|
|
162
162
|
const fs=require('fs');
|
|
163
163
|
const ventana=Date.now()-14*24*3600*1000;
|
|
164
|
-
const lines=fs.readFileSync('.planning/auto-
|
|
164
|
+
const lines=fs.readFileSync('.planning/auto-evolution/agentes.jsonl','utf8').split(/\r?\n/).filter(Boolean);
|
|
165
165
|
for(const l of lines){try{const j=JSON.parse(l);if(j.agente==='TU_TARGET' && Date.parse(j.ts)>=ventana)console.log(j.ts,j.status,j.tipo_fallo||'');}catch{}}"
|
|
166
166
|
```
|
|
167
167
|
|
|
@@ -672,7 +672,7 @@ como período de prueba (regla `gobernanza.md` línea 30). La promoción al core
|
|
|
672
672
|
- Oro (≥80) → promover sin más
|
|
673
673
|
- Plata (≥70) → promover, dejar nota en CHANGELOG: "promovido con badge Plata, mejorar en próxima evolución"
|
|
674
674
|
- Bronce (≥60) → NO promover. Devolver a _userland/ con feedback de qué dimensiones bajan el score.
|
|
675
|
-
- Sin badge (<60)→ NO promover. Documentar en .planning/
|
|
675
|
+
- Sin badge (<60)→ NO promover. Documentar en .planning/evolution/promociones-rechazadas.jsonl
|
|
676
676
|
4. Si badge ≥ Plata: mover archivo a habilidades/<nombre>/SKILL.md, registrar
|
|
677
677
|
en manifiestos/modulos.json, actualizar INVENTARIO.md.
|
|
678
678
|
5. Registrar evento en evoluciones.jsonl con tipo: "promocion-skill" y score.
|
|
@@ -702,7 +702,7 @@ Independientemente de los gates:
|
|
|
702
702
|
|
|
703
703
|
### Registro de evoluciones autónomas
|
|
704
704
|
|
|
705
|
-
Cada evolución autónoma escribe a `.planning/
|
|
705
|
+
Cada evolución autónoma escribe a `.planning/evolution/evoluciones.jsonl`:
|
|
706
706
|
|
|
707
707
|
```json
|
|
708
708
|
{"ts":"2026-04-19T...","tipo":"aplicada","target":"skill-x","score":85,"modo":"autonomo"}
|
|
@@ -61,6 +61,18 @@ Responsabilidades concretas:
|
|
|
61
61
|
- Adaptar o extender design systems existentes (Material, Ant, shadcn, Radix)
|
|
62
62
|
- Producir UI-SPEC.md que el implementador pueda seguir sin consultar al diseñador
|
|
63
63
|
|
|
64
|
+
## Path de output canónico (OBLIGATORIO)
|
|
65
|
+
|
|
66
|
+
Escribe TODOS tus artefactos en `.planning/design/` — NUNCA en la raíz del
|
|
67
|
+
proyecto ni en directorios ad-hoc (`ux/`, `diseno/`, `diseno-visual/`):
|
|
68
|
+
|
|
69
|
+
- `.planning/design/UI-SPEC.md` — la especificación visual principal.
|
|
70
|
+
- `.planning/design/tokens.md`, `component-inventory.md`, etc. — artefactos de apoyo.
|
|
71
|
+
|
|
72
|
+
El path está pineado (ADR-0031, `manifiestos/planning-paths.json`): no es elección
|
|
73
|
+
del orquestador. Si ya existe `.planning/design/UI-SPEC.md`, léelo antes de
|
|
74
|
+
sobreescribir. Cierra DT-PLANNING-OUTPUT-PATHS.
|
|
75
|
+
|
|
64
76
|
## Protocolo obligatorio al iniciar
|
|
65
77
|
|
|
66
78
|
ANTES de definir cualquier valor visual:
|
|
@@ -59,6 +59,15 @@ Responsabilidades concretas:
|
|
|
59
59
|
- Analizar datos de uso: heatmaps, funnels, tasas de conversión, bounce rates
|
|
60
60
|
- Producir reportes de investigación accionables con hallazgos y recomendaciones
|
|
61
61
|
|
|
62
|
+
## Path de output canónico (OBLIGATORIO)
|
|
63
|
+
|
|
64
|
+
Escribe TODOS tus artefactos de investigación en `.planning/design/` (reportes,
|
|
65
|
+
personas, customer journeys, análisis heurístico) — NUNCA en la raíz ni en
|
|
66
|
+
`ux/`/`investigacion/`/`research/`. Path pineado (ADR-0031,
|
|
67
|
+
`manifiestos/planning-paths.json`): compartes directorio con `disenador-ui-swl`
|
|
68
|
+
y `ux-disenador-swl` para que el conocimiento de usuario y la spec visual vivan
|
|
69
|
+
juntos. Cierra DT-PLANNING-OUTPUT-PATHS.
|
|
70
|
+
|
|
62
71
|
## Protocolo obligatorio al iniciar
|
|
63
72
|
|
|
64
73
|
ANTES de comenzar cualquier investigación:
|
|
@@ -15,7 +15,12 @@ modeloAlterno: claude-haiku-4-5-20251001
|
|
|
15
15
|
ventanaContexto: 200k
|
|
16
16
|
permissionMode: plan
|
|
17
17
|
color: white
|
|
18
|
-
version: 1.
|
|
18
|
+
version: 1.3.0
|
|
19
|
+
evolved: true
|
|
20
|
+
evolved-from: "1.2.0"
|
|
21
|
+
evolved-at: "2026-06-04"
|
|
22
|
+
evolved-by: "evolucionar"
|
|
23
|
+
evolved-note: "PE-005 sección 5 'Sub-agente background falla con API Error: Usage credits required for 1M context — verificar filesystem antes de re-intentar' + PE-006 sección 6 'Cuándo NO delegar a sub-agentes Opus 4.7 1M context'. Aprobación humana explícita pese a evolvable=false (función sistémica) — patrones de recovery operativos validados en OIC v1.5 2026-06-04 (2 sub-agentes background fallaron al cerrar pero dejaron ~700 LOC en disco)."
|
|
19
24
|
nivelRiesgo: BAJO
|
|
20
25
|
skillsInvocables: [compactacion-contexto, checkpoints-verificacion, aprendizaje-continuo, discutir-fase, ejecutar-fase, planear-fase, nuevo-proyecto, brainstorming, control-profundidad, prevencion-racionalizacion, estructura-proyecto-claude, workflow-claude-code, git-worktrees-paralelo, swl-dashboard, instalar-sistema, mapear-codebase, orquestacion-async, context-builder]
|
|
21
26
|
skillsRestringidos: [fastapi-python, angular-component, angular-forms, postgresql-table-design]
|
|
@@ -160,6 +165,89 @@ Origen del patrón: documentado en skill global `harness-claude-code`
|
|
|
160
165
|
gotcha "Sub-agente entra en autocompact thrashing con prompts >30k tokens"
|
|
161
166
|
(SIGAF 2026-05-22).
|
|
162
167
|
|
|
168
|
+
### 5. Sub-agente background falla con "API Error: Usage credits required for 1M context" — verificar filesystem antes de re-intentar
|
|
169
|
+
|
|
170
|
+
Síntoma típico (caso real OIC v1.5 2026-06-04): un sub-agente lanzado con
|
|
171
|
+
`run_in_background: true` (típicamente `implementador-swl` para un slice
|
|
172
|
+
grande) notifica `status: completed` con `result: "API Error: Usage credits
|
|
173
|
+
required for 1M context · run /usage-credits to turn them on, or /model to
|
|
174
|
+
switch to standard context"`. El `total_tokens` del result es muy bajo
|
|
175
|
+
(1k-2k) pese a `tool_uses` alto (29-35).
|
|
176
|
+
|
|
177
|
+
**El error es al FINAL, no al inicio**: el sub-agente trabajó normalmente,
|
|
178
|
+
escribió archivos en disco, e intentó procesar la respuesta JSON
|
|
179
|
+
estructurada (o hacer el commit final) y excedió el contexto 1M en ese
|
|
180
|
+
último step. Todo el trabajo real quedó en disco.
|
|
181
|
+
|
|
182
|
+
**Protocolo OBLIGATORIO de recuperación** antes de re-implementar:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
# 1. Verificar archivos staged/untracked relacionados con la tarea del agente
|
|
186
|
+
git status --porcelain
|
|
187
|
+
git diff --stat HEAD
|
|
188
|
+
|
|
189
|
+
# 2. Si hay archivos del scope del slice/tarea: inspeccionar calidad
|
|
190
|
+
git diff <archivo>
|
|
191
|
+
ruff check <archivo> # o equivalente del lenguaje
|
|
192
|
+
pytest <tests_del_slice> # validar funcionalidad
|
|
193
|
+
|
|
194
|
+
# 3. Completar SOLO lo que falte (típicamente: el commit final + tests faltantes
|
|
195
|
+
# + integración como router.py, __init__.py, etc.)
|
|
196
|
+
git add <archivos_validados>
|
|
197
|
+
git commit -m "feat(...): retomado tras fallo de billing del sub-agente"
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**NUNCA** asumir "fallo total" y re-implementar desde cero. Eso descarta
|
|
201
|
+
horas de trabajo que está completo en disco.
|
|
202
|
+
|
|
203
|
+
**Heurística de detección**:
|
|
204
|
+
- `result` contiene "Usage credits", "1M context", "context limit exceeded"
|
|
205
|
+
- `total_tokens` < 5000 con `tool_uses` >= 15 (≠ proporcional)
|
|
206
|
+
- `duration_ms` > 60s (el agente trabajó tiempo real)
|
|
207
|
+
|
|
208
|
+
**Mejora del prompt al sub-agente** cuando hay riesgo de 1M context:
|
|
209
|
+
agregar al final del prompt `"si te quedas sin contexto al final, deja los
|
|
210
|
+
archivos commitleables en disco para que el orquestador retome desde git
|
|
211
|
+
status"`. Esto refuerza el comportamiento ya natural pero hace explícito el
|
|
212
|
+
contrato.
|
|
213
|
+
|
|
214
|
+
**Origen**: OIC Milestone v1.5 Slices 1 y 5 (2026-06-04). Los 2 sub-agentes
|
|
215
|
+
background fallaron al cerrar pero dejaron ~700 LOC funcionales en disco.
|
|
216
|
+
Detectado por `git status` antes de re-implementar.
|
|
217
|
+
|
|
218
|
+
### 6. Cuándo NO delegar a sub-agentes Opus 4.7 [1M context]
|
|
219
|
+
|
|
220
|
+
El modelo Opus 4.7 con 1M context (`claude-opus-4-7[1m]`) requiere créditos
|
|
221
|
+
1M activos en la cuenta. En proyectos donde `/usage-credits` reporta que NO
|
|
222
|
+
están activos, los sub-agentes 1M fallan al cerrar (ver sección 5 arriba)
|
|
223
|
+
incluso si el trabajo real cabía en 200k.
|
|
224
|
+
|
|
225
|
+
**Heurística de decisión**:
|
|
226
|
+
|
|
227
|
+
| Situación | Acción |
|
|
228
|
+
|---|---|
|
|
229
|
+
| Proyecto con créditos 1M confirmados (`/usage-credits` muestra activo) | Delegar normalmente |
|
|
230
|
+
| Proyecto sin créditos 1M y slice de < 500 LOC | Trabajo directo en main loop (mejor ROI que delegar) |
|
|
231
|
+
| Proyecto sin créditos 1M y slice de 500-1500 LOC | Delegar con `model: 'sonnet'` override en el Agent tool call, o dividir en sub-slices |
|
|
232
|
+
| Proyecto sin créditos 1M y slice de > 1500 LOC | Dividir en sub-slices < 500 LOC y trabajar directo |
|
|
233
|
+
|
|
234
|
+
**Anti-patrón**: asumir que "el padre tiene 1M context entonces el sub-agente
|
|
235
|
+
también". El sub-agente hereda el modelo, no los créditos. Los créditos son
|
|
236
|
+
por-cuenta, no por-sesión.
|
|
237
|
+
|
|
238
|
+
**Override seguro** cuando se delega y no hay créditos 1M:
|
|
239
|
+
|
|
240
|
+
```typescript
|
|
241
|
+
Agent({
|
|
242
|
+
subagent_type: "implementador-swl",
|
|
243
|
+
model: "sonnet", // ← override explícito
|
|
244
|
+
prompt: "...",
|
|
245
|
+
})
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**Origen**: OIC Milestone v1.5 2026-06-04. 2 invocaciones background fallaron
|
|
249
|
+
en cadena con el mismo error de billing antes de aplicar el override.
|
|
250
|
+
|
|
163
251
|
## Routing por fase + dominio (lookup tabular determinístico)
|
|
164
252
|
|
|
165
253
|
Antes de delegar, **clasifica la petición** por dos ejes mecánicos en lugar de
|
|
@@ -94,7 +94,7 @@ tercero (perfil del usuario). **No cruces los carriles:**
|
|
|
94
94
|
|
|
95
95
|
3. **Verificar el dirty-bit del hook:**
|
|
96
96
|
```
|
|
97
|
-
Read(".planning/
|
|
97
|
+
Read(".planning/user-profile/dirty.json")
|
|
98
98
|
```
|
|
99
99
|
Este archivo lista las señales acumuladas desde la última consolidación.
|
|
100
100
|
Si no existe: no hay trabajo pendiente; termina con "perfil al día".
|
|
@@ -254,7 +254,7 @@ atomicWriteSync('instintos/perfil-usuario.yaml', yamlContent);
|
|
|
254
254
|
### Paso 6 — Limpiar dirty-bit
|
|
255
255
|
|
|
256
256
|
```bash
|
|
257
|
-
rm -f .planning/
|
|
257
|
+
rm -f .planning/user-profile/dirty.json
|
|
258
258
|
```
|
|
259
259
|
|
|
260
260
|
### Paso 7 — Reportar al usuario
|
|
@@ -15,12 +15,12 @@ model: claude-sonnet-4-6
|
|
|
15
15
|
modeloAlterno: claude-haiku-4-5-20251001
|
|
16
16
|
ventanaContexto: 200k
|
|
17
17
|
color: orange
|
|
18
|
-
version: 1.2.
|
|
18
|
+
version: 1.2.2
|
|
19
19
|
evolved: true
|
|
20
|
-
evolved-from: "1.1
|
|
21
|
-
evolved-at: "2026-05
|
|
22
|
-
evolved-by: "
|
|
23
|
-
evolved-note: "
|
|
20
|
+
evolved-from: "1.2.1"
|
|
21
|
+
evolved-at: "2026-06-05"
|
|
22
|
+
evolved-by: "evolucionar"
|
|
23
|
+
evolved-note: "+gating por versión de lenguaje antes de marcar sintaxis como SyntaxError CRÍTICO: leer requires-python/target-version/tsconfig/edition y refutar con import+linter del stack (aplicación de verificar-citas Familia 2 a claims de sintaxis). Generalizable a cualquier lenguaje version-dependent. Origen: falso positivo PEP 758 (except A,B: en Python 3.14) en sistema-verificacion-oic."
|
|
24
24
|
nivelRiesgo: BAJO
|
|
25
25
|
skillsInvocables: [checklist-calidad, patrones-python, api-rest-diseno, tdd-workflow, verificar-trabajo, verificacion-evidencia, swl-revisar-impacto, prevencion-sobreingenieria]
|
|
26
26
|
skillsRestringidos: []
|
|
@@ -68,13 +68,22 @@ Responsabilidades concretas:
|
|
|
68
68
|
|
|
69
69
|
## Protocolo obligatorio al iniciar
|
|
70
70
|
|
|
71
|
+
**Presupuesto de contexto (anti-thrashing):** tu ventana hereda el `CLAUDE.md`
|
|
72
|
+
del proyecto + las reglas globales del usuario. En proyectos rule-heavy eso
|
|
73
|
+
consume buena parte de la ventana antes de leer código — si además exploras el
|
|
74
|
+
codebase completo, saturas y entras en autocompact thrashing (0 tokens útiles,
|
|
75
|
+
observado 2026-06-05). Por eso: NO releas `CLAUDE.md` (ya está en tu contexto),
|
|
76
|
+
lee SOLO los archivos del alcance recibido, y carga `skillsInvocables` bajo
|
|
77
|
+
demanda — solo cuando el alcance concreto lo amerite, nunca al inicio "por si acaso".
|
|
78
|
+
|
|
71
79
|
Antes de revisar cualquier código:
|
|
72
80
|
|
|
73
|
-
1. **
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
81
|
+
1. **Obtener el diff / alcance**: usar los archivos indicados por quien delega;
|
|
82
|
+
si no se indicaron, `git diff main..HEAD --name-only`. NO releer CLAUDE.md
|
|
83
|
+
(ya está en tu contexto heredado).
|
|
84
|
+
2. **Leer los archivos del alcance PRIMERO**, antes de cargar cualquier skill.
|
|
85
|
+
3. **Leer contexto adicional solo si es necesario** para entender el cambio —
|
|
86
|
+
acotado; no el módulo completo si el alcance es pequeño.
|
|
78
87
|
4. **Verificar métricas base** con herramientas estáticas antes de hacer juicios.
|
|
79
88
|
|
|
80
89
|
## Revision en dos capas (obligatorio)
|
|
@@ -370,6 +379,19 @@ Solo los problemas CRÍTICOS bloquean el avance. MAYOR debe documentarse como de
|
|
|
370
379
|
- Si el código es bueno, dilo explícitamente — los reportes vacíos de problemas
|
|
371
380
|
son tan valiosos como los reportes con 10 problemas
|
|
372
381
|
- No revises código que no puedes ejecutar ni compilar — pide el contexto necesario
|
|
382
|
+
- NUNCA marques una construcción sintáctica como SyntaxError CRÍTICO sin verificar
|
|
383
|
+
primero la **versión objetivo del lenguaje** del proyecto. Mucha sintaxis es
|
|
384
|
+
válida solo a partir de cierta versión (Python: `requires-python` /
|
|
385
|
+
`tool.ruff.target-version` en `pyproject.toml`; TypeScript: `target`/`lib` en
|
|
386
|
+
`tsconfig.json`; Java: `--release`; C#: `<LangVersion>`; Rust: edition). Antes
|
|
387
|
+
de emitir el veredicto bloqueante, lee la versión objetivo y **refuta el presunto
|
|
388
|
+
error con evidencia ejecutable** del stack (`python -c "import <módulo>"`,
|
|
389
|
+
`ruff check`, `tsc --noEmit`, el compilador correspondiente). Evidencia >
|
|
390
|
+
afirmación: si la construcción importa/compila bajo la versión objetivo, NO es
|
|
391
|
+
un hallazgo — degrádalo o elimínalo. Esta es la aplicación de
|
|
392
|
+
`verificar-citas Familia 2` a claims de sintaxis: un revisor que afirma
|
|
393
|
+
"SyntaxError" sin verificar contra el target propaga un falso positivo
|
|
394
|
+
bloqueante.
|
|
373
395
|
|
|
374
396
|
## Gotchas / Errores comunes no obvios
|
|
375
397
|
|
|
@@ -381,6 +403,8 @@ Solo los problemas CRÍTICOS bloquean el avance. MAYOR debe documentarse como de
|
|
|
381
403
|
|
|
382
404
|
**Hallazgos sin ejemplo de corrección**: un hallazgo que solo señala el problema sin mostrar cómo arreglarlo no es accionable. Causa: el revisor describe el anti-patrón pero no la alternativa correcta. Solución: todo hallazgo CRÍTICO o MAYOR incluye el código incorrecto y el código correcto esperado.
|
|
383
405
|
|
|
406
|
+
**Marcar sintaxis version-dependent como SyntaxError sin verificar el target**: una construcción válida en la versión objetivo del proyecto se lee como error de sintaxis cuando el revisor la juzga contra su conocimiento general del lenguaje en vez de leer la versión objetivo. Causa: la validez sintáctica depende de la versión (`requires-python`/`target-version`, `tsconfig target`, `--release`, edition) y no es absoluta. Caso real (2026-06-05, `sistema-verificacion-oic`): `except A, B:` sin paréntesis — válido en Python ≥3.14 por PEP 758 — fue marcado como SyntaxError CRÍTICO/RECHAZADO en un proyecto con `requires-python >=3.14`; refutado con `python -c "import …"` + `ruff check` + CI verde. Solución: antes de un veredicto bloqueante por sintaxis, leer la versión objetivo del proyecto y refutar el presunto error con import/compilación real del stack (ver Reglas estrictas).
|
|
407
|
+
|
|
384
408
|
## Veto items — cap enforcement a 60/100
|
|
385
409
|
|
|
386
410
|
Ciertos hallazgos son **no negociables** y violan reglas globales del sistema.
|
|
@@ -63,6 +63,13 @@ Antes de comenzar la auditoría:
|
|
|
63
63
|
de archivos, autenticación, autorización, dependencias externas.
|
|
64
64
|
3. **Obtener el diff** o la lista de archivos a auditar.
|
|
65
65
|
4. **Mapear el flujo de datos**: de dónde viene el input, cómo se procesa, dónde se almacena.
|
|
66
|
+
5. **Elegir el modo**: revisión de PR/diff (flujo estándar de abajo) o
|
|
67
|
+
**auditoría en profundidad** — en ese caso cargar
|
|
68
|
+
`Skill("checklist-seguridad")` y aplicar su *modo cobertura* (STRIDE +
|
|
69
|
+
OWASP con score compuesto, iterando con rotación de personas red-team y
|
|
70
|
+
registro en `hooks/lib/loop-telemetry.js`). Cada hallazgo se etiqueta con
|
|
71
|
+
ambas taxonomías y el reporte incluye la línea de cobertura
|
|
72
|
+
`OWASP: N/10 | STRIDE: M/6 | Score: X`.
|
|
66
73
|
|
|
67
74
|
## Flujo de trabajo paso a paso
|
|
68
75
|
|
package/agentes/tdd-qa-swl.md
CHANGED
|
@@ -11,9 +11,9 @@ model: claude-sonnet-4-6
|
|
|
11
11
|
modeloAlterno: claude-haiku-4-5-20251001
|
|
12
12
|
ventanaContexto: 200k
|
|
13
13
|
color: purple
|
|
14
|
-
version: 1.
|
|
14
|
+
version: 1.1.0
|
|
15
15
|
nivelRiesgo: BAJO
|
|
16
|
-
skillsInvocables: [tdd-workflow, testing-python, checklist-calidad, manejo-errores, webapp-testing, php-testing, nextjs-testing]
|
|
16
|
+
skillsInvocables: [tdd-workflow, testing-python, checklist-calidad, manejo-errores, webapp-testing, php-testing, nextjs-testing, calidad-mutation-testing]
|
|
17
17
|
skillsRestringidos: []
|
|
18
18
|
permisosRed: false
|
|
19
19
|
permisosEscritura: true
|
|
@@ -213,6 +213,27 @@ diff /tmp/baseline.txt /tmp/current.txt
|
|
|
213
213
|
Toda regresión (test que antes pasaba y ahora falla) es un bloqueante.
|
|
214
214
|
Reporta: qué test, qué falló, qué cambio lo causó.
|
|
215
215
|
|
|
216
|
+
### Fase 6 — Gate de mutación (opt-in, módulos críticos)
|
|
217
|
+
|
|
218
|
+
La cobertura mide ejecución, no calidad de asserts. Cuando el módulo es
|
|
219
|
+
crítico (dinero, auth, cálculo regulatorio) Y hay runner de mutación
|
|
220
|
+
instalado Y la suite corre en <2 min, cerrar la auditoría con mutación
|
|
221
|
+
incremental sobre el diff:
|
|
222
|
+
|
|
223
|
+
1. Cargar `Skill("calidad-mutation-testing")` — herramientas por stack,
|
|
224
|
+
modo incremental, umbrales por contexto.
|
|
225
|
+
2. Correr la mutación SOLO sobre los archivos del diff de la fase
|
|
226
|
+
(`--since` / `--in-diff`), nunca el repo completo.
|
|
227
|
+
3. Diagnosticar cada mutante sobreviviente: assert débil → endurecer el
|
|
228
|
+
assert; test faltante → escribir test de frontera dirigido; mutante
|
|
229
|
+
equivalente → excluir con anotación (NUNCA test artificial para matarlo).
|
|
230
|
+
4. Reportar el mutation score junto a la cobertura. Umbral de referencia:
|
|
231
|
+
≥85% en módulo crítico, ≥70% en lógica de negocio estándar.
|
|
232
|
+
|
|
233
|
+
Si las precondiciones no se cumplen (sin runner, suite lenta, suite roja),
|
|
234
|
+
omitir la fase y decirlo en el reporte — no es deuda silenciosa, es opt-in
|
|
235
|
+
documentado.
|
|
236
|
+
|
|
216
237
|
## Convenciones de escritura de tests
|
|
217
238
|
|
|
218
239
|
### Python (pytest)
|
|
@@ -43,6 +43,12 @@ realmente pueden usar — no solo interfaces que se ven bien en un mockup.
|
|
|
43
43
|
Tu output es la UI-SPEC.md: el contrato de diseño que el frontend-swl implementará.
|
|
44
44
|
No escribes código. Diseñas con palabras, estructuras y especificaciones precisas.
|
|
45
45
|
|
|
46
|
+
**Path de output canónico (OBLIGATORIO):** escribe TODOS tus artefactos en
|
|
47
|
+
`.planning/design/` (`UI-SPEC.md`, wireframes, flujos) — NUNCA en la raíz ni en
|
|
48
|
+
`ux/`/`diseno/`/`diseno-visual/`. Path pineado (ADR-0031,
|
|
49
|
+
`manifiestos/planning-paths.json`); si ya existe `.planning/design/UI-SPEC.md`,
|
|
50
|
+
léelo antes de sobreescribir. Cierra DT-PLANNING-OUTPUT-PATHS.
|
|
51
|
+
|
|
46
52
|
## Rol y responsabilidad
|
|
47
53
|
|
|
48
54
|
Responsabilidades concretas:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: swl:autoresearch
|
|
3
|
-
description: Ejecuta el loop de auto-mejora iterativa Autoresearch sobre un skill o
|
|
3
|
+
description: Ejecuta el loop de auto-mejora iterativa Autoresearch sobre un skill, un agente, o (modo --codigo) sobre código del proyecto contra una métrica arbitraria. Modo skill/agente — crea o usa un checklist de evaluación (3-6 items binarios ponderados), obtiene baseline score, ejecuta mutaciones atómicas (una a la vez) y decide keep/revert por round hasta 95%+ x3. Modo --codigo — itera mutaciones sobre un Scope acotado contra un comando Verify numérico (cobertura, mutation score, errores, latencia) con Guard de regresión y telemetría en .planning/loops/. Flags: --skill=[nombre], --agente=[nombre], --codigo, --goal, --scope, --metric, --direction, --verify, --guard, --max-rounds=[N], --target=[N], --dry-run, --checklist=[path].
|
|
4
4
|
allowed_tools: ["Read", "Write", "Edit", "Bash", "Glob", "Grep"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -22,13 +22,20 @@ Este comando es distinto a `/swl:evolucionar`: donde evolucionar analiza evidenc
|
|
|
22
22
|
```
|
|
23
23
|
--skill=[nombre] Skill a mejorar (busca en habilidades/[nombre]/SKILL.md)
|
|
24
24
|
--agente=[nombre] Agente a mejorar (busca en agentes/[nombre].md)
|
|
25
|
-
--
|
|
26
|
-
--
|
|
27
|
-
--
|
|
28
|
-
--
|
|
25
|
+
--codigo Modo código: itera sobre código del proyecto contra una métrica (ver sección "Modo --codigo")
|
|
26
|
+
--goal="..." (--codigo) Meta textual del loop
|
|
27
|
+
--scope="glob" (--codigo) Archivos que el loop PUEDE modificar (glob acotado)
|
|
28
|
+
--metric="..." (--codigo) Qué mide la métrica (ej: "mutation score de src/pagos")
|
|
29
|
+
--direction=[dir] (--codigo) higher_is_better | lower_is_better
|
|
30
|
+
--verify="cmd" (--codigo) Comando shell cuya salida contiene el número de la métrica
|
|
31
|
+
--guard="cmd" (--codigo) Comando que debe pasar (exit 0) para aceptar una mutación
|
|
32
|
+
--max-rounds=[N] Máximo de iteraciones del loop (default: 10 skill/agente, 15 código)
|
|
33
|
+
--target=[N] Score objetivo (default: 95% en skills; en código lo define el usuario)
|
|
34
|
+
--dry-run Analizar y derivar configuración sin ejecutar mutaciones
|
|
35
|
+
--checklist=[path] Ruta a checklist existente (solo modo skill/agente)
|
|
29
36
|
```
|
|
30
37
|
|
|
31
|
-
**Nota**: Se debe pasar `--skill` o `--
|
|
38
|
+
**Nota**: Se debe pasar `--skill`, `--agente` o `--codigo` (excluyentes). Si no se pasa ninguno, preguntar al usuario.
|
|
32
39
|
|
|
33
40
|
## Paso 0 — Parseo de flags y carga de habilidades
|
|
34
41
|
|
|
@@ -168,3 +175,92 @@ Si el score mejoró respecto al baseline:
|
|
|
168
175
|
- Si después de 3 rounds sin mejora, preguntar al usuario si continuar o parar
|
|
169
176
|
- El caso de prueba NO cambia durante el loop
|
|
170
177
|
- Mantener log completo del loop para auditoría
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Modo `--codigo` — Loop métrico sobre código del proyecto
|
|
182
|
+
|
|
183
|
+
Generaliza el loop a **código del usuario**: la misma disciplina (mutación
|
|
184
|
+
atómica → medir → keep/revert) pero la evaluación es un **comando Verify
|
|
185
|
+
numérico** en lugar de un checklist. Patrón adoptado del análisis de
|
|
186
|
+
autoresearch v2.1 (loop core), adaptado a las reglas SWL (HITL, git-workflow,
|
|
187
|
+
telemetría en `.planning/loops/`).
|
|
188
|
+
|
|
189
|
+
Métricas típicas: mutation score (cargar `Skill("calidad-mutation-testing")`),
|
|
190
|
+
cobertura de tests, conteo de errores de tsc/lint (lower_is_better), latencia
|
|
191
|
+
p95 de un benchmark, bundle size, tiempo de suite.
|
|
192
|
+
|
|
193
|
+
### Paso C0 — Derivar y aprobar la configuración (HITL obligatorio)
|
|
194
|
+
|
|
195
|
+
Completar con el usuario los campos faltantes y presentar el bloque para
|
|
196
|
+
aprobación explícita ANTES de la primera mutación:
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
=== Autoresearch --codigo — Configuración ===
|
|
200
|
+
Goal: [meta textual]
|
|
201
|
+
Scope: [glob de archivos que el loop PUEDE tocar]
|
|
202
|
+
Metric: [qué mide] | Direction: [higher|lower]_is_better
|
|
203
|
+
Verify: [comando shell]
|
|
204
|
+
Guard: [comando shell o "(ninguno)"]
|
|
205
|
+
Target: [valor objetivo o "(mejora máxima en N rounds)"]
|
|
206
|
+
Rounds: [N, default 15]
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Safety screen del Verify/Guard (bloqueante)**: rechazar comandos que
|
|
210
|
+
contengan `rm -rf`, `curl|sh`/`wget|sh`, `sudo`, `git push`, `--force`,
|
|
211
|
+
redirecciones a archivos fuera del repo, o credenciales inline. El Verify se
|
|
212
|
+
ejecuta una vez en dry-run para confirmar que produce un número parseable —
|
|
213
|
+
si no, corregir el comando antes de iterar.
|
|
214
|
+
|
|
215
|
+
**Guard por default**: si el proyecto tiene suite de tests, el Guard es la
|
|
216
|
+
suite (`npm test` / `pytest`). Iterar sin Guard solo si el usuario lo aprueba
|
|
217
|
+
explícitamente — una métrica que sube con la suite rota no es mejora.
|
|
218
|
+
|
|
219
|
+
Si `--dry-run`: terminar aquí mostrando la configuración derivada.
|
|
220
|
+
|
|
221
|
+
### Paso C1 — Baseline y telemetría
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
node -e "const lt=require('./hooks/lib/loop-telemetry');const r=lt.iniciarCorrida({tipo:'autoresearch',direccion:'[direction]',config:{goal:'[goal]',scope:'[scope]',verify:'[verify]',guard:'[guard]'}});console.log(r.dir)"
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Correr Verify, extraer la métrica, registrar la iteración 0 (`estado:
|
|
228
|
+
baseline`). Si el baseline ya cumple el target, terminar: no hay loop que correr.
|
|
229
|
+
|
|
230
|
+
### Paso C2 — El loop
|
|
231
|
+
|
|
232
|
+
Por cada round (hasta `--max-rounds`, default 15):
|
|
233
|
+
|
|
234
|
+
1. **Revisar memoria**: últimas filas del TSV + `git log --oneline -10` — qué
|
|
235
|
+
funcionó, qué se revirtió. No repetir mutaciones ya revertidas.
|
|
236
|
+
2. **UNA mutación atómica** dentro del Scope. Archivos fuera del Scope son
|
|
237
|
+
intocables — si la mejora "necesita" tocar otro archivo, pausar y
|
|
238
|
+
preguntar al usuario (anti-proxy-goal-drift).
|
|
239
|
+
3. **Medir**: correr Verify → métrica nueva; correr Guard.
|
|
240
|
+
4. **Decidir**:
|
|
241
|
+
- Métrica mejora Y Guard pasa → **keep**: commit `experiment(autoresearch): [descripción]`.
|
|
242
|
+
- Métrica no mejora O Guard falla → **revert**: descartar los cambios del
|
|
243
|
+
working tree (`git checkout -- [archivos tocados]`). NUNCA reescribir
|
|
244
|
+
historia para revertir — solo se commitea lo que se conserva.
|
|
245
|
+
- Verify truena → estado `crash`: descartar cambios, registrar, continuar.
|
|
246
|
+
5. **Registrar** la iteración con `registrarIteracion` (métrica, delta, estado, descripción).
|
|
247
|
+
6. **Condiciones de salida**: target alcanzado → ÉXITO; `detectarPlateau`
|
|
248
|
+
sobre las últimas 3 filas → PLATEAU (parar, no quemar rounds sin mejora);
|
|
249
|
+
3 reverts consecutivos → ESTANCAMIENTO (preguntar al usuario);
|
|
250
|
+
max rounds → ACOTADO.
|
|
251
|
+
|
|
252
|
+
### Paso C3 — Cierre
|
|
253
|
+
|
|
254
|
+
1. Escribir handoff: `escribirHandoff(dir, {source: 'swl:autoresearch', status: [COMPLETO|PLATEAU|ACOTADO|INTERRUMPIDO], config})`.
|
|
255
|
+
2. Reporte final con trayectoria (`analizarTrayectoria`): rounds, keep/revert,
|
|
256
|
+
métrica inicial → final, mayor salto, y los commits `experiment(...)` generados.
|
|
257
|
+
3. Ofrecer al usuario squash de los commits experimentales en un commit
|
|
258
|
+
semántico final (`git-workflow.md § Squash antes de merge`).
|
|
259
|
+
|
|
260
|
+
### Reglas adicionales del modo `--codigo`
|
|
261
|
+
|
|
262
|
+
- NUNCA `git push` desde el loop — los commits experimentales son locales.
|
|
263
|
+
- NUNCA tocar archivos fuera del Scope aprobado.
|
|
264
|
+
- NUNCA continuar tras plateau "por si acaso" — el plateau ES la señal de salida.
|
|
265
|
+
- El hook `contexto-iteracion.js` inyecta el estado del loop en sesiones
|
|
266
|
+
largas; no releer el TSV completo en cada round (las últimas 3 filas bastan).
|
|
@@ -369,7 +369,7 @@ Umbral de promoción:
|
|
|
369
369
|
|-------|-------------------------|
|
|
370
370
|
| Platino, Oro, Plata | Promover a `habilidades/`, registrar en manifiestos |
|
|
371
371
|
| Bronce | NO promover, devolver a `_userland/` con feedback |
|
|
372
|
-
| Sin badge | NO promover, registrar rechazo en `.planning/
|
|
372
|
+
| Sin badge | NO promover, registrar rechazo en `.planning/evolution/promociones-rechazadas.jsonl` |
|
|
373
373
|
|
|
374
374
|
Si un skill es rechazado ≥3 veces consecutivas, el agente escala al usuario
|
|
375
375
|
con análisis de qué dimensiones bajan el score. Origen: ADR 0013 sección 3C.
|
|
@@ -31,7 +31,7 @@ PATH="/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH" echo '{}' | n
|
|
|
31
31
|
## Paso 1 — Cargar métricas
|
|
32
32
|
|
|
33
33
|
```bash
|
|
34
|
-
cat .planning/
|
|
34
|
+
cat .planning/evolution/metricas.json
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
Si el archivo no existe: ejecutar el regenerado del Paso 0. Si sigue sin
|
|
@@ -58,7 +58,7 @@ echo "RATIO=\"$EVOL_FALSE/$TOTAL\""
|
|
|
58
58
|
|
|
59
59
|
Estos valores alimentan la sección KERNEL del template.
|
|
60
60
|
|
|
61
|
-
Si `.planning/
|
|
61
|
+
Si `.planning/evolution/politica-evolvable.md` no existe, reportar como
|
|
62
62
|
hallazgo crítico: el kernel SIN política documentada es violación de
|
|
63
63
|
`reglas/gobernanza.md`.
|
|
64
64
|
|
|
@@ -127,7 +127,7 @@ Template de salida:
|
|
|
127
127
|
...
|
|
128
128
|
|
|
129
129
|
KERNEL (gobernanza)
|
|
130
|
-
Política evolvable .... .planning/
|
|
130
|
+
Política evolvable .... .planning/evolution/politica-evolvable.md
|
|
131
131
|
Último ADR kernel ..... <ADR-NNNN — título — fecha>
|
|
132
132
|
Agentes evolvable=false <n>/<total>
|
|
133
133
|
|
|
@@ -152,7 +152,7 @@ Al final del dashboard, sugerir acciones según las métricas:
|
|
|
152
152
|
→ `npx -y @saulwade/swl-ses@latest bootstrap-instincts` (pobla desde APRENDIZAJES.md)
|
|
153
153
|
|
|
154
154
|
- Si `nudges.tasaAccion < 0.3` y `nudges.total > 5`:
|
|
155
|
-
→ "Muchos nudges ignorados. Revisa `.planning/
|
|
155
|
+
→ "Muchos nudges ignorados. Revisa `.planning/evolution/alertas-persistentes.json`"
|
|
156
156
|
|
|
157
157
|
- Si `alertasActivas.length > 0`:
|
|
158
158
|
→ listar cada alerta con `/swl:evolucionar <target>` o cmd correspondiente
|
|
@@ -178,7 +178,7 @@ Al final del dashboard, sugerir acciones según las métricas:
|
|
|
178
178
|
|
|
179
179
|
## Anti-substitution guardrails
|
|
180
180
|
|
|
181
|
-
- Archivo de métricas: **siempre** `.planning/
|
|
181
|
+
- Archivo de métricas: **siempre** `.planning/evolution/metricas.json` (nunca `.planning/metricas.json`, `evolucion.json`, `estado-evolucion.json`).
|
|
182
182
|
- Hook que regenera: **siempre** `hooks/metricas-evolucion.js` (nunca `metrics.js`, `evolucion-metricas.js`, `evolution-metrics.js`).
|
|
183
183
|
- Para forzar regen: pipe `echo '{}' | node ...`, nunca invocar `require()` directo.
|
|
184
184
|
|
|
@@ -23,7 +23,7 @@ SWL tiene **tres canales independientes** de aprendizaje. Son complementarios, n
|
|
|
23
23
|
### Cómo se coordinan
|
|
24
24
|
|
|
25
25
|
- **Evolución + perfil**: el parser de fricción (`auto-evolucion-protocolo` v1.1) cruza el log
|
|
26
|
-
`.planning/auto-
|
|
26
|
+
`.planning/auto-evolution/agentes.jsonl` con las señales de corrección del usuario
|
|
27
27
|
para priorizar agentes cuyos runs coincidieron con correcciones. Ver tabla
|
|
28
28
|
"Categorías de fricción" en el skill.
|
|
29
29
|
- **Evolución + aprendizajes**: antes de modificar un skill, leer `APRENDIZAJES.md`
|
|
@@ -214,7 +214,7 @@ score_after = (evals_pass / evals_total) * 100 × factor_peso
|
|
|
214
214
|
| `score_after < score_baseline - 5` | **Revertir** — restaurar el archivo anterior + `--record-revert --score=<N>` |
|
|
215
215
|
| `score_baseline - 5 <= score_after < score_baseline` | **Requiere revisión humana** — reportar diferencia; usuario decide si acepta la regresión menor o revierte |
|
|
216
216
|
|
|
217
|
-
Los 3 casos registran evento en `.planning/
|
|
217
|
+
Los 3 casos registran evento en `.planning/evolution/evoluciones.jsonl` para el
|
|
218
218
|
dashboard `/swl:evolucion-estado`.
|
|
219
219
|
|
|
220
220
|
### Regla de oro
|
package/comandos/swl/inbox.md
CHANGED
|
@@ -45,7 +45,7 @@ Por cada comando en la cola, decidir:
|
|
|
45
45
|
| Instrucción de trabajo clara ("arregla el bug X", "ejecuta pruebas") | Procesar como prompt del usuario. Ejecutar la tarea siguiendo el flujo normal SWL. |
|
|
46
46
|
| Slash command (`/swl:salud`, `/swl:metricas`, etc.) | Invocar ese comando directamente. |
|
|
47
47
|
| Pregunta/consulta ("¿cómo va X?", "estado del release") | Responder con la información solicitada. Enviar respuesta al gateway si aplica. |
|
|
48
|
-
| Feedback/corrección ("no uses Y", "prefiero Z") | Escribir a `.planning/
|
|
48
|
+
| Feedback/corrección ("no uses Y", "prefiero Z") | Escribir a `.planning/evolution/feedback-queue.jsonl` con tipo correspondiente y marcar como procesado. |
|
|
49
49
|
| Contenido ambiguo o sospechoso | Marcar como descartado con razón registrada. |
|
|
50
50
|
|
|
51
51
|
### Paso 3 — Procesar y marcar
|
package/comandos/swl/metricas.md
CHANGED
|
@@ -22,6 +22,7 @@ costo estimado, herramientas más usadas y estado del presupuesto configurado.
|
|
|
22
22
|
/swl:metricas — Resumen de métricas de la sesión
|
|
23
23
|
/swl:metricas detalle — Desglose completo por herramienta y timeline
|
|
24
24
|
/swl:metricas fases — Progreso de fases del proyecto desde feature-list.json
|
|
25
|
+
/swl:metricas loops — Trayectorias de loops iterativos desde .planning/loops/
|
|
25
26
|
/swl:metricas historico — Abre el dashboard histórico multi-sesión (alias de /swl:dashboard)
|
|
26
27
|
```
|
|
27
28
|
|
|
@@ -318,6 +319,39 @@ node scripts/derivar-feature-list.js --check
|
|
|
318
319
|
|
|
319
320
|
---
|
|
320
321
|
|
|
322
|
+
## Subcomando: `loops` — Trayectorias de loops iterativos
|
|
323
|
+
|
|
324
|
+
Si el usuario invoca `/swl:metricas loops`, leer las corridas registradas por
|
|
325
|
+
`hooks/lib/loop-telemetry.js` en `.planning/loops/`:
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
node -e "
|
|
329
|
+
const fs = require('fs'), path = require('path');
|
|
330
|
+
const lt = require('./hooks/lib/loop-telemetry');
|
|
331
|
+
const base = path.join(process.cwd(), lt.DIR_LOOPS);
|
|
332
|
+
let dirs = [];
|
|
333
|
+
try { dirs = fs.readdirSync(base).map(d => path.join(base, d)).filter(d => fs.statSync(d).isDirectory()); } catch {}
|
|
334
|
+
if (dirs.length === 0) { console.log('(sin corridas de loops registradas)'); process.exit(0); }
|
|
335
|
+
for (const dir of dirs.sort().slice(-10)) {
|
|
336
|
+
try {
|
|
337
|
+
const t = lt.analizarTrayectoria(dir);
|
|
338
|
+
const h = lt.leerHandoff(dir);
|
|
339
|
+
console.log(path.basename(dir) + ' | iters: ' + t.totalIteraciones +
|
|
340
|
+
' | keep/revert: ' + t.keeps + '/' + t.reverts +
|
|
341
|
+
' | métrica: ' + t.metricaInicial + ' → ' + t.metricaFinal +
|
|
342
|
+
' | plateau: ' + (t.plateau ? 'SÍ' : 'no') +
|
|
343
|
+
' | status: ' + (h ? h.status : 'en curso'));
|
|
344
|
+
} catch (e) { console.log(path.basename(dir) + ' | (ilegible: ' + e.message + ')'); }
|
|
345
|
+
}
|
|
346
|
+
"
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
Reportar al usuario en tabla: corrida, iteraciones, keep/revert rate, métrica
|
|
350
|
+
inicial → final, plateau y status del handoff. Si alguna corrida activa muestra
|
|
351
|
+
plateau, sugerir cerrarla — seguir iterando sin mejora quema tokens.
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
321
355
|
## Subcomando: `historico`
|
|
322
356
|
|
|
323
357
|
Si el usuario invoca `/swl:metricas historico`, redirigir inmediatamente a:
|