@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.
- package/CLAUDE.md +3 -3
- package/README.md +4 -4
- package/agentes/_intent-spec.md +73 -0
- package/agentes/auto-evolucion-swl.md +24 -0
- package/agentes/cloud-infra-swl.md +25 -0
- package/agentes/datos-swl.md +23 -0
- package/agentes/devops-ci-swl.md +24 -0
- package/agentes/gh-fix-ci-swl.md +275 -0
- package/agentes/migrador-swl.md +22 -0
- package/agentes/nemesis-auditor-swl.md +90 -1
- package/agentes/pagos-swl.md +25 -0
- package/agentes/release-manager-swl.md +24 -0
- package/agentes/sre-swl.md +24 -0
- package/comandos/swl/exportar-vault.md +106 -14
- package/comandos/swl/nemesis.md +70 -3
- package/comandos/swl/planear-fase.md +16 -0
- package/comandos/swl/release.md +62 -2
- package/comandos/swl/salud.md +32 -0
- package/comandos/swl/verificar.md +116 -2
- package/habilidades/agent-browser/SKILL.md +111 -4
- package/habilidades/agent-deep-links/SKILL.md +148 -0
- package/habilidades/aprender-de-git-diff/SKILL.md +288 -0
- package/habilidades/backend-async-postgres-testing/SKILL.md +215 -0
- package/habilidades/backend-error-design/SKILL.md +221 -0
- package/habilidades/browser-interaction-patterns/SKILL.md +514 -0
- package/habilidades/browser-research-domains/SKILL.md +635 -0
- package/habilidades/changelog-generator/SKILL.md +172 -0
- package/habilidades/changelog-generator/scripts/parse-commits.js +354 -0
- package/habilidades/devsecops-pipeline-security/SKILL.md +3 -0
- package/habilidades/diseno-herramientas-agente/SKILL.md +17 -1
- package/habilidades/fastapi-experto/SKILL.md +49 -4
- package/habilidades/harness-claude-code/SKILL.md +4 -1
- package/habilidades/meta-skills-estandar/SKILL.md +6 -0
- package/habilidades/meta-skills-estandar/recursos/skill-judge-rubrica.md +281 -0
- package/habilidades/postgresql-experto/SKILL.md +80 -4
- package/habilidades/proceso-autoverificacion-evidencias/SKILL.md +258 -0
- package/habilidades/proceso-confianza-pre-implementacion/SKILL.md +246 -0
- package/habilidades/proceso-ddia-fundamentos/SKILL.md +255 -0
- package/habilidades/proceso-ddia-streaming/SKILL.md +231 -0
- package/habilidades/proceso-discovery-machote/SKILL.md +157 -0
- package/habilidades/proceso-intent-engineering/SKILL.md +269 -0
- package/habilidades/proceso-modular-split/SKILL.md +256 -0
- package/habilidades/reducir-entropia/SKILL.md +219 -0
- package/habilidades/tdd-workflow/SKILL.md +12 -5
- package/hooks/extraccion-aprendizajes.js +8 -0
- package/hooks/lib/deep-links.js +185 -0
- package/hooks/lib/evolution-tracker.js +115 -18
- package/hooks/lib/gateway-notify.js +70 -7
- package/hooks/lib/task-budget.js +218 -0
- package/hooks/validar-intent-spec.js +222 -0
- package/manifiestos/hooks-config.json +9 -0
- package/manifiestos/modulos.json +22 -3
- package/manifiestos/skills-lock.json +1247 -1142
- package/package.json +3 -3
- package/plugin.json +18 -2
- package/reglas/arquitectura.md +38 -0
- package/reglas/arreglar-al-detectar.md +93 -0
- package/reglas/auditorias-documentales-estructurales.md +38 -0
- package/reglas/fragmentos-compartidos.md +26 -0
- package/reglas/intent-engineering.md +214 -0
- package/reglas/registro-componentes-nuevos.md +52 -0
- package/reglas/tests-cleanup.md +220 -0
- package/schemas/agent-frontmatter.schema.json +294 -167
- package/schemas/agent-message.schema.json +73 -53
- package/schemas/agent-output-implementacion.schema.json +114 -85
- package/schemas/agent-output-planificacion.schema.json +150 -113
- package/schemas/agent-output-review.schema.json +98 -78
- package/schemas/diary-entry.schema.json +42 -10
- package/schemas/hook-profiles.schema.json +54 -39
- package/schemas/hooks-config.schema.json +89 -74
- package/schemas/instinct.schema.json +152 -115
- package/schemas/modulos.schema.json +38 -29
- package/schemas/perfiles.schema.json +36 -28
- package/schemas/plugin.schema.json +77 -64
- package/schemas/skill-evals.schema.json +119 -95
- package/schemas/skill-frontmatter.schema.json +245 -170
- package/scripts/generar-inventario.js +3 -1
- package/scripts/lib/mcp_config.py +29 -14
- package/scripts/lib/schema-version.js +164 -0
- package/scripts/mcp-orchestrator.py +153 -131
- package/scripts/mcp-pool-manager.py +132 -107
- package/scripts/mcp-telemetry.py +139 -120
- package/scripts/validar-manifest.js +1 -1
- package/scripts/validar.js +3 -2
- 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.
|
|
4
|
-
"description": "Sistema de ingenieria de software auto-evolutivo multi-runtime polyglot con
|
|
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.
|
|
4
|
-
"description": "Sistema de ingenieria de software auto-evolutivo multi-runtime polyglot.
|
|
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",
|
package/reglas/arquitectura.md
CHANGED
|
@@ -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").
|