@saulwade/swl-ses 1.8.0 → 2.0.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 +8 -8
- package/README.md +13 -13
- package/agentes/accesibilidad-wcag-swl.md +3 -3
- package/agentes/auto-evolucion-swl.md +908 -908
- package/agentes/disenador-ui-swl.md +6 -5
- package/agentes/frontend-angular-swl.md +2 -2
- package/agentes/frontend-css-swl.md +2 -2
- package/agentes/frontend-react-swl.md +4 -4
- package/agentes/frontend-swl.md +6 -6
- package/agentes/investigador-ux-swl.md +5 -5
- package/agentes/orquestador-swl.md +96 -8
- package/agentes/perfilador-usuario-swl.md +308 -308
- package/agentes/producto-prd-swl.md +1 -1
- package/agentes/red-team-swl.md +218 -218
- package/agentes/revisor-codigo-swl.md +34 -10
- package/agentes/revisor-seguridad-swl.md +7 -0
- package/agentes/tdd-qa-swl.md +39 -2
- package/comandos/swl/actualizar.md +1 -1
- package/comandos/swl/aprender.md +2 -2
- package/comandos/swl/aprobar-plan.md +152 -0
- package/comandos/swl/autoresearch.md +102 -6
- package/comandos/swl/ayuda.md +3 -3
- package/comandos/swl/discutir-fase.md +20 -2
- package/comandos/swl/ejecutar-fase.md +53 -6
- package/comandos/swl/evolucionar.md +1 -1
- package/comandos/swl/inbox.md +1 -1
- package/comandos/swl/instalar.md +1 -1
- package/comandos/swl/nemesis.md +42 -1
- package/comandos/swl/planear-fase.md +25 -1
- package/comandos/swl/plugins.md +1 -1
- package/comandos/swl/predecir.md +139 -0
- package/comandos/swl/release.md +1 -1
- package/comandos/swl/status.md +279 -0
- package/comandos/swl/verificar.md +75 -7
- package/habilidades/ai-runtime-security/SKILL.md +1 -1
- package/habilidades/angular-moderno/SKILL.md +44 -1
- package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
- package/habilidades/autoresearch/SKILL.md +15 -1
- package/habilidades/benchmark-memoria/SKILL.md +1 -1
- package/habilidades/calidad-contract-testing/SKILL.md +165 -0
- package/habilidades/calidad-mutation-testing/SKILL.md +170 -0
- package/habilidades/changelog-generator/SKILL.md +9 -2
- package/habilidades/changelog-generator/scripts/parse-commits.js +12 -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/diagrama-arquitectura/SKILL.md +1 -1
- package/habilidades/drift-detection/SKILL.md +179 -179
- package/habilidades/ejecutar-fase/SKILL.md +64 -14
- package/habilidades/estructura-proyecto-claude/SKILL.md +17 -14
- package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +34 -23
- package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +70 -53
- package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -77
- package/habilidades/extractor-de-aprendizajes/SKILL.md +9 -5
- package/habilidades/fastapi-experto/SKILL.md +56 -5
- package/habilidades/harness-claude-code/SKILL.md +10 -7
- package/{reglas/harness-claude-code.md → habilidades/harness-claude-code/recursos/disciplina-harness-regla.md} +2 -2
- package/habilidades/instalar-sistema/SKILL.md +3 -3
- package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +1 -1
- package/habilidades/patrones-python/SKILL.md +8 -5
- package/habilidades/perfil-usuario/SKILL.md +200 -200
- package/habilidades/planear-fase/SKILL.md +25 -4
- package/habilidades/proceso-ddia-fundamentos/SKILL.md +1 -1
- 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/protocolo-revision-swl/SKILL.md +1 -1
- package/habilidades/seguridad-skills-ia/SKILL.md +1 -1
- package/habilidades/swl-claudemd/SKILL.md +50 -210
- package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -0
- package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -0
- package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -0
- package/habilidades/swl-dashboard/SKILL.md +9 -9
- package/habilidades/swl-revisar-impacto/SKILL.md +1 -1
- package/habilidades/tdd-workflow/SKILL.md +58 -5
- package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -0
- package/habilidades/validacion-ci-sistema/SKILL.md +3 -3
- package/hooks/calidad-pre-commit.js +340 -3
- package/hooks/ciclo-evolucion-subagente.js +26 -0
- package/hooks/ciclo-evolucion.js +26 -0
- package/hooks/contexto-iteracion.js +144 -0
- package/hooks/extraccion-aprendizajes.js +13 -0
- package/hooks/lib/ciclo-evolucion.js +47 -0
- package/hooks/{auto-evolucion.js → lib/etapa-auto-evolucion.js} +701 -700
- package/hooks/{metricas-evolucion.js → lib/etapa-metricas.js} +388 -376
- package/hooks/{actualizar-perfil-usuario.js → lib/etapa-perfil-usuario.js} +376 -364
- package/hooks/lib/evolution-tracker.js +24 -3
- package/hooks/lib/loop-telemetry.js +321 -0
- package/hooks/notificacion-telegram.js +11 -3
- package/hooks/spec-gate.js +211 -0
- package/hooks/tdd-gate.js +241 -0
- package/hooks/validar-intent-spec.js +30 -10
- package/llms.txt +29 -0
- package/manifiestos/hooks-config.json +36 -18
- package/manifiestos/modulos.json +23 -14
- package/manifiestos/skills-lock.json +100 -72
- package/package.json +4 -3
- package/plugin.json +9 -10
- package/reglas/accesibilidad.md +10 -0
- package/reglas/api-diseno.md +9 -0
- package/reglas/arquitectura.evolved.json +7 -0
- package/reglas/arquitectura.md +65 -0
- package/reglas/auditorias-documentales-estructurales.md +7 -0
- package/reglas/cloud-infra.md +8 -0
- package/reglas/fragmentos-compartidos.md +5 -0
- package/reglas/gobernanza.md +4 -4
- package/reglas/hooks.md +6 -0
- package/reglas/intent-engineering.md +4 -0
- package/reglas/markitdown.md +8 -0
- package/reglas/memoria-consolidada.md +1 -1
- package/reglas/patrones.md +6 -0
- package/reglas/registro-componentes-nuevos.md +10 -1
- package/reglas/seguridad-agentes.md +1 -1
- package/reglas/seguridad.evolved.json +7 -0
- package/reglas/seguridad.md +144 -0
- package/reglas/skills-estandar.md +6 -0
- package/reglas/testing.md +7 -0
- package/reglas/tests-cleanup.md +4 -0
- package/reglas/usar-sistema-swl.md +1 -1
- package/scripts/generar-inventario.js +64 -1
- package/scripts/instalador.js +32 -2
- package/scripts/lib/gitignore-manifest.js +29 -1
- package/scripts/lib/plan-lock.js +275 -0
- package/scripts/migrar-fase-dominio.js +0 -1
- package/scripts/smoke-test.js +24 -2
- package/scripts/verificar-trazabilidad.js +292 -0
- package/agentes/ux-disenador-swl.md +0 -503
- package/comandos/swl/dashboard.md +0 -146
- package/comandos/swl/evolucion-estado.md +0 -191
- package/comandos/swl/metricas.md +0 -342
- package/comandos/swl/salud.md +0 -481
- package/reglas/verificar-citas-temporales.md +0 -139
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: swl:aprobar-plan
|
|
3
|
+
description: Aprueba el PLAN.md de una fase y lo firma con un lock SHA256 (gate G1 de SDD). Transiciona el frontmatter de estado borrador a aprobado y escribe .planning/locks/<plan>.lock. Es la única vía válida de aprobación — ejecutar-fase verifica este lock antes de implementar y detiene la ejecución si el plan fue mutado tras la firma.
|
|
4
|
+
allowed_tools: ["Read", "Write", "Edit", "Bash", "Glob"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /swl:aprobar-plan <n> — Aprobar y firmar el plan de una fase (Gate G1)
|
|
8
|
+
|
|
9
|
+
Eres el guardián del gate G1 del enforcement SDD. Tu trabajo es transicionar un
|
|
10
|
+
PLAN de `borrador` a `aprobado` Y firmarlo con un lock SHA256, de modo que
|
|
11
|
+
cualquier mutación posterior del plan sea detectable por `/swl:ejecutar-fase`.
|
|
12
|
+
|
|
13
|
+
Este comando es la **única vía documentada de aprobación**. Editar el frontmatter
|
|
14
|
+
a mano (`estado: aprobado`) deja el plan en modo legacy (cláusula de gracia D-05):
|
|
15
|
+
se ejecuta con advertencia pero sin protección de integridad. Usar este comando
|
|
16
|
+
es lo que activa el gate real.
|
|
17
|
+
|
|
18
|
+
## Uso
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
/swl:aprobar-plan 9
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
El argumento `<n>` es el número de la fase cuyo PLAN se aprueba.
|
|
25
|
+
|
|
26
|
+
## Paso 1 — Localizar el PLAN
|
|
27
|
+
|
|
28
|
+
Resuelve la ruta `.planning/fases/0N-PLAN.md` (N con cero a la izquierda si N < 10).
|
|
29
|
+
|
|
30
|
+
- Si no existe: detente con "No existe el PLAN de la fase N. Ejecuta `/swl:planear-fase N` primero."
|
|
31
|
+
- Lee el archivo completo.
|
|
32
|
+
|
|
33
|
+
## Paso 2 — Validar el estado actual del frontmatter
|
|
34
|
+
|
|
35
|
+
Lee el campo `estado:` del frontmatter:
|
|
36
|
+
|
|
37
|
+
- Si `estado: borrador` → continúa al Paso 3 (caso normal).
|
|
38
|
+
- Si `estado: aprobado` → ya está aprobado. Verifica si existe el lock:
|
|
39
|
+
```bash
|
|
40
|
+
node -e "const {verificarPlan}=require('./scripts/lib/plan-lock'); console.log(JSON.stringify(verificarPlan('.planning/fases/0N-PLAN.md')))"
|
|
41
|
+
```
|
|
42
|
+
- Si `modo: "firmado"` → informa "El plan ya está aprobado y firmado." y termina.
|
|
43
|
+
- Si `modo: "legacy"` (aprobado sin lock) → pregunta al usuario: "El plan está
|
|
44
|
+
aprobado pero sin firmar (modo legacy). ¿Lo firmo ahora para activar el gate
|
|
45
|
+
G1?" Si confirma, salta al Paso 4 (firmar sin re-transicionar).
|
|
46
|
+
- Si `modo: "mutado"` → el plan cambió tras una firma previa. Informa el
|
|
47
|
+
`hashEsperado` vs `hashActual` y pregunta si re-aprobar (re-firmar el estado
|
|
48
|
+
actual). Procede solo con confirmación explícita.
|
|
49
|
+
- Si no hay campo `estado` → detente: "El PLAN no tiene campo `estado` en el
|
|
50
|
+
frontmatter. Revisa que sea un plan válido generado por `/swl:planear-fase`."
|
|
51
|
+
|
|
52
|
+
## Paso 2.5 — Validar la matriz REQ×T (trazabilidad G4)
|
|
53
|
+
|
|
54
|
+
Lee `.planning/fases/0N-CONTEXTO.md` y extrae los IDs `REQ-NN:` de la sección de
|
|
55
|
+
criterios de aceptación.
|
|
56
|
+
|
|
57
|
+
- **CONTEXTO sin REQ-IDs** (fases legacy 01-09): advertencia informativa
|
|
58
|
+
("CONTEXTO sin REQ-IDs — trazabilidad no exigible, gracia legacy") y continúa.
|
|
59
|
+
- **CONTEXTO con REQ-IDs**: verifica que el PLAN cubra TODOS:
|
|
60
|
+
```bash
|
|
61
|
+
node scripts/verificar-trazabilidad.js --fase=N --solo-plan
|
|
62
|
+
```
|
|
63
|
+
- Exit 0 → continúa al Paso 3.
|
|
64
|
+
- Exit 1 (REQ huérfanos) → **RECHAZA la aprobación**. Lista los REQ sin tarea y
|
|
65
|
+
remite a `/swl:planear-fase N` para cubrirlos (o a retirar el REQ del CONTEXTO
|
|
66
|
+
con marca "RETIRADO — razón"). NO firmes un plan con REQ huérfanos.
|
|
67
|
+
|
|
68
|
+
## Paso 3 — Confirmar con el usuario antes de aprobar
|
|
69
|
+
|
|
70
|
+
NUNCA apruebes sin confirmación explícita. Presenta un resumen breve del plan
|
|
71
|
+
(número de slices, tareas, slices HITL) y pregunta:
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
El plan de la fase N tiene [X] slices y [Y] tareas ([Z] HITL).
|
|
75
|
+
¿Confirmas la aprobación? Al aprobar se firma con SHA256 y queda inmutable:
|
|
76
|
+
cualquier edición posterior detendrá /swl:ejecutar-fase.
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Espera respuesta afirmativa. Si el usuario pide cambios, NO apruebes — remítelo
|
|
80
|
+
a `/swl:planear-fase N` para refinar.
|
|
81
|
+
|
|
82
|
+
## Paso 4 — Transicionar y firmar
|
|
83
|
+
|
|
84
|
+
1. **Transicionar** (omitir si el plan ya estaba `aprobado` en modo legacy):
|
|
85
|
+
edita el frontmatter `estado: borrador` → `estado: aprobado` y agrega
|
|
86
|
+
`aprobadoPor: usuario (<nombre>) — <fecha>, via /swl:aprobar-plan`.
|
|
87
|
+
|
|
88
|
+
2. **Firmar** — escribe el lock SHA256:
|
|
89
|
+
```bash
|
|
90
|
+
node -e "const {firmarPlan}=require('./scripts/lib/plan-lock'); const r=firmarPlan('.planning/fases/0N-PLAN.md'); console.log(JSON.stringify(r))"
|
|
91
|
+
```
|
|
92
|
+
Verifica que el resultado sea `ok: true` y que exista
|
|
93
|
+
`.planning/locks/0N-PLAN.md.lock`.
|
|
94
|
+
|
|
95
|
+
3. **Verificar** la firma de inmediato:
|
|
96
|
+
```bash
|
|
97
|
+
node -e "const {verificarPlan}=require('./scripts/lib/plan-lock'); console.log(JSON.stringify(verificarPlan('.planning/fases/0N-PLAN.md')))"
|
|
98
|
+
```
|
|
99
|
+
Debe retornar `modo: "firmado"`, `ok: true`.
|
|
100
|
+
|
|
101
|
+
4. **Marcar la fase como activa** (gate G0 — `hooks/spec-gate.js` consume este
|
|
102
|
+
archivo): escribe `.planning/locks/fase-activa.json` con el sha256 devuelto
|
|
103
|
+
por `firmarPlan`:
|
|
104
|
+
```bash
|
|
105
|
+
node -e "
|
|
106
|
+
const {atomicWriteJSON} = require('./hooks/lib/atomic-write');
|
|
107
|
+
const {verificarPlan} = require('./scripts/lib/plan-lock');
|
|
108
|
+
const v = verificarPlan('.planning/fases/0N-PLAN.md');
|
|
109
|
+
atomicWriteJSON('.planning/locks/fase-activa.json', {
|
|
110
|
+
numero: N,
|
|
111
|
+
planPath: '.planning/fases/0N-PLAN.md',
|
|
112
|
+
sha256: v.hashEsperado,
|
|
113
|
+
aprobadoEn: new Date().toISOString(),
|
|
114
|
+
aprobadoPor: 'usuario via /swl:aprobar-plan'
|
|
115
|
+
});
|
|
116
|
+
console.log('fase activa: 0N');
|
|
117
|
+
"
|
|
118
|
+
```
|
|
119
|
+
Este archivo es runtime local (gitignored — a diferencia del `.lock`, que SÍ
|
|
120
|
+
se versiona como evidencia). `/swl:ejecutar-fase` lo elimina al cerrar la fase.
|
|
121
|
+
Si se re-firma un plan (re-aprobación tras mutación), re-escribir también
|
|
122
|
+
fase-activa.json para que el hash quede alineado.
|
|
123
|
+
|
|
124
|
+
## Paso 5 — Reporte
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
Plan de la fase N aprobado y firmado (gate G1 activo).
|
|
128
|
+
|
|
129
|
+
estado: borrador -> aprobado
|
|
130
|
+
lock: .planning/locks/0N-PLAN.md.lock
|
|
131
|
+
fase activa: .planning/locks/fase-activa.json (gate G0 cubierto)
|
|
132
|
+
sha256: <hash corto>
|
|
133
|
+
|
|
134
|
+
Cualquier edición del PLAN tras esta firma detendrá /swl:ejecutar-fase con un
|
|
135
|
+
mensaje de "plan mutado tras aprobación". Para cambiar el plan: edítalo y vuelve
|
|
136
|
+
a ejecutar /swl:aprobar-plan N.
|
|
137
|
+
|
|
138
|
+
Próximo paso: /swl:ejecutar-fase N
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Reglas de comportamiento
|
|
142
|
+
|
|
143
|
+
- NUNCA apruebes un plan sin confirmación explícita del usuario.
|
|
144
|
+
- NUNCA modifiques el contenido del plan al aprobarlo — solo el campo `estado`
|
|
145
|
+
del frontmatter y la línea `aprobadoPor`. El cuerpo es lo que se firma.
|
|
146
|
+
- El lock vive en `.planning/locks/` y SÍ se versiona en git (es evidencia de
|
|
147
|
+
aprobación, parte del audit trail de SDD).
|
|
148
|
+
- Si el usuario quiere cambiar el plan después de aprobado, el flujo correcto es
|
|
149
|
+
editar el PLAN y re-ejecutar `/swl:aprobar-plan N` (re-firma). NUNCA editar el
|
|
150
|
+
lock a mano.
|
|
151
|
+
- El número de versión del release que publique esta fase lo decide el usuario
|
|
152
|
+
(regla CLAUDE.md) — este comando no toca versiones.
|
|
@@ -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).
|
package/comandos/swl/ayuda.md
CHANGED
|
@@ -44,7 +44,7 @@ Formato: tabla compacta con nombre, descripción corta y flags principales.
|
|
|
44
44
|
| `/swl:revisar [stack\|archivo]` | Revisión de código por tecnología (auto-detect) |
|
|
45
45
|
| `/swl:revisar-impacto` | Análisis de blast radius y risk score |
|
|
46
46
|
| `/swl:evaluar-skill [nombre]` | Evaluación PluginEval de 2 capas con badge |
|
|
47
|
-
| `/swl:salud` | Diagnóstico de integridad del sistema |
|
|
47
|
+
| `/swl:status salud` | Diagnóstico de integridad del sistema |
|
|
48
48
|
| `/swl:auditar-deps` | Auditoría de dependencias (CVEs) |
|
|
49
49
|
|
|
50
50
|
#### Aprendizaje y evolución
|
|
@@ -70,8 +70,8 @@ Formato: tabla compacta con nombre, descripción corta y flags principales.
|
|
|
70
70
|
|
|
71
71
|
| Comando | Descripción |
|
|
72
72
|
|---------|------------|
|
|
73
|
-
| `/swl:metricas [resumen\|detalle]` | Métricas de sesión (tokens, costo) |
|
|
74
|
-
| `/swl:dashboard [today\|stats]` | Dashboard histórico multi-sesión |
|
|
73
|
+
| `/swl:status metricas [resumen\|detalle]` | Métricas de sesión (tokens, costo) |
|
|
74
|
+
| `/swl:status dashboard [today\|stats]` | Dashboard histórico multi-sesión |
|
|
75
75
|
| `/swl:mcp-status` | Estado de servidores MCP conectados |
|
|
76
76
|
|
|
77
77
|
#### Instalación y sistema
|
|
@@ -178,6 +178,12 @@ Espera confirmación. Si hay correcciones, ajusta y presenta el resumen nuevamen
|
|
|
178
178
|
|
|
179
179
|
Una vez confirmado, crea `.planning/fases/0N-CONTEXTO.md` (donde N es el número de fase con cero a la izquierda si N < 10, ej: `01-CONTEXTO.md`, `02-CONTEXTO.md`).
|
|
180
180
|
|
|
181
|
+
**TDD es default ON** (gate G2, decisión D-07 vNext): NO preguntes "¿quieres TDD?".
|
|
182
|
+
La fase se ejecuta con ciclo RED→GREEN→REFACTOR y evidencia en telemetría salvo que
|
|
183
|
+
el usuario pida desactivarlo explícitamente. Si lo desactiva: exige la razón, regístrala
|
|
184
|
+
en el campo `**TDD**` del CONTEXTO y anota la excepción en `.planning/AUDITORIA.md`
|
|
185
|
+
(el opt-out se declara y registra — nunca es silencioso).
|
|
186
|
+
|
|
181
187
|
Estructura del archivo:
|
|
182
188
|
|
|
183
189
|
```markdown
|
|
@@ -187,6 +193,8 @@ Estructura del archivo:
|
|
|
187
193
|
**Fase**: N de M (total de fases en el roadmap)
|
|
188
194
|
**Fecha de discusión**: [fecha actual]
|
|
189
195
|
**Estado**: Listo para planear
|
|
196
|
+
**TDD**: on <!-- default. Si el usuario lo desactiva: `off — razón: [...]` + entry en AUDITORIA.md -->
|
|
197
|
+
|
|
190
198
|
|
|
191
199
|
## Objetivo de la fase
|
|
192
200
|
[descripción clara del objetivo]
|
|
@@ -209,8 +217,18 @@ Estructura del archivo:
|
|
|
209
217
|
## Pantallas / vistas (si aplica)
|
|
210
218
|
[descripción de pantallas]
|
|
211
219
|
|
|
212
|
-
## Criterios de aceptación
|
|
213
|
-
[
|
|
220
|
+
## Criterios de aceptación (REQ)
|
|
221
|
+
[criterios binarios y verificables con ID estable REQ-NN — trazabilidad G4:
|
|
222
|
+
- **REQ-01**: [criterio binario verificable]
|
|
223
|
+
- **REQ-02**: [criterio binario verificable]
|
|
224
|
+
Un REQ emitido NUNCA se renumera ni se reusa: si un criterio se descarta, marcarlo
|
|
225
|
+
"RETIRADO — razón" conservando el número. planear-fase exige que cada tarea T-NN
|
|
226
|
+
declare qué REQ verifica (matriz REQ×T) y aprobar-plan rechaza planes con REQ
|
|
227
|
+
huérfanos. verificar-trazabilidad.js valida la cadena REQ→T→commit→test al cierre.
|
|
228
|
+
Método de verificación: por default cada REQ exige un test con marker
|
|
229
|
+
`verifica: REQ-NN`; los REQ satisfechos por prosa/docs/configuración llevan la
|
|
230
|
+
anotación `(verificación: inspección)` en el criterio — exigen tarea y commit
|
|
231
|
+
pero no test automatizado.]
|
|
214
232
|
|
|
215
233
|
## Riesgos identificados
|
|
216
234
|
[lista con nivel de impacto: ALTO/MEDIO/BAJO]
|
|
@@ -18,6 +18,7 @@ Eres el coordinador de ejecución SWL. Orquestas la implementación real del có
|
|
|
18
18
|
```
|
|
19
19
|
/swl:ejecutar-fase 1 # modo default — oleadas paralelas
|
|
20
20
|
/swl:ejecutar-fase 2 --iterative # modo iterativo — 1 tarea, review per-task, auto-debug
|
|
21
|
+
/swl:ejecutar-fase 3 --sin-verify # omite el verify automático del cierre (desviación registrada)
|
|
21
22
|
```
|
|
22
23
|
|
|
23
24
|
### Cuándo usar `--iterative` (modo opt-in)
|
|
@@ -48,7 +49,7 @@ Si NO hay `--iterative`, carga el flujo default:
|
|
|
48
49
|
Skill("ejecutar-fase")
|
|
49
50
|
```
|
|
50
51
|
|
|
51
|
-
El skill define el protocolo completo de ejecución por tarea (leer > verificar dependencias > implementar > verificar > commit > actualizar ESTADO.md), el formato de commit atómico, las 3 reglas de desviación (menor/moderada/mayor), el manejo de tareas HITL, TDD
|
|
52
|
+
El skill define el protocolo completo de ejecución por tarea (leer > verificar dependencias > implementar > verificar > commit > actualizar ESTADO.md), el formato de commit atómico, las 3 reglas de desviación (menor/moderada/mayor), el manejo de tareas HITL, TDD por default con evidencia RED en telemetría de loops (opt-out solo si el CONTEXTO declara `**TDD**: off` con razón — gate G2, ADR-0035), el formato de ESTADO.md y el checklist de cierre de fase.
|
|
52
53
|
|
|
53
54
|
Luego carga habilidades específicas del stack detectado en PLAN.md o PROYECTO.md:
|
|
54
55
|
- Backend Python: `Skill("fastapi-experto")`, `Skill("patrones-python")`
|
|
@@ -75,10 +76,33 @@ Verifica en orden:
|
|
|
75
76
|
5. **Requirement Freeze**: verifica que el frontmatter del PLAN.md contenga
|
|
76
77
|
`estado: aprobado`. Si contiene `estado: borrador` o no tiene campo `estado`:
|
|
77
78
|
- DETENER ejecución
|
|
78
|
-
- Reportar: "El PLAN.md no está aprobado. Ejecuta `/swl:
|
|
79
|
-
|
|
79
|
+
- Reportar: "El PLAN.md no está aprobado. Ejecuta `/swl:aprobar-plan N` para
|
|
80
|
+
aprobarlo y firmarlo antes de ejecutar."
|
|
80
81
|
- NO proceder sin aprobación explícita del usuario
|
|
81
82
|
|
|
83
|
+
6. **Gate G1 — verificación de integridad del plan firmado**: tras confirmar
|
|
84
|
+
`estado: aprobado`, recomputa el hash del PLAN y compáralo contra su lock:
|
|
85
|
+
```bash
|
|
86
|
+
node -e "const {verificarPlan}=require('./scripts/lib/plan-lock'); console.log(JSON.stringify(verificarPlan('.planning/fases/0N-PLAN.md')))"
|
|
87
|
+
```
|
|
88
|
+
Interpreta el resultado:
|
|
89
|
+
- `ok: true, modo: "firmado"` → el plan no fue mutado tras su aprobación.
|
|
90
|
+
Continúa con normalidad.
|
|
91
|
+
- `ok: true, modo: "legacy"` → plan aprobado SIN lock (creado antes de la
|
|
92
|
+
Fase 09, cláusula de gracia D-05). Muestra una **advertencia visible** al
|
|
93
|
+
usuario: "Plan en modo legacy (sin firma SHA256). Se ejecuta sin
|
|
94
|
+
verificación de integridad. Para firmarlo: `/swl:aprobar-plan N`." y
|
|
95
|
+
continúa.
|
|
96
|
+
- `ok: false, modo: "mutado"` → **DETENER ejecución**. El plan cambió tras la
|
|
97
|
+
firma. Reporta `hashEsperado` y `hashActual` y di: "El PLAN fue modificado
|
|
98
|
+
después de su aprobación. Revisa los cambios y vuelve a aprobarlo con
|
|
99
|
+
`/swl:aprobar-plan N` antes de ejecutar." NO proceder.
|
|
100
|
+
- `ok: false` con cualquier otro modo (`lock-corrupto`, `sin-firmar`,
|
|
101
|
+
`no-existe`) → DETENER y reportar el `motivo` exacto.
|
|
102
|
+
|
|
103
|
+
Repite esta verificación al inicio de cada slice (el plan no debe mutar
|
|
104
|
+
durante la ejecución — Requirement Freeze).
|
|
105
|
+
|
|
82
106
|
Lee los tres archivos completos. Verifica estado de Git (`git status`, `git log --oneline -5`). Si hay cambios no commiteados, pregunta cómo proceder.
|
|
83
107
|
|
|
84
108
|
**Nota sobre Requirement Freeze**: una vez que el plan está aprobado y la ejecución
|
|
@@ -147,7 +171,30 @@ Al completar todos los slices, genera `.planning/fases/0N-RESUMEN.md` con: slice
|
|
|
147
171
|
|
|
148
172
|
Marca fase completada en HOJA-RUTA.md con fecha. Actualiza ESTADO.md con estado general.
|
|
149
173
|
|
|
150
|
-
|
|
174
|
+
**Liberar la fase activa** (gate G0): elimina `.planning/locks/fase-activa.json` —
|
|
175
|
+
la fase ya no está en ejecución y `hooks/spec-gate.js` debe volver a advertir si se
|
|
176
|
+
escribe código sin una nueva fase aprobada:
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
node -e "const fs=require('fs'); const p='.planning/locks/fase-activa.json'; if(fs.existsSync(p)){fs.unlinkSync(p); console.log('fase activa liberada')} else {console.log('sin fase activa que liberar')}"
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
NO eliminar el `.lock` del plan (`0N-PLAN.md.lock`) — ese es evidencia de
|
|
183
|
+
aprobación versionada, no runtime.
|
|
184
|
+
|
|
185
|
+
## Paso 8 — Verificación automática y reporte final
|
|
186
|
+
|
|
187
|
+
**Verify automático (gate G4)**: tras generar RESUMEN.md y liberar la fase activa,
|
|
188
|
+
invoca `/swl:verificar --until-converge` automáticamente — el cierre de fase ya no
|
|
189
|
+
es un paso manual recomendado, es parte del flujo.
|
|
190
|
+
|
|
191
|
+
- Opt-out: si el usuario invocó `/swl:ejecutar-fase N --sin-verify`, omite la
|
|
192
|
+
verificación y registra la desviación en el RESUMEN.md ("verificación diferida
|
|
193
|
+
por --sin-verify — razón: [la que dé el usuario]").
|
|
194
|
+
- Si la verificación converge (Señal A): el VERIFICACION.md queda generado y el
|
|
195
|
+
reporte final lo incluye.
|
|
196
|
+
- Si NO converge (Señal B/C) o queda abortada: reportar el estado del loop al
|
|
197
|
+
usuario — la fase NO se declara verificada.
|
|
151
198
|
|
|
152
199
|
```
|
|
153
200
|
Fase N — [nombre] completada.
|
|
@@ -156,13 +203,13 @@ Slices implementados: [N de N]
|
|
|
156
203
|
Commits creados: [N]
|
|
157
204
|
Tests pasando: [N de N]
|
|
158
205
|
Desviaciones del plan: [N, o "ninguna"]
|
|
206
|
+
Verificación: [convergió en pasada K | diferida por --sin-verify | NO convergió — ver detalle]
|
|
159
207
|
|
|
160
208
|
Archivos generados:
|
|
161
209
|
- .planning/fases/0N-RESUMEN.md
|
|
210
|
+
- .planning/fases/0N-VERIFICACION.md (verify automático)
|
|
162
211
|
- .planning/ESTADO.md (actualizado)
|
|
163
212
|
- .planning/HOJA-RUTA.md (actualizado)
|
|
164
|
-
|
|
165
|
-
Próximo paso recomendado: /swl:verificar
|
|
166
213
|
```
|
|
167
214
|
|
|
168
215
|
## Reglas de comportamiento
|
|
@@ -215,7 +215,7 @@ score_after = (evals_pass / evals_total) * 100 × factor_peso
|
|
|
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
217
|
Los 3 casos registran evento en `.planning/evolution/evoluciones.jsonl` para el
|
|
218
|
-
dashboard `/swl:evolucion
|
|
218
|
+
dashboard `/swl:status evolucion`.
|
|
219
219
|
|
|
220
220
|
### Regla de oro
|
|
221
221
|
|
package/comandos/swl/inbox.md
CHANGED
|
@@ -43,7 +43,7 @@ Por cada comando en la cola, decidir:
|
|
|
43
43
|
| Tipo de contenido | Acción |
|
|
44
44
|
|-------------------|--------|
|
|
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
|
-
| Slash command (`/swl:salud`, `/swl:metricas`, etc.) | Invocar ese comando directamente. |
|
|
46
|
+
| Slash command (`/swl:status salud`, `/swl:status 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
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. |
|
package/comandos/swl/instalar.md
CHANGED
|
@@ -185,7 +185,7 @@ Doctor: <resultado>
|
|
|
185
185
|
Siguiente paso:
|
|
186
186
|
/swl:nuevo-proyecto → si es un proyecto nuevo
|
|
187
187
|
/swl:mapear-codebase → si ya hay código existente
|
|
188
|
-
/swl:salud → para diagnóstico profundo del sistema
|
|
188
|
+
/swl:status salud → para diagnóstico profundo del sistema
|
|
189
189
|
```
|
|
190
190
|
|
|
191
191
|
Si la instalación fue local, menciona: "Para instalar SWL en otro proyecto, abre Claude Code en ese proyecto y ejecuta `/swl:instalar` nuevamente."
|
package/comandos/swl/nemesis.md
CHANGED
|
@@ -8,7 +8,7 @@ description: >
|
|
|
8
8
|
automático para scope > 1500 LOC o > 5 archivos en módulos distintos.
|
|
9
9
|
Persiste hallazgos en .planning/audit/findings/iter-N/.
|
|
10
10
|
allowed-tools: [Read, Grep, Glob, Bash, Write, Agent, Skill]
|
|
11
|
-
argument-hint: "[--remediar] [--pass1 | --pass2 | --continue] [--modulo <ruta>] [--redistribuir] [--reset-plan]"
|
|
11
|
+
argument-hint: "[--remediar] [--pass1 | --pass2 | --continue] [--modulo <ruta>] [--redistribuir] [--reset-plan] [--cross-model]"
|
|
12
12
|
---
|
|
13
13
|
|
|
14
14
|
# /swl:nemesis — Auditoría iterativa con remediación opt-in
|
|
@@ -54,6 +54,29 @@ y el ciclo continúa hasta convergencia o agotar el guardrail de 3 iteraciones.
|
|
|
54
54
|
| Acotar módulo | `--modulo <ruta>` | Limita el scope a un archivo o subdirectorio específico. Se combina con cualquier otro flag. |
|
|
55
55
|
| Forzar redistribución | `--redistribuir` | Activa `Skill("nemesis-redistribuir")` aunque scope sea menor al umbral. |
|
|
56
56
|
| Reset del plan | `--reset-plan` | Regenera `nemesis-plan.json` desde cero (descarta plan previo). |
|
|
57
|
+
| **Revisión cross-modelo** | `--cross-model` | Opt-in: rutea la evaluación a un reviewer en OTRO modelo (vía MCP, p.ej. `gemini-review`/`codex-review`) para combatir *self-preferential bias*. Degrada al reviewer same-model si no hay MCP configurado (anuncia la degradación). Combina con `--remediar`. Ver `Skill("proceso-dynamic-workflows") § Revisión cross-modelo`. |
|
|
58
|
+
|
|
59
|
+
## Revisión cross-modelo (`--cross-model`)
|
|
60
|
+
|
|
61
|
+
El reviewer adversarial en el MISMO modelo aún arrastra *self-preferential bias*
|
|
62
|
+
(uno de los 3 modos de falla nombrados en el blog oficial de dynamic workflows).
|
|
63
|
+
`--cross-model` hace que la evaluación la emita un modelo DISTINTO al ejecutor:
|
|
64
|
+
|
|
65
|
+
- **Wiring (opt-in, ligero)**: si hay un MCP reviewer configurado (patrón ARIS
|
|
66
|
+
`gemini-review`/`codex-review`: expone `review`/`review_reply`, devuelve JSON con
|
|
67
|
+
`threadId` + `response`), el paso de evaluación se rutea a ese MCP. swl-ses NO
|
|
68
|
+
embebe el servidor — lo provee el usuario con su API key del otro modelo.
|
|
69
|
+
- **Degradación explícita** (regla `arreglar-al-detectar.md` / no-fallback-silencioso):
|
|
70
|
+
si el MCP no está disponible, NO falla — usa el reviewer same-model y **anuncia**
|
|
71
|
+
"cross-model solicitado pero MCP ausente → degradado a same-model".
|
|
72
|
+
- **Reviewer memory + debate** (de ARIS `auto-review-loop`): el reviewer externo
|
|
73
|
+
arrastra sospechas entre iteraciones (un `threadId`); el ejecutor puede rebatir,
|
|
74
|
+
el reviewer falla el veredicto final — *"it can drive, never acquit"*.
|
|
75
|
+
- **Trazabilidad**: el JSON del reviewer (`threadId`, `response`, score) se persiste
|
|
76
|
+
junto a `evaluacion.json` en `.planning/audit/findings/iter-N/` → veredicto
|
|
77
|
+
independiente auditable.
|
|
78
|
+
|
|
79
|
+
Detalle del patrón: `Skill("proceso-dynamic-workflows") § Revisión cross-modelo`.
|
|
57
80
|
|
|
58
81
|
## Flujo completo con `--remediar`
|
|
59
82
|
|
|
@@ -207,6 +230,24 @@ Estructura de salida bajo `.planning/audit/findings/`:
|
|
|
207
230
|
|
|
208
231
|
Cada `evaluacion.json` sigue el schema `nemesis-evaluacion-json` v1.0.0.
|
|
209
232
|
|
|
233
|
+
### Telemetría de loop (obligatoria con `--remediar`)
|
|
234
|
+
|
|
235
|
+
En modo `--remediar`, además de los `iter-N/` el comando registra la
|
|
236
|
+
trayectoria en el formato estándar de telemetría de loops
|
|
237
|
+
(`hooks/lib/loop-telemetry.js`). Esto habilita: inyección de estado por el
|
|
238
|
+
hook `contexto-iteracion.js` durante las ejecuciones largas (8-30 turnos),
|
|
239
|
+
detección de plateau, y lectura de la corrida por `/swl:status metricas`.
|
|
240
|
+
|
|
241
|
+
- Al iniciar iter-1: `iniciarCorrida({tipo: 'nemesis', direccion: 'lower_is_better', config: {modulo, maxIter: 3}})`.
|
|
242
|
+
- Tras cada iteración: `registrarIteracion(dir, {iteracion: N, metrica: criticos+altos, delta, estado: 'keep', descripcion: 'iter N: status=<status>, X criticos, Y altos'})`.
|
|
243
|
+
- Al cerrar (PASS, FAIL o Recovery Catalog): `escribirHandoff(dir, {source: 'swl:nemesis', status, findings: <hallazgos residuales con archivo_linea>, config})`.
|
|
244
|
+
Mapeo de status: PASS → `COMPLETO`, max iteraciones → `ACOTADO`, Recovery
|
|
245
|
+
Catalog/escalada → `INTERRUMPIDO`.
|
|
246
|
+
|
|
247
|
+
El `handoff.json` resultante es consumible por una corrida posterior de
|
|
248
|
+
`/swl:verificar --until-converge` o por el orquestador (los `findings`
|
|
249
|
+
traen `archivo_linea` verificable según `verificar-citas-normativas.md § Familia 2`).
|
|
250
|
+
|
|
210
251
|
## Cómo interpretar el reporte
|
|
211
252
|
|
|
212
253
|
### Severidades
|
|
@@ -146,7 +146,12 @@ El agente planificador-swl debe generar el plan con esta estructura exacta:
|
|
|
146
146
|
...
|
|
147
147
|
|
|
148
148
|
## Modelos y esquemas de datos
|
|
149
|
-
[tablas, campos, tipos, constraints — si la fase introduce datos nuevos
|
|
149
|
+
[tablas, campos, tipos, constraints — si la fase introduce datos nuevos.
|
|
150
|
+
Los schemas declarados aquí (Pydantic/Zod/JSON Schema/OpenAPI) son **contrato
|
|
151
|
+
verificable**, parte de la spec: la tarea que los implementa se verifica con
|
|
152
|
+
contract testing (`Skill("calidad-contract-testing")`), no solo con tests
|
|
153
|
+
unitarios. Declarar el schema con la estrictez de la promesa real (requeridos
|
|
154
|
+
marcados, sin campos extra implícitos).]
|
|
150
155
|
|
|
151
156
|
## Endpoints a implementar
|
|
152
157
|
| Método | Ruta | Descripción | Roles permitidos |
|
|
@@ -161,10 +166,28 @@ El agente planificador-swl debe generar el plan con esta estructura exacta:
|
|
|
161
166
|
## Tests requeridos
|
|
162
167
|
[lista de tests que deben existir al finalizar la fase]
|
|
163
168
|
|
|
169
|
+
## Escenarios Gherkin (opt-in — solo si la fase tiene criterios de aceptación de negocio)
|
|
170
|
+
[Si el CONTEXTO.md/PRD trae criterios de aceptación con reglas de negocio
|
|
171
|
+
distinguibles, convertirlos en escenarios Given–When–Then siguiendo
|
|
172
|
+
`habilidades/tdd-workflow/recursos/gherkin-bdd.md` y presentarlos al usuario
|
|
173
|
+
para validación ANTES de aprobar el plan. Cada escenario validado se referencia
|
|
174
|
+
desde la tarea que lo implementa (será su test RED). Omitir esta sección en
|
|
175
|
+
fases técnicas puras — Gherkin sin lector de negocio es ceremonia.]
|
|
176
|
+
|
|
164
177
|
## Riesgos y mitigaciones
|
|
165
178
|
| Riesgo | Impacto | Probabilidad | Mitigación |
|
|
166
179
|
|--------|---------|-------------|-----------|
|
|
167
180
|
|
|
181
|
+
## Matriz REQ×T (obligatoria si el CONTEXTO tiene criterios REQ-NN)
|
|
182
|
+
[tabla REQ → tareas que lo verifican. Cada tarea declara `**Verifica REQ**: REQ-XX`.
|
|
183
|
+
Todo REQ sin tarea = plan NO apto para aprobación (aprobar-plan lo rechaza).
|
|
184
|
+
La convención de cierre de cadena: commits con footer `Refs: REQ-NN` y tests con
|
|
185
|
+
marker `# verifica: REQ-NN` (Python) / `// verifica: REQ-NN` (JS/TS) — validada
|
|
186
|
+
por `scripts/verificar-trazabilidad.js`. Omitir solo en CONTEXTOs legacy sin REQ-IDs.]
|
|
187
|
+
|
|
188
|
+
| REQ | Tareas que lo verifican |
|
|
189
|
+
|-----|------------------------|
|
|
190
|
+
|
|
168
191
|
## Criterios de aceptación de la fase
|
|
169
192
|
[copia del CONTEXTO.md, verificados contra el plan]
|
|
170
193
|
|
|
@@ -182,6 +205,7 @@ Una vez que el agente planificador-swl produce el PLAN.md, ejecuta una revisión
|
|
|
182
205
|
- [ ] ¿El orden de implementación respeta las dependencias (BD → service → endpoint → frontend)?
|
|
183
206
|
- [ ] ¿Hay criterios de verificación para cada slice?
|
|
184
207
|
- [ ] ¿Los criterios de aceptación de la fase están cubiertos por los slices?
|
|
208
|
+
- [ ] Si el CONTEXTO tiene REQ-IDs: ¿la matriz REQ×T cubre TODOS los REQ (cero huérfanos)?
|
|
185
209
|
- [ ] ¿Los riesgos ALTO del CONTEXTO.md están mitigados en el plan?
|
|
186
210
|
- [ ] ¿Hay tests especificados para cada área crítica?
|
|
187
211
|
- [ ] ¿Hay tareas HITL claramente marcadas?
|
package/comandos/swl/plugins.md
CHANGED
|
@@ -122,7 +122,7 @@ echo "Plugin <nombre> v<version> instalado en _userland/plugins/<nombre>/"
|
|
|
122
122
|
echo "Componentes: agentes=$(count), skills=$(count), reglas=$(count), hooks=$(count)"
|
|
123
123
|
```
|
|
124
124
|
|
|
125
|
-
Indicar al usuario que ejecute `/swl:salud` para verificar integridad global.
|
|
125
|
+
Indicar al usuario que ejecute `/swl:status salud` para verificar integridad global.
|
|
126
126
|
|
|
127
127
|
---
|
|
128
128
|
|