@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.
Files changed (135) hide show
  1. package/CLAUDE.md +8 -8
  2. package/README.md +13 -13
  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 +96 -8
  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/revisor-codigo-swl.md +34 -10
  16. package/agentes/revisor-seguridad-swl.md +7 -0
  17. package/agentes/tdd-qa-swl.md +39 -2
  18. package/comandos/swl/actualizar.md +1 -1
  19. package/comandos/swl/aprender.md +2 -2
  20. package/comandos/swl/aprobar-plan.md +152 -0
  21. package/comandos/swl/autoresearch.md +102 -6
  22. package/comandos/swl/ayuda.md +3 -3
  23. package/comandos/swl/discutir-fase.md +20 -2
  24. package/comandos/swl/ejecutar-fase.md +53 -6
  25. package/comandos/swl/evolucionar.md +1 -1
  26. package/comandos/swl/inbox.md +1 -1
  27. package/comandos/swl/instalar.md +1 -1
  28. package/comandos/swl/nemesis.md +42 -1
  29. package/comandos/swl/planear-fase.md +25 -1
  30. package/comandos/swl/plugins.md +1 -1
  31. package/comandos/swl/predecir.md +139 -0
  32. package/comandos/swl/release.md +1 -1
  33. package/comandos/swl/status.md +279 -0
  34. package/comandos/swl/verificar.md +75 -7
  35. package/habilidades/ai-runtime-security/SKILL.md +1 -1
  36. package/habilidades/angular-moderno/SKILL.md +44 -1
  37. package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
  38. package/habilidades/autoresearch/SKILL.md +15 -1
  39. package/habilidades/benchmark-memoria/SKILL.md +1 -1
  40. package/habilidades/calidad-contract-testing/SKILL.md +165 -0
  41. package/habilidades/calidad-mutation-testing/SKILL.md +170 -0
  42. package/habilidades/changelog-generator/SKILL.md +9 -2
  43. package/habilidades/changelog-generator/scripts/parse-commits.js +12 -1
  44. package/habilidades/checklist-seguridad/SKILL.md +29 -1
  45. package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -0
  46. package/habilidades/css-moderno/SKILL.md +3 -1
  47. package/habilidades/diagrama-arquitectura/SKILL.md +1 -1
  48. package/habilidades/drift-detection/SKILL.md +179 -179
  49. package/habilidades/ejecutar-fase/SKILL.md +64 -14
  50. package/habilidades/estructura-proyecto-claude/SKILL.md +17 -14
  51. package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +34 -23
  52. package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +70 -53
  53. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -77
  54. package/habilidades/extractor-de-aprendizajes/SKILL.md +9 -5
  55. package/habilidades/fastapi-experto/SKILL.md +56 -5
  56. package/habilidades/harness-claude-code/SKILL.md +10 -7
  57. package/{reglas/harness-claude-code.md → habilidades/harness-claude-code/recursos/disciplina-harness-regla.md} +2 -2
  58. package/habilidades/instalar-sistema/SKILL.md +3 -3
  59. package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +1 -1
  60. package/habilidades/patrones-python/SKILL.md +8 -5
  61. package/habilidades/perfil-usuario/SKILL.md +200 -200
  62. package/habilidades/planear-fase/SKILL.md +25 -4
  63. package/habilidades/proceso-ddia-fundamentos/SKILL.md +1 -1
  64. package/habilidades/proceso-ddia-streaming/SKILL.md +4 -4
  65. package/habilidades/proceso-debate-adversarial/SKILL.md +164 -0
  66. package/habilidades/proceso-debate-adversarial/recursos/personas.md +105 -0
  67. package/habilidades/proceso-dynamic-workflows/SKILL.md +138 -0
  68. package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -0
  69. package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -0
  70. package/habilidades/protocolo-revision-swl/SKILL.md +1 -1
  71. package/habilidades/seguridad-skills-ia/SKILL.md +1 -1
  72. package/habilidades/swl-claudemd/SKILL.md +50 -210
  73. package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -0
  74. package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -0
  75. package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -0
  76. package/habilidades/swl-dashboard/SKILL.md +9 -9
  77. package/habilidades/swl-revisar-impacto/SKILL.md +1 -1
  78. package/habilidades/tdd-workflow/SKILL.md +58 -5
  79. package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -0
  80. package/habilidades/validacion-ci-sistema/SKILL.md +3 -3
  81. package/hooks/calidad-pre-commit.js +340 -3
  82. package/hooks/ciclo-evolucion-subagente.js +26 -0
  83. package/hooks/ciclo-evolucion.js +26 -0
  84. package/hooks/contexto-iteracion.js +144 -0
  85. package/hooks/extraccion-aprendizajes.js +13 -0
  86. package/hooks/lib/ciclo-evolucion.js +47 -0
  87. package/hooks/{auto-evolucion.js → lib/etapa-auto-evolucion.js} +701 -700
  88. package/hooks/{metricas-evolucion.js → lib/etapa-metricas.js} +388 -376
  89. package/hooks/{actualizar-perfil-usuario.js → lib/etapa-perfil-usuario.js} +376 -364
  90. package/hooks/lib/evolution-tracker.js +24 -3
  91. package/hooks/lib/loop-telemetry.js +321 -0
  92. package/hooks/notificacion-telegram.js +11 -3
  93. package/hooks/spec-gate.js +211 -0
  94. package/hooks/tdd-gate.js +241 -0
  95. package/hooks/validar-intent-spec.js +30 -10
  96. package/llms.txt +29 -0
  97. package/manifiestos/hooks-config.json +36 -18
  98. package/manifiestos/modulos.json +23 -14
  99. package/manifiestos/skills-lock.json +100 -72
  100. package/package.json +4 -3
  101. package/plugin.json +9 -10
  102. package/reglas/accesibilidad.md +10 -0
  103. package/reglas/api-diseno.md +9 -0
  104. package/reglas/arquitectura.evolved.json +7 -0
  105. package/reglas/arquitectura.md +65 -0
  106. package/reglas/auditorias-documentales-estructurales.md +7 -0
  107. package/reglas/cloud-infra.md +8 -0
  108. package/reglas/fragmentos-compartidos.md +5 -0
  109. package/reglas/gobernanza.md +4 -4
  110. package/reglas/hooks.md +6 -0
  111. package/reglas/intent-engineering.md +4 -0
  112. package/reglas/markitdown.md +8 -0
  113. package/reglas/memoria-consolidada.md +1 -1
  114. package/reglas/patrones.md +6 -0
  115. package/reglas/registro-componentes-nuevos.md +10 -1
  116. package/reglas/seguridad-agentes.md +1 -1
  117. package/reglas/seguridad.evolved.json +7 -0
  118. package/reglas/seguridad.md +144 -0
  119. package/reglas/skills-estandar.md +6 -0
  120. package/reglas/testing.md +7 -0
  121. package/reglas/tests-cleanup.md +4 -0
  122. package/reglas/usar-sistema-swl.md +1 -1
  123. package/scripts/generar-inventario.js +64 -1
  124. package/scripts/instalador.js +32 -2
  125. package/scripts/lib/gitignore-manifest.js +29 -1
  126. package/scripts/lib/plan-lock.js +275 -0
  127. package/scripts/migrar-fase-dominio.js +0 -1
  128. package/scripts/smoke-test.js +24 -2
  129. package/scripts/verificar-trazabilidad.js +292 -0
  130. package/agentes/ux-disenador-swl.md +0 -503
  131. package/comandos/swl/dashboard.md +0 -146
  132. package/comandos/swl/evolucion-estado.md +0 -191
  133. package/comandos/swl/metricas.md +0 -342
  134. package/comandos/swl/salud.md +0 -481
  135. package/reglas/verificar-citas-temporales.md +0 -139
@@ -0,0 +1,139 @@
1
+ ---
2
+ name: swl:predecir
3
+ description: >
4
+ Análisis predictivo pre-implementación: 5 personas expertas (Arquitecto,
5
+ Seguridad, Rendimiento, Confiabilidad, Abogado del Diablo) analizan EN FRÍO
6
+ un cambio propuesto antes de implementarlo, un sintetizador deduplica con
7
+ anti-herd check y entrega hallazgos rankeados por severidad × confianza ×
8
+ acuerdo. Usar antes de /swl:planear-fase en fases de riesgo, antes de un
9
+ refactor grande, o cuando el costo de descubrir un problema DESPUÉS de
10
+ implementar es alto. Con --adversarial usa el set atacante (Rompedor,
11
+ Tramposo, Escalador, Novato, Insider).
12
+ argument-hint: "[descripción del cambio] [--scope <glob>] [--adversarial] [--presupuesto N] [--chain planear-fase]"
13
+ allowed-tools: [Read, Grep, Glob, Bash, Write, Agent, Skill]
14
+ ---
15
+
16
+ # /swl:predecir — Análisis predictivo pre-implementación
17
+
18
+ Eres el coordinador de un panel de personas expertas que evalúan un cambio
19
+ propuesto ANTES de que se implemente. El valor del comando está en el
20
+ aislamiento: cada persona analiza en frío, sin ver a las demás — los sesgos
21
+ de manada y de confirmación se eliminan por construcción.
22
+
23
+ Complementa (no reemplaza) a `/swl:verificar` y `/swl:nemesis`: esos auditan
24
+ código que YA existe; `predecir` ataca el plan cuando corregirlo cuesta una
25
+ conversación, no un refactor.
26
+
27
+ ## Cuándo usar
28
+
29
+ - Antes de `/swl:planear-fase` en fases que tocan auth, dinero, datos
30
+ productivos o contratos públicos de API.
31
+ - Antes de un refactor cross-módulo o una migración de schema.
32
+ - Cuando el usuario duda entre implementar o no un cambio con blast radius alto.
33
+
34
+ **Cuándo NO usar**: cambios triviales (1-2 archivos), código ya implementado
35
+ (usar `/swl:verificar`), o decisiones entre 2+ alternativas (usar el debate
36
+ adversarial de `Skill("proceso-debate-adversarial")` — predecir analiza UNA
37
+ propuesta, el debate compara varias).
38
+
39
+ ## Flags
40
+
41
+ ```
42
+ [descripción] La propuesta de cambio a analizar (obligatoria; si falta, preguntar)
43
+ --scope <glob> Archivos relevantes para grounding (default: derivar del texto)
44
+ --adversarial Set de personas atacantes en vez del set default
45
+ --presupuesto N Máximo de hallazgos totales (default: 40 → 8 por persona)
46
+ --chain planear-fase Al terminar, ofrecer arrancar /swl:planear-fase con los hallazgos como contexto
47
+ ```
48
+
49
+ ## Paso 0 — Carga y configuración
50
+
51
+ ```
52
+ Skill("proceso-debate-adversarial")
53
+ ```
54
+
55
+ El skill define el protocolo COLD START, el anti-herd check y el formato de
56
+ síntesis. Las definiciones de personas viven en
57
+ `habilidades/proceso-debate-adversarial/recursos/personas.md`.
58
+
59
+ Confirmar con el usuario: propuesta, scope, set de personas, presupuesto.
60
+
61
+ ## Paso 1 — Reconocimiento del codebase
62
+
63
+ Construir el paquete de conocimiento que recibirá CADA persona (idéntico para
64
+ todas): descripción de la propuesta + inventario de archivos del scope +
65
+ dependencias relevantes + superficie de API afectada + cobertura de tests del
66
+ área. Usar `code-review-graph` si está disponible (blast radius, callers);
67
+ si no, Grep/Glob dirigidos. Máximo ~1,500 tokens — las personas analizan, no
68
+ exploran.
69
+
70
+ ## Paso 2 — Análisis en frío (5 invocaciones Agent independientes)
71
+
72
+ Por cada persona, UNA invocación del Agent tool (general-purpose o el agente
73
+ afín al dominio) con prompt autocontenido:
74
+
75
+ ```
76
+ Eres [persona] — [enfoque de recursos/personas.md].
77
+ Propuesta: [descripción]
78
+ Contexto del codebase: [paquete del Paso 1]
79
+ Tu tarea: encuentra hasta [presupuesto/5] problemas que esta propuesta
80
+ causaría, desde tu perspectiva. Por cada uno: título, severidad
81
+ (crítico/alto/medio/bajo), confianza 0-100%, archivo:línea si aplica,
82
+ recomendación concreta. Preguntas guía: [de la persona]. Red flags: [de la
83
+ persona]. NO incluyas elogios ni evaluación general — solo hallazgos.
84
+ ```
85
+
86
+ Las 5 invocaciones pueden correr en paralelo. NUNCA pasar el output de una
87
+ persona a otra — el aislamiento es el mecanismo del comando.
88
+
89
+ ## Paso 3 — Síntesis con anti-herd check
90
+
91
+ Aplicar el protocolo de síntesis del skill:
92
+
93
+ 1. Deduplicar (mismo archivo:línea + mismo problema → fusionar, severidad más alta gana).
94
+ 2. Registrar disensos (dos personas en desacuerdo → ambas posturas visibles).
95
+ 3. **Anti-herd check**: si todas las personas coinciden en el hallazgo top,
96
+ generar explícitamente ≥1 contraargumento antes de aceptarlo.
97
+ 4. Rankear: `severidad × confianza promedio × número de personas que coinciden`.
98
+
99
+ ## Paso 4 — Reporte y persistencia
100
+
101
+ Persistir en `.planning/loops/predecir-[timestamp]/` con
102
+ `hooks/lib/loop-telemetry.js` (tipo `predecir`, columnas `iteracion,
103
+ timestamp, hallazgo, severidad, confianza, personas, archivo_linea`; una fila
104
+ por hallazgo consensuado) + `escribirHandoff` con `source: 'swl:predecir'`,
105
+ `findings` rankeados y `config: {propuesta, scope}`.
106
+
107
+ Reportar al usuario:
108
+
109
+ ```
110
+ === Predicción — [propuesta resumida] ===
111
+ Personas: [set] | Hallazgos brutos: N | Tras dedup: M
112
+
113
+ ## Top hallazgos (rankeados)
114
+ | # | Hallazgo | Severidad | Confianza | Acuerdo | archivo:línea | Recomendación |
115
+
116
+ ## Disensos registrados
117
+ - [persona X sostiene A; persona Y sostiene B — evidencia de cada una]
118
+
119
+ ## Veredicto del panel
120
+ [PROCEDER | PROCEDER CON AJUSTES (lista) | REPLANTEAR (razón)]
121
+ ```
122
+
123
+ ## Paso 5 — Encadenamiento (si `--chain planear-fase`)
124
+
125
+ Ofrecer arrancar `/swl:planear-fase` indicando el directorio del handoff. El
126
+ planificador incorpora los hallazgos `crítico`/`alto` como restricciones del
127
+ PLAN.md — cada uno se atiende con una tarea o se descarta con justificación
128
+ explícita (nunca silenciosamente).
129
+
130
+ ## Reglas de comportamiento
131
+
132
+ - NUNCA compartir contexto entre personas — una invocación Agent por persona.
133
+ - NUNCA omitir el anti-herd check cuando hay unanimidad.
134
+ - Los hallazgos con archivo:línea citan código REAL verificado en el Paso 1 —
135
+ regla `verificar-citas-normativas.md § Familia 2` aplica al propio output.
136
+ - El comando NO modifica código — produce análisis. Implementar es del flujo
137
+ planear → ejecutar.
138
+ - Con 0 hallazgos crítico/alto: decirlo claramente y no inflar hallazgos
139
+ menores para justificar el costo del panel.
@@ -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.
@@ -137,18 +137,30 @@ Verifica que los mensajes de commit siguen la convención del proyecto (si está
137
137
 
138
138
  Delega al agente `revisor-codigo-swl` para revisión de código en profundidad.
139
139
 
140
+ **Presupuesto de contexto (anti-thrashing):** el subagente hereda `CLAUDE.md` +
141
+ reglas globales del proyecto; en proyectos rule-heavy eso consume buena parte de
142
+ su ventana antes de leer código (causa de autocompact thrashing con 0 tokens
143
+ útiles, observado 2026-06-05). Para evitarlo:
144
+ - Pasa al agente SOLO el diff / los archivos del alcance — nunca "revisa el proyecto".
145
+ - Instruye leer los archivos del alcance PRIMERO y cargar skills bajo demanda (solo
146
+ si el alcance lo amerita), no al inicio.
147
+ - Si el alcance > ~15 archivos o > ~2000 LOC, divídelo en lotes y delega uno por
148
+ invocación (cada subagente arranca con ventana limpia).
149
+
140
150
  **Instrucción al agente revisor-codigo-swl:**
141
151
 
142
152
  ```
143
- Revisa el código de la Fase N del proyecto [nombre].
153
+ Revisa SOLO los archivos del alcance de la Fase N del proyecto [nombre].
154
+ No explores el codebase completo: tu ventana ya hereda CLAUDE.md + reglas
155
+ globales; lee primero los archivos del alcance para no saturarla.
144
156
 
145
157
  Archivos a revisar (en orden de prioridad):
146
- [lista del RESUMEN.md]
158
+ [lista del RESUMEN.md / git diff del alcance]
147
159
 
148
- Lee también:
149
- - .planning/fases/0N-CONTEXTO.md (para entender requisitos)
150
- - .planning/fases/0N-PLAN.md (para entender qué se debía hacer)
151
- - CLAUDE.md (para convenciones del proyecto)
160
+ Lee también (solo lo necesario, bajo demanda):
161
+ - .planning/fases/0N-CONTEXTO.md (requisitos)
162
+ - .planning/fases/0N-PLAN.md (qué se debía hacer)
163
+ (CLAUDE.md ya está en tu contexto heredado — no lo releas.)
152
164
 
153
165
  Para cada archivo revisado, verifica:
154
166
 
@@ -391,7 +403,38 @@ El VERIFICACION.md reportado al usuario al final del loop incluye una sección a
391
403
  - Estado persistido: `.planning/fases/0N-converge-run-[timestamp].json`
392
404
  ```
393
405
 
394
- ### 4.6.7 — Protocolo `--ci-aware` (Señal D)
406
+ ### 4.6.7 — Telemetría de loop (obligatoria en `--until-converge`)
407
+
408
+ Además del estado estructurado de 4.6.5, cada corrida del loop registra su
409
+ trayectoria en el formato estándar de telemetría de loops
410
+ (`hooks/lib/loop-telemetry.js`), que habilita: inyección de estado por el hook
411
+ `contexto-iteracion.js` (anti-context-rot en sesiones largas), detección de
412
+ plateau, y lectura por `/swl:status metricas`.
413
+
414
+ Al iniciar el loop (antes de la pasada 1):
415
+
416
+ ```bash
417
+ node -e "const lt=require('./hooks/lib/loop-telemetry');const r=lt.iniciarCorrida({tipo:'verificar',direccion:'lower_is_better',config:{fase:'0N',maxIter:5}});console.log(r.dir)"
418
+ ```
419
+
420
+ Tras CADA pasada, registrar una fila (métrica = hallazgos CRÍTICO+ALTO+MAYOR):
421
+
422
+ ```bash
423
+ node -e "const lt=require('./hooks/lib/loop-telemetry');lt.registrarIteracion('<dir>',{iteracion:N,metrica:M,delta:D,estado:'keep',descripcion:'pasada N: X criticos, Y altos, Z mayores'})"
424
+ ```
425
+
426
+ Al cerrar el loop (cualquier señal de salida), escribir el handoff:
427
+
428
+ ```bash
429
+ node -e "const lt=require('./hooks/lib/loop-telemetry');lt.escribirHandoff('<dir>',{source:'swl:verificar',status:'COMPLETO',findings:[/* hallazgos MEDIO/BAJO residuales */],config:{fase:'0N'}})"
430
+ ```
431
+
432
+ `status` según la señal: A/D → `COMPLETO`, B → `INTERRUMPIDO`, C → `ACOTADO`.
433
+ Si `analizarTrayectoria()` reporta plateau antes de `--max-iter`, tratarlo como
434
+ señal C anticipada: seguir iterando sin mejora de métrica quema tokens sin
435
+ reducir hallazgos.
436
+
437
+ ### 4.6.8 — Protocolo `--ci-aware` (Señal D)
395
438
 
396
439
  Cuando `--ci-aware` está activo, el bucle de convergencia se extiende con un gate adicional ANTES de declarar Señal A como cierre definitivo:
397
440
 
@@ -451,6 +494,31 @@ Sin `--until-converge`, el comportamiento del comando es idéntico al actual: un
451
494
 
452
495
  ## Paso 5 — Verificación de criterios de aceptación
453
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
+
454
522
  Lee los criterios de aceptación del `.planning/fases/0N-CONTEXTO.md` y verifica cada uno:
455
523
 
456
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.
@@ -1,7 +1,12 @@
1
1
  ---
2
2
  name: angular-moderno
3
3
  description: Angular v17+/v20+. Signals, standalone components, OnPush, host bindings, nueva sintaxis de control flow (@if/@for/@switch), defer blocks y patrones modernos.
4
- version: "1.0.0"
4
+ version: "1.0.1"
5
+ evolved: true
6
+ evolved-from: "1.0.0"
7
+ evolved-at: "2026-06-04"
8
+ evolved-by: "evolucionar"
9
+ evolved-note: "PE-009 patrón Angular 19+ ErrorHandler custom con provideBrowserGlobalErrorListeners (NO listeners manuales window.onerror). Origen: OIC v1.5 Slice 6 2026-06-04."
5
10
  herramientasPermitidas: [Read]
6
11
  exclusiones:
7
12
  - "No cargar para patrones Angular avanzados (zoneless, SSR, Resource API, interceptores funcionales) — para eso cargar `angular-avanzado`."
@@ -184,3 +189,41 @@ Para ejemplos completos de host bindings con clases dinámicas, services store c
184
189
  **`input.required<T>()` accedido fuera del contexto de renderizado (en `constructor`) lanza error de runtime**: `this.factura()` dentro del `constructor` de un componente que usa `input.required<Factura>()` lanza `NG0950: Input is required but no value is available yet`. Causa: los inputs signal no tienen valor hasta que Angular completa la inicialización del componente. Fix: acceder a inputs en `ngOnInit`, en `computed()`, o en métodos del template — nunca en el constructor.
185
190
 
186
191
  **`takeUntilDestroyed()` usado fuera del contexto de inyección lanza error**: `takeUntilDestroyed()` sin argumentos requiere un `DestroyRef` del contexto de inyección activo — si se llama dentro de un callback asíncrono (como `.then()` o `setTimeout`), el injection context ya no está activo. Causa: `inject()` solo funciona en contextos de inyección síncronos. Fix: capturar `DestroyRef` en el constructor con `private destroyRef = inject(DestroyRef)` y pasarlo explícitamente: `takeUntilDestroyed(this.destroyRef)`.
192
+
193
+ **Para captura global de errores runtime (window.onerror + unhandledrejection), usar `ErrorHandler` custom con `provideBrowserGlobalErrorListeners` — NO `window.addEventListener('error', ...)` manual** (Angular 19+; patrón portable OIC v1.5 2026-06-04): Angular 19+ provee `provideBrowserGlobalErrorListeners()` que ya registra los listeners nativos. Para reportar errores no controlados al backend (Sentry-style, audit handler, logs centralizados), proveer un `ErrorHandler` custom — listeners manuales duplican el registro y rompen la integración con el ciclo de DI/zone de Angular.
194
+
195
+ ```typescript
196
+ // app.config.ts
197
+ import { ApplicationConfig, ErrorHandler, provideBrowserGlobalErrorListeners } from '@angular/core';
198
+
199
+ export const appConfig: ApplicationConfig = {
200
+ providers: [
201
+ provideBrowserGlobalErrorListeners(), // 1. Listeners nativos
202
+ { provide: ErrorHandler, useClass: GlobalErrorHandler }, // 2. Tu handler custom
203
+ // ...
204
+ ],
205
+ };
206
+
207
+ // global-error-handler.service.ts
208
+ @Injectable({ providedIn: 'root' })
209
+ export class GlobalErrorHandler implements ErrorHandler {
210
+ private readonly reporter = inject(ErrorReporterService);
211
+
212
+ handleError(error: unknown): void {
213
+ try {
214
+ this.reporter.reportarErrorGlobal(error, 'global-error-handler');
215
+ } catch {
216
+ // Silenciar fallos del reporter — un handler global NUNCA debe propagar.
217
+ }
218
+ console.error(error); // Preservar visibilidad en DevTools.
219
+ }
220
+ }
221
+ ```
222
+
223
+ **Causa**: con `provideBrowserGlobalErrorListeners` activo, Angular ya escucha `window.onerror`/`unhandledrejection` y los enruta a `ErrorHandler.handleError()`. Registrar listeners manuales propios duplica el callback (cada error se reporta dos veces) y se pierde la integración con el lifecycle Angular (zone tracking, DI context). **Fix**: usar EXCLUSIVAMENTE el `ErrorHandler` custom + `provideBrowserGlobalErrorListeners`.
224
+
225
+ **Reglas del handler**:
226
+ - `try/except` agresivo: el reporter NUNCA debe propagar al `handleError` (riesgo de recursión si el propio POST de reporte falla).
227
+ - Delegar a `console.error(error)` para preservar DevTools (no silenciar para devs).
228
+ - El reporter debe tener throttle propio (ej: 10 eventos/5s) y silenciar respuestas esperadas (401/403/404/429) — los detalles del reporter viven en su propio service, no en el `ErrorHandler`.
229
+ - Anti-bucle: el `ErrorReporterInterceptor` (si existe) debe excluir llamadas al propio endpoint POST de reportes.