@saulwade/swl-ses 2.4.2 → 2.5.1

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 (198) hide show
  1. package/CLAUDE.md +194 -241
  2. package/README.md +600 -597
  3. package/agentes/_intent-spec.md +73 -73
  4. package/agentes/_propose-step.md +90 -90
  5. package/agentes/abogado-diablo-swl.md +145 -0
  6. package/agentes/accesibilidad-wcag-swl.md +690 -690
  7. package/agentes/arquitecto-swl.md +267 -267
  8. package/agentes/auto-evolucion-swl.md +908 -908
  9. package/agentes/backend-api-swl.md +1 -1
  10. package/agentes/backend-csharp-swl.md +420 -420
  11. package/agentes/backend-go-swl.md +390 -390
  12. package/agentes/backend-java-swl.md +281 -281
  13. package/agentes/backend-node-swl.md +1 -1
  14. package/agentes/backend-python-swl.md +1 -1
  15. package/agentes/backend-rust-swl.md +364 -364
  16. package/agentes/backend-workers-swl.md +482 -482
  17. package/agentes/cloud-infra-swl.md +509 -509
  18. package/agentes/consolidador-swl.md +541 -541
  19. package/agentes/datos-swl.md +1 -1
  20. package/agentes/depurador-swl.md +352 -352
  21. package/agentes/devops-ci-swl.md +400 -400
  22. package/agentes/disenador-ui-swl.md +569 -569
  23. package/agentes/documentador-swl.md +345 -345
  24. package/agentes/frontend-angular-swl.md +621 -621
  25. package/agentes/frontend-css-swl.md +716 -716
  26. package/agentes/frontend-react-swl.md +692 -692
  27. package/agentes/frontend-swl.md +496 -496
  28. package/agentes/frontend-tailwind-swl.md +826 -826
  29. package/agentes/gh-fix-ci-swl.md +6 -1
  30. package/agentes/implementador-swl.md +1 -1
  31. package/agentes/investigador-swl.md +432 -432
  32. package/agentes/investigador-ux-swl.md +505 -505
  33. package/agentes/llm-apps-swl.md +1 -1
  34. package/agentes/migrador-swl.md +442 -442
  35. package/agentes/mobile-android-swl.md +511 -511
  36. package/agentes/mobile-cross-swl.md +541 -541
  37. package/agentes/mobile-ios-swl.md +502 -502
  38. package/agentes/mobile-testing-swl.md +302 -302
  39. package/agentes/nemesis-auditor-swl.md +285 -285
  40. package/agentes/notificador-swl.md +1 -1
  41. package/agentes/observabilidad-swl.md +438 -438
  42. package/agentes/pagos-swl.md +310 -310
  43. package/agentes/perfilador-usuario-swl.md +321 -321
  44. package/agentes/planificador-swl.md +399 -399
  45. package/agentes/producto-prd-swl.md +589 -589
  46. package/agentes/red-team-swl.md +218 -218
  47. package/agentes/release-manager-swl.md +590 -590
  48. package/agentes/rendimiento-swl.md +713 -713
  49. package/agentes/resolutor-build-swl.md +10 -1
  50. package/agentes/revisor-angular-swl.md +278 -278
  51. package/agentes/revisor-codigo-swl.md +1 -1
  52. package/agentes/revisor-csharp-swl.md +264 -264
  53. package/agentes/revisor-go-swl.md +259 -259
  54. package/agentes/revisor-java-swl.md +257 -257
  55. package/agentes/revisor-kotlin-swl.md +273 -273
  56. package/agentes/revisor-nextjs-swl.md +281 -281
  57. package/agentes/revisor-php-swl.md +271 -271
  58. package/agentes/revisor-react-swl.md +278 -278
  59. package/agentes/revisor-rust-swl.md +346 -346
  60. package/agentes/revisor-seguridad-swl.md +399 -399
  61. package/agentes/revisor-swift-swl.md +268 -268
  62. package/agentes/revisor-typescript-swl.md +346 -346
  63. package/agentes/sre-swl.md +1 -1
  64. package/agentes/tdd-qa-swl.md +393 -393
  65. package/bin/lib/bot-comandos.js +1 -1
  66. package/bin/swl-ses.js +6 -0
  67. package/comandos/swl/adoptar-proyecto.md +14 -2
  68. package/comandos/swl/configurar-ci.md +8 -1
  69. package/comandos/swl/deuda-codigo.md +97 -97
  70. package/comandos/swl/discutir-fase.md +22 -118
  71. package/comandos/swl/fix.md +118 -0
  72. package/comandos/swl/nuevo-proyecto.md +54 -3
  73. package/comandos/swl/predecir.md +32 -2
  74. package/comandos/swl/seguridad.md +189 -0
  75. package/comandos/swl/status.md +5 -3
  76. package/habilidades/aprendizaje-continuo/SKILL.md +3 -1
  77. package/habilidades/discutir-fase/SKILL.md +84 -81
  78. package/habilidades/discutir-fase/recursos/plantilla-contexto.md +136 -0
  79. package/habilidades/doc-sync/SKILL.md +3 -1
  80. package/habilidades/doubt-driven-review/SKILL.md +15 -1
  81. package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
  82. package/habilidades/estructura-proyecto-claude/SKILL.md +11 -2
  83. package/habilidades/harness-claude-code/SKILL.md +3 -1
  84. package/habilidades/instalar-sistema/SKILL.md +3 -1
  85. package/habilidades/meta-reglas-extendido/SKILL.md +92 -0
  86. package/habilidades/meta-reglas-extendido/recursos/analisis-previo-tareas-grandes.md +186 -0
  87. package/habilidades/meta-reglas-extendido/recursos/analizar-directorios-antes-de-escribir.md +235 -0
  88. package/habilidades/meta-reglas-extendido/recursos/api-diseno.md +413 -0
  89. package/habilidades/meta-reglas-extendido/recursos/arquitectura.md +491 -0
  90. package/habilidades/meta-reglas-extendido/recursos/arreglar-al-detectar.md +264 -0
  91. package/habilidades/meta-reglas-extendido/recursos/debatir-antes-de-aceptar.md +152 -0
  92. package/habilidades/meta-reglas-extendido/recursos/git-workflow.md +259 -0
  93. package/habilidades/meta-reglas-extendido/recursos/gobernanza.md +291 -0
  94. package/habilidades/meta-reglas-extendido/recursos/memoria-consolidada.md +263 -0
  95. package/habilidades/meta-reglas-extendido/recursos/seguridad-agentes.md +443 -0
  96. package/habilidades/meta-reglas-extendido/recursos/sesiones-paralelas.md +190 -0
  97. package/habilidades/meta-reglas-extendido/recursos/sin-duplicacion-reglas-globales.md +179 -0
  98. package/habilidades/meta-reglas-extendido/recursos/skills-estandar.md +394 -0
  99. package/habilidades/meta-reglas-extendido/recursos/usar-code-review-graph.md +156 -0
  100. package/habilidades/meta-reglas-extendido/recursos/usar-context7.md +236 -0
  101. package/habilidades/meta-reglas-extendido/recursos/usar-sistema-swl.md +253 -0
  102. package/habilidades/meta-reglas-extendido/recursos/verificar-citas-normativas.md +527 -0
  103. package/habilidades/meta-skills-estandar/SKILL.md +3 -1
  104. package/habilidades/nuevo-proyecto/SKILL.md +20 -3
  105. package/habilidades/php-experto/SKILL.md +10 -3
  106. package/habilidades/{filament-admin/SKILL.md → php-experto/recursos/filament-admin.md} +23 -39
  107. package/habilidades/prevencion-sobreingenieria/recursos/soluciones-nativas.md +166 -166
  108. package/habilidades/prevencion-sobreingenieria/recursos/variables-residuales-post-refactor.md +85 -85
  109. package/habilidades/proceso-debate-adversarial/recursos/personas.md +5 -4
  110. package/habilidades/proceso-ingenieria-requerimientos/SKILL.md +147 -0
  111. package/hooks/check-update.js +19 -10
  112. package/hooks/contexto-subagente.js +68 -68
  113. package/hooks/degradacion-instintos.js +1 -1
  114. package/hooks/extraccion-aprendizajes.js +2 -2
  115. package/hooks/lib/briefing.js +3 -3
  116. package/hooks/lib/nudge-tracker.js +1 -1
  117. package/hooks/lib/otlp-exporter.js +1 -1
  118. package/hooks/lib/webhook-dedup.js +1 -1
  119. package/hooks/session-briefing.js +1 -1
  120. package/llms.txt +6 -6
  121. package/manifiestos/canonical-hashes.json +989 -0
  122. package/manifiestos/hooks-config.json +469 -469
  123. package/manifiestos/invariantes-criticos.json +30 -30
  124. package/manifiestos/modulos.json +168 -135
  125. package/manifiestos/perfiles.json +0 -2
  126. package/manifiestos/skills-lock.json +52 -59
  127. package/package.json +7 -5
  128. package/plantillas/github-workflows/README.md +15 -1
  129. package/plantillas/github-workflows/swl-devsecops.yml +70 -0
  130. package/plugin.json +5 -5
  131. package/reglas/analisis-previo-tareas-grandes.md +30 -156
  132. package/reglas/analizar-directorios-antes-de-escribir.md +30 -211
  133. package/reglas/api-diseno.md +28 -398
  134. package/reglas/arquitectura.md +35 -456
  135. package/reglas/arreglar-al-detectar.md +30 -230
  136. package/reglas/debatir-antes-de-aceptar.md +30 -143
  137. package/reglas/docs.md +7 -0
  138. package/reglas/estilo-codigo.md +9 -0
  139. package/reglas/fragmentos-compartidos.md +6 -0
  140. package/reglas/git-workflow.md +44 -240
  141. package/reglas/gobernanza.md +23 -262
  142. package/reglas/memoria-consolidada.md +34 -228
  143. package/reglas/performance.md +8 -0
  144. package/reglas/pruebas.md +12 -0
  145. package/reglas/seguridad-agentes.md +37 -418
  146. package/reglas/seguridad.md +12 -0
  147. package/reglas/sesiones-paralelas.md +29 -162
  148. package/reglas/sin-duplicacion-reglas-globales.md +25 -166
  149. package/reglas/skills-estandar.md +23 -373
  150. package/reglas/usar-code-review-graph.md +31 -140
  151. package/reglas/usar-context7.md +30 -208
  152. package/reglas/usar-sistema-swl.md +47 -242
  153. package/reglas/verificar-citas-normativas.md +47 -537
  154. package/scripts/actualizar.js +253 -253
  155. package/scripts/audit-tools/auditar-relleno-inventario.js +145 -0
  156. package/scripts/auditar-clases-conocidas.js +106 -0
  157. package/scripts/bootstrap-instintos.js +2 -2
  158. package/scripts/canario-hooks.js +166 -0
  159. package/scripts/cli/configurar-ci.js +2 -1
  160. package/scripts/evidencia-valor.js +93 -0
  161. package/scripts/field-report.js +1 -1
  162. package/scripts/generar-comandos.js +143 -0
  163. package/scripts/generar-inventario.js +236 -23
  164. package/scripts/generar-matriz-lenguajes.js +1 -1
  165. package/scripts/instalador.js +15 -1
  166. package/scripts/lib/configurar-ci.js +10 -3
  167. package/scripts/lib/detectar-runtime.js +12 -3
  168. package/scripts/lib/diary-entry.js +3 -1
  169. package/scripts/lib/drift-detector.js +1 -1
  170. package/scripts/lib/evidencia-valor.js +189 -0
  171. package/scripts/lib/expandir-targets.js +71 -71
  172. package/scripts/lib/frontmatter-md.js +63 -0
  173. package/scripts/lib/parsear-opciones.js +2 -0
  174. package/scripts/lib/prune-componentes.js +180 -0
  175. package/scripts/lib/reglas-globales-conocidas.json +16 -2
  176. package/scripts/lib/scoring-instintos.js +2 -2
  177. package/scripts/lib/toml-merge.js +204 -204
  178. package/scripts/lib/transformadores/claude.js +1 -1
  179. package/scripts/lib/transformadores/codex.js +1 -1
  180. package/scripts/lib/transformadores/copilot.js +1 -1
  181. package/scripts/lib/transformadores/cursor.js +1 -1
  182. package/scripts/lib/transformadores/gemini.js +22 -2
  183. package/scripts/lib/transformadores/opencode.js +1 -1
  184. package/scripts/mcp-server/auth.js +105 -105
  185. package/scripts/mcp-server/cache.js +106 -106
  186. package/scripts/prune.js +102 -0
  187. package/scripts/publicar.js +18 -2
  188. package/scripts/tui/pantallas/inspect.js +175 -175
  189. package/scripts/tui/pantallas/uninstall-wizard.js +210 -210
  190. package/scripts/tui/pantallas/update-wizard.js +234 -234
  191. package/scripts/tui/pantallas/welcome.js +189 -189
  192. package/habilidades/paid-media-tracking/SKILL.md +0 -269
  193. package/habilidades/paid-media-tracking/recursos/auditoria-tracking.md +0 -220
  194. package/habilidades/paid-media-tracking/recursos/google-ads-api.md +0 -215
  195. package/habilidades/tracking-measurement/SKILL.md +0 -239
  196. package/habilidades/tracking-measurement/recursos/consent-mode.md +0 -231
  197. package/habilidades/tracking-measurement/recursos/gtm-datalayer.md +0 -216
  198. package/habilidades/tracking-measurement/recursos/meta-capi.md +0 -262
@@ -696,7 +696,7 @@ function cmdCosto(argDias) {
696
696
  bindParam = limiteSeg;
697
697
  } else {
698
698
  // ISO 8601 string — usar comparación de string (funciona para fechas ISO)
699
- const fechaIso = new Date(limiteMs).toISOString().slice(0, 10);
699
+ const fechaIso = new Date(limiteMs).toLocaleDateString('sv');
700
700
  whereClause = `WHERE ${colTimestamp} >= ?`;
701
701
  bindParam = fechaIso;
702
702
  }
package/bin/swl-ses.js CHANGED
@@ -106,6 +106,9 @@ const COMANDOS = {
106
106
  doctor: '../scripts/doctor.js',
107
107
  update: '../scripts/actualizar.js',
108
108
  uninstall: '../scripts/desinstalar.js',
109
+ prune: '../scripts/prune.js',
110
+ valor: '../scripts/evidencia-valor.js',
111
+ 'field-report': '../scripts/field-report.js',
109
112
  'check-update': '../scripts/check-update.js',
110
113
  'install-git-hook': '../scripts/instalar-git-hook.js',
111
114
  'audit-claudemd': '../scripts/cli/audit-claudemd.js',
@@ -161,6 +164,9 @@ COMANDOS PRINCIPALES:
161
164
  doctor Diagnóstica problemas de instalación
162
165
  update Actualiza componentes instalados
163
166
  uninstall Desinstala componentes del runtime
167
+ prune Purga componentes retirados del paquete (dry-run; --confirmar ejecuta)
168
+ valor Panel de evidencia de valor del harness (intercepciones, defectos, DORA/CI, uso; --json, --dias N)
169
+ field-report Reporte de agregados anónimos para compartir con el autor (opt-in, revisión manual)
164
170
  check-update Fuerza consulta inmediata de nueva versión en npm (sin throttle)
165
171
  install-git-hook [--force] Instala pre-commit hook que avisa de nuevas versiones.
166
172
  Útil para CLIs que no son Claude Code (Codex, Copilot,
@@ -237,10 +237,22 @@ Hallazgos clave:
237
237
 
238
238
  Riesgo principal: [descripción]
239
239
 
240
- Próximo paso recomendado:
241
- /swl:discutir-fase 1 ← para definir la primera fase de trabajo
240
+ Próximos pasos recomendados:
241
+ /swl:discutir-fase 1 ← para definir la primera fase de trabajo
242
+ /swl:seguridad --rapido ← baseline de seguridad del proyecto adoptado
243
+ (secretos en repo+historial + CVEs en deps);
244
+ obligatorio recomendarlo si TRAMPAS.md detectó
245
+ manejo de auth, pagos o datos personales
246
+ /swl:configurar-ci init ← si el repo vive en GitHub y no tiene pipelines
247
+ (documentar la ausencia de CI ya es hallazgo)
242
248
  ```
243
249
 
250
+ Si el usuario acepta correr `/swl:seguridad --rapido`, su reporte de postura
251
+ queda en `.planning/audit/` y los hallazgos CRÍTICOS se listan como "Puntos a
252
+ resolver" del arranque — un proyecto adoptado con secretos en el historial no
253
+ debe empezar fases nuevas sin decidir qué hacer con ellos (Hallazgo C de
254
+ `arreglar-al-detectar.md`).
255
+
244
256
  ## Reglas de comportamiento
245
257
 
246
258
  - NUNCA inventar información que no se detectó ni el usuario proporcionó. Si un campo no se puede inferir, dejarlo con nota "Pendiente — definir con `/swl:discutir-fase`".
@@ -48,12 +48,19 @@ Mostrar al usuario qué se detectó y confirmar que es el proyecto correcto.
48
48
 
49
49
  [ ] release-please.yml — Releases automáticos desde conventional commits
50
50
  Sin secrets adicionales. Requiere conventional commits.
51
+
52
+ [ ] swl-devsecops.yml — Gates de seguridad del pipeline: gitleaks (secretos,
53
+ historial completo) + auditoría de dependencias por ecosistema (npm/pip/cargo)
54
+ Sin secrets en repos personales; en repos de ORGANIZACIÓN gitleaks exige
55
+ GITLEAKS_LICENSE (gratuita para individuos). Los gates avanzados
56
+ (SAST/Trivy/DAST) se configuran por proyecto — ver Skill("devsecops-pipeline-security").
51
57
  ```
52
58
 
53
59
  Si el usuario omite `init` e invoca con flags directos, respetar esos flags sin preguntar:
54
60
  - `--with-security` / `--no-security`
55
61
  - `--with-ci` / `--no-ci`
56
62
  - `--with-release-please`
63
+ - `--with-devsecops`
57
64
  - `--dry-run`
58
65
  - `--force`
59
66
 
@@ -65,7 +72,7 @@ Invocar el subcomando del CLI (resuelve cross-scope; ver
65
72
 
66
73
  ```bash
67
74
  swl-ses configurar-ci init
68
- # flags: --no-security --no-ci --with-release-please --dry-run --force
75
+ # flags: --no-security --no-ci --with-release-please --with-devsecops --dry-run --force
69
76
  # fallback: npx -y @saulwade/swl-ses@latest configurar-ci init
70
77
  ```
71
78
 
@@ -1,97 +1,97 @@
1
- ---
2
- name: swl:deuda-codigo
3
- description: Cosecha los marcadores `simplificado:` del código (simplificaciones deliberadas con techo y trigger de upgrade) hacia un ledger visible, detecta marcadores sin trigger (riesgo de rot) y sincroniza opcionalmente con .planning/DEUDA-TECNICA.md. Cargar cuando el usuario pida "qué simplificamos", "deuda de código", "cosecha los marcadores", o tras una fase que dejó marcadores simplificado:.
4
- allowed_tools: ["Grep", "Read", "Edit", "Bash"]
5
- ---
6
-
7
- # /swl:deuda-codigo — Cosecha de simplificaciones deliberadas
8
-
9
- Todo atajo intencional marcado con `simplificado: <techo>, <trigger>` (convención
10
- de `Skill("prevencion-sobreingenieria")`, adaptada del patrón `ponytail:` de
11
- ponytail, MIT) se cosecha aquí en un ledger — para que un "después" no se
12
- convierta en "nunca" (regla `arreglar-al-detectar.md`).
13
-
14
- ## Uso
15
-
16
- ```
17
- /swl:deuda-codigo — Reporte en pantalla (no escribe nada)
18
- /swl:deuda-codigo --sync — Además sincroniza a .planning/DEUDA-TECNICA.md
19
- /swl:deuda-codigo --owners — Agrega autor por marcador (git blame)
20
- /swl:deuda-codigo <directorio> — Limita la cosecha a un subárbol
21
- ```
22
-
23
- ## Paso 1 — Cosechar los marcadores
24
-
25
- Buscar con Grep (herramienta, no shell) el patrón sobre el árbol del proyecto,
26
- excluyendo `node_modules`, `.git`, `dist`, `build`, `temp`, `respositorios-git`:
27
-
28
- ```
29
- Grep(pattern: "(#|//|--|<!--|/\\*)\\s?simplificado:", output_mode: "content", -n: true)
30
- ```
31
-
32
- Cada hit es una fila del ledger. El prefijo de comentario evita capturar prosa
33
- que solo menciona la convención (como este archivo o el SKILL.md).
34
-
35
- ## Paso 2 — Parsear techo y trigger
36
-
37
- La convención es `simplificado: <techo>, <trigger de upgrade>`:
38
-
39
- - **techo**: el límite conocido del atajo (lock global, O(n²), heurística naive).
40
- - **trigger**: la condición observable que obliga el upgrade ("si throughput > X",
41
- "cuando haya un segundo consumidor", "antes del primer deploy productivo").
42
-
43
- Si el texto tras `simplificado:` no contiene una condición observable,
44
- etiquetar la fila `sin-trigger` — esos son los que rotan en silencio.
45
-
46
- ## Paso 3 — Reporte
47
-
48
- Una fila por marcador, agrupado por archivo:
49
-
50
- ```
51
- ## Ledger de simplificaciones — [fecha]
52
-
53
- | Ubicación | Qué se simplificó | Techo | Trigger de upgrade | Estado |
54
- |---|---|---|---|---|
55
- | src/locks.py:42 | lock global | contención con N workers | throughput > 500 rps | ok |
56
- | api/cache.js:17 | TTL fijo 5 min | staleness | (ninguno) | sin-trigger |
57
-
58
- Total: N marcadores, M sin trigger.
59
- ```
60
-
61
- Con `--owners`: agregar columna con `git blame -L<línea>,<línea> --porcelain <archivo>`
62
- (solo el autor, una llamada por fila).
63
-
64
- Si no hay marcadores: `Sin deuda simplificado:. Ledger limpio.` — y terminar.
65
-
66
- ## Paso 4 — Sincronizar al ledger formal (solo con --sync)
67
-
68
- Para cada marcador `sin-trigger` o de techo relevante que no exista ya en
69
- `.planning/DEUDA-TECNICA.md`:
70
-
71
- 1. Leer el ledger actual y verificar duplicados por ubicación (`archivo:línea`).
72
- 2. Agregar entrada `### DT-SIMPLIFICADO-<n>` con: ubicación, techo, trigger
73
- (o `PENDIENTE DE TRIGGER` marcado como acción requerida), fecha de cosecha.
74
- 3. Los `sin-trigger` NO se sincronizan como DT válidas hasta tener trigger:
75
- reportarlos al usuario como acción inmediata — una DT sin trigger verificable
76
- viola `arreglar-al-detectar.md § DT formal`.
77
-
78
- NUNCA borrar ni editar los marcadores del código durante la cosecha: el
79
- comando lee y reporta; el código solo cambia cuando el trigger se cumple y
80
- el upgrade se implementa.
81
-
82
- ## Cuándo usarlo
83
-
84
- - Cierre de fase (`/swl:verificar` lo puede invocar como pasada complementaria).
85
- - Antes de un release: los `sin-trigger` son bloqueo blando (reportar en el gate).
86
- - Auditorías de deuda: junto con la sección "Sobre-ingeniería" de `/swl:revisar`.
87
-
88
- ## Gotchas
89
-
90
- - **Marcadores en fixtures o docs**: los hits dentro de `tests/fixtures/`,
91
- ejemplos de skills o este propio comando son material de referencia, no deuda
92
- — excluirlos del conteo y decir cuántos se excluyeron (sin caps silenciosos).
93
- - **Prefijos de comentario por stack**: el patrón cubre `#` (Python/shell),
94
- `//` (JS/TS/Go/Rust/C#/Java), `--` (SQL/Lua), `<!--` (HTML/MD) y `/*` (CSS/C).
95
- Si el proyecto usa otro prefijo, agregarlo al patrón y decirlo en el reporte.
96
- - **`git blame` sobre archivos renombrados**: usar `git blame -M -C` si el
97
- autor aparece como el commit del rename.
1
+ ---
2
+ name: swl:deuda-codigo
3
+ description: Cosecha los marcadores `simplificado:` del código (simplificaciones deliberadas con techo y trigger de upgrade) hacia un ledger visible, detecta marcadores sin trigger (riesgo de rot) y sincroniza opcionalmente con .planning/DEUDA-TECNICA.md. Cargar cuando el usuario pida "qué simplificamos", "deuda de código", "cosecha los marcadores", o tras una fase que dejó marcadores simplificado:.
4
+ allowed_tools: ["Grep", "Read", "Edit", "Bash"]
5
+ ---
6
+
7
+ # /swl:deuda-codigo — Cosecha de simplificaciones deliberadas
8
+
9
+ Todo atajo intencional marcado con `simplificado: <techo>, <trigger>` (convención
10
+ de `Skill("prevencion-sobreingenieria")`, adaptada del patrón `ponytail:` de
11
+ ponytail, MIT) se cosecha aquí en un ledger — para que un "después" no se
12
+ convierta en "nunca" (regla `arreglar-al-detectar.md`).
13
+
14
+ ## Uso
15
+
16
+ ```
17
+ /swl:deuda-codigo — Reporte en pantalla (no escribe nada)
18
+ /swl:deuda-codigo --sync — Además sincroniza a .planning/DEUDA-TECNICA.md
19
+ /swl:deuda-codigo --owners — Agrega autor por marcador (git blame)
20
+ /swl:deuda-codigo <directorio> — Limita la cosecha a un subárbol
21
+ ```
22
+
23
+ ## Paso 1 — Cosechar los marcadores
24
+
25
+ Buscar con Grep (herramienta, no shell) el patrón sobre el árbol del proyecto,
26
+ excluyendo `node_modules`, `.git`, `dist`, `build`, `temp`, `respositorios-git`:
27
+
28
+ ```
29
+ Grep(pattern: "(#|//|--|<!--|/\\*)\\s?simplificado:", output_mode: "content", -n: true)
30
+ ```
31
+
32
+ Cada hit es una fila del ledger. El prefijo de comentario evita capturar prosa
33
+ que solo menciona la convención (como este archivo o el SKILL.md).
34
+
35
+ ## Paso 2 — Parsear techo y trigger
36
+
37
+ La convención es `simplificado: <techo>, <trigger de upgrade>`:
38
+
39
+ - **techo**: el límite conocido del atajo (lock global, O(n²), heurística naive).
40
+ - **trigger**: la condición observable que obliga el upgrade ("si throughput > X",
41
+ "cuando haya un segundo consumidor", "antes del primer deploy productivo").
42
+
43
+ Si el texto tras `simplificado:` no contiene una condición observable,
44
+ etiquetar la fila `sin-trigger` — esos son los que rotan en silencio.
45
+
46
+ ## Paso 3 — Reporte
47
+
48
+ Una fila por marcador, agrupado por archivo:
49
+
50
+ ```
51
+ ## Ledger de simplificaciones — [fecha]
52
+
53
+ | Ubicación | Qué se simplificó | Techo | Trigger de upgrade | Estado |
54
+ |---|---|---|---|---|
55
+ | src/locks.py:42 | lock global | contención con N workers | throughput > 500 rps | ok |
56
+ | api/cache.js:17 | TTL fijo 5 min | staleness | (ninguno) | sin-trigger |
57
+
58
+ Total: N marcadores, M sin trigger.
59
+ ```
60
+
61
+ Con `--owners`: agregar columna con `git blame -L<línea>,<línea> --porcelain <archivo>`
62
+ (solo el autor, una llamada por fila).
63
+
64
+ Si no hay marcadores: `Sin deuda simplificado:. Ledger limpio.` — y terminar.
65
+
66
+ ## Paso 4 — Sincronizar al ledger formal (solo con --sync)
67
+
68
+ Para cada marcador `sin-trigger` o de techo relevante que no exista ya en
69
+ `.planning/DEUDA-TECNICA.md`:
70
+
71
+ 1. Leer el ledger actual y verificar duplicados por ubicación (`archivo:línea`).
72
+ 2. Agregar entrada `### DT-SIMPLIFICADO-<n>` con: ubicación, techo, trigger
73
+ (o `PENDIENTE DE TRIGGER` marcado como acción requerida), fecha de cosecha.
74
+ 3. Los `sin-trigger` NO se sincronizan como DT válidas hasta tener trigger:
75
+ reportarlos al usuario como acción inmediata — una DT sin trigger verificable
76
+ viola `arreglar-al-detectar.md § DT formal`.
77
+
78
+ NUNCA borrar ni editar los marcadores del código durante la cosecha: el
79
+ comando lee y reporta; el código solo cambia cuando el trigger se cumple y
80
+ el upgrade se implementa.
81
+
82
+ ## Cuándo usarlo
83
+
84
+ - Cierre de fase (`/swl:verificar` lo puede invocar como pasada complementaria).
85
+ - Antes de un release: los `sin-trigger` son bloqueo blando (reportar en el gate).
86
+ - Auditorías de deuda: junto con la sección "Sobre-ingeniería" de `/swl:revisar`.
87
+
88
+ ## Gotchas
89
+
90
+ - **Marcadores en fixtures o docs**: los hits dentro de `tests/fixtures/`,
91
+ ejemplos de skills o este propio comando son material de referencia, no deuda
92
+ — excluirlos del conteo y decir cuántos se excluyeron (sin caps silenciosos).
93
+ - **Prefijos de comentario por stack**: el patrón cubre `#` (Python/shell),
94
+ `//` (JS/TS/Go/Rust/C#/Java), `--` (SQL/Lua), `<!--` (HTML/MD) y `/*` (CSS/C).
95
+ Si el proyecto usa otro prefijo, agregarlo al patrón y decirlo en el reporte.
96
+ - **`git blame` sobre archivos renombrados**: usar `git blame -M -C` si el
97
+ autor aparece como el commit del rename.
@@ -25,8 +25,8 @@ Antes del cuestionario adaptativo completo, el agente clasifica la petición en
25
25
  |------|--------------|--------|
26
26
  | **RUTA_A** — Extender fase existente | La petición agrega tareas a una fase ya planeada. | Saltar cuestionario; cargar el CONTEXTO.md existente y agregar tareas. |
27
27
  | **RUTA_B** — Sin fase formal | Fix trivial o tarea de <2 horas sin impacto cross-módulo. | Saltar cuestionario; proceder con `/swl:ejecutar-fase` directamente. |
28
- | **RUTA_C** — Nueva fase single-scope | Petición nueva, no encaja en fases existentes, single-domain. | Ejecutar cuestionario completo (Bloques 1-4). |
29
- | **RUTA_D** — Nueva fase multi-domain | Petición nueva, requiere decomposición en sub-tareas paralelas. | Cuestionario completo + planificación de paralelización. |
28
+ | **RUTA_C** — Nueva fase single-scope | Petición nueva, no encaja en fases existentes, single-domain. | Ejecutar cuestionario completo (Bloques 1-5 del skill). |
29
+ | **RUTA_D** — Nueva fase multi-domain | Petición nueva, requiere decomposición en sub-tareas paralelas. | Cuestionario completo (bloques de dominio combinados) + planificación de paralelización. Si produciría >20 tareas, sugerir descomposición en N fases. |
30
30
  | **RUTA_E** — Mixto | La petición combina: extensión + nueva fase + posiblemente fix trivial. | Presentar decomposición propuesta y confirmar antes de proceder. |
31
31
 
32
32
  El agente identifica la ruta en la primera respuesta al cargar `Skill("discutir-fase")` analizando: la petición textual, el estado de `.planning/HOJA-RUTA.md` y el último `RESUMEN.md`. Solo si la ruta es C o D se ejecuta el cuestionario completo descrito a continuación.
@@ -73,61 +73,19 @@ Haré algunas preguntas para entender los detalles. Puedes responder con todo el
73
73
 
74
74
  ## Paso 3 — Entrevista adaptativa por bloques
75
75
 
76
- La entrevista se adapta al tipo de fase. Primero determina el tipo leyendo la descripción:
76
+ **El cuestionario canónico vive en `Skill("discutir-fase")`** este comando NO
77
+ define preguntas propias (única fuente, evita deriva). Aplica los 5 bloques del
78
+ skill en orden:
77
79
 
78
- - **Fase de infraestructura/setup**: preguntas sobre entorno, herramientas, CI/CD
79
- - **Fase de backend/API**: preguntas sobre modelos de datos, endpoints, reglas de negocio
80
- - **Fase de frontend/UI**: preguntas sobre pantallas, flujos de usuario, componentes
81
- - **Fase de integración**: preguntas sobre sistemas externos, formatos, protocolos
82
- - **Fase de datos/migración**: preguntas sobre volumen, transformaciones, rollback
83
- - **Fase mixta**: combina bloques relevantes
80
+ 1. **Bloque 1 — Contexto** (siempre): objetivo, criterio de terminación, claridad del roadmap, restricciones de tiempo/presupuesto, decisiones previas, supuestos explícitos.
81
+ 2. **Bloque 2 — Dominio** (adaptativo): backend/API, frontend/UI, infraestructura, integración, datos/migración. Determina el tipo leyendo la descripción de la fase; las fases mixtas combinan bloques. Cambios destructivos de datos activan SIEMPRE el bloque Datos/Migración (rollback, integridad, expand-contract).
82
+ 3. **Bloque 3 Calidad, proceso y operación** (si aplica): tests, revisión de seguridad, NFRs, observabilidad, deployment.
83
+ 4. **Bloque 4 Dependencias y riesgos** (siempre).
84
+ 5. **Bloque 5 — Criterios de aceptación** (siempre, al final): demostración, pruebas, visto bueno, métrica de outcome.
84
85
 
85
- ### Bloque universal (todas las fases)
86
-
87
- Presenta primero:
88
-
89
- 1. ¿Cuál es el entregable más importante de esta fase? ¿Cómo sabremos que está terminada?
90
- 2. ¿Hay algo en esta fase que NO quedó claro en el roadmap y que debemos aclarar ahora?
91
- 3. ¿Cuáles son los riesgos más grandes que ves en esta fase?
92
- 4. ¿Hay decisiones técnicas o de producto que debemos tomar antes de empezar a planear?
93
-
94
- ### Bloque de dominio (según tipo de fase)
95
-
96
- **Si la fase es de backend/API:**
97
- 5. ¿Qué entidades de datos nuevas introduce esta fase? Describe sus campos principales.
98
- 6. ¿Qué endpoints o servicios necesita exponer esta fase?
99
- 7. ¿Hay reglas de negocio complejas o cálculos que deben procesarse?
100
- 8. ¿Qué validaciones son críticas? ¿Qué datos nunca deben llegar corruptos a la BD?
101
- 9. ¿Quién tiene permiso de acceder a qué? ¿Hay roles o restricciones de seguridad?
102
-
103
- **Si la fase es de frontend/UI:**
104
- 5. ¿Qué pantallas o vistas nuevas introduce esta fase? Descríbelas.
105
- 6. ¿Cuál es el flujo principal del usuario en esta fase? (de dónde viene, qué hace, adónde va)
106
- 7. ¿Hay componentes que deben reutilizarse del diseño existente o del sistema de diseño?
107
- 8. ¿Qué datos consume cada pantalla? ¿De qué endpoints los obtiene?
108
- 9. ¿Hay estados de carga, error y vacío que debemos considerar explícitamente?
109
-
110
- **Si la fase es de infraestructura:**
111
- 5. ¿Cuál es el entorno objetivo? (dev, staging, prod — con diferencias entre ellos)
112
- 6. ¿Hay secretos o variables de entorno que esta fase introduce?
113
- 7. ¿Qué servicios gestionados (cloud) se van a usar?
114
- 8. ¿Cuál es la estrategia de rollback si algo sale mal en despliegue?
115
- 9. ¿Se necesita documentar el proceso de despliegue para el equipo?
116
-
117
- **Si la fase es de integración:**
118
- 5. ¿Qué sistema externo se integra? ¿Tienes la documentación de su API?
119
- 6. ¿El sistema externo tiene ambiente de pruebas (sandbox)?
120
- 7. ¿Qué pasa si el sistema externo no responde? ¿Hay timeout y retry definidos?
121
- 8. ¿Se sincronizan datos en tiempo real o en batch?
122
- 9. ¿Hay transformaciones de datos entre los formatos de ambos sistemas?
123
-
124
- ### Bloque de criterios de aceptación
125
-
126
- Siempre al final:
127
-
128
- 10. ¿Qué debe demostrarle el equipo al usuario/cliente para que la fase se apruebe?
129
- 11. ¿Hay pruebas específicas que deben pasar? (pruebas de humo, de carga, de usuario)
130
- 12. ¿Quién da el visto bueno final de esta fase?
86
+ Respeta las reglas del skill: máximo 4 preguntas por mensaje, clasificar cada
87
+ respuesta como CERRADA / ABIERTA / PENDIENTE al recibirla, no avanzar con
88
+ PENDIENTE en ítems críticos.
131
89
 
132
90
  ## Paso 4 — Preguntas de seguimiento
133
91
 
@@ -137,7 +95,7 @@ Después de las respuestas del Bloque de dominio, revisa si hay ambigüedades. P
137
95
  - "Dijiste que los datos se sincronizan 'frecuentemente' — ¿cada cuánto tiempo exactamente?"
138
96
  - "Mencionaste 'validación del lado del cliente' — ¿también se valida en el servidor, o solo en frontend?"
139
97
 
140
- Máximo 5 preguntas de seguimiento por fase. Si hay más de 5 ambigüedades, documenta las restantes como "[PENDIENTE DE ACLARAR]" en el CONTEXTO.md.
98
+ Máximo 5 preguntas de seguimiento por fase. Si hay más de 5 ambigüedades, documenta las restantes en el CONTEXTO.md con la taxonomía del skill: `ABIERTA` si el usuario delega la decisión, `PENDIENTE` si bloquea el plan.
141
99
 
142
100
  ## Paso 5 — Confirmación del entendimiento
143
101
 
@@ -184,67 +142,13 @@ el usuario pida desactivarlo explícitamente. Si lo desactiva: exige la razón,
184
142
  en el campo `**TDD**` del CONTEXTO y anota la excepción en `.planning/AUDITORIA.md`
185
143
  (el opt-out se declara y registra — nunca es silencioso).
186
144
 
187
- Estructura del archivo:
188
-
189
- ```markdown
190
- # Contexto de la Fase N [nombre de la fase]
191
-
192
- **Proyecto**: [nombre del proyecto]
193
- **Fase**: N de M (total de fases en el roadmap)
194
- **Fecha de discusión**: [fecha actual]
195
- **Estado**: Listo para planear
196
- **TDD**: on <!-- default. Si el usuario lo desactiva: `off — razón: [...]` + entry en AUDITORIA.md -->
197
-
198
-
199
- ## Objetivo de la fase
200
- [descripción clara del objetivo]
201
-
202
- ## Entregables esperados
203
- [lista con formato de checklist: - [ ] entregable]
204
-
205
- ## Requisitos técnicos
206
- [lista detallada]
207
-
208
- ## Reglas de negocio
209
- [lista de reglas, numeradas]
210
-
211
- ## Modelos de datos (si aplica)
212
- [descripción de entidades y campos clave]
213
-
214
- ## Endpoints / servicios (si aplica)
215
- [lista de endpoints con método, ruta y propósito]
216
-
217
- ## Pantallas / vistas (si aplica)
218
- [descripción de pantallas]
219
-
220
- ## Criterios de aceptación (REQ)
221
- [criterios binarios y verificables con ID estable namespaceado por fase
222
- `REQ-<fase>-NN` (DT-IDS-NAMESPACE, fases ≥12) — trazabilidad G4:
223
- - **REQ-12-01**: [criterio binario verificable]
224
- - **REQ-12-02**: [criterio binario verificable]
225
- Las fases 01-11 conservan el formato plano `REQ-NN` (gracia legacy permanente,
226
- no se renumeran). `verificar-trazabilidad.js` acepta ambos formatos.
227
- Un REQ emitido NUNCA se renumera ni se reusa: si un criterio se descarta, marcarlo
228
- "RETIRADO — razón" conservando el número. planear-fase exige que cada tarea T-NN
229
- declare qué REQ verifica (matriz REQ×T) y aprobar-plan rechaza planes con REQ
230
- huérfanos. verificar-trazabilidad.js valida la cadena REQ→T→commit→test al cierre.
231
- Método de verificación: por default cada REQ exige un test con marker
232
- `verifica: REQ-<fase>-NN`; los REQ satisfechos por prosa/docs/configuración llevan
233
- la anotación `(verificación: inspección)` en el criterio — exigen tarea y commit
234
- pero no test automatizado.]
235
-
236
- ## Riesgos identificados
237
- [lista con nivel de impacto: ALTO/MEDIO/BAJO]
238
-
239
- ## Dependencias
240
- [qué fases previas deben estar completas, qué sistemas externos se necesitan]
241
-
242
- ## Decisiones pendientes
243
- [preguntas que quedaron abiertas y deben resolverse antes o durante la ejecución]
244
-
245
- ## Notas adicionales
246
- [todo lo que no encajó en las categorías anteriores pero es importante]
247
- ```
145
+ Estructura del archivo: usar la **plantilla canónica**
146
+ `habilidades/discutir-fase/recursos/plantilla-contexto.md` (única fuente,
147
+ compartida con el skill). Leerla antes de escribir; incluye el frontmatter con
148
+ gate TDD, la tabla de decisiones CERRADA/ABIERTA/PENDIENTE, supuestos
149
+ explícitos, no-goals, los criterios de aceptación con REQ-IDs namespaceados
150
+ (`REQ-<fase>-NN`, trazabilidad G4), métrica de outcome, NFRs/observabilidad y
151
+ rollback. Las secciones *(si aplica)* se omiten cuando la fase no las toca.
248
152
 
249
153
  ## Paso 7 — Reporte al usuario
250
154
 
@@ -262,4 +166,4 @@ Al terminar:
262
166
  - Si el usuario dice "como siempre" o "igual que antes", pregunta para verificar — las asunciones son la fuente principal de retrabajo.
263
167
  - El archivo CONTEXTO.md debe ser comprensible sin haber participado en la conversación.
264
168
  - Escribe el archivo en español-MX con formato Markdown limpio.
265
- - Si el usuario no sabe algo importante, documenta "[POR DEFINIR]" y continúa — no bloquees el proceso.
169
+ - Si el usuario no sabe algo importante: regístralo como `ABIERTA` (si delega la decisión al agente) o `PENDIENTE` (si bloquea el plan) y continúa — no bloquees el proceso, pero NUNCA cierres la discusión con `PENDIENTE` en ítems críticos (Regla 3 del skill).
@@ -0,0 +1,118 @@
1
+ ---
2
+ name: swl:fix
3
+ description: >
4
+ Punto de entrada único para reparar fallas: recibe un síntoma (stack trace,
5
+ test rojo, build roto, CI en rojo, hallazgo de revisión) y hace triage para
6
+ rutear al fixer correcto — depurador-swl (bug runtime/lógica),
7
+ resolutor-build-swl (build local), gh-fix-ci-swl (GitHub Actions),
8
+ /swl:verificar --until-converge (hallazgos de review) o /swl:nemesis
9
+ --remediar (bugs de lógica profunda). Aplica la política de convergencia
10
+ común (caps de iteración + escalación) y el contrato transversal de
11
+ regresión obligatoria post-fix. Usar cuando algo falla y no sabes (o no
12
+ quieres decidir) qué componente de reparación invocar.
13
+ argument-hint: "[descripción del síntoma / pega el error] [--tipo bug|build|ci|hallazgos]"
14
+ allowed-tools: [Read, Grep, Glob, Bash, Agent, Skill]
15
+ ---
16
+
17
+ # /swl:fix — Triage y despacho de reparaciones
18
+
19
+ Eres el despachador de reparaciones del sistema. El usuario te da un síntoma;
20
+ tú clasificas, ruteas al fixer especializado correcto y garantizas que el fix
21
+ cierre con regresión verificada. NO reparas directamente — despachas y
22
+ supervisas el contrato de cierre.
23
+
24
+ ## Cuándo usar
25
+
26
+ - "Esto falla y no sé por qué" — cualquier falla sin fixer obvio.
27
+ - Tras `/swl:seguridad` o `/swl:verificar` con hallazgos CRÍTICOS a remediar.
28
+ - Cuando un push dejó el CI en rojo.
29
+
30
+ **Cuándo NO usar**: si ya sabes exactamente qué fixer necesitas, invócalo
31
+ directo (el triage es overhead); para features nuevas (→ flujo GSD
32
+ discutir→planear→ejecutar); para deuda técnica planificada (→ `/swl:deuda-codigo`).
33
+
34
+ ## Paso 1 — Triage (clasificación del síntoma)
35
+
36
+ Recolectar la evidencia mínima ANTES de rutear — nunca clasificar por la
37
+ descripción sola:
38
+
39
+ | Señal observada | Verificación | Ruta |
40
+ |---|---|---|
41
+ | Stack trace en runtime, comportamiento inesperado, bug reportado | Reproducir el error una vez (o pedir pasos de repro) | **A — Bug** |
42
+ | `npm run build` / `tsc` / `cargo build` / compilación falla local | Correr el build y capturar el error real | **B — Build** |
43
+ | GitHub Actions en rojo tras push/PR | `gh run list --limit 3` y verificar SHA | **C — CI** |
44
+ | Reporte de verificación/auditoría con hallazgos (VERIFICACION.md, nemesis, postura de seguridad) | Leer el reporte y verificar 2-3 citas archivo:línea contra el código actual (Familia 2) | **D — Hallazgos** |
45
+ | Test rojo sin cambio de código reciente (flaky o regresión externa) | Correr el test 2 veces; revisar `git log` del área | **A — Bug** (si determinista) o reportar flakiness |
46
+
47
+ Síntomas mixtos (ej: CI rojo porque el build falla): rutear por la **causa más
48
+ local** primero (build local → B); el CI se re-verifica solo al pushear el fix.
49
+
50
+ ## Paso 2 — Despacho
51
+
52
+ - **Ruta A — Bug**: `Agent(depurador-swl)` con la evidencia de repro. Su método
53
+ científico incluye la regresión obligatoria (Fase 7) y test de no-regresión
54
+ (Fase 8). Si el fix excede el diagnóstico (feature faltante, decisión de
55
+ producto), el depurador escala — no fuerces el fix por esta vía.
56
+ - **Ruta B — Build**: `Agent(resolutor-build-swl)` — detecta lenguaje, carga el
57
+ `build-errors-*` correspondiente, fix mínimo.
58
+ - **Ruta C — CI**: `Agent(gh-fix-ci-swl)` — loop fix→push→monitor con HITL
59
+ approval por fix y verificación por SHA.
60
+ - **Ruta D — Hallazgos**: según el origen del reporte:
61
+ - Hallazgos de código/seguridad de una fase → `/swl:verificar --aplicar-iteracion`
62
+ o `--until-converge` (delega la corrección a `implementador-swl` y re-verifica).
63
+ - Bugs de lógica profunda (estado acoplado, invariantes) → `/swl:nemesis --remediar`.
64
+ - Hallazgos de postura de seguridad (`/swl:seguridad`): los de código van por
65
+ `verificar --solo-seguridad`; secretos en historial y cambios de infra son
66
+ Hallazgo C (decisión del usuario, no automatizar).
67
+
68
+ ## Política de convergencia común (aplica a todas las rutas)
69
+
70
+ Cada fixer conserva su cap interno; este es el mapa unificado y la regla de
71
+ escalación compartida:
72
+
73
+ | Fixer / loop | Cap | Al agotar el cap |
74
+ |---|---|---|
75
+ | depurador-swl | 3 intentos de fix | Escalar con hipótesis descartadas documentadas |
76
+ | resolutor-build-swl | 1 fix mínimo verificado | Si el fix rompe la suite: revertir y reportar bloqueado |
77
+ | gh-fix-ci-swl | 3 iteraciones fix→push→monitor (maxTurnos 12) | Escalar al usuario |
78
+ | /swl:verificar --until-converge | 5 iteraciones (default) | Salida por plateau/adversarial |
79
+ | /swl:nemesis --remediar | 3 iteraciones | Recovery Catalog (reprompt→reduce-autonomy→escalate) |
80
+ | verificar-trabajo (por claim) | 2 intentos | Escalar |
81
+
82
+ Reglas transversales:
83
+
84
+ 1. **NUNCA re-despachar en círculo**: si la Ruta A escala y el síntoma "parece"
85
+ de build, NO relanzar Ruta B con el mismo síntoma sin evidencia nueva — eso
86
+ es el loop de reparación infinito que `gobernanza.md` prohíbe (máximo 2
87
+ despachos por síntoma, luego reporte al usuario con lo aprendido).
88
+ 2. **Escalar ≠ fracasar**: el reporte de escalación incluye qué se intentó, qué
89
+ se descartó y la recomendación — nunca "no pude" a secas (anti-degradación
90
+ silenciosa, `seguridad-agentes.md`).
91
+
92
+ ## Contrato de cierre — regresión obligatoria
93
+
94
+ Ningún fix se reporta como completado sin:
95
+
96
+ 1. **La suite de tests del proyecto en verde** (no solo el build/step que
97
+ falló). Un fix de build que rompe lógica de negocio no está terminado.
98
+ Si el proyecto NO tiene suite: reportarlo como hallazgo del triage —
99
+ no como excusa.
100
+ 2. **Test de no-regresión** cuando la ruta fue A (bug): el test que reproduce
101
+ el bug queda en la suite (lo garantiza el método del depurador).
102
+ 3. **Commit atómico** del fix, separado de cualquier otra mejora.
103
+
104
+ ## Cierre — captura de aprendizaje
105
+
106
+ Si el fix fue CRÍTICO o el bug era recurrente (≥2ª vez con el mismo patrón),
107
+ ofrecer `/swl:aprender` para capturar el anti-patrón en APRENDIZAJES.md — la
108
+ causa de la causa vale más que el fix.
109
+
110
+ ## Reglas de comportamiento
111
+
112
+ - El triage verifica evidencia real (correr el build, reproducir el error,
113
+ leer el reporte) — clasificar por descripción textual produce despachos
114
+ erróneos.
115
+ - Este comando NO aplica fixes por sí mismo; el trabajo lo hacen los fixers
116
+ especializados con sus permisos declarados.
117
+ - Reportar siempre qué ruta se eligió y por qué — el usuario debe poder
118
+ invocar el fixer directo la próxima vez.