@saulwade/swl-ses 2.4.3 → 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 (197) 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 +713 -52
  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 +49 -56
  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/diary-entry.js +3 -1
  168. package/scripts/lib/drift-detector.js +1 -1
  169. package/scripts/lib/evidencia-valor.js +189 -0
  170. package/scripts/lib/expandir-targets.js +71 -71
  171. package/scripts/lib/frontmatter-md.js +63 -0
  172. package/scripts/lib/parsear-opciones.js +2 -0
  173. package/scripts/lib/prune-componentes.js +180 -0
  174. package/scripts/lib/reglas-globales-conocidas.json +16 -2
  175. package/scripts/lib/scoring-instintos.js +2 -2
  176. package/scripts/lib/toml-merge.js +204 -204
  177. package/scripts/lib/transformadores/claude.js +1 -1
  178. package/scripts/lib/transformadores/codex.js +1 -1
  179. package/scripts/lib/transformadores/copilot.js +1 -1
  180. package/scripts/lib/transformadores/cursor.js +1 -1
  181. package/scripts/lib/transformadores/gemini.js +22 -2
  182. package/scripts/lib/transformadores/opencode.js +1 -1
  183. package/scripts/mcp-server/auth.js +105 -105
  184. package/scripts/mcp-server/cache.js +106 -106
  185. package/scripts/prune.js +102 -0
  186. package/scripts/publicar.js +18 -2
  187. package/scripts/tui/pantallas/inspect.js +175 -175
  188. package/scripts/tui/pantallas/uninstall-wizard.js +210 -210
  189. package/scripts/tui/pantallas/update-wizard.js +234 -234
  190. package/scripts/tui/pantallas/welcome.js +189 -189
  191. package/habilidades/paid-media-tracking/SKILL.md +0 -269
  192. package/habilidades/paid-media-tracking/recursos/auditoria-tracking.md +0 -220
  193. package/habilidades/paid-media-tracking/recursos/google-ads-api.md +0 -215
  194. package/habilidades/tracking-measurement/SKILL.md +0 -239
  195. package/habilidades/tracking-measurement/recursos/consent-mode.md +0 -231
  196. package/habilidades/tracking-measurement/recursos/gtm-datalayer.md +0 -216
  197. package/habilidades/tracking-measurement/recursos/meta-capi.md +0 -262
@@ -0,0 +1,527 @@
1
+ # Verificar citas verificables — extendido
2
+
3
+ > Extendido de `reglas/verificar-citas-normativas.md` (Fase D, dieta de contexto).
4
+ > El núcleo instalado en `~/.claude/rules/` es la norma vigente; este archivo trae
5
+ > los protocolos completos, ejemplos y casos de origen.
6
+
7
+ ## Índice
8
+
9
+ - [Qué cuenta como "cita verificable"](#qué-cuenta-como-cita-verificable)
10
+ - [Cómo verificar — protocolo obligatorio](#cómo-verificar--protocolo-obligatorio)
11
+ - [Protocolo para citas archivo:línea en reportes](#protocolo-para-citas-archivolínea-en-reportes)
12
+ - [Pattern de redacción cuando NO hay cita verificada](#pattern-de-redacción-cuando-no-hay-cita-verificada)
13
+ - [Anti-patrones explícitos](#anti-patrones-explícitos)
14
+ - [Excepciones legítimas](#excepciones-legítimas)
15
+ - [Familia 2 extendida — reportes COMPACTACION.md y status reports SWL](#familia-2-extendida--reportes-compactacionmd-y-status-reports-swl)
16
+ - [Familia 2 extendida — comentarios temporales en código](#familia-2-extendida--comentarios-temporales-en-código)
17
+ - [Origen de esta regla](#origen-de-esta-regla)
18
+ - [Checklists](#checklist-antes-de-escribir-una-cita-verificable-familia-1)
19
+
20
+ ---
21
+
22
+ ## Qué cuenta como "cita verificable"
23
+
24
+ ### Familia 1 — citas normativas / legales / documentales
25
+
26
+ OBLIGATORIO verificar antes de escribir:
27
+
28
+ - Artículo numerado de una norma: "Art. 23 RINEMAABMS", "Art. 30 LGCG",
29
+ "Art. 134 CPEUM", "fracción IV del Art. 17", etc.
30
+ - Número de RFC / ISO / IEEE: "RFC 7231", "ISO/IEC 27001", "IEEE 802.11n".
31
+ - Sección de un estándar: "OWASP Top 10 A03", "WCAG 2.1 SC 1.4.3", "NIST
32
+ SP 800-63".
33
+ - Nombre de catálogo, programa o acuerdo oficial: "PAAASINE-INE", "PAF",
34
+ "Acuerdo INE/CG2024/15".
35
+ - Atribución de fundamento normativo a un dato/tabla/módulo: "según
36
+ Art. X de la norma Y".
37
+ - Fechas y números de páginas de documentos oficiales: "actualización
38
+ julio 2017, 71 páginas".
39
+ - Citas textuales entre comillas atribuidas a un documento concreto.
40
+
41
+ Las normas mexicanas (RINEMAABMS, LGCG, LAASSP, CONAC, Constitución, leyes
42
+ generales) y los estándares técnicos (RFC, ISO, OWASP, WCAG) son tentadores
43
+ para confabular contextos plausibles.
44
+
45
+ ### Familia 2 — citas técnicas archivo:línea
46
+
47
+ OBLIGATORIO verificar antes de escribir o de aceptar como base para acción:
48
+
49
+ - Ubicación específica de un bug, hallazgo o evidencia:
50
+ `auth/service.py:191-243`, `schema.sql:438-451`, `repository.py:1260`.
51
+ - Atribución de un fragmento de código a un archivo: "la función `foo`
52
+ en `bar/baz.ts:42` hace X".
53
+ - Cita textual de líneas de código incluidas en un reporte: si el reporte
54
+ pega 4 líneas como evidencia, esas 4 líneas deben coincidir letra por
55
+ letra con el archivo en el HEAD actual del repo.
56
+ - Citas dentro de reportes de auditoría externa, nemesis, code review,
57
+ análisis de seguridad, post-mortems, RCAs, hallazgos consolidados
58
+ (incluyendo los que tú mismo emites).
59
+ - Conclusiones derivadas de una cita: "es bug porque X:42 ignora Y" —
60
+ hay que confirmar primero que X:42 realmente hace lo que el reporte
61
+ dice.
62
+ - Citas en commit messages, PR descriptions o issues que pretenden ser
63
+ evidencia accionable.
64
+
65
+ Las citas archivo:línea generadas por otros agentes son tentadoras para
66
+ aceptar sin verificar — vienen con apariencia de evidencia "ya hecha".
67
+
68
+ NO requiere verificación previa:
69
+
70
+ - Conceptos genéricos del dominio sin atribución a artículo específico
71
+ ("auditoría interna", "contratación pública", "expediente de
72
+ contratación").
73
+ - Conocimiento técnico estable sin cita numérica ("SQL injection",
74
+ "OAuth2 flow", "JWT").
75
+ - Descripciones funcionales del propio código que estás editando en
76
+ ese momento.
77
+ - Referencias a archivos sin número de línea cuando solo se discute la
78
+ existencia, no el contenido ("el módulo `auth/` está implementado").
79
+
80
+ ---
81
+
82
+ ## Cómo verificar — protocolo obligatorio
83
+
84
+ ### Paso 1: identificar la fuente potencial
85
+
86
+ Antes de escribir la cita, identifica de dónde podría salir:
87
+
88
+ - Seeds del proyecto: `grep -rn "TEXTO_CITA" backend/app/seeds/`
89
+ - Modelos / docstrings: `grep -rn "TEXTO_CITA" backend/app/modules/`
90
+ - Documentación normativa: `grep -rn "TEXTO_CITA" referencia/normativa/`
91
+ - ADRs: `grep -rn "TEXTO_CITA" docs/adr/`
92
+ - README, CHANGELOG, planning: `grep -rn "TEXTO_CITA" docs/`
93
+
94
+ ### Paso 2: ejecutar la búsqueda
95
+
96
+ Usar `grep` con el patrón exacto de lo que vas a escribir:
97
+
98
+ ```bash
99
+ # Verificar "Art. 23 RINEMAABMS"
100
+ grep -rin "art.*23.*rinemaabms\|rinemaabms.*art.*23" path/
101
+
102
+ # Verificar nombre de catálogo
103
+ grep -rin "clasif" referencia/normativa/
104
+
105
+ # Verificar número RFC
106
+ grep -rin "RFC 7231" .
107
+ ```
108
+
109
+ ### Paso 3: leer la fuente original
110
+
111
+ Si grep devuelve coincidencias, abrir el archivo con `Read` y verificar
112
+ que el contexto sí respalda la cita. Una coincidencia léxica no es prueba
113
+ suficiente — el contexto puede ser opuesto al que asumes.
114
+
115
+ ### Paso 4: decidir
116
+
117
+ - **Si la fuente confirma la cita**: escríbela con el contenido que dice
118
+ textualmente el origen.
119
+ - **Si la fuente dice algo parecido pero distinto**: usa el wording real
120
+ del origen, no el que recuerdes de memoria.
121
+ - **Si no hay fuente**: NO escribas la cita. Sustituye por descripción
122
+ neutra sin atribución, o pide al usuario la cita exacta.
123
+
124
+ ---
125
+
126
+ ## Protocolo para citas archivo:línea en reportes
127
+
128
+ Cuando trabajas con un reporte que cita ubicaciones del codebase (auditoría
129
+ nemesis, hallazgos de revisor-seguridad-swl, output de revisor-codigo-swl,
130
+ informe externo, RCA, post-mortem, hallazgo del usuario):
131
+
132
+ ### Paso 1: clasificar las citas
133
+
134
+ Lista cada `archivo:línea` mencionada y clasifícala:
135
+
136
+ - **Crítica accionable** — bug que se va a remediar, hallazgo que se va a
137
+ priorizar, evidencia que se va a citar en un commit o PR. OBLIGATORIO
138
+ verificar.
139
+ - **Contextual** — mención de paso en un párrafo sin que ninguna acción
140
+ dependa de su exactitud. Verificación opcional pero recomendada al
141
+ primer hallazgo crítico que la cite indirectamente.
142
+
143
+ ### Paso 2: muestreo mínimo verificable
144
+
145
+ Si el reporte tiene N citas críticas, verificar como mínimo:
146
+
147
+ - **Las top 4-6 acciones priorizadas** del reporte (P1 / críticas).
148
+ - **Cualquier cita con número exacto de líneas** (`:191-243`, `:438-451`)
149
+ — porque exactitud específica es la más propensa a confabulación.
150
+ - **Cualquier hallazgo etiquetado "regresión", "latente" o "extra"** —
151
+ porque suelen detectarse de carambola y son los más frágiles.
152
+ - **Cualquier cita que contradiga decisiones documentadas** — un reporte
153
+ que dice "esto está mal" sobre algo que un ADR / APRENDIZAJES dice
154
+ "esto se decidió así" requiere verificación dura antes de actuar.
155
+
156
+ ### Paso 3: verificar con `Read` y `grep`, no asumir
157
+
158
+ Para cada cita crítica:
159
+
160
+ ```bash
161
+ # Verificar que las líneas existen y dicen lo que el reporte dice
162
+ Read file_path="<archivo>" offset=<inicio-2> limit=<rango+4>
163
+
164
+ # Buscar evidencia complementaria (¿hay más sitios con el mismo patrón?)
165
+ grep -rn "<patrón>" backend/app/ --include="*.py"
166
+ ```
167
+
168
+ Una afirmación del tipo "X:42 ignora la validación" debe verificarse
169
+ leyendo X:42 directamente. Si el reporte cita 4 líneas como evidencia,
170
+ las 4 líneas deben coincidir con el archivo en el HEAD actual.
171
+
172
+ ### Paso 4: detectar gaps del reporte
173
+
174
+ Aprovechar la verificación para detectar lo que el reporte NO dice:
175
+
176
+ - **Sweep por patrón**: si el reporte cita un bug en `X.py:1260` por usar
177
+ `u.col_inexistente`, hacer `grep -rn "u\.col_inexistente"` en TODO el
178
+ módulo para descartar regresiones adicionales. Los reportes suelen
179
+ parar en el primer hallazgo del patrón.
180
+ - **Búsqueda inversa**: si el reporte dice "RESUELTO en commit Y",
181
+ verificar que el commit realmente toca el archivo citado.
182
+ - **Evidencia complementaria**: si el reporte cita una columna SQL,
183
+ verificar el `CREATE TABLE` del schema correspondiente. La doble
184
+ evidencia (código + schema) refuerza o refuta el hallazgo.
185
+
186
+ ### Paso 5: separar lo verificado de lo no verificado
187
+
188
+ Al re-emitir conclusiones a partir del reporte:
189
+
190
+ - **Marca explícitamente qué citas verificaste personalmente** vs. qué
191
+ citas reproducís sin re-verificar.
192
+ - **NO presentes el reporte como si fuera tu análisis directo** si no
193
+ lo verificaste. Es propagación de cita ajena, no análisis propio.
194
+ - **Si el reporte tiene 11 acciones y solo verificaste 6**, dilo así.
195
+ "Verifiqué 6/11; las 5 restantes asumo correctas por consistencia
196
+ metodológica con las que sí verifiqué" es honesto. "Las 11 acciones
197
+ están confirmadas" cuando solo viste 6 es propagación deshonesta.
198
+
199
+ ---
200
+
201
+ ## Pattern de redacción cuando NO hay cita verificada
202
+
203
+ En vez de inventar fundamento normativo:
204
+
205
+ - "Documento oficial INE, actualización julio 2017" (cita textual del seed).
206
+ - "Catálogo administrativo interno" (descripción neutra).
207
+ - "Definido por el equipo de proyecto" (atribución honesta sin invento).
208
+ - Sin cualquier cita ni atribución (preferible a inventar).
209
+
210
+ NUNCA:
211
+
212
+ - "Art. X de Y" sin verificación.
213
+ - "Catálogo oficial Z" sin verificación.
214
+ - "Conforme a la sección N del estándar" sin verificación.
215
+
216
+ ---
217
+
218
+ ## Anti-patrones explícitos
219
+
220
+ ### Confabulación plausible
221
+
222
+ Inventar una cita que suena correcta porque el contexto sugiere que
223
+ podría existir. Ejemplo real (SIGAF, 2026-05-13): asocié "Art. 23
224
+ RINEMAABMS" como fundamento del Clasificador de Gasto del INE porque
225
+ RINEMAABMS regula contratación INE y el Art. 23 trata adquisiciones —
226
+ plausible pero falso. El seed `07_clasificador_gasto.sql` no menciona
227
+ ningún artículo, solo cita "Documento oficial INE, actualización julio
228
+ 2017, 71 páginas".
229
+
230
+ ### Asociación incorrecta entre instrumento y catálogo
231
+
232
+ Confundir un programa de planeación con un catálogo de clasificación.
233
+ Ejemplo: presentar "PAAASINE" (Programa Anual de Adquisiciones del INE,
234
+ instrumento de planeación) como si fuera el "catálogo oficial" del
235
+ Clasificador de Gasto. Son cosas distintas en el dominio.
236
+
237
+ ### Cita por intuición de memoria del modelo
238
+
239
+ Atribuir contenido a un artículo o estándar porque "lo aprendí en el
240
+ entrenamiento". El conocimiento de entrenamiento sobre normas mexicanas
241
+ específicas, especialmente las del INE/OIC y reglamentos administrativos,
242
+ es alto en confabulación. Trata cada cita normativa como si NO lo supieras
243
+ hasta que el grep al proyecto lo confirme.
244
+
245
+ ### Cita por inferencia transitiva
246
+
247
+ "Si la norma X regula Y, entonces la cita debe ser Art. N de X". No.
248
+ La transición lógica no es prueba documental.
249
+
250
+ ### Cita "para dar peso"
251
+
252
+ Inventar fundamento normativo para hacer ver la UI/docs como más
253
+ profesional o jurídicamente sólida. Una cita falsa es peor que ninguna
254
+ cita — destruye la confianza del usuario en TODO lo demás que escribiste.
255
+
256
+ ### Aceptar reporte ajeno sin re-verificar evidencia
257
+
258
+ Recibir un reporte de auditoría / nemesis / revisor con citas
259
+ archivo:línea y proceder a priorizar, planear remediación o re-emitir
260
+ las conclusiones SIN haber hecho `Read` ni `grep` sobre las citas
261
+ críticas. El reporte puede:
262
+
263
+ - Tener una cita correcta en archivo pero incorrecta en número de línea
264
+ (el código se movió post-reporte).
265
+ - Tener una cita totalmente inventada por confabulación del agente que
266
+ lo produjo.
267
+ - Estar desactualizado: el bug citado ya se cerró en un commit posterior.
268
+ - Confundir dos archivos similares (`router.py` de módulo A con
269
+ `router.py` de módulo B).
270
+
271
+ Propagar el reporte como si fuera tu análisis directo es deshonesto y
272
+ multiplica el costo del error. La verificación de las top 4-6 citas
273
+ críticas toma 5-10 minutos y separa lo verificado de lo asumido.
274
+
275
+ ### Sweep parcial cuando el patrón sugiere más sitios
276
+
277
+ Verificar la cita exacta del reporte (`X.py:1260`) y detenerse ahí
278
+ cuando el bug es **un patrón** (uso de columna inexistente, llamada a
279
+ función deprecada, falta de validación). Los reportes de auditoría
280
+ suelen parar en el primer hallazgo del patrón. Si verificaste que
281
+ `u.col_inexistente` está mal en `X.py:1260`, ejecuta `grep -rn` sobre
282
+ toda la base para encontrar los hermanos antes de marcar el hallazgo
283
+ como cerrado.
284
+
285
+ ### "El reporte ya lo verificó"
286
+
287
+ Falacia. Un reporte declara haber verificado, no demuestra haber
288
+ verificado. Si vas a actuar sobre la cita, tu firma vale lo que
289
+ verificaste personalmente — no lo que el reporte afirma haber hecho.
290
+
291
+ ---
292
+
293
+ ## Excepciones legítimas
294
+
295
+ NO aplica la regla cuando:
296
+
297
+ 1. **El usuario dictó la cita explícitamente**: si el usuario escribe
298
+ "agrega que esto es por el Art. 23 RINEMAABMS", asume que el usuario
299
+ verificó. Pero si la cita parece dudosa, repregunta.
300
+ 2. **La cita ya existe en el codebase verificado**: si encuentras "Art.
301
+ 23 RINEMAABMS" ya escrito en un docstring del modelo, puedes
302
+ reutilizarlo en UI sin re-verificar la fuente externa (asumes que
303
+ alguien antes la verificó).
304
+ 3. **Conceptos canónicos sin atribución específica**: "auditoría",
305
+ "expediente", "contratación" — no requieren cita.
306
+ 4. **Citas de standards técnicos universalmente conocidos sin número**:
307
+ "OWASP", "WCAG" sin sub-versión. Si pones "WCAG 2.1 SC 1.4.3" sí
308
+ aplica la regla.
309
+ 5. **Cita archivo:línea producida por TU MISMO en ESTE turno** sobre un
310
+ archivo que acabas de leer con `Read` en este mismo turno. La
311
+ evidencia es directa, no necesita re-verificación.
312
+ 6. **Reporte ajeno que solo vas a leer / archivar / referenciar como
313
+ contexto histórico** sin tomar acción. La verificación se activa
314
+ cuando vas a priorizar, remediar, propagar o concluir a partir del
315
+ reporte.
316
+
317
+ ---
318
+
319
+ ## Familia 2 extendida — reportes COMPACTACION.md y status reports SWL
320
+
321
+ Los reportes generados por `/swl:compactar` (Delta vN en `.planning/COMPACTACION.md`),
322
+ `/swl:checkpoint` (continue-here.md), y similares **son también sub-productos
323
+ verificables**. El agente que los escribió puede sintetizar afirmaciones cuantitativas
324
+ sin re-verificar contra `git`/`pytest`/`grep`, y el agente que los lee después
325
+ hereda los errores si los acepta como base para decisiones.
326
+
327
+ ### Cuándo aplica
328
+
329
+ OBLIGATORIO verificar antes de tomar acción sobre afirmaciones cuantitativas
330
+ extraídas de:
331
+
332
+ - `COMPACTACION.md` Delta vN (la última sección de cierre de sesión).
333
+ - `RESUMEN.md` de fase (conteos de archivos, commits, slices).
334
+ - `ESTADO.md` (DT activas, OP pendientes, fases completadas).
335
+ - `continue-here.md` (commits pendientes, archivos sin terminar).
336
+ - Reportes de auditoría con cifras agregadas ("N hallazgos críticos resueltos").
337
+
338
+ ### Verificaciones rápidas obligatorias
339
+
340
+ Cuando un reporte declara una cifra accionable, ejecutar la primitiva equivalente
341
+ ANTES de basar decisiones en ella:
342
+
343
+ | Afirmación del reporte | Verificación |
344
+ |---|---|
345
+ | "N commits sin push" | `git log origin/main..HEAD --oneline \| wc -l` |
346
+ | "N archivos modificados" | `git diff --stat HEAD~M..HEAD \| tail -1` |
347
+ | "N DT activas" | `grep -cE "^### (DT\|DA\|OP)-" .planning/DEUDAS.md` (sección Activas) |
348
+ | "N tests verdes" | output reciente de `pytest --co -q` o último run de CI |
349
+ | "Fase N completada" | revisar `NN-CIERRE.md` y commits asociados, no solo el reporte |
350
+ | "Cobertura X%" | re-ejecutar `coverage report` si la cifra es relevante para decisión |
351
+
352
+ ### Caso real (origen — sesión SIGM 2026-05-21)
353
+
354
+ El reporte v10 de COMPACTACION.md afirmó:
355
+
356
+ > "Trabajo pendiente mapeado: 11 commits acumulados sin push"
357
+
358
+ Verificación con `git log origin/main..HEAD --oneline | wc -l` retornó **2**.
359
+ Los otros 9 commits ya estaban en `origin/main`; el fetch falló por red pero la
360
+ referencia local seguía válida. Si el siguiente turno hubiera aceptado el dato
361
+ como cierto, habría "esperado créditos GH para pushear 11" sin necesidad.
362
+
363
+ Lección: el reporte de compactación es un artefacto de prosa con cifras — NO
364
+ es la fuente de verdad. La fuente es el filesystem + git + el output de las
365
+ herramientas. Tres segundos de `git log origin/main..HEAD` previenen propagación
366
+ de error.
367
+
368
+ ### Anti-patrón específico
369
+
370
+ - **Aceptar el reporte v10 (o vN) tras `/compact` como base de decisiones**: el
371
+ reporte fue escrito por el agente al cerrar contexto, sin re-verificar. Tras
372
+ la compactación, el agente NUEVO lo lee con confianza por defecto y propaga
373
+ cualquier desalineación. Aplicar Familia 2: verificar 2-3 cifras críticas
374
+ del reporte contra git/pytest/grep antes de planificar la siguiente acción.
375
+
376
+ ---
377
+
378
+ ## Familia 2 extendida — comentarios temporales en código
379
+
380
+ (Absorbe la regla `verificar-citas-temporales.md`, unificada aquí el 2026-06-11
381
+ porque su propio texto se declaraba extensión de esta Familia 2.)
382
+
383
+ > Un comentario en código que afirma alineación con otro commit, versión o
384
+ > contrato (`// Alineado con commits X+Y`, `// Refactorizado a vN.M.0`,
385
+ > `# Sincronizado con backend`, `<!-- Coherente con schema X -->`) **NO es
386
+ > verificación** — es afirmación temporal sin prueba. Antes de actuar sobre el
387
+ > comentario como si fuera evidencia, verificar contra la fuente real con
388
+ > `grep` / `Read` / `git show`.
389
+
390
+ El comentario puede haberse desactualizado silenciosamente si el commit
391
+ referenciado se revirtió, nunca se aplicó, o el refactor citado cambió después.
392
+
393
+ **Cuándo aplica**: comentarios que afirman alineación cross-stack o con commits,
394
+ versiones, schemas. NO aplica a comentarios de intención, `TODO`/`FIXME` con
395
+ ticket, ni explicaciones del POR QUÉ.
396
+
397
+ **Cómo verificar**: identificar QUÉ se afirma alineado → `git show <SHA> --
398
+ <archivo>` o `grep` del campo clave en ambos stacks → comparar campo por campo.
399
+ Si hay drift, NO confiar en el comentario: actualizarlo o eliminarlo en el mismo
400
+ commit (un comentario stale es peor que ninguno).
401
+
402
+ **Alternativas seguras** al comentario temporal: test de contrato en CI (en vez
403
+ de `// Alineado con commits X+Y`), versión semántica + lock (en vez de
404
+ `// Refactorizado a vN`), tipos generados/codegen (en vez de `# Sincronizado con
405
+ backend`), validador en pre-commit (en vez de `<!-- Coherente con schema -->`).
406
+ Si el comentario es la única opción, incluir **fecha y SHA explícitos** y la
407
+ condición de re-verificación.
408
+
409
+ **Caso de origen** (SIGAF 2026-05-22): `contrato.models.ts:2` decía "Alineados
410
+ con el backend refactorizado (commits 284df74 + 5869ac9)" pero el backend nunca
411
+ aplicó ese refactor; Pydantic con `extra=ignore` descartaba 5 campos en
412
+ silencio y los contratos se crearon sin monto ni vigencia durante semanas. El
413
+ comentario funcionó como falso anclaje de confianza para los reviewers.
414
+
415
+ **Anti-patrones**: confiar en el comentario en code review sin `git show`;
416
+ propagarlo en refactors (viaja con el copy-paste hasta volverse falso); no
417
+ actualizarlo al revertir el commit citado; usarlo como "prueba" en debates
418
+ técnicos.
419
+
420
+ ---
421
+
422
+ ## Origen de esta regla
423
+
424
+ ### Origen Familia 1 — citas normativas (versión inicial)
425
+
426
+ Sesión 2026-05-13, proyecto SIGAF. Durante implementación del refactor
427
+ ADR-076 F4 del form de Nuevo Expediente, agregué como fundamento del
428
+ catálogo "Clasificador por objeto y tipo de gasto para el INE" la cita
429
+ "Art. 23 RINEMAABMS · catálogo oficial PAAASINE-INE" sin haberla
430
+ verificado en ningún archivo del proyecto. Era plausible (RINEMAABMS
431
+ regula contratación INE; PAAASINE es el programa anual de adquisiciones)
432
+ pero ambas atribuciones eran falsas:
433
+
434
+ - El modelo `CatClasificadorGasto` y el seed `07_clasificador_gasto.sql`
435
+ no mencionan ningún artículo del RINEMAABMS.
436
+ - El seed cita textualmente "Documento oficial INE, actualización julio
437
+ 2017, 71 páginas" como fuente — sin asociarlo a artículo legal.
438
+ - PAAASINE es un instrumento de planeación, no un catálogo de
439
+ clasificación. Conceptualmente distintos.
440
+
441
+ El usuario detectó la alucinación al verificar el SQL de referencia y
442
+ pidió analizarla. La regla se promueve a global porque el patrón puede
443
+ repetirse en cualquier proyecto del usuario que toque normas mexicanas o
444
+ estándares técnicos numerados — el sesgo de confabulación plausible no es
445
+ específico de SIGAF.
446
+
447
+ Commit donde se corrigió la alucinación original: `f2b025a` en SIGAF.
448
+
449
+ ### Extensión Familia 2 — citas archivo:línea en reportes
450
+
451
+ Sesión 2026-05-16, proyecto SIGM. El usuario pidió analizar un reporte
452
+ de auditoría nemesis con 16 hallazgos (F-01 a F-16) más 3 hallazgos
453
+ heredados (H5.A1, H5.A2, H3.1), todos con citas `archivo:línea`
454
+ específicas (`auth/service.py:191-243`, `dependencies.py:73-78`,
455
+ `database/init/init.sh`, `catastro/repository.py:1260`, etc.).
456
+
457
+ Detecté que aceptar el reporte sin verificar habría sido propagación
458
+ de cita ajena. Apliqué el principio de la regla original adaptado al
459
+ dominio técnico: cada cita crítica priorizada (top 6) se verificó con
460
+ `Read` + `grep` contra el código real antes de re-emitir conclusiones.
461
+
462
+ Resultado: 6/6 hallazgos top verificados al 100%, con **evidencia
463
+ adicional** que el reporte no había detallado:
464
+
465
+ - F-04 lockout: además del backend que no escribe `intentos_fallidos`,
466
+ el schema declara `CHECK (intentos_fallidos >= 0 AND intentos_fallidos
467
+ <= 10)` — el tope de 10 es invariante de la BD, doble confirmación.
468
+ - Regresión `u.nombre_completo`: el reporte citó 2 sitios; la
469
+ verificación con `grep -n "u.nombre_completo"` reveló que **podían
470
+ haber más** y el reporte no había hecho sweep global.
471
+
472
+ Esa última observación se promueve a sub-regla operativa (Paso 4
473
+ del protocolo archivo:línea: detectar gaps del reporte con sweep por
474
+ patrón).
475
+
476
+ La adaptación se fusiona en esta regla en lugar de crear una nueva
477
+ porque el principio es idéntico — solo cambia el dominio de la cita
478
+ (normativa vs. archivo:línea). Mantener una sola regla evita
479
+ duplicación operativa y refuerza que el origen del riesgo es siempre el
480
+ mismo: una afirmación con apariencia de evidencia que en realidad no
481
+ se verificó.
482
+
483
+ ### Extensión Familia 2 — reportes COMPACTACION.md (2026-05-21)
484
+
485
+ Sesión SIGM 2026-05-21. Tras `/swl:compactar` v10, el reporte declaró
486
+ "11 commits acumulados sin push". Verificación con
487
+ `git log origin/main..HEAD --oneline | wc -l` retornó **2**. El reporte se
488
+ escribió desde la perspectiva del agente al cerrar contexto, sin re-verificar
489
+ contra `origin/main` (que sigue local actualizada incluso con `git fetch`
490
+ fallando por red).
491
+
492
+ La adaptación se incorpora como sub-sección "Familia 2 extendida — reportes
493
+ COMPACTACION.md y status reports SWL" arriba, no como Familia 3 separada. El
494
+ principio es el mismo: afirmación cuantitativa en un reporte = sub-producto
495
+ verificable. Cambia el dominio (compactación SWL vs. nemesis auditorías), no
496
+ el protocolo.
497
+
498
+ Lección operativa: las 3 cifras que más se desalinean tras un `/compact` son
499
+ "commits sin push" (depende de fetch reciente), "DT activas" (depende del
500
+ último Edit de DEUDAS.md vs lo que la prosa del reporte describe) y "tests
501
+ verdes" (depende del último run de CI vs lo que el agente recuerda). Verificar
502
+ esas 3 antes de decidir siguiente acción.
503
+
504
+ ---
505
+
506
+ ## Checklist antes de escribir una cita verificable (Familia 1)
507
+
508
+ - [ ] ¿La cita tiene un número, artículo, fracción o referencia
509
+ específica?
510
+ - [ ] ¿Ejecuté `grep` o `Read` sobre la fuente real del proyecto?
511
+ - [ ] ¿La fuente respalda textualmente la cita?
512
+ - [ ] Si no respalda: ¿sustituí por descripción neutra o eliminé la cita?
513
+ - [ ] Si no encontré fuente y el usuario no la dictó: ¿pregunté al
514
+ usuario por la cita exacta antes de inventarla?
515
+
516
+ ## Checklist antes de aceptar o re-emitir una cita archivo:línea (Familia 2)
517
+
518
+ - [ ] ¿Identifiqué cuáles citas del reporte son críticas accionables vs.
519
+ contextuales?
520
+ - [ ] ¿Hice `Read` sobre cada cita crítica priorizada (top 4-6)?
521
+ - [ ] ¿El archivo:línea citado dice textualmente lo que el reporte afirma?
522
+ - [ ] ¿Hice sweep por patrón (`grep -rn`) para detectar hermanos del bug
523
+ que el reporte no listó?
524
+ - [ ] ¿Verifiqué evidencia complementaria (schema, ADRs, commits citados)
525
+ antes de aceptar el hallazgo?
526
+ - [ ] Al re-emitir conclusiones: ¿marqué explícitamente qué citas
527
+ verifiqué vs. cuáles reproduzco sin verificar?
@@ -9,7 +9,7 @@ description: >
9
9
  idiomas de framework y mapeo a frameworks de seguridad. Cargar cuando se
10
10
  esté escribiendo o auditando un SKILL.md y se necesiten patrones avanzados
11
11
  que no están en la regla core.
12
- version: "1.1.2"
12
+ version: "1.1.3"
13
13
  herramientasPermitidas: [Read, Write, Edit]
14
14
  exclusiones:
15
15
  - "No cargar si solo se necesita el frontmatter obligatorio, el límite de líneas o la estructura de directorio — eso está en la regla core `reglas/skills-estandar.md` que se carga siempre."
@@ -281,6 +281,8 @@ al caso en cuestión en lugar de los tres.
281
281
 
282
282
  ## Gotchas / Errores comunes no obvios
283
283
 
284
+ - **Parser de frontmatter línea-a-línea devuelve el literal `">"` para escalares plegados (`description: >`)** [caso real 2026-07-08: `generar-inventario.js` recolectó descriptions inutilizables desde su origen — código muerto que delató el bug al intentar consumirlas]: casi todos los componentes SWL usan `description: >` multilínea; un parser casero que solo hace `split(':')` por línea captura el indicador YAML, no el contenido. Solución canónica: `scripts/lib/frontmatter-md.js` (`leerFrontmatter` junta las líneas indentadas siguientes cuando el valor es `>`, `|`, `>-`, `|-` o vacío). Todo script nuevo que lea frontmatter DEBE usar esa lib, no reimplementar el parseo. Síntoma de detección: campos que "existen" pero valen `">"` o cadena vacía en el output.
285
+
284
286
  - **Confundir Response Discipline con skills de dominio conceptual**: aplicar
285
287
  el patrón "command-first" a un skill de patrones de diseño produce respuestas
286
288
  truncadas sin contexto. Response Discipline SOLO aplica a skills que
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: nuevo-proyecto
3
3
  description: Flujo para inicializar un proyecto de software nuevo. Recopila visión, restricciones técnicas y de negocio, stack tecnológico y contexto del equipo. Genera la carpeta .planning/ con PROYECTO.md, REQUISITOS.md y HOJA-RUTA.md como artefactos de arranque.
4
- version: "1.0.0"
4
+ version: "1.1.0"
5
5
  herramientasPermitidas: [Read, Write, Edit, Bash, Glob, Grep]
6
6
  exclusiones:
7
7
  - "No cargar para incorporar un proyecto existente al sistema SWL; usar el comando `/swl:adoptar-proyecto`."
@@ -184,8 +184,13 @@ en cada sesión futura sobre este proyecto.
184
184
 
185
185
  > Sigue las best practices del video oficial Anthropic
186
186
  > ("The CLAUDE.md file"): empieza compacto, deja que el archivo crezca con
187
- > correcciones explícitas. Las cinco secciones canónicas son:
188
- > Stack / Comandos / Code style / Conventions / @references.
187
+ > correcciones explícitas. El **contrato mínimo auditado** (el que verifica
188
+ > `auditar-claudemd.js`) son 4 secciones: Stack / Comandos / Code style /
189
+ > Conventions — más `@references`. Las secciones Testing / Security /
190
+ > Git Workflow del contrato completo (`Skill("estructura-proyecto-claude")`,
191
+ > 7 secciones) se agregan SOLO cuando el cuestionario capturó contenido real
192
+ > para ellas (preguntas 13, 14 y 15) — una sección de seguridad genérica sin
193
+ > política del proyecto es relleno.
189
194
 
190
195
  ### Plantilla mínima: `./CLAUDE.md` del proyecto
191
196
 
@@ -222,6 +227,18 @@ Usa los datos del Bloque B (stack) y del Bloque C (equipo, repo) del cuestionari
222
227
  - [Patrones a preferir: ej. "preferir async sobre callbacks"]
223
228
  - [Restricciones del Bloque B8 si son operativas]
224
229
 
230
+ ## Testing <!-- SOLO si la pregunta 13 capturó política de tests -->
231
+
232
+ - [tipos de test requeridos, framework, cómo correrlos, cobertura mínima]
233
+
234
+ ## Security <!-- SOLO si la pregunta 14 capturó requisitos de seguridad/cumplimiento -->
235
+
236
+ - [estándar regulatorio aplicable (PII/HIPAA/PCI-DSS), reglas del proyecto]
237
+
238
+ ## Git Workflow <!-- SOLO si la pregunta 15 capturó convenciones de git -->
239
+
240
+ - [branch strategy, formato de commits, reglas de PR]
241
+
225
242
  ## @references
226
243
 
227
244
  - `@.planning/PROYECTO.md` — visión, objetivos del MVP, criterios de éxito
@@ -2,9 +2,12 @@
2
2
  name: php-experto
3
3
  description: >
4
4
  PHP moderno con Laravel: Service Container, Eloquent ORM, Form Requests,
5
- API Resources, Events, Jobs/Queues, Middleware y Sanctum. Cargar cuando
6
- se implementen APIs Laravel, modelos Eloquent, jobs asíncronos o autenticación.
7
- version: "1.0.0"
5
+ API Resources, Events, Jobs/Queues, Middleware y Sanctum. Incluye Laravel
6
+ Filament v3 (paneles admin: formularios con Tabs/Grid, Infolist, Tables con
7
+ filtros y bulk actions) en recursos/filament-admin.md. Cargar cuando se
8
+ implementen APIs Laravel, modelos Eloquent, jobs asíncronos, autenticación
9
+ o paneles de administración Filament.
10
+ version: "1.1.0"
8
11
  herramientasPermitidas: [Read, Grep]
9
12
  exclusiones:
10
13
  - "No cargar para diseñar patrones Laravel (Action classes, DTOs readonly, Pipeline) — para diseño cargar `php-patrones`."
@@ -29,6 +32,10 @@ Invoca `Skill("php-experto")` cuando:
29
32
  - Se creen Jobs, Events o Listeners
30
33
  - Se configure autenticación con Laravel Sanctum
31
34
  - Se implementen Artisan commands custom
35
+ - Se construya o rediseñe un panel admin con **Filament v3** — leer
36
+ [recursos/filament-admin.md](recursos/filament-admin.md) (jerarquía de UX,
37
+ Tabs/Grid, Infolist, Tables con filtros/bulk actions, Repeater y gotchas de
38
+ producción como `searchDebounce` y bulk actions paginadas)
32
39
 
33
40
  ## Cuándo NO cargar
34
41