@saulwade/swl-ses 1.6.1 → 1.6.5

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 (85) hide show
  1. package/CLAUDE.md +3 -3
  2. package/README.md +4 -4
  3. package/agentes/_intent-spec.md +73 -0
  4. package/agentes/auto-evolucion-swl.md +24 -0
  5. package/agentes/cloud-infra-swl.md +25 -0
  6. package/agentes/datos-swl.md +23 -0
  7. package/agentes/devops-ci-swl.md +24 -0
  8. package/agentes/gh-fix-ci-swl.md +275 -0
  9. package/agentes/migrador-swl.md +22 -0
  10. package/agentes/nemesis-auditor-swl.md +90 -1
  11. package/agentes/pagos-swl.md +25 -0
  12. package/agentes/release-manager-swl.md +24 -0
  13. package/agentes/sre-swl.md +24 -0
  14. package/comandos/swl/exportar-vault.md +106 -14
  15. package/comandos/swl/nemesis.md +70 -3
  16. package/comandos/swl/planear-fase.md +16 -0
  17. package/comandos/swl/release.md +62 -2
  18. package/comandos/swl/salud.md +32 -0
  19. package/comandos/swl/verificar.md +116 -2
  20. package/habilidades/agent-browser/SKILL.md +111 -4
  21. package/habilidades/agent-deep-links/SKILL.md +148 -0
  22. package/habilidades/aprender-de-git-diff/SKILL.md +288 -0
  23. package/habilidades/backend-async-postgres-testing/SKILL.md +215 -0
  24. package/habilidades/backend-error-design/SKILL.md +221 -0
  25. package/habilidades/browser-interaction-patterns/SKILL.md +514 -0
  26. package/habilidades/browser-research-domains/SKILL.md +635 -0
  27. package/habilidades/changelog-generator/SKILL.md +172 -0
  28. package/habilidades/changelog-generator/scripts/parse-commits.js +354 -0
  29. package/habilidades/devsecops-pipeline-security/SKILL.md +3 -0
  30. package/habilidades/diseno-herramientas-agente/SKILL.md +17 -1
  31. package/habilidades/fastapi-experto/SKILL.md +49 -4
  32. package/habilidades/harness-claude-code/SKILL.md +4 -1
  33. package/habilidades/meta-skills-estandar/SKILL.md +6 -0
  34. package/habilidades/meta-skills-estandar/recursos/skill-judge-rubrica.md +281 -0
  35. package/habilidades/postgresql-experto/SKILL.md +80 -4
  36. package/habilidades/proceso-autoverificacion-evidencias/SKILL.md +258 -0
  37. package/habilidades/proceso-confianza-pre-implementacion/SKILL.md +246 -0
  38. package/habilidades/proceso-ddia-fundamentos/SKILL.md +255 -0
  39. package/habilidades/proceso-ddia-streaming/SKILL.md +231 -0
  40. package/habilidades/proceso-discovery-machote/SKILL.md +157 -0
  41. package/habilidades/proceso-intent-engineering/SKILL.md +269 -0
  42. package/habilidades/proceso-modular-split/SKILL.md +256 -0
  43. package/habilidades/reducir-entropia/SKILL.md +219 -0
  44. package/habilidades/tdd-workflow/SKILL.md +12 -5
  45. package/hooks/extraccion-aprendizajes.js +8 -0
  46. package/hooks/lib/deep-links.js +185 -0
  47. package/hooks/lib/evolution-tracker.js +115 -18
  48. package/hooks/lib/gateway-notify.js +70 -7
  49. package/hooks/lib/task-budget.js +218 -0
  50. package/hooks/validar-intent-spec.js +222 -0
  51. package/manifiestos/hooks-config.json +9 -0
  52. package/manifiestos/modulos.json +22 -3
  53. package/manifiestos/skills-lock.json +1247 -1142
  54. package/package.json +3 -3
  55. package/plugin.json +18 -2
  56. package/reglas/arquitectura.md +38 -0
  57. package/reglas/arreglar-al-detectar.md +93 -0
  58. package/reglas/auditorias-documentales-estructurales.md +38 -0
  59. package/reglas/fragmentos-compartidos.md +26 -0
  60. package/reglas/intent-engineering.md +214 -0
  61. package/reglas/registro-componentes-nuevos.md +52 -0
  62. package/reglas/tests-cleanup.md +220 -0
  63. package/schemas/agent-frontmatter.schema.json +294 -167
  64. package/schemas/agent-message.schema.json +73 -53
  65. package/schemas/agent-output-implementacion.schema.json +114 -85
  66. package/schemas/agent-output-planificacion.schema.json +150 -113
  67. package/schemas/agent-output-review.schema.json +98 -78
  68. package/schemas/diary-entry.schema.json +42 -10
  69. package/schemas/hook-profiles.schema.json +54 -39
  70. package/schemas/hooks-config.schema.json +89 -74
  71. package/schemas/instinct.schema.json +152 -115
  72. package/schemas/modulos.schema.json +38 -29
  73. package/schemas/perfiles.schema.json +36 -28
  74. package/schemas/plugin.schema.json +77 -64
  75. package/schemas/skill-evals.schema.json +119 -95
  76. package/schemas/skill-frontmatter.schema.json +245 -170
  77. package/scripts/generar-inventario.js +3 -1
  78. package/scripts/lib/mcp_config.py +29 -14
  79. package/scripts/lib/schema-version.js +164 -0
  80. package/scripts/mcp-orchestrator.py +153 -131
  81. package/scripts/mcp-pool-manager.py +132 -107
  82. package/scripts/mcp-telemetry.py +139 -120
  83. package/scripts/validar-manifest.js +1 -1
  84. package/scripts/validar.js +3 -2
  85. package/scripts/verificar-release.js +199 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@saulwade/swl-ses",
3
- "version": "1.6.1",
4
- "description": "Sistema de ingenieria de software auto-evolutivo multi-runtime polyglot con 60 agentes, 162 habilidades, 44 comandos, 67 reglas y 41 hooks. Soporta 11 lenguajes y 7 runtimes: Claude Code, OpenClaude, OpenCode, Gemini CLI, Cursor, Codex CLI (soporte completo); GitHub Copilot (soporte parcial). 100% en espanol (Mexico). Multi-target install (--target CSV / --all-runtimes), autoconfig MCP en Cursor/Codex con --with-mcp, agentes Codex en TOML, hooks Cursor (17 eventos) y Codex (6 eventos). Gateway bidireccional con relay Telegram y auditoria profunda Nemesis con loop evaluator-optimizer opt-in (ADR-0021) y 8 tools ejecutables. v1.6.1 endurece el verificador docs-vs-codigo con gates de profundidad (Check #2 + #6 + #7 + #8 nuevos) y formaliza el protocolo proactivo de propagacion (doc-sync v1.3.0) ADR-0023.",
3
+ "version": "1.6.5",
4
+ "description": "Sistema de ingenieria de software auto-evolutivo multi-runtime polyglot con 61 agentes, 177 habilidades, 44 comandos, 69 reglas y 42 hooks. Soporta 11 lenguajes y 7 runtimes: Claude Code, OpenClaude, OpenCode, Gemini CLI, Cursor, Codex CLI (soporte completo); GitHub Copilot (soporte parcial). 100% en espanol (Mexico). Multi-target install (--target CSV / --all-runtimes), autoconfig MCP en Cursor/Codex con --with-mcp, agentes Codex en TOML, hooks Cursor (17 eventos) y Codex (6 eventos). Gateway bidireccional con relay Telegram y auditoria profunda Nemesis con loop evaluator-optimizer opt-in (ADR-0021) y 8 tools ejecutables. v1.6.5 integra 3 patrones de awesome-codex-skills (ComposioHQ, MIT) agent-deep-links + changelog-generator + gh-fix-ci-swl ADR-0029, y promueve 3 evoluciones SIGAF al sistema global (D1 nemesis SendMessage + D2 verificar smoke frontend + L2 alineacion veredicto).",
5
5
  "bin": {
6
6
  "swl-ses": "bin/swl-ses.js",
7
7
  "swl-telegram-bot": "bin/swl-telegram-bot.js",
@@ -28,7 +28,7 @@
28
28
  ],
29
29
  "scripts": {
30
30
  "postinstall": "echo '\n swl-software-engineering-system instalado.\n Ejecuta: npx swl-ses init\n'",
31
- "test": "node --test tests/lib/*.test.js tests/scripts/*.test.js tests/scripts/lib/*.test.js tests/scripts/tui/*.test.js tests/hooks/*.test.js tests/gateway/*.test.js tests/bin/*.test.js tests/transformadores/*.test.js tests/mcp-server/*.test.js",
31
+ "test": "node --test tests/lib/*.test.js tests/scripts/*.test.js tests/scripts/lib/*.test.js tests/scripts/tui/*.test.js tests/hooks/*.test.js tests/hooks/lib/*.test.js tests/habilidades/*.test.js tests/gateway/*.test.js tests/bin/*.test.js tests/transformadores/*.test.js tests/mcp-server/*.test.js",
32
32
  "test:validate": "node scripts/validar.js",
33
33
  "test:manifest": "node scripts/validar-manifest.js",
34
34
  "test:docs": "node scripts/verificar-docs-vs-codigo.js",
package/plugin.json CHANGED
@@ -1,28 +1,34 @@
1
1
  {
2
2
  "name": "swl-ses",
3
- "version": "1.6.1",
4
- "description": "Sistema de ingenieria de software auto-evolutivo multi-runtime polyglot. 60 agentes, 162 habilidades, 44 comandos, 67 reglas y 41 hooks. 62 librerias. 11 lenguajes. Soporta Claude Code, Copilot, OpenCode, Codex y Gemini CLI. Loop evaluator-optimizer en /swl:nemesis (ADR-0021). v1.6.1 endurece verificador docs-vs-codigo (gates de profundidad) y formaliza protocolo proactivo doc-sync v1.3.0 (ADR-0023).",
3
+ "version": "1.6.5",
4
+ "description": "Sistema de ingenieria de software auto-evolutivo multi-runtime polyglot. 61 agentes, 177 habilidades, 44 comandos, 69 reglas y 42 hooks. 62 librerias. 11 lenguajes. Soporta Claude Code, Copilot, OpenCode, Codex y Gemini CLI. Loop evaluator-optimizer en /swl:nemesis (ADR-0021). 3 patrones de awesome-codex-skills (ComposioHQ, MIT) adoptados (ADR-0029) agent-deep-links + changelog-generator + gh-fix-ci-swl. Promueve 3 evoluciones SIGAF (D1 nemesis SendMessage, D2 verificar smoke frontend, L2 alineacion veredicto).",
5
5
  "author": "Saul Wade Leon",
6
6
  "license": "MIT",
7
7
  "repository": "https://github.com/saul-wade/swl-ses",
8
8
  "skills": [
9
9
  "habilidades/accesibilidad-a11y",
10
10
  "habilidades/agent-browser",
11
+ "habilidades/agent-deep-links",
11
12
  "habilidades/agentes-como-servicio",
12
13
  "habilidades/ai-runtime-security",
13
14
  "habilidades/angular-avanzado",
14
15
  "habilidades/angular-moderno",
15
16
  "habilidades/api-rest-diseno",
17
+ "habilidades/aprender-de-git-diff",
16
18
  "habilidades/aprendizaje-continuo",
17
19
  "habilidades/async-python",
18
20
  "habilidades/auth-patrones",
19
21
  "habilidades/auto-evolucion-protocolo",
20
22
  "habilidades/autoresearch",
21
23
  "habilidades/azure-cloud",
24
+ "habilidades/backend-async-postgres-testing",
25
+ "habilidades/backend-error-design",
22
26
  "habilidades/backend-mcp-servidor",
23
27
  "habilidades/backend-production-resilience",
24
28
  "habilidades/benchmark-memoria",
25
29
  "habilidades/brainstorming",
30
+ "habilidades/browser-interaction-patterns",
31
+ "habilidades/browser-research-domains",
26
32
  "habilidades/build-errors-cpp",
27
33
  "habilidades/build-errors-csharp",
28
34
  "habilidades/build-errors-go",
@@ -34,6 +40,7 @@
34
40
  "habilidades/build-errors-rust",
35
41
  "habilidades/build-errors-swift",
36
42
  "habilidades/build-errors-typescript",
43
+ "habilidades/changelog-generator",
37
44
  "habilidades/checklist-calidad",
38
45
  "habilidades/checklist-seguridad",
39
46
  "habilidades/checkpoints-verificacion",
@@ -127,6 +134,13 @@
127
134
  "habilidades/prevencion-racionalizacion",
128
135
  "habilidades/prevencion-sobreingenieria",
129
136
  "habilidades/privacy-memoria",
137
+ "habilidades/proceso-autoverificacion-evidencias",
138
+ "habilidades/proceso-confianza-pre-implementacion",
139
+ "habilidades/proceso-ddia-fundamentos",
140
+ "habilidades/proceso-ddia-streaming",
141
+ "habilidades/proceso-discovery-machote",
142
+ "habilidades/proceso-intent-engineering",
143
+ "habilidades/proceso-modular-split",
130
144
  "habilidades/prompt-engineering",
131
145
  "habilidades/protocolo-revision-swl",
132
146
  "habilidades/rag-arquitectura",
@@ -134,6 +148,7 @@
134
148
  "habilidades/react-experto",
135
149
  "habilidades/react-optimizacion",
136
150
  "habilidades/redis-experto",
151
+ "habilidades/reducir-entropia",
137
152
  "habilidades/release-semver",
138
153
  "habilidades/rust-experto",
139
154
  "habilidades/rust-patrones",
@@ -193,6 +208,7 @@
193
208
  "agentes/frontend-react-swl.md",
194
209
  "agentes/frontend-swl.md",
195
210
  "agentes/frontend-tailwind-swl.md",
211
+ "agentes/gh-fix-ci-swl.md",
196
212
  "agentes/implementador-swl.md",
197
213
  "agentes/investigador-swl.md",
198
214
  "agentes/investigador-ux-swl.md",
@@ -274,6 +274,44 @@ Documentar en un ADR qué patrón se usa y por qué.
274
274
 
275
275
  ---
276
276
 
277
+ ## Split modular con compositor por herencia múltiple
278
+
279
+ Cuando un módulo backend (router, service, repository) supera ~1500 LOC en un
280
+ solo archivo y contiene sub-dominios identificables, aplicar el playbook de
281
+ split documentado en `Skill("proceso-modular-split")`. El patrón clave:
282
+
283
+ - **Compositor por herencia múltiple, NO `__getattr__`**: el compositor (clase
284
+ monolítica que mantiene API pública previa) hereda de cada sub-service. MRO
285
+ inspeccionable, type checker feliz, IDE autocompleta. `__getattr__` para
286
+ delegación es opaco al tipado y al stack trace.
287
+
288
+ - **Helpers transversales en clase base, no duplicados entre sub-services**: si
289
+ un helper como `_validar_predio_existe` lo usan ≥80% de sub-services, vive
290
+ en `<modulo>/service_base.py` (`<Modulo>ServiceBase`). Cada sub-service
291
+ hereda de la base. Si solo lo usan 1-2 sub-services, vive en uno de ellos y
292
+ los demás importan por composición (no por herencia).
293
+
294
+ - **Helper transversal cross-sub-service NO se duplica**: validación que
295
+ aparece en ≥3 sub-services es candidata inmediata a la clase base. La
296
+ duplicación es señal de que el split fue prematuro o de que se perdió el
297
+ helper común durante la migración.
298
+
299
+ - **Validar a escala**: el patrón se validó a ~20,000 LOC totales en SIGM
300
+ (recaudación ADR-0016 + catastro ADR-0017). Aplicar al primer módulo es
301
+ prudente; antes de aplicar a un tercero, confirmar que el feedback de los
302
+ dos primeros no requiere ajuste al playbook.
303
+
304
+ Anti-patrones a evitar (las auditorías técnicas NO los detectan):
305
+
306
+ - Router que importa el compositor cuando existe sub-service específico.
307
+ - Router que accede a `servicio._repo` o métodos privados del sub-service.
308
+ - Default `None` pasado explícitamente bypasea el default del callee.
309
+ - CLAUDE.md y AGENTS.md desincronizados tras el refactor.
310
+
311
+ Estos los detecta revisión de arquitectura humana o senior, no `nemesis-auditor-swl`.
312
+
313
+ ---
314
+
277
315
  ## Reglas de desempate entre principios (conflict resolution)
278
316
 
279
317
  Los principios de ingeniería pueden entrar en tensión. Cuando dos reglas
@@ -86,6 +86,99 @@ principio:
86
86
  reportan", "p95 > 60s en producción documentado", "uso > N veces/mes",
87
87
  no "cuando sea relevante" o "más adelante".
88
88
 
89
+ ### Hallazgos colaterales con blast radius alto — patrón Hallazgo A/B/C
90
+
91
+ Durante el trabajo principal puedes detectar un problema secundario cuyo fix
92
+ **no cabe** en la regla general "detectar → informar → arreglar en mismo
93
+ turno" porque su blast radius es alto: toca infra compartida, requiere
94
+ downtime, modifica contratos públicos, exige decisión arquitectural, o su
95
+ remediación dura más que el trabajo principal en curso.
96
+
97
+ Aplicar el catálogo de tres opciones explícitas — NUNCA mezclar el fix con
98
+ el trabajo principal sin etiquetarlo y NUNCA dejarlo como deuda silenciosa.
99
+
100
+ #### Definición operacional
101
+
102
+ Un hallazgo colateral cumple **al menos uno** de estos atributos:
103
+
104
+ - Su fix toca archivos fuera del scope del trabajo principal (>3 archivos
105
+ no relacionados con la tarea actual).
106
+ - Requiere operación destructiva (`git filter-branch`, `git filter-repo`,
107
+ drop de tabla, rotación de credencial productiva).
108
+ - Modifica configuración de infra compartida (CI/CD, branch protection,
109
+ permisos de repo, secrets de organización).
110
+ - Exige decisión arquitectural ambigua que el agente no puede tomar solo.
111
+ - Su remediación dura más que el commit actual del trabajo principal.
112
+
113
+ Si NO cumple ninguno de estos atributos, NO es Hallazgo A/B/C — aplicar la
114
+ regla general (arreglar en mismo turno).
115
+
116
+ #### Las tres opciones explícitas
117
+
118
+ | Opción | Cuándo | Acción |
119
+ |---|---|---|
120
+ | **Hallazgo A — Resolver ahora** | Fix < 30 min, reversible con `git revert`, sin blast radius en infra compartida, sin decisión arquitectural | Pausar trabajo principal, fix en commit separado etiquetado, retomar |
121
+ | **Hallazgo B — DT formal con trigger verificable** | Fix con blast radius alto pero NO bloqueante para el trabajo principal. Tiene criterio observable que define cuándo cerrarlo | Redactar entry en `.planning/DEUDA-TECNICA.md` con ID, trigger verificable, plan de cierre paso a paso. Continuar trabajo principal |
122
+ | **Hallazgo C — Escalar al usuario** | Fix excede autorización del agente: requiere decisión arquitectural, operación destructiva irreversible, o modifica contratos productivos | Pausar trabajo principal, reportar al usuario con 3 opciones concretas y recomendación, esperar decisión explícita |
123
+
124
+ #### Reglas duras
125
+
126
+ - **Reportar siempre, independientemente de la opción elegida**: el usuario
127
+ ve el hallazgo en el mismo turno, no se entera en el commit posterior.
128
+ - **DT formal NO es "lo apunto y veremos"**: requiere ID (`DT-NOMBRE-X`),
129
+ trigger verificable observable, plan de cierre con pasos concretos, y
130
+ entry visible en `.planning/DEUDA-TECNICA.md` commiteada en mismo turno.
131
+ - **NUNCA degradar Hallazgo C a Hallazgo B sin pedirlo**: una decisión
132
+ arquitectural disfrazada de DT es deuda silenciosa con cara de proceso.
133
+ - **NUNCA "arreglar como parte del trabajo principal" un Hallazgo B/C
134
+ sin etiquetarlo**: aunque el fix sea pequeño, si su blast radius es alto
135
+ el commit debe ser separado con mensaje explícito ("colateral: cierra
136
+ DT-X" o "colateral: aplica fix urgente fuera de scope original").
137
+
138
+ #### Ejemplo validado (SIGAF, sesión 2026-05-20)
139
+
140
+ Durante implementación de pipeline DevSecOps (gates gitleaks + SAST + deps
141
+ + containers), el agente detectó tres hallazgos colaterales:
142
+
143
+ - **Hallazgo A — Validator JWT con frozenset + regex**: bug detectado en
144
+ `backend/app/core/config.py` donde `_CENTINELA` hardcodeado divergía del
145
+ `.env.example` real. Fix < 30 min, reversible, alcance acotado a
146
+ validators. Aplicado en commit separado mismo turno + 8 tests de regresión.
147
+
148
+ - **Hallazgo B — DT-GHAS-HABILITAR**: detectado que repo PRIVATE en
149
+ organización sin GitHub Advanced Security responde 403 al upload SARIF.
150
+ Mitigación inmediata con `continue-on-error: true` en step de upload.
151
+ DT formal con trigger verificable: "equipo crece >2 personas, auditoría
152
+ externa, o licencia GHAS adquirida". Entry en `.planning/DEUDA-TECNICA.md`
153
+ con plan de cierre (eliminar `continue-on-error` cuando GHAS activo).
154
+
155
+ - **Hallazgo C — DT-HISTORIAL-ENV**: detectado que commit `203a603` en
156
+ historial git contenía `ADMIN_PASSWORD=Admin2026!` (ya rotado, ya en
157
+ `.gitignore`, pero presente en `git log -p`). Fix requiere `git
158
+ filter-branch` o `git filter-repo` (destructivo, irreversible para
159
+ colaboradores con clones locales). El agente escaló al usuario; usuario
160
+ respondió "estamos en desarrollo y etapa de pruebas" → degradado a DT
161
+ formal con trigger "antes del primer deploy productivo, repo público
162
+ o colaborador externo".
163
+
164
+ Los tres hallazgos quedaron visibles, etiquetados y con trigger observable.
165
+ Ninguno se mezcló silenciosamente con el trabajo principal del pipeline.
166
+
167
+ #### Anti-patrones específicos
168
+
169
+ - **"Lo arreglo de paso porque ya estoy aquí"**: si el fix tiene blast
170
+ radius alto, NO va de paso. Va etiquetado o no va.
171
+ - **DT sin trigger verificable**: "cuando sea posible", "más adelante",
172
+ "cuando tengamos tiempo" — viola la regla general arriba. Trigger debe
173
+ ser condición observable.
174
+ - **Reportar Hallazgo C como informativo sin pedir decisión**: si la
175
+ decisión requiere autorización del usuario, la respuesta NO es
176
+ "documentado para tu consideración" — es "elige A, B o C".
177
+ - **Aplicar Hallazgo A descubriendo en medio que era Hallazgo C**: si al
178
+ empezar el fix detectas que tiene blast radius mayor del estimado,
179
+ detente, revierte el WIP, y re-clasifica. NO terminar "porque ya
180
+ empezamos".
181
+
89
182
  ---
90
183
 
91
184
  ## Excepciones legítimas
@@ -112,6 +112,44 @@ agent-browser, @dbml/core, likec4, etc.) debe documentarse en
112
112
  7. **Limitaciones conocidas**.
113
113
  8. **Origen** (ADR, sesión, paper, repo).
114
114
 
115
+ ### Para prosa cuantificada en campos descriptivos de manifiestos JSON
116
+
117
+ Los campos `description` de `package.json` y `plugin.json` contienen prosa
118
+ con cifras agregadas del sistema (típicamente "60 agentes + N habilidades +
119
+ M comandos + K reglas + L hooks"). Esa prosa es **fuente de verdad parcial
120
+ para usuarios de npm y de Claude Code marketplace** — npm muestra el
121
+ description en la página del paquete; Claude Code lo lee al listar plugins.
122
+
123
+ Estos campos NO son agregados estructurales que los gates estándar
124
+ auditen (los gates escanean `.md` y comparan contra `INVENTARIO.md`),
125
+ por lo que necesitan tratamiento explícito:
126
+
127
+ 1. **Universo a chequear**: `package.json#description` Y `plugin.json#description`.
128
+ Ambos deben extraerse, parsearse para sus cifras, y compararse entre sí.
129
+
130
+ 2. **Verificación cross-manifest**: las cifras de
131
+ `package.json#description` deben coincidir letra por letra con las de
132
+ `plugin.json#description`. Cualquier divergencia es bug de manifiesto
133
+ inconsistente.
134
+
135
+ 3. **Verificación vs fuente de verdad estructural**: las cifras de ambos
136
+ manifiestos deben coincidir con los conteos reales que reporta
137
+ `INVENTARIO.md` (regenerado por `node scripts/generar-inventario.js`).
138
+
139
+ 4. **Gate automatizado**: `scripts/verificar-release.js` incluye gate
140
+ "Gate de description" desde v1.6.4 que ejecuta exactamente esa
141
+ triple validación. Confiar en su exit code antes de release.
142
+
143
+ **Anti-patrón documentado**: actualizar `plugin.json#description` con
144
+ cifras nuevas tras agregar 2 skills, asumir que `package.json#description`
145
+ está alineado por simetría, y commitear sin verificar. Origen del bug
146
+ v1.6.4 (sesión 2026-05-18): el commit del ADR-0028 actualizó
147
+ `plugin.json#description` (171/69/42 + ADR-0028) pero dejó
148
+ `package.json#description` con valores stale de v1.6.2 (162/67/41 +
149
+ ADR-0025). Los 4 gates pre-existentes no lo detectaron porque ninguno
150
+ escaneaba campos JSON descriptivos. El gate dedicado se agregó tras este
151
+ bug; la regla queda anti-recurrente.
152
+
115
153
  ---
116
154
 
117
155
  ## Procedimiento al ejecutar una auditoría documental
@@ -150,3 +150,29 @@ Para extraer un bloque duplicado a fragmento:
150
150
  - [ ] No es contenido invocable dinámicamente (eso es skill)
151
151
  - [ ] Cada agente que lo usa lo declara en `fragmentos: [...]`
152
152
  - [ ] `scripts/validar-manifest.js` no reporta errores
153
+
154
+ ## Implicaciones en scripts de auditoría/conteo de agentes
155
+
156
+ Cualquier script o hook que recorre `agentes/*.md` para contar o validar
157
+ agentes DEBE excluir fragmentos explícitamente con
158
+ `filter(f => f.endsWith('.md') && !f.startsWith('_'))`. Si no lo hace,
159
+ incluye fragmentos en el conteo y reporta cifras incorrectas o falla en la
160
+ validación de frontmatter (los fragmentos NO tienen frontmatter de agente).
161
+
162
+ Scripts y hooks SWL que aplican esta exclusión y deben mantenerla:
163
+
164
+ - `scripts/validar.js` — verifica frontmatter de agentes.
165
+ - `scripts/validar-manifest.js` — cruza `agentes/*.md` vs `modulos.json`.
166
+ - `scripts/generar-inventario.js` — cuenta agentes para INVENTARIO/SALUD.
167
+ - `hooks/validar-intent-spec.js` — regex `/\/agentes\/[^_][^/]*\.md$/`
168
+ con clase negada para fragmentos.
169
+ - Cualquier script futuro de auditoría de agentes.
170
+
171
+ **Caso de regresión histórico**: tras crear `agentes/_intent-spec.md`
172
+ (fragmento) en sesión 2026-05-18, `scripts/generar-inventario.js` contó
173
+ 61 agentes cuando real eran 60 (gate `verificar-release.js` lo detectó).
174
+ Fix: agregar el filtro al `readdirSync` del script.
175
+
176
+ **Consideración futura**: centralizar la lógica en
177
+ `scripts/lib/listar-agentes.js` con la exclusión por defecto evitaría que
178
+ el filtro se omita en scripts nuevos.
@@ -0,0 +1,214 @@
1
+ # Regla: Intent Engineering para agentes ALTO riesgo
2
+
3
+ Esta regla es **OBLIGATORIA** y aplica al crear, modificar o promover agentes
4
+ del sistema SWL cuyo `nivelRiesgo` sea `ALTO`. Implementa el framework
5
+ "Intent Engineering" de 8 partes de Pawel Huryn (*Lead Agents Like Humans*,
6
+ Product Compass, 2026-05).
7
+
8
+ ---
9
+
10
+ ## Principio
11
+
12
+ > Un agente con autonomía elevada que opera sin intent specification explícito
13
+ > falla silenciosamente por instrucciones ambiguas, deriva de scope o pérdida
14
+ > de health metrics. Los agentes ALTO riesgo del sistema SWL DEBEN declarar
15
+ > las 8 partes del framework de forma verificable (frontmatter + fragmento),
16
+ > no implícita.
17
+
18
+ Huryn lo resume:
19
+
20
+ > "Agents don't fail because the model is weak. They fail because intent is
21
+ > incomplete. Objectives are vague. Outcomes are implicit. Trade-offs are
22
+ > unstated. Constraints are treated as suggestions. Autonomy is granted
23
+ > without understanding risk." (Lead Agents Like Humans, línea 56)
24
+
25
+ SWL adopta el framework parcialmente: las partes 5 (Org Context) y 3
26
+ (Desired Outcomes) viven en `CLAUDE.md` y `PLAN.md` respectivamente, no en
27
+ cada agente. Las otras 6 son responsabilidad del autor del agente.
28
+
29
+ ---
30
+
31
+ ## Cuándo aplicar
32
+
33
+ OBLIGATORIO al:
34
+
35
+ - Crear un agente nuevo `nivelRiesgo: ALTO`.
36
+ - Modificar el frontmatter de un agente `nivelRiesgo: ALTO` existente.
37
+ - Promover un agente de `MEDIO` o `BAJO` a `ALTO`.
38
+ - Auditar agentes con `/swl:revisar` cuando se detecta deriva de scope.
39
+
40
+ NO aplicar al:
41
+
42
+ - Agentes `BAJO` o `MEDIO` riesgo (los campos son opcionales para ellos).
43
+ - Cambios cosméticos al cuerpo markdown del agente sin tocar frontmatter.
44
+ - Skills, hooks, comandos (la regla aplica solo a agentes).
45
+
46
+ ---
47
+
48
+ ## Lo que DEBE declarar un agente ALTO
49
+
50
+ ### En el frontmatter YAML
51
+
52
+ ```yaml
53
+ nivelRiesgo: ALTO # Parte 7 — Autonomy Boundaries
54
+ maxTurnos: <int> # Parte 8 — Stop Rules (cap iteraciones)
55
+ strategy: "<1-3 lineas>" # Parte 1 — Strategy (max 500 chars)
56
+ healthMetrics: # Parte 4 — qué NO debe degradar
57
+ - "<invariante 1>"
58
+ - "<invariante 2>"
59
+ steering: # Parte 6 — prompt-level constraints
60
+ - "<guía de comportamiento o @reglas/X.md>"
61
+ hardGuardrails: # Parte 6 — orchestration-level constraints
62
+ - "<restricción enforced por hook/schema o @reglas/X.md>"
63
+ fragmentos:
64
+ - _intent-spec # Importa el bloque compartido al system prompt
65
+ ```
66
+
67
+ ### En el cuerpo markdown
68
+
69
+ NO requerido pero recomendado: agregar sección breve "Health Metrics" o
70
+ "Constraints" si el rol del agente justifica explicación adicional.
71
+
72
+ ---
73
+
74
+ ## Criterios de calidad por campo
75
+
76
+ ### `strategy:`
77
+
78
+ - 1-3 líneas, máximo 500 caracteres.
79
+ - Nombra el tradeoff que el agente prioriza.
80
+ - NO es boilerplate genérico ("código limpio", "buenas prácticas").
81
+ - Hereda del proyecto cuando aplica; declara explícito cuando el rol impone
82
+ tradeoffs propios.
83
+
84
+ **Ejemplo válido** (`migrador-swl`):
85
+ ```yaml
86
+ strategy: >
87
+ Preservar integridad de datos por encima de velocidad de migración.
88
+ Expand-contract obligatorio sobre cambios destructivos. Rollback siempre
89
+ viable. Sin downtime es preferible a migración rápida.
90
+ ```
91
+
92
+ **Ejemplo inválido**:
93
+ ```yaml
94
+ strategy: "Migrar datos de forma segura." # boilerplate genérico
95
+ ```
96
+
97
+ ### `healthMetrics:`
98
+
99
+ - Lista de invariantes blandas que el agente protege mientras trabaja.
100
+ - Distintas de `outcomes`: outcomes se persiguen, health metrics se
101
+ protegen.
102
+ - Sin métrica = sin protección. Agentes ALTO sin health metrics violan
103
+ Goodhart's Law por construcción.
104
+ - Pueden ser cualitativas si no hay telemetría que las mida live ("sin
105
+ warnings nuevos de ORM").
106
+
107
+ ### `steering:`
108
+
109
+ - Soft constraints. El agente las lee como guía.
110
+ - Acepta texto inline o referencia a regla global (`@reglas/X.md`).
111
+ - NO duplicar contenido de `@reglas/X.md` — referenciar evita drift.
112
+
113
+ ### `hardGuardrails:`
114
+
115
+ - Hard constraints aplicadas por arquitectura (hooks, schemas, sandbox).
116
+ - Cada item DEBE referenciar el mecanismo que enforza:
117
+ - `@reglas/seguridad-agentes.md § Privilegio mínimo` (regla global)
118
+ - `@hooks/proteccion-rutas.js` (hook bloqueante)
119
+ - `@schemas/agent-frontmatter.schema.json#properties.tools` (validación)
120
+ - Si la restricción no tiene mecanismo de enforcement, NO es hard
121
+ guardrail — es steering.
122
+
123
+ ---
124
+
125
+ ## Excepciones legítimas
126
+
127
+ NO aplica la regla cuando:
128
+
129
+ 1. **El agente acaba de bajar de ALTO a MEDIO/BAJO**: si en una revisión se
130
+ determina que un agente puede operar con menos privilegio, primero baja
131
+ el `nivelRiesgo`, luego los campos se vuelven opcionales.
132
+
133
+ 2. **El agente está en proceso de deprecación**: agentes marcados
134
+ `evolvable: false` con plan de retiro documentado en ADR pueden quedar
135
+ sin las 8 partes hasta su retiro. Documentar excepción en commit.
136
+
137
+ 3. **Refactor cosmético reversible**: cambios al cuerpo markdown que no
138
+ modifican `nivelRiesgo:` ni los 4 campos nuevos no disparan la regla.
139
+
140
+ ---
141
+
142
+ ## Cómo verificar conformidad
143
+
144
+ ### Manualmente
145
+
146
+ Para auditar un agente ALTO:
147
+
148
+ ```bash
149
+ node -e "
150
+ const a = require('js-yaml').load(require('fs').readFileSync(process.argv[1], 'utf-8').match(/^---\n([\s\S]+?)\n---/)[1]);
151
+ if (a.nivelRiesgo !== 'ALTO') { console.log('NO-ALTO'); return; }
152
+ const faltan = ['strategy','healthMetrics','steering','hardGuardrails'].filter(k => !a[k]);
153
+ if (faltan.length) console.error('FALTAN:', faltan.join(','));
154
+ else console.log('OK');
155
+ " agentes/X-swl.md
156
+ ```
157
+
158
+ ### Automáticamente
159
+
160
+ Hook `hooks/validar-intent-spec.js` (creado en F3) ejecuta esta validación
161
+ en PostToolUse sobre `Write|Edit` de `agentes/*.md`. Modo inicial:
162
+ `blocking: false` (warn-only). Promoción a `blocking: true` tras 2 semanas
163
+ estables sin falsos positivos, documentada en ADR-0027.
164
+
165
+ ---
166
+
167
+ ## Anti-patrones
168
+
169
+ - **Declarar `steering` algo que requiere enforcement**: "no eliminar
170
+ archivos" sin hook que lo prevenga. Si importa, va en `hardGuardrails`
171
+ con apoyo arquitectural.
172
+ - **Copiar `@reglas/X.md` completa en `hardGuardrails`**: referenciar, no
173
+ duplicar. La regla evoluciona; la copia se queda atrás.
174
+ - **Health metrics como outcomes negados**: "latencia < 200ms" es outcome;
175
+ "no degradar latencia mientras trabajas" es health metric.
176
+ - **Strategy demasiado vaga**: si la strategy aplica a cualquier agente,
177
+ no es strategy de este agente. Borrar o especificar.
178
+ - **Promover a ALTO sin declarar las 6 partes**: violación directa de
179
+ esta regla; el hook F3 (cuando blocking=true) lo previene.
180
+
181
+ ---
182
+
183
+ ## Relación con otras reglas
184
+
185
+ - `reglas/seguridad-agentes.md § Privilegio mínimo` — los campos nuevos NO
186
+ escalan privilegios; son metadata declarativa.
187
+ - `reglas/fragmentos-compartidos.md` — el `_intent-spec` importado es un
188
+ fragmento legítimo.
189
+ - `reglas/skills-estandar.md` — los skills cargables (`proceso-intent-engineering`)
190
+ son la versión on-demand del fragmento.
191
+ - `reglas/registro-componentes-nuevos.md` — al agregar agente nuevo ALTO,
192
+ registrar en manifiestos sigue siendo obligatorio.
193
+
194
+ ---
195
+
196
+ ## Cargar para aprender el framework
197
+
198
+ ```
199
+ Skill("proceso-intent-engineering")
200
+ ```
201
+
202
+ El skill explica cada parte con ejemplos, mapea Huryn (4 tiers) a SWL (3
203
+ tiers), enumera anti-patrones y entrega tabla de referencia rápida.
204
+
205
+ ---
206
+
207
+ ## Origen
208
+
209
+ Regla creada el 2026-05-18 como parte de Opción B (ver ADR-0025). Cubre el
210
+ gap detectado en análisis del artículo Huryn: SWL cubría 5/8 partes pero
211
+ no enforzaba sistemáticamente las 3 restantes (Strategy, Health Metrics,
212
+ Constraints distinguidas). La regla aplica solo a agentes ALTO porque
213
+ costos de declaración no compensan en agentes BAJO/MEDIO (los 6 agentes
214
+ del CONTEXTO original que eran BAJO/MEDIO se dejan opcionales).
@@ -46,6 +46,7 @@ listados según el tipo:
46
46
  | **Schema** (`schemas/X.schema.json`) | `INVENTARIO.md`, `SALUD.md`. Si valida frontmatter de algún componente, actualizar `scripts/validar.js` para que lo use | `node scripts/generar-inventario.js` |
47
47
  | **Plantilla** (`plantillas/X.md`) | `manifiestos/modulos.json` si la copia el instalador, `INVENTARIO.md` | `node scripts/generar-inventario.js` |
48
48
  | **Bump de versión** (`package.json`) | 15+ ubicaciones — usar checklist en `/swl:release` paso 6, ejecutar `node scripts/verificar-release.js` para verificar sincronización | `node scripts/verificar-release.js` |
49
+ | **Cifras en `description` de manifiestos** (cualquier cambio de conteo de agentes / skills / comandos / reglas / hooks) | **Ambos** `package.json#description` Y `plugin.json#description` con cifras nuevas. **NO tocar uno sin tocar el otro.** Adicionalmente: la frase "60 agentes + N habilidades + M comandos + K reglas + L hooks" en `README.md`, `CLAUDE.md`, `MANUAL_USO.md`, `COMANDOS.md`, `INSTALACION.md`, `MAPEO_SKILLS_AGENTES.md` debe actualizarse con las cifras nuevas. | `node scripts/verificar-release.js` (gate "description" detecta drift cross-manifest + drift vs INVENTARIO.md) |
49
50
 
50
51
  **Ambos manifiestos cuando aplique** son obligatorios. Si un hook se registra
51
52
  solo en `.claude/settings.json` pero no en `manifiestos/hooks-config.json`, el
@@ -133,6 +134,19 @@ Falso. La regla `git-workflow.md` exige commits atómicos. Un componente
133
134
  nuevo + su registro = un commit atómico. Mezclar varios componentes nuevos
134
135
  en un commit es violación separada.
135
136
 
137
+ ### Description stale de un manifiesto que el otro sí actualizó
138
+
139
+ Olvidar editar `package.json#description` cuando se actualizó
140
+ `plugin.json#description` (o viceversa). Origen del bug v1.6.4: el commit del
141
+ ADR-0028 actualizó `plugin.json#description` con cifras nuevas (171 skills, 69
142
+ reglas, 42 hooks, ADR-0028) pero dejó `package.json#description` con valores
143
+ de v1.6.2 (162/67/41, ADR-0025). El gate de versión no lo detectó porque solo
144
+ chequea `version`; el gate de contadores no lo detectó porque solo escanea
145
+ `.md`. Ahora hay gate dedicado (`ejecutarGateDescription` en
146
+ `scripts/verificar-release.js`) que detecta drift cross-manifest. Antes de
147
+ commitear cualquier cambio que afecte conteos, ejecutar
148
+ `node scripts/verificar-release.js` y mirar la sección "Gate de description".
149
+
136
150
  ### Confiar en `node -e` para validar conteos sin re-leer manifiestos
137
151
 
138
152
  Falso. `node -e "console.log(require('./plugin.json').skills.length)"`
@@ -181,6 +195,43 @@ commit separado del fix actual.
181
195
 
182
196
  ---
183
197
 
198
+ ## Citas a módulos de manifest en ADRs y docs
199
+
200
+ Cuando un ADR o documento del sistema cita un nombre de módulo de
201
+ `manifiestos/modulos.json`, `manifiestos/hooks-config.json` o
202
+ `manifiestos/perfiles.json`, **el nombre DEBE verificarse contra el
203
+ archivo real antes de persistir el ADR/doc**. Citas redactadas "de
204
+ memoria" tienden a inventar nombres plausibles que no existen.
205
+
206
+ **Patrón verificador**:
207
+
208
+ ```bash
209
+ # Verificar en qué módulo está registrado un componente específico
210
+ node -e "
211
+ const m = require('./manifiestos/modulos.json');
212
+ for (const [k, v] of Object.entries(m.modulos || m)) {
213
+ if (v.archivos && v.archivos.includes('hooks/<NOMBRE>.js')) {
214
+ console.log('Módulo real:', k);
215
+ }
216
+ }
217
+ "
218
+
219
+ # Listar todos los nombres de módulos disponibles
220
+ node -e "console.log(Object.keys(require('./manifiestos/modulos.json').modulos))"
221
+ ```
222
+
223
+ **Caso de regresión histórico**: ADR-0027 (2026-05-18) inicialmente decía
224
+ "`manifiestos/modulos.json` en módulo `hooks-evolucion-instintos`" —
225
+ módulo **inexistente**. El hook real quedó en `hooks-core`. Pasó la
226
+ primera revisión porque el ADR se redactó de memoria. Fix retrospectivo
227
+ en commit `6919b01`.
228
+
229
+ **Aplicación**: la regla global `~/.claude/rules/verificar-citas-normativas.md
230
+ § Familia 2` cubre "citas archivo:línea" — esta regla extiende el patrón
231
+ al dominio interno del proyecto: citas a nombres de módulos en manifiestos.
232
+
233
+ ---
234
+
184
235
  ## Checklist antes de commitear un componente nuevo
185
236
 
186
237
  - [ ] El archivo del componente está en el directorio correcto (`agentes/`, `habilidades/`, `comandos/swl/`, etc.).
@@ -190,3 +241,4 @@ commit separado del fix actual.
190
241
  - [ ] `npm run test:all` pasa sin errores.
191
242
  - [ ] Si es release: `node scripts/verificar-release.js` pasa sin discrepancias.
192
243
  - [ ] El commit message menciona qué componente se agrega y, si aplica, en qué módulo.
244
+ - [ ] Si el ADR/doc cita un módulo de manifest, el nombre se verificó con `node -e` o `grep` contra el archivo real (no escrito "de memoria").