@saulwade/swl-ses 1.9.0 → 2.1.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/_propose-step.md +90 -0
- 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/implementador-swl.md +2 -0
- package/agentes/investigador-ux-swl.md +5 -5
- package/agentes/orquestador-swl.md +9 -7
- package/agentes/perfilador-usuario-swl.md +321 -308
- package/agentes/producto-prd-swl.md +1 -1
- package/agentes/red-team-swl.md +218 -218
- package/agentes/tdd-qa-swl.md +17 -1
- package/bin/swl-ses.js +1 -1
- package/comandos/swl/actualizar.md +1 -1
- package/comandos/swl/aprender.md +2 -2
- package/comandos/swl/aprobar-plan.md +153 -0
- package/comandos/swl/ayuda.md +3 -3
- package/comandos/swl/briefing.md +122 -0
- package/comandos/swl/compactar.md +29 -2
- package/comandos/swl/discutir-fase.md +23 -2
- package/comandos/swl/ejecutar-fase.md +59 -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 +1 -1
- package/comandos/swl/planear-fase.md +19 -1
- package/comandos/swl/plugins.md +1 -1
- package/comandos/swl/release.md +47 -1
- package/comandos/swl/status.md +348 -0
- package/comandos/swl/verificar.md +27 -1
- package/habilidades/ai-runtime-security/SKILL.md +1 -1
- package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
- package/habilidades/benchmark-memoria/SKILL.md +1 -1
- package/habilidades/calidad-contract-testing/SKILL.md +165 -0
- package/habilidades/changelog-generator/SKILL.md +9 -2
- package/habilidades/changelog-generator/scripts/parse-commits.js +13 -1
- package/habilidades/diagrama-arquitectura/SKILL.md +1 -1
- package/habilidades/drift-detection/SKILL.md +179 -179
- package/habilidades/ejecutar-fase/SKILL.md +541 -468
- 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/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/perfil-usuario/SKILL.md +200 -200
- package/habilidades/planear-fase/SKILL.md +26 -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 +2 -2
- 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 +715 -673
- package/habilidades/validacion-ci-sistema/SKILL.md +20 -4
- package/hooks/calidad-pre-commit.js +344 -3
- package/hooks/check-update.js +39 -1
- package/hooks/ciclo-evolucion-subagente.js +26 -0
- package/hooks/ciclo-evolucion.js +26 -0
- package/hooks/extraccion-aprendizajes.js +13 -0
- package/hooks/lib/autonomia.js +208 -0
- package/hooks/lib/briefing.js +474 -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/propose-step.js +357 -0
- package/hooks/session-briefing.js +98 -0
- package/hooks/spec-gate.js +211 -0
- package/hooks/tdd-gate.js +241 -0
- package/hooks/telemetria-skill-routing.js +100 -0
- package/hooks/validar-intent-spec.js +30 -10
- package/instintos/autonomia.yaml +27 -0
- package/llms.txt +6 -6
- package/manifiestos/hooks-config.json +44 -17
- package/manifiestos/modulos.json +40 -15
- package/manifiestos/skills-lock.json +64 -57
- package/package.json +93 -93
- package/plugin.json +371 -375
- package/reglas/accesibilidad.md +10 -0
- package/reglas/analizar-directorios-antes-de-escribir.md +228 -0
- package/reglas/api-diseno.md +9 -0
- package/reglas/auditorias-documentales-estructurales.md +7 -0
- package/reglas/cloud-infra.md +8 -0
- package/reglas/consultar-vault-primero.md +195 -0
- package/reglas/debatir-antes-de-aceptar.md +158 -0
- package/reglas/fragmentos-compartidos.md +5 -0
- package/reglas/git-coauthor.md +100 -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/monitor-ci.md +309 -0
- package/reglas/patrones.md +6 -0
- package/reglas/registro-componentes-nuevos.md +39 -2
- package/reglas/seguridad-agentes.md +1 -1
- package/reglas/sesiones-paralelas.md +180 -0
- package/reglas/skills-estandar.md +6 -0
- package/reglas/testing.md +7 -0
- package/reglas/tests-cleanup.md +4 -0
- package/reglas/usar-code-review-graph.md +155 -0
- package/reglas/usar-sistema-swl.md +1 -1
- package/reglas/verificar-citas-normativas.md +548 -0
- package/scripts/instalador.js +52 -6
- package/scripts/lib/ci-reader.js +193 -0
- package/scripts/lib/detectar-host-swl.js +175 -0
- package/scripts/lib/evidencia-release.js +322 -0
- package/scripts/lib/gate-hooks-requires.js +249 -0
- package/scripts/lib/gate-licencias.js +212 -0
- package/scripts/lib/git-metricas.js +257 -0
- package/scripts/lib/gitignore-manifest.js +29 -1
- package/scripts/lib/metricas-dora.js +204 -0
- package/scripts/lib/plan-lock.js +275 -0
- package/scripts/migrar-fase-dominio.js +0 -1
- package/scripts/tui/ejecutores.js +1 -1
- package/scripts/validar-manifest.js +92 -1
- package/scripts/verificar-evolucion.js +54 -4
- package/scripts/verificar-release.js +102 -0
- package/scripts/verificar-trazabilidad.js +298 -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 -376
- package/comandos/swl/salud.md +0 -481
- package/reglas/arquitectura.evolved.json +0 -7
- package/reglas/seguridad.evolved.json +0 -7
- package/reglas/verificar-citas-temporales.md +0 -139
|
@@ -0,0 +1,153 @@
|
|
|
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:` (fases 01-11) o
|
|
55
|
+
`REQ-<fase>-NN:` (namespaceados, fases ≥12) de la sección de criterios de
|
|
56
|
+
aceptación. `verificar-trazabilidad.js` reconoce ambos formatos.
|
|
57
|
+
|
|
58
|
+
- **CONTEXTO sin REQ-IDs** (fases legacy 01-09): advertencia informativa
|
|
59
|
+
("CONTEXTO sin REQ-IDs — trazabilidad no exigible, gracia legacy") y continúa.
|
|
60
|
+
- **CONTEXTO con REQ-IDs**: verifica que el PLAN cubra TODOS:
|
|
61
|
+
```bash
|
|
62
|
+
node scripts/verificar-trazabilidad.js --fase=N --solo-plan
|
|
63
|
+
```
|
|
64
|
+
- Exit 0 → continúa al Paso 3.
|
|
65
|
+
- Exit 1 (REQ huérfanos) → **RECHAZA la aprobación**. Lista los REQ sin tarea y
|
|
66
|
+
remite a `/swl:planear-fase N` para cubrirlos (o a retirar el REQ del CONTEXTO
|
|
67
|
+
con marca "RETIRADO — razón"). NO firmes un plan con REQ huérfanos.
|
|
68
|
+
|
|
69
|
+
## Paso 3 — Confirmar con el usuario antes de aprobar
|
|
70
|
+
|
|
71
|
+
NUNCA apruebes sin confirmación explícita. Presenta un resumen breve del plan
|
|
72
|
+
(número de slices, tareas, slices HITL) y pregunta:
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
El plan de la fase N tiene [X] slices y [Y] tareas ([Z] HITL).
|
|
76
|
+
¿Confirmas la aprobación? Al aprobar se firma con SHA256 y queda inmutable:
|
|
77
|
+
cualquier edición posterior detendrá /swl:ejecutar-fase.
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Espera respuesta afirmativa. Si el usuario pide cambios, NO apruebes — remítelo
|
|
81
|
+
a `/swl:planear-fase N` para refinar.
|
|
82
|
+
|
|
83
|
+
## Paso 4 — Transicionar y firmar
|
|
84
|
+
|
|
85
|
+
1. **Transicionar** (omitir si el plan ya estaba `aprobado` en modo legacy):
|
|
86
|
+
edita el frontmatter `estado: borrador` → `estado: aprobado` y agrega
|
|
87
|
+
`aprobadoPor: usuario (<nombre>) — <fecha>, via /swl:aprobar-plan`.
|
|
88
|
+
|
|
89
|
+
2. **Firmar** — escribe el lock SHA256:
|
|
90
|
+
```bash
|
|
91
|
+
node -e "const {firmarPlan}=require('./scripts/lib/plan-lock'); const r=firmarPlan('.planning/fases/0N-PLAN.md'); console.log(JSON.stringify(r))"
|
|
92
|
+
```
|
|
93
|
+
Verifica que el resultado sea `ok: true` y que exista
|
|
94
|
+
`.planning/locks/0N-PLAN.md.lock`.
|
|
95
|
+
|
|
96
|
+
3. **Verificar** la firma de inmediato:
|
|
97
|
+
```bash
|
|
98
|
+
node -e "const {verificarPlan}=require('./scripts/lib/plan-lock'); console.log(JSON.stringify(verificarPlan('.planning/fases/0N-PLAN.md')))"
|
|
99
|
+
```
|
|
100
|
+
Debe retornar `modo: "firmado"`, `ok: true`.
|
|
101
|
+
|
|
102
|
+
4. **Marcar la fase como activa** (gate G0 — `hooks/spec-gate.js` consume este
|
|
103
|
+
archivo): escribe `.planning/locks/fase-activa.json` con el sha256 devuelto
|
|
104
|
+
por `firmarPlan`:
|
|
105
|
+
```bash
|
|
106
|
+
node -e "
|
|
107
|
+
const {atomicWriteJSON} = require('./hooks/lib/atomic-write');
|
|
108
|
+
const {verificarPlan} = require('./scripts/lib/plan-lock');
|
|
109
|
+
const v = verificarPlan('.planning/fases/0N-PLAN.md');
|
|
110
|
+
atomicWriteJSON('.planning/locks/fase-activa.json', {
|
|
111
|
+
numero: N,
|
|
112
|
+
planPath: '.planning/fases/0N-PLAN.md',
|
|
113
|
+
sha256: v.hashEsperado,
|
|
114
|
+
aprobadoEn: new Date().toISOString(),
|
|
115
|
+
aprobadoPor: 'usuario via /swl:aprobar-plan'
|
|
116
|
+
});
|
|
117
|
+
console.log('fase activa: 0N');
|
|
118
|
+
"
|
|
119
|
+
```
|
|
120
|
+
Este archivo es runtime local (gitignored — a diferencia del `.lock`, que SÍ
|
|
121
|
+
se versiona como evidencia). `/swl:ejecutar-fase` lo elimina al cerrar la fase.
|
|
122
|
+
Si se re-firma un plan (re-aprobación tras mutación), re-escribir también
|
|
123
|
+
fase-activa.json para que el hash quede alineado.
|
|
124
|
+
|
|
125
|
+
## Paso 5 — Reporte
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
Plan de la fase N aprobado y firmado (gate G1 activo).
|
|
129
|
+
|
|
130
|
+
estado: borrador -> aprobado
|
|
131
|
+
lock: .planning/locks/0N-PLAN.md.lock
|
|
132
|
+
fase activa: .planning/locks/fase-activa.json (gate G0 cubierto)
|
|
133
|
+
sha256: <hash corto>
|
|
134
|
+
|
|
135
|
+
Cualquier edición del PLAN tras esta firma detendrá /swl:ejecutar-fase con un
|
|
136
|
+
mensaje de "plan mutado tras aprobación". Para cambiar el plan: edítalo y vuelve
|
|
137
|
+
a ejecutar /swl:aprobar-plan N.
|
|
138
|
+
|
|
139
|
+
Próximo paso: /swl:ejecutar-fase N
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Reglas de comportamiento
|
|
143
|
+
|
|
144
|
+
- NUNCA apruebes un plan sin confirmación explícita del usuario.
|
|
145
|
+
- NUNCA modifiques el contenido del plan al aprobarlo — solo el campo `estado`
|
|
146
|
+
del frontmatter y la línea `aprobadoPor`. El cuerpo es lo que se firma.
|
|
147
|
+
- El lock vive en `.planning/locks/` y SÍ se versiona en git (es evidencia de
|
|
148
|
+
aprobación, parte del audit trail de SDD).
|
|
149
|
+
- Si el usuario quiere cambiar el plan después de aprobado, el flujo correcto es
|
|
150
|
+
editar el PLAN y re-ejecutar `/swl:aprobar-plan N` (re-firma). NUNCA editar el
|
|
151
|
+
lock a mano.
|
|
152
|
+
- El número de versión del release que publique esta fase lo decide el usuario
|
|
153
|
+
(regla CLAUDE.md) — este comando no toca versiones.
|
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
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: swl:briefing
|
|
3
|
+
description: Briefing proactivo del proyecto bajo demanda. Re-presenta las señales baratas del hook SessionStart (ADRs Propuestos con reevaluación vencida, deuda con trigger por fecha cumplido, nudges sin accionar, gates en calibración, retoma pendiente) y agrega el análisis profundo opt-in que el hook no puede pagar: audit de dependencias del proyecto destino, cobertura vs umbral, hubs del grafo tocados sin revisión, drift de feature-list, y triggers de deuda en prosa libre. Cargar cuando el usuario pide "¿qué hay pendiente?", "¿qué riesgos hay?", "ponme al día", o cuando el digest de sesión sugiere el análisis completo por volumen de señales.
|
|
4
|
+
allowed_tools: ["Read", "Bash", "Glob", "Grep"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /swl:briefing — Briefing proactivo bajo demanda
|
|
8
|
+
|
|
9
|
+
Análisis no solicitado del estado del proyecto destino (Fase 12, ADR-0036). El
|
|
10
|
+
hook `session-briefing.js` da el digest barato al abrir sesión; este comando es
|
|
11
|
+
el nivel profundo: re-presenta esas señales Y agrega las que cuestan (deps, grafo,
|
|
12
|
+
cobertura) con degradación funcional si la herramienta no está instalada.
|
|
13
|
+
|
|
14
|
+
Principio rector: **proponer es barato y siempre permitido; actuar requiere
|
|
15
|
+
autorización del usuario**. Este comando solo propone y analiza — nunca aplica
|
|
16
|
+
cambios sin que el usuario los pida.
|
|
17
|
+
|
|
18
|
+
## Uso
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
/swl:briefing # señales baratas + análisis profundo completo
|
|
22
|
+
/swl:briefing rapido # solo las 5 señales del hook (sin deps/grafo/cobertura)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Paso 1 — Señales baratas (mismas del hook)
|
|
26
|
+
|
|
27
|
+
Ejecuta los recolectores de filesystem y presenta el digest sin tope de 5 (aquí
|
|
28
|
+
sí caben todas, no hay presupuesto de latencia de arranque):
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
node -e "
|
|
32
|
+
const b = require('./hooks/lib/briefing.js');
|
|
33
|
+
const items = b.recolectarTodo(process.cwd(), new Date());
|
|
34
|
+
for (const it of items) console.log('— [' + it.categoria + '] ' + it.titulo + ' → ' + it.accion);
|
|
35
|
+
if (items.length === 0) console.log('(sin señales baratas)');
|
|
36
|
+
"
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Las 5 categorías: `adr-vencido`, `deuda-trigger`, `nudges-pendientes`,
|
|
40
|
+
`gate-calibracion`, `continue-here`. Si `rapido`, terminar aquí.
|
|
41
|
+
|
|
42
|
+
## Paso 2 — Análisis profundo (opt-in, con degradación)
|
|
43
|
+
|
|
44
|
+
Para cada herramienta, **validar antes de invocar** (patrón "validar antes de
|
|
45
|
+
invocar"): si no está disponible, reportar "no disponible, omitido" y continuar —
|
|
46
|
+
nunca fallar el briefing por una herramienta ausente.
|
|
47
|
+
|
|
48
|
+
### 2.1 — Audit de dependencias del proyecto destino
|
|
49
|
+
|
|
50
|
+
Detectar el ecosistema y correr el audit nativo:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Node
|
|
54
|
+
[ -f package.json ] && npm audit --omit=dev 2>/dev/null | tail -5
|
|
55
|
+
# Python
|
|
56
|
+
[ -f requirements.txt -o -f pyproject.toml ] && (command -v pip-audit >/dev/null && pip-audit 2>/dev/null | tail -5 || echo "pip-audit no instalado — omitido")
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Reportar CVEs HIGH/CRITICAL con la acción concreta (`npm audit fix`, bump de
|
|
60
|
+
versión). Sin lockfile o sin gestor → omitir.
|
|
61
|
+
|
|
62
|
+
### 2.2 — Cobertura vs umbral
|
|
63
|
+
|
|
64
|
+
Si el proyecto define cobertura, comparar contra el umbral del proyecto (80% por
|
|
65
|
+
defecto). Si no hay reporte reciente, indicar el comando para generarlo en vez de
|
|
66
|
+
correrlo (puede ser caro):
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
Para medir cobertura: <runner del proyecto> --coverage
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 2.3 — Hubs del grafo tocados sin revisión
|
|
73
|
+
|
|
74
|
+
Si el MCP `code-review-graph` está disponible (tools `mcp__code-review-graph__*`
|
|
75
|
+
registradas o deferred), consultar los nodos hub modificados en los últimos N
|
|
76
|
+
commits sin revisión asociada. Si no está disponible → omitir con nota.
|
|
77
|
+
|
|
78
|
+
### 2.4 — Drift de feature-list
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
node scripts/derivar-feature-list.js --check 2>/dev/null; echo "exit: $?"
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Exit 2 → reportar que `HOJA-RUTA.md` y `feature-list.json` divergieron, con la
|
|
85
|
+
acción `node scripts/derivar-feature-list.js` para regenerar.
|
|
86
|
+
|
|
87
|
+
### 2.5 — Deuda con trigger en prosa libre
|
|
88
|
+
|
|
89
|
+
El hook solo evalúa triggers verificables por fecha (D-16). Aquí, leer
|
|
90
|
+
`.planning/DEUDA-TECNICA.md` y evaluar con criterio los triggers en prosa
|
|
91
|
+
("≥2 clientes reportan", "p95 > 60s documentado") contra el estado real del
|
|
92
|
+
proyecto. Reportar los que parezcan cumplidos para revisión del usuario.
|
|
93
|
+
|
|
94
|
+
## Paso 3 — Presentación y telemetría
|
|
95
|
+
|
|
96
|
+
Presenta el briefing agrupado por prioridad (continue-here → gates → deuda →
|
|
97
|
+
ADRs → nudges → hallazgos profundos). Cada ítem con su acción ejecutable.
|
|
98
|
+
|
|
99
|
+
Tras presentar, el usuario decide qué accionar. NO ejecutar acciones de mutación
|
|
100
|
+
(cerrar deuda, promover gates, aplicar fixes) sin que el usuario lo pida — este
|
|
101
|
+
comando es propositivo (separación PROPONER/ACTUAR, ADR-0037 pendiente).
|
|
102
|
+
|
|
103
|
+
Si el usuario acciona una señal en esta sesión (ejecuta el comando sugerido), esa
|
|
104
|
+
resolución la captura la telemetría de aceptación del hook en la siguiente sesión
|
|
105
|
+
(la señal desaparece del recolector → cuenta como "actuada", D-18).
|
|
106
|
+
|
|
107
|
+
## Cuándo NO usar este comando
|
|
108
|
+
|
|
109
|
+
- En cada turno de una sesión: el briefing es por sesión, no por mensaje. El hook
|
|
110
|
+
ya cubre el inicio; este comando es para cuando el usuario pide el detalle.
|
|
111
|
+
- Para aplicar las acciones propuestas: este comando propone, no ejecuta. Usar el
|
|
112
|
+
comando concreto de cada señal (`/swl:evolucion-estado`, `/swl:verificar`, etc.).
|
|
113
|
+
- En proyectos sin `.planning/`: no hay señales que recolectar.
|
|
114
|
+
|
|
115
|
+
## Gotchas
|
|
116
|
+
|
|
117
|
+
- **Herramienta ausente ≠ error**: si `npm audit`, `pip-audit` o el grafo no están,
|
|
118
|
+
el briefing los omite con nota y sigue. Nunca abortar por una dependencia opt-in.
|
|
119
|
+
- **No re-listar lo que el hook ya mostró hoy**: el hook aplica dedupe diario; este
|
|
120
|
+
comando ignora el dedupe a propósito (lo invoca el usuario, quiere ver todo).
|
|
121
|
+
- **`code-review-graph` deferred ≠ ausente**: si las tools aparecen como deferred,
|
|
122
|
+
cargar su schema con `ToolSearch` antes de concluir que no está disponible.
|
|
@@ -269,10 +269,37 @@ Archivos actualizados:
|
|
|
269
269
|
- .planning/COMPACTACION.md (creado/actualizado)
|
|
270
270
|
- .planning/ESTADO.md (referencia agregada)
|
|
271
271
|
|
|
272
|
-
El
|
|
273
|
-
|
|
272
|
+
El estado está a salvo en disco. IMPORTANTE: este comando NO compacta la
|
|
273
|
+
ventana de contexto — eso es una operación del harness que el agente no
|
|
274
|
+
puede ejecutar. Para compactar de verdad, AHORA ejecuta TÚ una de estas:
|
|
275
|
+
|
|
276
|
+
/compact ← built-in de Claude Code: trunca la ventana usando
|
|
277
|
+
el estado ya persistido (recomendado para seguir
|
|
278
|
+
en la misma sesión)
|
|
279
|
+
/clear o sesión nueva ← arranque limpio; pega la instrucción de arranque
|
|
280
|
+
del Paso 7
|
|
281
|
+
|
|
282
|
+
Próximo comando de trabajo (tras compactar): [comando exacto]
|
|
274
283
|
```
|
|
275
284
|
|
|
285
|
+
## Paso 9 — Por qué este comando NO compacta la ventana (límite del harness)
|
|
286
|
+
|
|
287
|
+
La compactación REAL del contexto (truncar la conversación) es una operación
|
|
288
|
+
exclusiva del harness de Claude Code: el `/compact` built-in o el auto-compact.
|
|
289
|
+
Un comando `/swl:*` corre DENTRO de la conversación y el modelo no tiene
|
|
290
|
+
ninguna herramienta para truncar su propia ventana — por diseño.
|
|
291
|
+
|
|
292
|
+
División de responsabilidades:
|
|
293
|
+
|
|
294
|
+
| Mitad | Quién | Qué hace |
|
|
295
|
+
|-------|-------|----------|
|
|
296
|
+
| `/swl:compactar` | el agente | Persiste el estado a disco (COMPACTACION.md + ESTADO.md) para que NADA se pierda al truncar |
|
|
297
|
+
| `/compact` | el usuario (harness) | Trunca la ventana de verdad. Sin la mitad anterior, perdería las decisiones no escritas |
|
|
298
|
+
|
|
299
|
+
El error a prevenir: ejecutar `/compact` SIN haber corrido `/swl:compactar`
|
|
300
|
+
antes (estado solo en la memoria de la conversación → se pierde). El orden
|
|
301
|
+
correcto siempre es: `/swl:compactar` → `/compact`.
|
|
302
|
+
|
|
276
303
|
## Reglas de comportamiento
|
|
277
304
|
|
|
278
305
|
- El COMPACTACION.md debe reemplazar la necesidad de releer toda la conversación. Si alguien lo lee, debe poder continuar el trabajo.
|
|
@@ -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,21 @@ 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 namespaceado por fase
|
|
222
|
+
`REQ-<fase>-NN` (DT-IDS-NAMESPACE, fases ≥12) — trazabilidad G4:
|
|
223
|
+
- **REQ-12-01**: [criterio binario verificable]
|
|
224
|
+
- **REQ-12-02**: [criterio binario verificable]
|
|
225
|
+
Las fases 01-11 conservan el formato plano `REQ-NN` (gracia legacy permanente,
|
|
226
|
+
no se renumeran). `verificar-trazabilidad.js` acepta ambos formatos.
|
|
227
|
+
Un REQ emitido NUNCA se renumera ni se reusa: si un criterio se descarta, marcarlo
|
|
228
|
+
"RETIRADO — razón" conservando el número. planear-fase exige que cada tarea T-NN
|
|
229
|
+
declare qué REQ verifica (matriz REQ×T) y aprobar-plan rechaza planes con REQ
|
|
230
|
+
huérfanos. verificar-trazabilidad.js valida la cadena REQ→T→commit→test al cierre.
|
|
231
|
+
Método de verificación: por default cada REQ exige un test con marker
|
|
232
|
+
`verifica: REQ-<fase>-NN`; los REQ satisfechos por prosa/docs/configuración llevan
|
|
233
|
+
la anotación `(verificación: inspección)` en el criterio — exigen tarea y commit
|
|
234
|
+
pero no test automatizado.]
|
|
214
235
|
|
|
215
236
|
## Riesgos identificados
|
|
216
237
|
[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
|
|
@@ -143,11 +167,40 @@ Según tipo de error:
|
|
|
143
167
|
|
|
144
168
|
Al completar todos los slices, genera `.planning/fases/0N-RESUMEN.md` con: slices implementados (commits, archivos), resultados de tests, desviaciones del plan, decisiones técnicas, deuda técnica, estado final, criterios de aceptación verificados, próximos pasos.
|
|
145
169
|
|
|
170
|
+
**Anexo propositivo (Fase 13, ADR-0037)**: antes de cerrar, ejecuta el propose-step
|
|
171
|
+
sobre el diff de la fase (`node hooks/lib/propose-step.js --rango=<base>..HEAD`) e
|
|
172
|
+
incluye una sección "Anexo propositivo" en el RESUMEN.md **solo si hay ≥1 señal** de
|
|
173
|
+
adyacencia (auth/PII/pagos, migración de schema). Si no hay señal, omite la sección
|
|
174
|
+
(silencio, no sección vacía). El anexo propone, nunca bloquea. Opt-out `SWL_PROPOSE=0`.
|
|
175
|
+
|
|
146
176
|
## Paso 7 — Actualización de HOJA-RUTA.md y ESTADO.md
|
|
147
177
|
|
|
148
178
|
Marca fase completada en HOJA-RUTA.md con fecha. Actualiza ESTADO.md con estado general.
|
|
149
179
|
|
|
150
|
-
|
|
180
|
+
**Liberar la fase activa** (gate G0): elimina `.planning/locks/fase-activa.json` —
|
|
181
|
+
la fase ya no está en ejecución y `hooks/spec-gate.js` debe volver a advertir si se
|
|
182
|
+
escribe código sin una nueva fase aprobada:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
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')}"
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
NO eliminar el `.lock` del plan (`0N-PLAN.md.lock`) — ese es evidencia de
|
|
189
|
+
aprobación versionada, no runtime.
|
|
190
|
+
|
|
191
|
+
## Paso 8 — Verificación automática y reporte final
|
|
192
|
+
|
|
193
|
+
**Verify automático (gate G4)**: tras generar RESUMEN.md y liberar la fase activa,
|
|
194
|
+
invoca `/swl:verificar --until-converge` automáticamente — el cierre de fase ya no
|
|
195
|
+
es un paso manual recomendado, es parte del flujo.
|
|
196
|
+
|
|
197
|
+
- Opt-out: si el usuario invocó `/swl:ejecutar-fase N --sin-verify`, omite la
|
|
198
|
+
verificación y registra la desviación en el RESUMEN.md ("verificación diferida
|
|
199
|
+
por --sin-verify — razón: [la que dé el usuario]").
|
|
200
|
+
- Si la verificación converge (Señal A): el VERIFICACION.md queda generado y el
|
|
201
|
+
reporte final lo incluye.
|
|
202
|
+
- Si NO converge (Señal B/C) o queda abortada: reportar el estado del loop al
|
|
203
|
+
usuario — la fase NO se declara verificada.
|
|
151
204
|
|
|
152
205
|
```
|
|
153
206
|
Fase N — [nombre] completada.
|
|
@@ -156,13 +209,13 @@ Slices implementados: [N de N]
|
|
|
156
209
|
Commits creados: [N]
|
|
157
210
|
Tests pasando: [N de N]
|
|
158
211
|
Desviaciones del plan: [N, o "ninguna"]
|
|
212
|
+
Verificación: [convergió en pasada K | diferida por --sin-verify | NO convergió — ver detalle]
|
|
159
213
|
|
|
160
214
|
Archivos generados:
|
|
161
215
|
- .planning/fases/0N-RESUMEN.md
|
|
216
|
+
- .planning/fases/0N-VERIFICACION.md (verify automático)
|
|
162
217
|
- .planning/ESTADO.md (actualizado)
|
|
163
218
|
- .planning/HOJA-RUTA.md (actualizado)
|
|
164
|
-
|
|
165
|
-
Próximo paso recomendado: /swl:verificar
|
|
166
219
|
```
|
|
167
220
|
|
|
168
221
|
## 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
|
@@ -236,7 +236,7 @@ En modo `--remediar`, además de los `iter-N/` el comando registra la
|
|
|
236
236
|
trayectoria en el formato estándar de telemetría de loops
|
|
237
237
|
(`hooks/lib/loop-telemetry.js`). Esto habilita: inyección de estado por el
|
|
238
238
|
hook `contexto-iteracion.js` durante las ejecuciones largas (8-30 turnos),
|
|
239
|
-
detección de plateau, y lectura de la corrida por `/swl:metricas`.
|
|
239
|
+
detección de plateau, y lectura de la corrida por `/swl:status metricas`.
|
|
240
240
|
|
|
241
241
|
- Al iniciar iter-1: `iniciarCorrida({tipo: 'nemesis', direccion: 'lower_is_better', config: {modulo, maxIter: 3}})`.
|
|
242
242
|
- Tras cada iteración: `registrarIteracion(dir, {iteracion: N, metrica: criticos+altos, delta, estado: 'keep', descripcion: 'iter N: status=<status>, X criticos, Y altos'})`.
|
|
@@ -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 |
|
|
@@ -173,6 +178,18 @@ fases técnicas puras — Gherkin sin lector de negocio es ceremonia.]
|
|
|
173
178
|
| Riesgo | Impacto | Probabilidad | Mitigación |
|
|
174
179
|
|--------|---------|-------------|-----------|
|
|
175
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 (fases ≥12, IDs namespaceados por fase): commits
|
|
185
|
+
con prefijo `[F<fase>·T-NN]` y footer `Refs: REQ-<fase>-NN`, tests con marker
|
|
186
|
+
`# verifica: REQ-<fase>-NN` (Python) / `// verifica: REQ-<fase>-NN` (JS/TS) —
|
|
187
|
+
validada por `scripts/verificar-trazabilidad.js` (acepta también el formato plano
|
|
188
|
+
`REQ-NN`/`[T-NN]` de fases 01-11). Omitir solo en CONTEXTOs legacy sin REQ-IDs.]
|
|
189
|
+
|
|
190
|
+
| REQ | Tareas que lo verifican |
|
|
191
|
+
|-----|------------------------|
|
|
192
|
+
|
|
176
193
|
## Criterios de aceptación de la fase
|
|
177
194
|
[copia del CONTEXTO.md, verificados contra el plan]
|
|
178
195
|
|
|
@@ -190,6 +207,7 @@ Una vez que el agente planificador-swl produce el PLAN.md, ejecuta una revisión
|
|
|
190
207
|
- [ ] ¿El orden de implementación respeta las dependencias (BD → service → endpoint → frontend)?
|
|
191
208
|
- [ ] ¿Hay criterios de verificación para cada slice?
|
|
192
209
|
- [ ] ¿Los criterios de aceptación de la fase están cubiertos por los slices?
|
|
210
|
+
- [ ] Si el CONTEXTO tiene REQ-IDs: ¿la matriz REQ×T cubre TODOS los REQ (cero huérfanos)?
|
|
193
211
|
- [ ] ¿Los riesgos ALTO del CONTEXTO.md están mitigados en el plan?
|
|
194
212
|
- [ ] ¿Hay tests especificados para cada área crítica?
|
|
195
213
|
- [ ] ¿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
|
|
package/comandos/swl/release.md
CHANGED
|
@@ -167,7 +167,7 @@ node scripts/generar-skills-lock.js
|
|
|
167
167
|
git add manifiestos/skills-lock.json
|
|
168
168
|
```
|
|
169
169
|
|
|
170
|
-
El lock contiene SHA256 de cada SKILL.md y permite que `/swl:salud` detecte
|
|
170
|
+
El lock contiene SHA256 de cada SKILL.md y permite que `/swl:status salud` detecte
|
|
171
171
|
drift silencioso entre releases. Si el lock no cambió respecto al anterior,
|
|
172
172
|
el commit lo refleja como no-op (idempotente). El archivo es pequeño (~37KB)
|
|
173
173
|
y debe versionarse.
|
|
@@ -254,6 +254,52 @@ Usar tags anotados siempre (regla del skill).
|
|
|
254
254
|
|
|
255
255
|
Crea `RELEASE-NOTES-v[nueva-versión].md` con: resumen, cambios, instrucciones de actualización y guía de migración si hay breaking changes.
|
|
256
256
|
|
|
257
|
+
## Paso 9.5 — Evidencia de procedencia (cadena de suministro, ADR-0038)
|
|
258
|
+
|
|
259
|
+
Genera la evidencia de cadena de suministro del release: SBOM CycloneDX del
|
|
260
|
+
árbol runtime + SHA256SUMS del tarball. No publica nada; produce artefactos
|
|
261
|
+
versionados en `releases/v[nueva-versión]/`.
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
node scripts/lib/evidencia-release.js --version [nueva-versión]
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
Esto escribe (vía `scripts/lib/evidencia-release.js`):
|
|
268
|
+
- `releases/v[nueva-versión]/sbom-v[nueva-versión].cdx.json` — SBOM CycloneDX
|
|
269
|
+
runtime-only (`npm sbom --sbom-format cyclonedx --omit dev`).
|
|
270
|
+
- `releases/v[nueva-versión]/SHA256SUMS` — checksum del tarball de `npm pack`.
|
|
271
|
+
|
|
272
|
+
Luego:
|
|
273
|
+
|
|
274
|
+
1. **Insertar la sección "Integridad y verificación"** en
|
|
275
|
+
`RELEASE-NOTES-v[nueva-versión].md`, justo después de la sección de
|
|
276
|
+
correcciones. La genera `seccionVerificacionNotas` de la lib:
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
node -e "const {seccionVerificacionNotas}=require('./scripts/lib/evidencia-release');const fs=require('fs');const v='[nueva-versión]';const sums=fs.readFileSync('releases/v'+v+'/SHA256SUMS','utf8').trim().split(/\s+/);const md=seccionVerificacionNotas({version:v,hash:sums[0],tarball:sums[1]});console.log(md)"
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Copiar ese markdown a RELEASE-NOTES (tras "Correcciones").
|
|
283
|
+
|
|
284
|
+
2. **Copiar las RELEASE-NOTES** a la carpeta del release como evidencia
|
|
285
|
+
versionada:
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
cp RELEASE-NOTES-v[nueva-versión].md releases/v[nueva-versión]/
|
|
289
|
+
git add releases/v[nueva-versión]/
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
`releases/` NO viaja en el tarball npm (`package.json#files` es allowlist y no
|
|
293
|
+
lo incluye) — es evidencia del repo, no del paquete. Verificar con
|
|
294
|
+
`npm pack --dry-run | grep -c "releases/"` → debe ser `0`.
|
|
295
|
+
|
|
296
|
+
**Provenance (opt-in)**: el publish default sigue siendo local
|
|
297
|
+
(`scripts/publicar.js`). Para publicar a npmjs con `npm publish --provenance`
|
|
298
|
+
(que exige OIDC desde CI) usar el workflow opt-in
|
|
299
|
+
`.github/workflows/publish-npm.yml` (trigger `workflow_dispatch`, `dry_run`
|
|
300
|
+
default true). GitHub Packages permanece local. Runbook de verificación para
|
|
301
|
+
el consumidor: `docs/verificacion-consumidor.md`.
|
|
302
|
+
|
|
257
303
|
## Paso 10 — Verificación final
|
|
258
304
|
|
|
259
305
|
### 10.1 Gate automática anti-gap (OBLIGATORIA antes del push)
|