@saulwade/swl-ses 1.9.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.
Files changed (108) hide show
  1. package/CLAUDE.md +8 -8
  2. package/README.md +12 -12
  3. package/agentes/accesibilidad-wcag-swl.md +3 -3
  4. package/agentes/auto-evolucion-swl.md +908 -908
  5. package/agentes/disenador-ui-swl.md +6 -5
  6. package/agentes/frontend-angular-swl.md +2 -2
  7. package/agentes/frontend-css-swl.md +2 -2
  8. package/agentes/frontend-react-swl.md +4 -4
  9. package/agentes/frontend-swl.md +6 -6
  10. package/agentes/investigador-ux-swl.md +5 -5
  11. package/agentes/orquestador-swl.md +7 -7
  12. package/agentes/perfilador-usuario-swl.md +308 -308
  13. package/agentes/producto-prd-swl.md +1 -1
  14. package/agentes/red-team-swl.md +218 -218
  15. package/agentes/tdd-qa-swl.md +17 -1
  16. package/comandos/swl/actualizar.md +1 -1
  17. package/comandos/swl/aprender.md +2 -2
  18. package/comandos/swl/aprobar-plan.md +152 -0
  19. package/comandos/swl/ayuda.md +3 -3
  20. package/comandos/swl/discutir-fase.md +20 -2
  21. package/comandos/swl/ejecutar-fase.md +53 -6
  22. package/comandos/swl/evolucionar.md +1 -1
  23. package/comandos/swl/inbox.md +1 -1
  24. package/comandos/swl/instalar.md +1 -1
  25. package/comandos/swl/nemesis.md +1 -1
  26. package/comandos/swl/planear-fase.md +17 -1
  27. package/comandos/swl/plugins.md +1 -1
  28. package/comandos/swl/release.md +1 -1
  29. package/comandos/swl/status.md +279 -0
  30. package/comandos/swl/verificar.md +26 -1
  31. package/habilidades/ai-runtime-security/SKILL.md +1 -1
  32. package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
  33. package/habilidades/benchmark-memoria/SKILL.md +1 -1
  34. package/habilidades/calidad-contract-testing/SKILL.md +165 -0
  35. package/habilidades/changelog-generator/SKILL.md +9 -2
  36. package/habilidades/changelog-generator/scripts/parse-commits.js +11 -1
  37. package/habilidades/diagrama-arquitectura/SKILL.md +1 -1
  38. package/habilidades/drift-detection/SKILL.md +179 -179
  39. package/habilidades/ejecutar-fase/SKILL.md +64 -14
  40. package/habilidades/estructura-proyecto-claude/SKILL.md +17 -14
  41. package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +34 -23
  42. package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +70 -53
  43. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -77
  44. package/habilidades/extractor-de-aprendizajes/SKILL.md +9 -5
  45. package/habilidades/harness-claude-code/SKILL.md +10 -7
  46. package/{reglas/harness-claude-code.md → habilidades/harness-claude-code/recursos/disciplina-harness-regla.md} +2 -2
  47. package/habilidades/instalar-sistema/SKILL.md +3 -3
  48. package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +1 -1
  49. package/habilidades/perfil-usuario/SKILL.md +200 -200
  50. package/habilidades/planear-fase/SKILL.md +25 -4
  51. package/habilidades/proceso-ddia-fundamentos/SKILL.md +1 -1
  52. package/habilidades/proceso-ddia-streaming/SKILL.md +4 -4
  53. package/habilidades/proceso-debate-adversarial/SKILL.md +2 -2
  54. package/habilidades/protocolo-revision-swl/SKILL.md +1 -1
  55. package/habilidades/seguridad-skills-ia/SKILL.md +1 -1
  56. package/habilidades/swl-claudemd/SKILL.md +50 -210
  57. package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -0
  58. package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -0
  59. package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -0
  60. package/habilidades/swl-dashboard/SKILL.md +9 -9
  61. package/habilidades/swl-revisar-impacto/SKILL.md +1 -1
  62. package/habilidades/tdd-workflow/SKILL.md +45 -5
  63. package/habilidades/validacion-ci-sistema/SKILL.md +3 -3
  64. package/hooks/calidad-pre-commit.js +340 -3
  65. package/hooks/ciclo-evolucion-subagente.js +26 -0
  66. package/hooks/ciclo-evolucion.js +26 -0
  67. package/hooks/extraccion-aprendizajes.js +13 -0
  68. package/hooks/lib/ciclo-evolucion.js +47 -0
  69. package/hooks/{auto-evolucion.js → lib/etapa-auto-evolucion.js} +701 -700
  70. package/hooks/{metricas-evolucion.js → lib/etapa-metricas.js} +388 -376
  71. package/hooks/{actualizar-perfil-usuario.js → lib/etapa-perfil-usuario.js} +376 -364
  72. package/hooks/lib/evolution-tracker.js +24 -3
  73. package/hooks/spec-gate.js +211 -0
  74. package/hooks/tdd-gate.js +241 -0
  75. package/hooks/validar-intent-spec.js +30 -10
  76. package/llms.txt +6 -6
  77. package/manifiestos/hooks-config.json +26 -17
  78. package/manifiestos/modulos.json +17 -14
  79. package/manifiestos/skills-lock.json +63 -56
  80. package/package.json +2 -2
  81. package/plugin.json +6 -10
  82. package/reglas/accesibilidad.md +10 -0
  83. package/reglas/api-diseno.md +9 -0
  84. package/reglas/auditorias-documentales-estructurales.md +7 -0
  85. package/reglas/cloud-infra.md +8 -0
  86. package/reglas/fragmentos-compartidos.md +5 -0
  87. package/reglas/gobernanza.md +4 -4
  88. package/reglas/hooks.md +6 -0
  89. package/reglas/intent-engineering.md +4 -0
  90. package/reglas/markitdown.md +8 -0
  91. package/reglas/memoria-consolidada.md +1 -1
  92. package/reglas/patrones.md +6 -0
  93. package/reglas/registro-componentes-nuevos.md +10 -1
  94. package/reglas/seguridad-agentes.md +1 -1
  95. package/reglas/skills-estandar.md +6 -0
  96. package/reglas/testing.md +7 -0
  97. package/reglas/tests-cleanup.md +4 -0
  98. package/reglas/usar-sistema-swl.md +1 -1
  99. package/scripts/lib/gitignore-manifest.js +29 -1
  100. package/scripts/lib/plan-lock.js +275 -0
  101. package/scripts/migrar-fase-dominio.js +0 -1
  102. package/scripts/verificar-trazabilidad.js +292 -0
  103. package/agentes/ux-disenador-swl.md +0 -503
  104. package/comandos/swl/dashboard.md +0 -146
  105. package/comandos/swl/evolucion-estado.md +0 -191
  106. package/comandos/swl/metricas.md +0 -376
  107. package/comandos/swl/salud.md +0 -481
  108. package/reglas/verificar-citas-temporales.md +0 -139
@@ -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
- [lista medible de criterios]
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 opcional, el formato de ESTADO.md y el checklist de cierre de fase.
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:planear-fase N` y
79
- confirma el plan antes de ejecutar."
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
- ## Paso 8 Reporte final
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-estado`.
218
+ dashboard `/swl:status evolucion`.
219
219
 
220
220
  ### Regla de oro
221
221
 
@@ -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. |
@@ -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."
@@ -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,16 @@ 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: 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
+
176
191
  ## Criterios de aceptación de la fase
177
192
  [copia del CONTEXTO.md, verificados contra el plan]
178
193
 
@@ -190,6 +205,7 @@ Una vez que el agente planificador-swl produce el PLAN.md, ejecuta una revisión
190
205
  - [ ] ¿El orden de implementación respeta las dependencias (BD → service → endpoint → frontend)?
191
206
  - [ ] ¿Hay criterios de verificación para cada slice?
192
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)?
193
209
  - [ ] ¿Los riesgos ALTO del CONTEXTO.md están mitigados en el plan?
194
210
  - [ ] ¿Hay tests especificados para cada área crítica?
195
211
  - [ ] ¿Hay tareas HITL claramente marcadas?
@@ -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
 
@@ -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.
@@ -0,0 +1,279 @@
1
+ ---
2
+ name: swl:status
3
+ description: Comando unificado de observabilidad del sistema y la sesión. Enruta a subcomandos [salud | metricas | loops | evolucion | historico | dashboard] que reportan salud del sistema SWL, métricas de la sesión actual, trayectorias de loops iterativos, estado del ciclo de auto-evolución y dashboard histórico multi-sesión. Reemplaza los comandos previos /swl:salud, /swl:metricas, /swl:dashboard y /swl:evolucion-estado (fusionados en este desde la Fase 09).
4
+ allowed_tools: ["Read", "Write", "Bash", "Glob", "Grep"]
5
+ ---
6
+
7
+ # /swl:status <subcomando> — Observabilidad unificada
8
+
9
+ Punto único de observabilidad de swl-ses. Fusiona los cuatro comandos previos de
10
+ diagnóstico en un router con subcomandos. Cada subcomando delega exactamente en
11
+ la misma lógica (skill o script) que usaba el comando original — sin pérdida de
12
+ funcionalidad ni de flags.
13
+
14
+ ## Uso
15
+
16
+ ```
17
+ /swl:status salud — Diagnóstico de salud del sistema SWL (genera SALUD.md)
18
+ /swl:status metricas — Métricas de la sesión actual (tokens, costo, herramientas)
19
+ /swl:status metricas detalle — Desglose completo por herramienta, agente y timeline
20
+ /swl:status metricas fases — Progreso de fases del proyecto (desde feature-list.json)
21
+ /swl:status loops — Trayectorias de loops iterativos (.planning/loops/)
22
+ /swl:status evolucion — Estado del ciclo de auto-evolución (health_score, nudges…)
23
+ /swl:status evolucion --json — JSON crudo de metricas.json (para pipes)
24
+ /swl:status evolucion --dias=N — Regenera métricas con ventana de N días (default 14)
25
+ /swl:status evolucion --regenerar — Fuerza recomputo del hook ciclo-evolucion.js (etapa métricas)
26
+ /swl:status historico — Dashboard histórico multi-sesión (web, auto-puerto)
27
+ /swl:status dashboard — Alias de historico
28
+ /swl:status dashboard --port 9090 — Fuerza puerto específico del dashboard
29
+ /swl:status dashboard today — Resumen de consumo del día (terminal)
30
+ /swl:status dashboard stats — Estadísticas históricas all-time (terminal)
31
+ /swl:status dashboard scan — Sincroniza JSONL → SQLite sin abrir el dashboard
32
+ ```
33
+
34
+ Sin subcomando: pide al usuario cuál quiere, o muestra `salud` + `metricas`
35
+ como vista por defecto si el contexto lo sugiere.
36
+
37
+ ## Tabla de enrutamiento (delegación 1:1)
38
+
39
+ | Subcomando | Delega en | Origen previo |
40
+ |------------|-----------|---------------|
41
+ | `salud` | `Skill("validacion-ci-sistema")` | `/swl:salud` |
42
+ | `metricas` (+ `detalle`, `fases`) | scripts de métricas de sesión + `derivar-feature-list.js` | `/swl:metricas` |
43
+ | `loops` | `hooks/lib/loop-telemetry.js` | `/swl:metricas loops` |
44
+ | `evolucion` | `hooks/ciclo-evolucion.js` (etapa métricas) + `.planning/evolution/metricas.json` | `/swl:evolucion-estado` |
45
+ | `historico` / `dashboard` | `Skill("swl-dashboard")` | `/swl:dashboard` |
46
+
47
+ ---
48
+
49
+ ## Subcomando: `salud`
50
+
51
+ Diagnóstico de salud del sistema SWL con **verificaciones deterministas**
52
+ (conteos, existencia de campos, sintaxis). Genera `SALUD.md` con score objetivo.
53
+ **Solo lectura** — no modifica nada salvo `SALUD.md`. Para corregir problemas,
54
+ usar `/swl:evolucionar`.
55
+
56
+ **Carga**: `Skill("validacion-ci-sistema")` — contiene las reglas de validación
57
+ por componente (agentes, skills, hooks, comandos, reglas), la tabla de exit codes
58
+ y el checklist de integridad. Toda la lógica de verificación vive en el skill.
59
+
60
+ **Cuándo usar**: antes de iniciar proyecto nuevo, tras modificar agentes/skills
61
+ manualmente, tras merge/pull, o como mantenimiento mensual.
62
+
63
+ **Score global ponderado**:
64
+ ```
65
+ Score = agentes×0.30 + skills×0.25 + comandos×0.20 + reglas×0.15 + hooks×0.10
66
+ 90-100 Excelente · 75-89 Saludable · 60-74 Funcional · <60 Crítico
67
+ ```
68
+
69
+ **Pasos siempre activos**: inventario determinista, detección de tier del proyecto
70
+ (Simple <500 / Standard 500-5000 / Complex >5000 archivos), diagnóstico de los 5
71
+ componentes, y calidad de `CLAUDE.md` (ADR-0016):
72
+ ```bash
73
+ npx -y @saulwade/swl-ses@latest audit-claudemd --json
74
+ ```
75
+ Umbrales ajustables: `SWL_CLAUDEMD_MAX_LINES` (default 200),
76
+ `SWL_CLAUDEMD_MAX_BULLET_CHARS` (default 1000).
77
+
78
+ **Auditorías opt-in** (cada una se activa con su variable de entorno; si no está
79
+ definida, el paso se omite sin afectar el score — diseño zero-config):
80
+
81
+ | Variable | Qué audita | Comando |
82
+ |----------|-----------|---------|
83
+ | `SWL_AUDIT_SKILLS=1` | Prompt injection, secretos, URLs sospechosas y estructura en SKILL.md | `bash scripts/audit-skills.sh` (requiere `uv`) |
84
+ | `SWL_AUDIT_FRAMEWORKS=1` | Cobertura de NIST CSF/AI RMF, MITRE ATLAS/ATT&CK, D3FEND en skills de seguridad | `npx -y @saulwade/swl-ses@latest audit-coverage-frameworks --resumen` |
85
+ | `SWL_AUDIT_AGENTES=1` | Agentes sin Exclusion Clause o Gotchas (anti agent-hijacking) | `npx -y @saulwade/swl-ses@latest audit-agents-gaps --resumen` |
86
+
87
+ **Verificación de drift de skills** (si existe `manifiestos/skills-lock.json`):
88
+ ```bash
89
+ npx -y @saulwade/swl-ses@latest generate-skills-lock --check
90
+ ```
91
+
92
+ **Smoke test de MCP** (si hay servers en `.claude/settings.json` o configs globales):
93
+ ```bash
94
+ python scripts/mcp-orchestrator.py status --json 2>/dev/null
95
+ ```
96
+ Detecta drift de apiKeys (`40101`), binarios faltantes y `"env": {}` que rompe la
97
+ herencia de variables — antes de que fallen en uso interactivo.
98
+
99
+ Formato de salida enriquecido vía `scripts/lib/health-row.js` (barras Unicode;
100
+ respeta `NO_COLOR` y `SWL_ASCII_SIMPLE=1`). Genera `SALUD.md` con los datos
101
+ exactos de los scripts — sin ajustar el score "porque parece sano".
102
+
103
+ ---
104
+
105
+ ## Subcomando: `metricas`
106
+
107
+ Métricas acumuladas de la **sesión actual**: tokens, costo estimado USD, tool
108
+ calls y distribución por herramienta, más el estado del presupuesto configurado.
109
+
110
+ **Fuentes de datos**:
111
+ ```bash
112
+ # 1. Bridge de tracking de la sesión (generado por el hook de costos)
113
+ ls /tmp/swl-costs-*.json 2>/dev/null | sort -t- -k3 -n | tail -1
114
+ # 2. Métricas persistidas del proyecto
115
+ cat .planning/METRICAS.md 2>/dev/null || echo "(sin métricas previas)"
116
+ # 3. Presupuesto configurado
117
+ node -e "const c=require('./manifiestos/hooks-config.json').costBudget||{}; console.log('maxUsd:',c.maxUsd??'no configurado','| maxTokens:',c.maxTokens??'no configurado','| alertAt:',c.alertAt??'no configurado')"
118
+ ```
119
+
120
+ Construir el resumen con: tool calls totales, tokens, costo estimado, modelo
121
+ predominante, estado de presupuesto (`OK`/`ALERTA`/`EXCEDIDO`) y top 5
122
+ herramientas por costo. Si el estado es ALERTA (≥ `alertAt`), sugerir
123
+ `/swl:compactar`. Si EXCEDIDO, recomendar revisar `manifiestos/hooks-config.json`.
124
+
125
+ ### `metricas detalle`
126
+
127
+ Desglose completo: tabla por herramienta (calls, tokens entrada/salida, costo),
128
+ desglose por agente SWL desde `costePorAgente` del bridge, comparativa histórica
129
+ contra `~/.claude/usage.db` (últimos 30 días) y timeline de actividad por bloques
130
+ de 5 minutos.
131
+
132
+ ### `metricas fases`
133
+
134
+ Progreso de fases del proyecto. Regenera primero el JSON derivado de
135
+ `HOJA-RUTA.md` (fuente de verdad) y lo lee:
136
+ ```bash
137
+ node scripts/derivar-feature-list.js
138
+ cat .planning/feature-list.json
139
+ ```
140
+ Reporta totales por estado canónico (`completado`, `en_progreso`, `pendiente`,
141
+ `bloqueado`, `spec_listo`), lista de fases con marca visual y artefactos
142
+ presentes (`[PLAN]`/`[RESUMEN]`), y timestamp de generación. Detección de drift:
143
+ `node scripts/derivar-feature-list.js --check` (exit 2 si drift).
144
+
145
+ ### Notas de precisión
146
+
147
+ Los costos son estimaciones según precios publicados de la API de Anthropic. El
148
+ real varía por modelo efectivo, caché de prompt y región/plan. Para costos
149
+ exactos, el dashboard de Anthropic Console.
150
+
151
+ ---
152
+
153
+ ## Subcomando: `loops`
154
+
155
+ Trayectorias de loops iterativos registradas por `hooks/lib/loop-telemetry.js`
156
+ en `.planning/loops/`:
157
+ ```bash
158
+ node -e "
159
+ const fs = require('fs'), path = require('path');
160
+ const lt = require('./hooks/lib/loop-telemetry');
161
+ const base = path.join(process.cwd(), lt.DIR_LOOPS);
162
+ let dirs = [];
163
+ try { dirs = fs.readdirSync(base).map(d => path.join(base, d)).filter(d => fs.statSync(d).isDirectory()); } catch {}
164
+ if (dirs.length === 0) { console.log('(sin corridas de loops registradas)'); process.exit(0); }
165
+ for (const dir of dirs.sort().slice(-10)) {
166
+ try {
167
+ const t = lt.analizarTrayectoria(dir);
168
+ const h = lt.leerHandoff(dir);
169
+ console.log(path.basename(dir) + ' | iters: ' + t.totalIteraciones +
170
+ ' | keep/revert: ' + t.keeps + '/' + t.reverts +
171
+ ' | métrica: ' + t.metricaInicial + ' → ' + t.metricaFinal +
172
+ ' | plateau: ' + (t.plateau ? 'SÍ' : 'no') +
173
+ ' | status: ' + (h ? h.status : 'en curso'));
174
+ } catch (e) { console.log(path.basename(dir) + ' | (ilegible: ' + e.message + ')'); }
175
+ }
176
+ "
177
+ ```
178
+ Reportar en tabla: corrida, iteraciones, keep/revert rate, métrica inicial →
179
+ final, plateau y status. Si una corrida activa muestra plateau, sugerir cerrarla
180
+ — iterar sin mejora quema tokens.
181
+
182
+ ---
183
+
184
+ ## Subcomando: `evolucion`
185
+
186
+ Estado del ciclo de auto-evolución en la ventana reciente (default 14 días).
187
+ Responde con datos a "¿el sistema está aprendiendo?".
188
+
189
+ **Flags**: `--json` (emite el JSON crudo de `metricas.json`), `--dias=N`
190
+ (ventana de N días), `--regenerar` (fuerza recomputo del hook).
191
+
192
+ **Paso 0 — métricas frescas** (si `--regenerar` o `metricas.json` > 24h):
193
+ ```bash
194
+ echo '{}' | node hooks/ciclo-evolucion.js
195
+ ```
196
+
197
+ **Paso 1 — cargar**:
198
+ ```bash
199
+ cat .planning/evolution/metricas.json
200
+ ```
201
+ Si no existe, ejecutar el regenerado; si sigue sin existir, reportar que el ciclo
202
+ no ha corrido aún.
203
+
204
+ **Dashboard** (formato humano) con secciones: health_score + badge, NUDGES
205
+ (emitidos/accionados/pendientes por tipo), INSTINTOS (proyecto/global/perfil),
206
+ AGENTES (runs/fallos/tasa), EVOLUCIONES (aplicadas/revertidas/rollback ratio),
207
+ CALIDAD CONDUCTUAL (fallos por tipo, reintentos, latencia), ALERTAS PERSISTENTES
208
+ y KERNEL (gobernanza: política evolvable, último ADR kernel, ratio
209
+ `evolvable=false`/total).
210
+
211
+ **Badges**: ≥90 🏆 Óptimo · ≥75 🥇 Saludable · ≥60 🥈 Parcial · ≥40 🥉 Esqueleto
212
+ · <40 ⚠️ Dormido.
213
+
214
+ **Recomendaciones contextuales** (máx 3, al final): bootstrap de instintos si
215
+ `instintos.proyecto==0` y `aprendizajes>10`; revisar alertas si `tasaAccion<0.3`;
216
+ candidatos a `/swl:evolucionar` si `tasaExito<70`; etc.
217
+
218
+ **Anti-substitution**: el archivo de métricas es **siempre**
219
+ `.planning/evolution/metricas.json` (nunca `.planning/metricas.json` ni variantes);
220
+ el hook que regenera es **siempre** `hooks/ciclo-evolucion.js` (etapa métricas, Fase 11); para forzar
221
+ regen usar el pipe `echo '{}' | node ...`, nunca `require()` directo.
222
+
223
+ **Response discipline**: con `--json`, la respuesta es el contenido crudo del
224
+ archivo, sin prosa.
225
+
226
+ ---
227
+
228
+ ## Subcomando: `historico` / `dashboard`
229
+
230
+ Dashboard histórico multi-sesión vía `claude-usage` (vendored). Complementa
231
+ `metricas` (sesión actual) con perspectiva multi-sesión y gráficos interactivos.
232
+
233
+ **Carga**: `Skill("swl-dashboard")` con el subcomando indicado:
234
+ - (vacío) o `historico` → dashboard web (auto-detecta puerto: 8888, 9090, 9191…)
235
+ - `--port N` → fuerza un puerto
236
+ - `today` → resumen del día en terminal
237
+ - `stats` → estadísticas históricas all-time en terminal
238
+ - `scan` → solo sincroniza JSONL → SQLite sin abrir el dashboard
239
+
240
+ ### Integración con Mission Control (opt-in)
241
+
242
+ Dashboard web externo para orquestación de flotas de agentes. **Completamente
243
+ opcional** — el dashboard local funciona igual sin configurarlo.
244
+
245
+ | Variable | Descripción | Ejemplo |
246
+ |----------|-------------|---------|
247
+ | `SWL_MC_URL` | URL base de la instancia de MC | `http://localhost:3000` |
248
+ | `SWL_MC_TOKEN` | API key de MC (si hay auth) | `mc-key-abc123` |
249
+
250
+ - Con `SWL_MC_URL` definida: el comando detecta MC (vía `scripts/lib/mc-client.js`)
251
+ y ofrece redirigir al panel web. Si MC no responde en 2s, fallback graceful al
252
+ dashboard local con mensaje informativo (sin crash ni degradación silenciosa).
253
+ - Sin `SWL_MC_URL`: dashboard local sin cambios (zero-config).
254
+
255
+ Instalar MC (opcional): `git clone https://github.com/builderzlabs/mission-control`
256
+ → `docker compose up` (requiere Node ≥22, pnpm; genera su API key al primer
257
+ arranque). MC expone además un **servidor MCP con ~49 tools** (agentes, memoria,
258
+ soul, tareas, sesiones, tokens/costos, skills, cron, runs/evals). swl-ses **NO**
259
+ modifica `.claude/settings.json` automáticamente — el registro del MCP es manual.
260
+
261
+ **Seguridad**: el MCP de MC incluye tools de **escritura** (`mc_create_task`,
262
+ `mc_write_memory`, `mc_write_soul`…). Antes de activarlo, evaluar exposición de
263
+ red, permisos mínimos de la API key y confianza en los agentes que lo invocarán.
264
+ La regla `seguridad-agentes.md` recomienda documentarlo en
265
+ `.planning/MCP_REGISTRY.md`.
266
+
267
+ ---
268
+
269
+ ## Reglas de comportamiento
270
+
271
+ - `salud` y `evolucion` son **solo lectura** (salvo que `salud` genera `SALUD.md`).
272
+ Para corregir, usar `/swl:evolucionar`.
273
+ - Las verificaciones de `salud` son scripts deterministas — no usar juicio
274
+ subjetivo ni ajustar scores "porque parece sano".
275
+ - Los reportes opt-in de auditoría (`SWL_AUDIT_SKILLS`, `SWL_AUDIT_FRAMEWORKS`,
276
+ `SWL_AUDIT_AGENTES`) nunca bloquean el diagnóstico: si fallan (red,
277
+ dependencia, paquete no publicado), el flujo continúa.
278
+ - Respetar `--json` como salida cruda sin prosa donde aplique (`evolucion`).
279
+ - No reintroducir los comandos eliminados: este comando los reemplaza.
@@ -409,7 +409,7 @@ Además del estado estructurado de 4.6.5, cada corrida del loop registra su
409
409
  trayectoria en el formato estándar de telemetría de loops
410
410
  (`hooks/lib/loop-telemetry.js`), que habilita: inyección de estado por el hook
411
411
  `contexto-iteracion.js` (anti-context-rot en sesiones largas), detección de
412
- plateau, y lectura por `/swl:metricas`.
412
+ plateau, y lectura por `/swl:status metricas`.
413
413
 
414
414
  Al iniciar el loop (antes de la pasada 1):
415
415
 
@@ -494,6 +494,31 @@ Sin `--until-converge`, el comportamiento del comando es idéntico al actual: un
494
494
 
495
495
  ## Paso 5 — Verificación de criterios de aceptación
496
496
 
497
+ ### 5.0 — Trazabilidad REQ→T→commit→test (si el CONTEXTO tiene REQ-IDs)
498
+
499
+ Si la sección de criterios del CONTEXTO usa IDs `REQ-NN:` (formato Fase 10+),
500
+ ejecuta el validador de cadena ANTES de la verificación criterio por criterio:
501
+
502
+ ```bash
503
+ node scripts/verificar-trazabilidad.js --fase=N
504
+ ```
505
+
506
+ - Exit 0 → cadena completa; adjunta la tabla REQ→tareas/commits/tests al VERIFICACION.md.
507
+ - Exit 1 → **cada REQ huérfano es hallazgo CRÍTICO** (requisito sin implementar,
508
+ sin commit trazable o sin test que lo verifique). Listarlos en el VERIFICACION.md
509
+ con la dirección del gap (sin tarea / sin commit / sin test).
510
+ - Exit 2 → error de invocación; reportar sin bloquear el resto de la verificación.
511
+
512
+ En CONTEXTOs legacy sin REQ-IDs el script sale 0 con nota — continuar normal.
513
+
514
+ ### 5.0b — Contract testing (si la fase declaró schemas en el PLAN)
515
+
516
+ Si el PLAN declara schemas (Pydantic/Zod/JSON Schema/OpenAPI) o la fase expone
517
+ una API consumida por otro componente, cargar `Skill("calidad-contract-testing")`
518
+ y verificar que la implementación honra el contrato (schema-based con
519
+ schemathesis/Dredd contra la API real, o validación de forma con el modelo en
520
+ el test de integración). Cada violación de contrato = hallazgo CRÍTICO.
521
+
497
522
  Lee los criterios de aceptación del `.planning/fases/0N-CONTEXTO.md` y verifica cada uno:
498
523
 
499
524
  Para cada criterio:
@@ -141,7 +141,7 @@ Checklist para cualquier aplicación LLM en producción:
141
141
  | Tiempo | Estático (pre-incorporación) | Dinámico (runtime) |
142
142
  | Objetivo | Artefactos (SKILL.md, scripts) | Sesiones del agente en producción |
143
143
  | Amenazas cubiertas | Supply chain, credenciales hardcodeadas, autonomy abuse declarada | Prompt injection directo/indirecto, context poisoning, tool abuse en runtime |
144
- | Cuándo ejecuta | `/swl:crear-skill`, `/swl:plugins install`, `/swl:salud` | Durante cada request del agente en producción |
144
+ | Cuándo ejecuta | `/swl:crear-skill`, `/swl:plugins install`, `/swl:status salud` | Durante cada request del agente en producción |
145
145
  | Herramientas recomendadas | Grep, SAST sobre SKILL.md | Regex + heurístico + clasificador + guardrails |
146
146
 
147
147
  Ambos skills son necesarios. Ninguno reemplaza al otro.