@saulwade/swl-ses 2.3.0 → 2.3.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 (303) hide show
  1. package/CLAUDE.md +47 -6
  2. package/README.md +1 -1
  3. package/agentes/accesibilidad-wcag-swl.md +690 -690
  4. package/agentes/arquitecto-swl.md +267 -267
  5. package/agentes/auto-evolucion-swl.md +908 -908
  6. package/agentes/backend-api-swl.md +472 -472
  7. package/agentes/backend-csharp-swl.md +420 -420
  8. package/agentes/backend-go-swl.md +390 -390
  9. package/agentes/backend-java-swl.md +281 -281
  10. package/agentes/backend-node-swl.md +479 -479
  11. package/agentes/backend-python-swl.md +605 -605
  12. package/agentes/backend-rust-swl.md +364 -364
  13. package/agentes/backend-workers-swl.md +482 -482
  14. package/agentes/cloud-infra-swl.md +509 -509
  15. package/agentes/consolidador-swl.md +541 -541
  16. package/agentes/datos-swl.md +605 -605
  17. package/agentes/depurador-swl.md +352 -352
  18. package/agentes/devops-ci-swl.md +400 -400
  19. package/agentes/disenador-ui-swl.md +569 -569
  20. package/agentes/documentador-swl.md +345 -345
  21. package/agentes/frontend-angular-swl.md +621 -621
  22. package/agentes/frontend-css-swl.md +716 -716
  23. package/agentes/frontend-react-swl.md +692 -692
  24. package/agentes/frontend-swl.md +496 -496
  25. package/agentes/frontend-tailwind-swl.md +826 -826
  26. package/agentes/gh-fix-ci-swl.md +2 -2
  27. package/agentes/implementador-swl.md +328 -328
  28. package/agentes/investigador-swl.md +432 -432
  29. package/agentes/investigador-ux-swl.md +505 -505
  30. package/agentes/llm-apps-swl.md +278 -278
  31. package/agentes/migrador-swl.md +442 -442
  32. package/agentes/mobile-android-swl.md +511 -511
  33. package/agentes/mobile-cross-swl.md +541 -541
  34. package/agentes/mobile-ios-swl.md +502 -502
  35. package/agentes/mobile-testing-swl.md +302 -302
  36. package/agentes/nemesis-auditor-swl.md +285 -285
  37. package/agentes/notificador-swl.md +918 -918
  38. package/agentes/observabilidad-swl.md +438 -438
  39. package/agentes/orquestador-swl.md +1026 -1026
  40. package/agentes/pagos-swl.md +310 -310
  41. package/agentes/perfilador-usuario-swl.md +321 -321
  42. package/agentes/planificador-swl.md +399 -399
  43. package/agentes/producto-prd-swl.md +589 -589
  44. package/agentes/red-team-swl.md +1 -1
  45. package/agentes/release-manager-swl.md +590 -590
  46. package/agentes/rendimiento-swl.md +713 -713
  47. package/agentes/resolutor-build-swl.md +245 -245
  48. package/agentes/revisor-angular-swl.md +278 -278
  49. package/agentes/revisor-codigo-swl.md +505 -505
  50. package/agentes/revisor-csharp-swl.md +264 -264
  51. package/agentes/revisor-go-swl.md +259 -259
  52. package/agentes/revisor-java-swl.md +257 -257
  53. package/agentes/revisor-kotlin-swl.md +273 -273
  54. package/agentes/revisor-nextjs-swl.md +281 -281
  55. package/agentes/revisor-php-swl.md +271 -271
  56. package/agentes/revisor-react-swl.md +278 -278
  57. package/agentes/revisor-rust-swl.md +346 -346
  58. package/agentes/revisor-seguridad-swl.md +399 -399
  59. package/agentes/revisor-swift-swl.md +268 -268
  60. package/agentes/revisor-typescript-swl.md +346 -346
  61. package/agentes/sre-swl.md +291 -291
  62. package/agentes/tdd-qa-swl.md +393 -393
  63. package/comandos/swl/briefing.md +119 -119
  64. package/comandos/swl/contribuir.md +233 -233
  65. package/comandos/swl/predecir.md +139 -139
  66. package/comandos/swl/sesiones.md +1 -1
  67. package/gateway/agent-executor.js +1 -1
  68. package/gateway/lib/event-channel.js +191 -191
  69. package/habilidades/agent-deep-links/SKILL.md +148 -148
  70. package/habilidades/agentes-como-servicio/SKILL.md +2 -2
  71. package/habilidades/angular-moderno/SKILL.md +20 -1
  72. package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
  73. package/habilidades/backend-async-postgres-testing/SKILL.md +215 -215
  74. package/habilidades/backend-error-design/SKILL.md +221 -221
  75. package/habilidades/backend-production-resilience/SKILL.md +288 -288
  76. package/habilidades/benchmark-memoria/SKILL.md +186 -186
  77. package/habilidades/calidad-anti-patrones-universales/SKILL.md +368 -368
  78. package/habilidades/calidad-contract-testing/SKILL.md +165 -165
  79. package/habilidades/calidad-mutation-testing/SKILL.md +170 -170
  80. package/habilidades/changelog-generator/scripts/parse-commits.js +367 -367
  81. package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -60
  82. package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
  83. package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
  84. package/habilidades/drift-detection/SKILL.md +179 -179
  85. package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
  86. package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +1 -1
  87. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -57
  88. package/habilidades/eval-framework/SKILL.md +212 -212
  89. package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -108
  90. package/habilidades/harness-claude-code/recursos/disciplina-harness-regla.md +252 -252
  91. package/habilidades/legacy-code-rescue/SKILL.md +267 -267
  92. package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
  93. package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
  94. package/habilidades/perfil-usuario/SKILL.md +200 -200
  95. package/habilidades/prevencion-sobreingenieria/recursos/EXAMPLES.md +580 -580
  96. package/habilidades/proceso-ddia-fundamentos/SKILL.md +255 -255
  97. package/habilidades/proceso-ddia-streaming/SKILL.md +231 -231
  98. package/habilidades/proceso-debate-adversarial/recursos/personas.md +105 -105
  99. package/habilidades/proceso-discovery-machote/SKILL.md +157 -157
  100. package/habilidades/proceso-dynamic-workflows/SKILL.md +138 -138
  101. package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -65
  102. package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -65
  103. package/habilidades/proceso-intent-engineering/SKILL.md +269 -269
  104. package/habilidades/proceso-modular-split/SKILL.md +256 -256
  105. package/habilidades/prompt-engineering/recursos/patrones-avanzados.md +2 -2
  106. package/habilidades/state-inconsistency-auditor-swl/recursos/coupled-state-patterns.md +147 -147
  107. package/habilidades/structured-outputs/SKILL.md +2 -2
  108. package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -83
  109. package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -85
  110. package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -94
  111. package/habilidades/swl-dashboard/SKILL.md +2 -2
  112. package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -111
  113. package/habilidades/validacion-ci-sistema/recursos/validadores-completos.md +1 -1
  114. package/habilidades/validacion-ci-sistema/scripts/validar-sistema.sh +1 -1
  115. package/hooks/ciclo-evolucion-subagente.js +26 -26
  116. package/hooks/ciclo-evolucion.js +26 -26
  117. package/hooks/claudemd-bloat-detector.js +161 -161
  118. package/hooks/claudemd-duplicacion-detector.js +170 -170
  119. package/hooks/contexto-iteracion.js +144 -144
  120. package/hooks/guardrail-modelo.js +1 -1
  121. package/hooks/lib/agent-routing.js +107 -107
  122. package/hooks/lib/auto-consolidator.js +335 -335
  123. package/hooks/lib/autonomia.js +208 -208
  124. package/hooks/lib/ciclo-evolucion.js +47 -47
  125. package/hooks/lib/deep-links.js +185 -185
  126. package/hooks/lib/error-classifier.js +308 -308
  127. package/hooks/lib/etapa-auto-evolucion.js +701 -701
  128. package/hooks/lib/etapa-metricas.js +388 -388
  129. package/hooks/lib/etapa-perfil-usuario.js +376 -376
  130. package/hooks/lib/loop-telemetry.js +321 -321
  131. package/hooks/lib/merkle-audit.js +96 -96
  132. package/hooks/lib/model-router.js +2 -2
  133. package/hooks/lib/propose-step.js +358 -358
  134. package/hooks/lib/provenance-tracker.js +191 -191
  135. package/hooks/lib/rate-limit-tracker.js +253 -253
  136. package/hooks/lib/resource-quota.js +122 -122
  137. package/hooks/lib/retry-jitter.js +165 -165
  138. package/hooks/lib/security-net.js +201 -201
  139. package/hooks/lib/skill-auditor.js +588 -588
  140. package/hooks/lib/sync-status.js +228 -228
  141. package/hooks/lib/taint-tracker.js +107 -107
  142. package/hooks/lib/text-similarity.js +241 -241
  143. package/hooks/lib/token-estimator.js +1 -0
  144. package/hooks/lib/toon-compressor.js +245 -245
  145. package/hooks/lib/usage-model.js +1 -1
  146. package/hooks/linea-estado.js +2 -0
  147. package/hooks/registro-turnos.js +209 -209
  148. package/hooks/session-briefing.js +98 -98
  149. package/hooks/spec-gate.js +211 -211
  150. package/hooks/sugerir-regenerar-inventario.js +170 -170
  151. package/hooks/tdd-gate.js +241 -241
  152. package/hooks/telemetria-skill-routing.js +100 -100
  153. package/hooks/validar-formato-post-subagente.js +140 -140
  154. package/hooks/validar-intent-spec.js +242 -242
  155. package/hooks/validar-memoria-hook.js +218 -218
  156. package/hooks/validar-planning-paths.js +134 -134
  157. package/instintos/autonomia.yaml +27 -27
  158. package/instintos/prompt-appendices.yaml +57 -57
  159. package/llms.txt +29 -29
  160. package/manifiestos/agent-output-schemas.json +57 -57
  161. package/manifiestos/canonical-hashes.json +2291 -1964
  162. package/manifiestos/planning-paths.json +44 -44
  163. package/manifiestos/skills-lock.json +1282 -1282
  164. package/package.json +1 -1
  165. package/plantillas/auditor-veto-template.md +105 -105
  166. package/plantillas/github-workflows/README.md +47 -47
  167. package/plantillas/github-workflows/release-please.yml +44 -44
  168. package/plantillas/github-workflows/swl-ci.yml +107 -107
  169. package/plantillas/github-workflows/swl-security.yml +51 -51
  170. package/plugin.json +1 -1
  171. package/reglas/accesibilidad.md +10 -10
  172. package/reglas/analisis-previo-tareas-grandes.md +172 -172
  173. package/reglas/api-diseno.md +9 -9
  174. package/reglas/arreglar-al-detectar.md +240 -240
  175. package/reglas/auditorias-documentales-estructurales.md +7 -7
  176. package/reglas/cloud-infra.md +8 -8
  177. package/reglas/consultar-vault-primero.md +195 -195
  178. package/reglas/debatir-antes-de-aceptar.md +158 -158
  179. package/reglas/fragmentos-compartidos.md +183 -183
  180. package/reglas/hooks.md +6 -6
  181. package/reglas/intent-engineering.md +218 -218
  182. package/reglas/markitdown.md +8 -8
  183. package/reglas/monitor-ci.md +309 -309
  184. package/reglas/patrones.md +6 -6
  185. package/reglas/sesiones-paralelas.md +180 -180
  186. package/reglas/sin-duplicacion-reglas-globales.md +182 -182
  187. package/reglas/skills-estandar.md +6 -6
  188. package/reglas/testing.md +7 -7
  189. package/reglas/tests-cleanup.md +224 -224
  190. package/reglas/usar-code-review-graph.md +155 -155
  191. package/reglas/usar-context7.md +226 -226
  192. package/reglas/verificar-citas-normativas.md +548 -548
  193. package/schemas/agent-frontmatter.schema.json +3 -3
  194. package/schemas/agent-message.schema.json +73 -73
  195. package/schemas/agent-output-implementacion.schema.json +114 -114
  196. package/schemas/agent-output-planificacion.schema.json +150 -150
  197. package/schemas/agent-output-review.schema.json +98 -98
  198. package/schemas/diary-entry.schema.json +112 -112
  199. package/schemas/hook-profiles.schema.json +54 -54
  200. package/schemas/hooks-config.schema.json +89 -89
  201. package/schemas/modulos.schema.json +38 -38
  202. package/schemas/perfiles.schema.json +36 -36
  203. package/schemas/plugin.schema.json +77 -77
  204. package/schemas/skill-evals.schema.json +119 -119
  205. package/schemas/skill-frontmatter.schema.json +245 -245
  206. package/scripts/audit-tools/audit-history.js +330 -330
  207. package/scripts/audit-tools/bundle-tracker.js +290 -290
  208. package/scripts/audit-tools/canary-monitor.js +352 -352
  209. package/scripts/audit-tools/code-profiler.js +605 -605
  210. package/scripts/audit-tools/dep-doctor.js +320 -320
  211. package/scripts/audit-tools/env-validator.js +206 -206
  212. package/scripts/audit-tools/lib/fs-walk.js +48 -48
  213. package/scripts/audit-tools/lib/output.js +23 -23
  214. package/scripts/audit-tools/migration-checker.js +392 -392
  215. package/scripts/audit-tools/pentest-scanner.js +1436 -1436
  216. package/scripts/benchmark-memoria.js +167 -167
  217. package/scripts/cli/aprobar-plan.js +73 -73
  218. package/scripts/cli/briefing.js +23 -23
  219. package/scripts/cli/ciclo-evolucion.js +26 -26
  220. package/scripts/cli/configurar-ci.js +40 -40
  221. package/scripts/cli/derivar-feature-list.js +25 -25
  222. package/scripts/cli/detectar-host.js +27 -27
  223. package/scripts/cli/diary-entry.js +69 -69
  224. package/scripts/cli/execution-state.js +18 -18
  225. package/scripts/cli/gateway-notify.js +41 -41
  226. package/scripts/cli/liberar-fase.js +42 -42
  227. package/scripts/cli/loop-telemetry.js +125 -125
  228. package/scripts/cli/mark-evolved.js +56 -56
  229. package/scripts/cli/metricas-dora.js +26 -26
  230. package/scripts/cli/near-duplicate.js +55 -55
  231. package/scripts/cli/notificaciones.js +123 -123
  232. package/scripts/cli/propose-step.js +29 -29
  233. package/scripts/cli/schedule-parse.js +19 -19
  234. package/scripts/cli/sugerir-modelo.js +20 -20
  235. package/scripts/cli/verificar-plan.js +36 -36
  236. package/scripts/cli/verificar-trazabilidad.js +35 -35
  237. package/scripts/configurar-branch-protection.js +418 -418
  238. package/scripts/detectar-aprendizajes-duplicados.js +151 -151
  239. package/scripts/field-report.js +199 -199
  240. package/scripts/generar-checklists-consolidados.js +273 -273
  241. package/scripts/generar-matriz-lenguajes.js +271 -271
  242. package/scripts/lib/artefactos-python.js +43 -43
  243. package/scripts/lib/auditar-invocaciones-comandos.js +104 -104
  244. package/scripts/lib/benchmark-metrics.js +160 -160
  245. package/scripts/lib/budget-enforcer.js +252 -252
  246. package/scripts/lib/ci-reader.js +193 -193
  247. package/scripts/lib/claude-sessions.js +1 -0
  248. package/scripts/lib/configurar-ci.js +380 -380
  249. package/scripts/lib/contadores-inventario.js +217 -217
  250. package/scripts/lib/detectar-host-swl.js +175 -175
  251. package/scripts/lib/detectar-stack-detallado.js +307 -307
  252. package/scripts/lib/detector-autoduplicacion-intra-archivo.js +234 -234
  253. package/scripts/lib/detector-reglas-duplicadas.js +220 -220
  254. package/scripts/lib/diary-entry.js +234 -234
  255. package/scripts/lib/eval-metrics-store.js +218 -218
  256. package/scripts/lib/eval-quality.js +171 -171
  257. package/scripts/lib/eval-schemas.js +144 -144
  258. package/scripts/lib/eval-self-correct.js +106 -106
  259. package/scripts/lib/eval-validator.js +185 -185
  260. package/scripts/lib/evidencia-release.js +322 -322
  261. package/scripts/lib/expandir-targets.js +71 -71
  262. package/scripts/lib/gate-hooks-requires.js +249 -249
  263. package/scripts/lib/gate-licencias.js +212 -212
  264. package/scripts/lib/git-metricas.js +257 -257
  265. package/scripts/lib/jaccard-similarity.js +98 -98
  266. package/scripts/lib/longmemeval-runner.js +125 -125
  267. package/scripts/lib/metricas-dora.js +204 -204
  268. package/scripts/lib/npm-version.js +261 -261
  269. package/scripts/lib/paquetes-conocidos.js +50 -50
  270. package/scripts/lib/plan-lock.js +275 -275
  271. package/scripts/lib/pr-analyzer.js +399 -399
  272. package/scripts/lib/prompt-builder.js +264 -264
  273. package/scripts/lib/reglas-globales-conocidas.json +180 -180
  274. package/scripts/lib/resolver-plan-fase.js +37 -37
  275. package/scripts/lib/rrf-fusion.js +175 -175
  276. package/scripts/lib/schema-version.js +164 -164
  277. package/scripts/lib/scoring-instintos.js +277 -277
  278. package/scripts/lib/semantic-search.js +252 -252
  279. package/scripts/lib/toml-merge.js +204 -204
  280. package/scripts/lib/tool-cost-analyzer.js +1 -0
  281. package/scripts/limpiar-artefactos-python.js +131 -131
  282. package/scripts/mcp-server/auth.js +105 -105
  283. package/scripts/mcp-server/cache.js +106 -106
  284. package/scripts/migrar-csv-a-array.js +168 -168
  285. package/scripts/migrar-fase-dominio.js +200 -200
  286. package/scripts/publicar.js +497 -497
  287. package/scripts/run-eval.js +141 -141
  288. package/scripts/tui/componentes/selector-multi.js +189 -189
  289. package/scripts/tui/componentes/selector-unico.js +158 -158
  290. package/scripts/tui/ejecutores.js +375 -375
  291. package/scripts/tui/index.js +162 -162
  292. package/scripts/tui/lib/colores.js +129 -129
  293. package/scripts/tui/lib/render.js +264 -264
  294. package/scripts/tui/lib/teclas.js +113 -113
  295. package/scripts/tui/pantallas/inspect.js +173 -173
  296. package/scripts/tui/pantallas/install-wizard.js +334 -334
  297. package/scripts/tui/pantallas/menu-principal.js +52 -52
  298. package/scripts/tui/pantallas/progreso.js +274 -274
  299. package/scripts/tui/pantallas/resumen.js +132 -132
  300. package/scripts/tui/pantallas/uninstall-wizard.js +208 -208
  301. package/scripts/tui/pantallas/update-wizard.js +232 -232
  302. package/scripts/tui/pantallas/welcome.js +187 -187
  303. package/scripts/validar-userland-vacio.js +110 -110
@@ -1,548 +1,548 @@
1
- # Regla: Verificar citas verificables antes de escribirlas o aceptarlas
2
-
3
- Esta regla es OBLIGATORIA y aplica a todo contenido que Claude genere o acepte
4
- como válido en cualquier proyecto del usuario donde aparezca una cita
5
- verificable. Cubre dos familias del mismo principio:
6
-
7
- 1. **Citas normativas / legales / documentales**: artículo de ley o reglamento,
8
- sección de un estándar, número de RFC/ISO, página de documento oficial,
9
- referencia a un acuerdo institucional, nombre de un programa o catálogo
10
- oficial, fecha de promulgación, o atribución de fundamento normativo a una
11
- entidad de datos.
12
- 2. **Citas técnicas archivo:línea**: cualquier afirmación que cite una
13
- ubicación específica del codebase (`path/al/archivo.py:123`,
14
- `module/file.ts:45-90`, `schema.sql:438`) en reportes de auditoría,
15
- análisis de bugs, hallazgos de seguridad, code review, post-mortems,
16
- reportes de revisión externa, o conclusiones que tú mismo escribas
17
- acerca del código.
18
-
19
- Las dos familias comparten el mismo problema y la misma defensa: el agente
20
- o el reporte afirma evidencia específica, y esa evidencia puede inventarse,
21
- trasladarse mal o estar desactualizada. El antídoto es siempre el mismo:
22
- **`grep` / `Read` sobre la fuente real antes de aceptar o re-emitir la cita**.
23
-
24
- ---
25
-
26
- ## Principio
27
-
28
- > Antes de escribir una cita verificable (normativa o técnica archivo:línea)
29
- > en código, UI, documentación, reportes, comentarios, docstrings o
30
- > conclusiones, **debes verificarla con `grep` o `Read` sobre la fuente real
31
- > del proyecto**. Si no puedes encontrar evidencia textual de la cita, NO la
32
- > escribas. Una cita plausible que suena correcta NO es una cita verificada.
33
- >
34
- > El mismo principio aplica cuando ACEPTAS una cita ajena: un reporte de
35
- > otro agente, un hallazgo de auditoría, una afirmación del usuario sobre
36
- > "el bug está en X:42". Si vas a actuar sobre la cita (priorizarla,
37
- > remediarla, reproducirla en tu propio output), verifícala primero contra
38
- > la fuente. Aceptar sin verificar es propagar la confabulación.
39
-
40
- Las normas mexicanas (RINEMAABMS, LGCG, LAASSP, CONAC, Constitución, leyes
41
- generales) y los estándares técnicos (RFC, ISO, OWASP, WCAG) son tentadores
42
- para confabular contextos plausibles. **Las citas archivo:línea generadas
43
- por otros agentes son tentadoras para aceptar sin verificar** — vienen con
44
- apariencia de evidencia "ya hecha". Plausible ≠ verificado. El costo de
45
- inventar o propagar una cita es pérdida de confianza del usuario y debug
46
- innecesario; el costo de verificar es un `grep` o `Read` de 2 segundos.
47
-
48
- ---
49
-
50
- ## Qué cuenta como "cita verificable"
51
-
52
- ### Familia 1 — citas normativas / legales / documentales
53
-
54
- OBLIGATORIO verificar antes de escribir:
55
-
56
- - Artículo numerado de una norma: "Art. 23 RINEMAABMS", "Art. 30 LGCG",
57
- "Art. 134 CPEUM", "fracción IV del Art. 17", etc.
58
- - Número de RFC / ISO / IEEE: "RFC 7231", "ISO/IEC 27001", "IEEE 802.11n".
59
- - Sección de un estándar: "OWASP Top 10 A03", "WCAG 2.1 SC 1.4.3", "NIST
60
- SP 800-63".
61
- - Nombre de catálogo, programa o acuerdo oficial: "PAAASINE-INE", "PAF",
62
- "Acuerdo INE/CG2024/15".
63
- - Atribución de fundamento normativo a un dato/tabla/módulo: "según
64
- Art. X de la norma Y".
65
- - Fechas y números de páginas de documentos oficiales: "actualización
66
- julio 2017, 71 páginas".
67
- - Citas textuales entre comillas atribuidas a un documento concreto.
68
-
69
- ### Familia 2 — citas técnicas archivo:línea
70
-
71
- OBLIGATORIO verificar antes de escribir o de aceptar como base para acción:
72
-
73
- - Ubicación específica de un bug, hallazgo o evidencia:
74
- `auth/service.py:191-243`, `schema.sql:438-451`, `repository.py:1260`.
75
- - Atribución de un fragmento de código a un archivo: "la función `foo`
76
- en `bar/baz.ts:42` hace X".
77
- - Cita textual de líneas de código incluidas en un reporte: si el reporte
78
- pega 4 líneas como evidencia, esas 4 líneas deben coincidir letra por
79
- letra con el archivo en el HEAD actual del repo.
80
- - Citas dentro de reportes de auditoría externa, nemesis, code review,
81
- análisis de seguridad, post-mortems, RCAs, hallazgos consolidados
82
- (incluyendo los que tú mismo emites).
83
- - Conclusiones derivadas de una cita: "es bug porque X:42 ignora Y" —
84
- hay que confirmar primero que X:42 realmente hace lo que el reporte
85
- dice.
86
- - Citas en commit messages, PR descriptions o issues que pretenden ser
87
- evidencia accionable.
88
-
89
- NO requiere verificación previa:
90
-
91
- - Conceptos genéricos del dominio sin atribución a artículo específico
92
- ("auditoría interna", "contratación pública", "expediente de
93
- contratación").
94
- - Conocimiento técnico estable sin cita numérica ("SQL injection",
95
- "OAuth2 flow", "JWT").
96
- - Descripciones funcionales del propio código que estás editando en
97
- ese momento.
98
- - Referencias a archivos sin número de línea cuando solo se discute la
99
- existencia, no el contenido ("el módulo `auth/` está implementado").
100
-
101
- ---
102
-
103
- ## Cómo verificar — protocolo obligatorio
104
-
105
- ### Paso 1: identificar la fuente potencial
106
-
107
- Antes de escribir la cita, identifica de dónde podría salir:
108
-
109
- - Seeds del proyecto: `grep -rn "TEXTO_CITA" backend/app/seeds/`
110
- - Modelos / docstrings: `grep -rn "TEXTO_CITA" backend/app/modules/`
111
- - Documentación normativa: `grep -rn "TEXTO_CITA" referencia/normativa/`
112
- - ADRs: `grep -rn "TEXTO_CITA" docs/adr/`
113
- - README, CHANGELOG, planning: `grep -rn "TEXTO_CITA" docs/`
114
-
115
- ### Paso 2: ejecutar la búsqueda
116
-
117
- Usar `grep` con el patrón exacto de lo que vas a escribir:
118
-
119
- ```bash
120
- # Verificar "Art. 23 RINEMAABMS"
121
- grep -rin "art.*23.*rinemaabms\|rinemaabms.*art.*23" path/
122
-
123
- # Verificar nombre de catálogo
124
- grep -rin "clasif" referencia/normativa/
125
-
126
- # Verificar número RFC
127
- grep -rin "RFC 7231" .
128
- ```
129
-
130
- ### Paso 3: leer la fuente original
131
-
132
- Si grep devuelve coincidencias, abrir el archivo con `Read` y verificar
133
- que el contexto sí respalda la cita. Una coincidencia léxica no es prueba
134
- suficiente — el contexto puede ser opuesto al que asumes.
135
-
136
- ### Paso 4: decidir
137
-
138
- - **Si la fuente confirma la cita**: escríbela con el contenido que dice
139
- textualmente el origen.
140
- - **Si la fuente dice algo parecido pero distinto**: usa el wording real
141
- del origen, no el que recuerdes de memoria.
142
- - **Si no hay fuente**: NO escribas la cita. Sustituye por descripción
143
- neutra sin atribución, o pide al usuario la cita exacta.
144
-
145
- ---
146
-
147
- ## Protocolo para citas archivo:línea en reportes
148
-
149
- Cuando trabajas con un reporte que cita ubicaciones del codebase (auditoría
150
- nemesis, hallazgos de revisor-seguridad-swl, output de revisor-codigo-swl,
151
- informe externo, RCA, post-mortem, hallazgo del usuario):
152
-
153
- ### Paso 1: clasificar las citas
154
-
155
- Lista cada `archivo:línea` mencionada y clasifícala:
156
-
157
- - **Crítica accionable** — bug que se va a remediar, hallazgo que se va a
158
- priorizar, evidencia que se va a citar en un commit o PR. OBLIGATORIO
159
- verificar.
160
- - **Contextual** — mención de paso en un párrafo sin que ninguna acción
161
- dependa de su exactitud. Verificación opcional pero recomendada al
162
- primer hallazgo crítico que la cite indirectamente.
163
-
164
- ### Paso 2: muestreo mínimo verificable
165
-
166
- Si el reporte tiene N citas críticas, verificar como mínimo:
167
-
168
- - **Las top 4-6 acciones priorizadas** del reporte (P1 / críticas).
169
- - **Cualquier cita con número exacto de líneas** (`:191-243`, `:438-451`)
170
- — porque exactitud específica es la más propensa a confabulación.
171
- - **Cualquier hallazgo etiquetado "regresión", "latente" o "extra"** —
172
- porque suelen detectarse de carambola y son los más frágiles.
173
- - **Cualquier cita que contradiga decisiones documentadas** — un reporte
174
- que dice "esto está mal" sobre algo que un ADR / APRENDIZAJES dice
175
- "esto se decidió así" requiere verificación dura antes de actuar.
176
-
177
- ### Paso 3: verificar con `Read` y `grep`, no asumir
178
-
179
- Para cada cita crítica:
180
-
181
- ```bash
182
- # Verificar que las líneas existen y dicen lo que el reporte dice
183
- Read file_path="<archivo>" offset=<inicio-2> limit=<rango+4>
184
-
185
- # Buscar evidencia complementaria (¿hay más sitios con el mismo patrón?)
186
- grep -rn "<patrón>" backend/app/ --include="*.py"
187
- ```
188
-
189
- Una afirmación del tipo "X:42 ignora la validación" debe verificarse
190
- leyendo X:42 directamente. Si el reporte cita 4 líneas como evidencia,
191
- las 4 líneas deben coincidir con el archivo en el HEAD actual.
192
-
193
- ### Paso 4: detectar gaps del reporte
194
-
195
- Aprovechar la verificación para detectar lo que el reporte NO dice:
196
-
197
- - **Sweep por patrón**: si el reporte cita un bug en `X.py:1260` por usar
198
- `u.col_inexistente`, hacer `grep -rn "u\.col_inexistente"` en TODO el
199
- módulo para descartar regresiones adicionales. Los reportes suelen
200
- parar en el primer hallazgo del patrón.
201
- - **Búsqueda inversa**: si el reporte dice "RESUELTO en commit Y",
202
- verificar que el commit realmente toca el archivo citado.
203
- - **Evidencia complementaria**: si el reporte cita una columna SQL,
204
- verificar el `CREATE TABLE` del schema correspondiente. La doble
205
- evidencia (código + schema) refuerza o refuta el hallazgo.
206
-
207
- ### Paso 5: separar lo verificado de lo no verificado
208
-
209
- Al re-emitir conclusiones a partir del reporte:
210
-
211
- - **Marca explícitamente qué citas verificaste personalmente** vs. qué
212
- citas reproducís sin re-verificar.
213
- - **NO presentes el reporte como si fuera tu análisis directo** si no
214
- lo verificaste. Es propagación de cita ajena, no análisis propio.
215
- - **Si el reporte tiene 11 acciones y solo verificaste 6**, dilo así.
216
- "Verifiqué 6/11; las 5 restantes asumo correctas por consistencia
217
- metodológica con las que sí verifiqué" es honesto. "Las 11 acciones
218
- están confirmadas" cuando solo viste 6 es propagación deshonesta.
219
-
220
- ---
221
-
222
- ## Pattern de redacción cuando NO hay cita verificada
223
-
224
- En vez de inventar fundamento normativo:
225
-
226
- - "Documento oficial INE, actualización julio 2017" (cita textual del seed).
227
- - "Catálogo administrativo interno" (descripción neutra).
228
- - "Definido por el equipo de proyecto" (atribución honesta sin invento).
229
- - Sin cualquier cita ni atribución (preferible a inventar).
230
-
231
- NUNCA:
232
-
233
- - "Art. X de Y" sin verificación.
234
- - "Catálogo oficial Z" sin verificación.
235
- - "Conforme a la sección N del estándar" sin verificación.
236
-
237
- ---
238
-
239
- ## Anti-patrones explícitos
240
-
241
- ### Confabulación plausible
242
-
243
- Inventar una cita que suena correcta porque el contexto sugiere que
244
- podría existir. Ejemplo real (SIGAF, 2026-05-13): asocié "Art. 23
245
- RINEMAABMS" como fundamento del Clasificador de Gasto del INE porque
246
- RINEMAABMS regula contratación INE y el Art. 23 trata adquisiciones —
247
- plausible pero falso. El seed `07_clasificador_gasto.sql` no menciona
248
- ningún artículo, solo cita "Documento oficial INE, actualización julio
249
- 2017, 71 páginas".
250
-
251
- ### Asociación incorrecta entre instrumento y catálogo
252
-
253
- Confundir un programa de planeación con un catálogo de clasificación.
254
- Ejemplo: presentar "PAAASINE" (Programa Anual de Adquisiciones del INE,
255
- instrumento de planeación) como si fuera el "catálogo oficial" del
256
- Clasificador de Gasto. Son cosas distintas en el dominio.
257
-
258
- ### Cita por intuición de memoria del modelo
259
-
260
- Atribuir contenido a un artículo o estándar porque "lo aprendí en el
261
- entrenamiento". El conocimiento de entrenamiento sobre normas mexicanas
262
- específicas, especialmente las del INE/OIC y reglamentos administrativos,
263
- es alto en confabulación. Trata cada cita normativa como si NO lo supieras
264
- hasta que el grep al proyecto lo confirme.
265
-
266
- ### Cita por inferencia transitiva
267
-
268
- "Si la norma X regula Y, entonces la cita debe ser Art. N de X". No.
269
- La transición lógica no es prueba documental.
270
-
271
- ### Cita "para dar peso"
272
-
273
- Inventar fundamento normativo para hacer ver la UI/docs como más
274
- profesional o jurídicamente sólida. Una cita falsa es peor que ninguna
275
- cita — destruye la confianza del usuario en TODO lo demás que escribiste.
276
-
277
- ### Aceptar reporte ajeno sin re-verificar evidencia
278
-
279
- Recibir un reporte de auditoría / nemesis / revisor con citas
280
- archivo:línea y proceder a priorizar, planear remediación o re-emitir
281
- las conclusiones SIN haber hecho `Read` ni `grep` sobre las citas
282
- críticas. El reporte puede:
283
-
284
- - Tener una cita correcta en archivo pero incorrecta en número de línea
285
- (el código se movió post-reporte).
286
- - Tener una cita totalmente inventada por confabulación del agente que
287
- lo produjo.
288
- - Estar desactualizado: el bug citado ya se cerró en un commit posterior.
289
- - Confundir dos archivos similares (`router.py` de módulo A con
290
- `router.py` de módulo B).
291
-
292
- Propagar el reporte como si fuera tu análisis directo es deshonesto y
293
- multiplica el costo del error. La verificación de las top 4-6 citas
294
- críticas toma 5-10 minutos y separa lo verificado de lo asumido.
295
-
296
- ### Sweep parcial cuando el patrón sugiere más sitios
297
-
298
- Verificar la cita exacta del reporte (`X.py:1260`) y detenerse ahí
299
- cuando el bug es **un patrón** (uso de columna inexistente, llamada a
300
- función deprecada, falta de validación). Los reportes de auditoría
301
- suelen parar en el primer hallazgo del patrón. Si verificaste que
302
- `u.col_inexistente` está mal en `X.py:1260`, ejecuta `grep -rn` sobre
303
- toda la base para encontrar los hermanos antes de marcar el hallazgo
304
- como cerrado.
305
-
306
- ### "El reporte ya lo verificó"
307
-
308
- Falacia. Un reporte declara haber verificado, no demuestra haber
309
- verificado. Si vas a actuar sobre la cita, tu firma vale lo que
310
- verificaste personalmente — no lo que el reporte afirma haber hecho.
311
-
312
- ---
313
-
314
- ## Excepciones legítimas
315
-
316
- NO aplica la regla cuando:
317
-
318
- 1. **El usuario dictó la cita explícitamente**: si el usuario escribe
319
- "agrega que esto es por el Art. 23 RINEMAABMS", asume que el usuario
320
- verificó. Pero si la cita parece dudosa, repregunta.
321
- 2. **La cita ya existe en el codebase verificado**: si encuentras "Art.
322
- 23 RINEMAABMS" ya escrito en un docstring del modelo, puedes
323
- reutilizarlo en UI sin re-verificar la fuente externa (asumes que
324
- alguien antes la verificó).
325
- 3. **Conceptos canónicos sin atribución específica**: "auditoría",
326
- "expediente", "contratación" — no requieren cita.
327
- 4. **Citas de standards técnicos universalmente conocidos sin número**:
328
- "OWASP", "WCAG" sin sub-versión. Si pones "WCAG 2.1 SC 1.4.3" sí
329
- aplica la regla.
330
- 5. **Cita archivo:línea producida por TU MISMO en ESTE turno** sobre un
331
- archivo que acabas de leer con `Read` en este mismo turno. La
332
- evidencia es directa, no necesita re-verificación.
333
- 6. **Reporte ajeno que solo vas a leer / archivar / referenciar como
334
- contexto histórico** sin tomar acción. La verificación se activa
335
- cuando vas a priorizar, remediar, propagar o concluir a partir del
336
- reporte.
337
-
338
- ---
339
-
340
- ## Familia 2 extendida — reportes COMPACTACION.md y status reports SWL
341
-
342
- Los reportes generados por `/swl:compactar` (Delta vN en `.planning/COMPACTACION.md`),
343
- `/swl:checkpoint` (continue-here.md), y similares **son también sub-productos
344
- verificables**. El agente que los escribió puede sintetizar afirmaciones cuantitativas
345
- sin re-verificar contra `git`/`pytest`/`grep`, y el agente que los lee después
346
- hereda los errores si los acepta como base para decisiones.
347
-
348
- ### Cuándo aplica
349
-
350
- OBLIGATORIO verificar antes de tomar acción sobre afirmaciones cuantitativas
351
- extraídas de:
352
-
353
- - `COMPACTACION.md` Delta vN (la última sección de cierre de sesión).
354
- - `RESUMEN.md` de fase (conteos de archivos, commits, slices).
355
- - `ESTADO.md` (DT activas, OP pendientes, fases completadas).
356
- - `continue-here.md` (commits pendientes, archivos sin terminar).
357
- - Reportes de auditoría con cifras agregadas ("N hallazgos críticos resueltos").
358
-
359
- ### Verificaciones rápidas obligatorias
360
-
361
- Cuando un reporte declara una cifra accionable, ejecutar la primitiva equivalente
362
- ANTES de basar decisiones en ella:
363
-
364
- | Afirmación del reporte | Verificación |
365
- |---|---|
366
- | "N commits sin push" | `git log origin/main..HEAD --oneline \| wc -l` |
367
- | "N archivos modificados" | `git diff --stat HEAD~M..HEAD \| tail -1` |
368
- | "N DT activas" | `grep -cE "^### (DT\|DA\|OP)-" .planning/DEUDAS.md` (sección Activas) |
369
- | "N tests verdes" | output reciente de `pytest --co -q` o último run de CI |
370
- | "Fase N completada" | revisar `NN-CIERRE.md` y commits asociados, no solo el reporte |
371
- | "Cobertura X%" | re-ejecutar `coverage report` si la cifra es relevante para decisión |
372
-
373
- ### Caso real (origen — sesión SIGM 2026-05-21)
374
-
375
- El reporte v10 de COMPACTACION.md afirmó:
376
-
377
- > "Trabajo pendiente mapeado: 11 commits acumulados sin push"
378
-
379
- Verificación con `git log origin/main..HEAD --oneline | wc -l` retornó **2**.
380
- Los otros 9 commits ya estaban en `origin/main`; el fetch falló por red pero la
381
- referencia local seguía válida. Si el siguiente turno hubiera aceptado el dato
382
- como cierto, habría "esperado créditos GH para pushear 11" sin necesidad.
383
-
384
- Lección: el reporte de compactación es un artefacto de prosa con cifras — NO
385
- es la fuente de verdad. La fuente es el filesystem + git + el output de las
386
- herramientas. Tres segundos de `git log origin/main..HEAD` previenen propagación
387
- de error.
388
-
389
- ### Anti-patrón específico
390
-
391
- - **Aceptar el reporte v10 (o vN) tras `/compact` como base de decisiones**: el
392
- reporte fue escrito por el agente al cerrar contexto, sin re-verificar. Tras
393
- la compactación, el agente NUEVO lo lee con confianza por defecto y propaga
394
- cualquier desalineación. Aplicar Familia 2: verificar 2-3 cifras críticas
395
- del reporte contra git/pytest/grep antes de planificar la siguiente acción.
396
-
397
- ---
398
-
399
- ## Familia 2 extendida — comentarios temporales en código
400
-
401
- (Absorbe la regla `verificar-citas-temporales.md`, unificada aquí el 2026-06-11
402
- porque su propio texto se declaraba extensión de esta Familia 2.)
403
-
404
- > Un comentario en código que afirma alineación con otro commit, versión o
405
- > contrato (`// Alineado con commits X+Y`, `// Refactorizado a vN.M.0`,
406
- > `# Sincronizado con backend`, `<!-- Coherente con schema X -->`) **NO es
407
- > verificación** — es afirmación temporal sin prueba. Antes de actuar sobre el
408
- > comentario como si fuera evidencia, verificar contra la fuente real con
409
- > `grep` / `Read` / `git show`.
410
-
411
- El comentario puede haberse desactualizado silenciosamente si el commit
412
- referenciado se revirtió, nunca se aplicó, o el refactor citado cambió después.
413
-
414
- **Cuándo aplica**: comentarios que afirman alineación cross-stack o con commits,
415
- versiones, schemas. NO aplica a comentarios de intención, `TODO`/`FIXME` con
416
- ticket, ni explicaciones del POR QUÉ.
417
-
418
- **Cómo verificar**: identificar QUÉ se afirma alineado → `git show <SHA> --
419
- <archivo>` o `grep` del campo clave en ambos stacks → comparar campo por campo.
420
- Si hay drift, NO confiar en el comentario: actualizarlo o eliminarlo en el mismo
421
- commit (un comentario stale es peor que ninguno).
422
-
423
- **Alternativas seguras** al comentario temporal: test de contrato en CI (en vez
424
- de `// Alineado con commits X+Y`), versión semántica + lock (en vez de
425
- `// Refactorizado a vN`), tipos generados/codegen (en vez de `# Sincronizado con
426
- backend`), validador en pre-commit (en vez de `<!-- Coherente con schema -->`).
427
- Si el comentario es la única opción, incluir **fecha y SHA explícitos** y la
428
- condición de re-verificación.
429
-
430
- **Caso de origen** (SIGAF 2026-05-22): `contrato.models.ts:2` decía "Alineados
431
- con el backend refactorizado (commits 284df74 + 5869ac9)" pero el backend nunca
432
- aplicó ese refactor; Pydantic con `extra=ignore` descartaba 5 campos en
433
- silencio y los contratos se crearon sin monto ni vigencia durante semanas. El
434
- comentario funcionó como falso anclaje de confianza para los reviewers.
435
-
436
- **Anti-patrones**: confiar en el comentario en code review sin `git show`;
437
- propagarlo en refactors (viaja con el copy-paste hasta volverse falso); no
438
- actualizarlo al revertir el commit citado; usarlo como "prueba" en debates
439
- técnicos.
440
-
441
- ---
442
-
443
- ## Origen de esta regla
444
-
445
- ### Origen Familia 1 — citas normativas (versión inicial)
446
-
447
- Sesión 2026-05-13, proyecto SIGAF. Durante implementación del refactor
448
- ADR-076 F4 del form de Nuevo Expediente, agregué como fundamento del
449
- catálogo "Clasificador por objeto y tipo de gasto para el INE" la cita
450
- "Art. 23 RINEMAABMS · catálogo oficial PAAASINE-INE" sin haberla
451
- verificado en ningún archivo del proyecto. Era plausible (RINEMAABMS
452
- regula contratación INE; PAAASINE es el programa anual de adquisiciones)
453
- pero ambas atribuciones eran falsas:
454
-
455
- - El modelo `CatClasificadorGasto` y el seed `07_clasificador_gasto.sql`
456
- no mencionan ningún artículo del RINEMAABMS.
457
- - El seed cita textualmente "Documento oficial INE, actualización julio
458
- 2017, 71 páginas" como fuente — sin asociarlo a artículo legal.
459
- - PAAASINE es un instrumento de planeación, no un catálogo de
460
- clasificación. Conceptualmente distintos.
461
-
462
- El usuario detectó la alucinación al verificar el SQL de referencia y
463
- pidió analizarla. La regla se promueve a global porque el patrón puede
464
- repetirse en cualquier proyecto del usuario que toque normas mexicanas o
465
- estándares técnicos numerados — el sesgo de confabulación plausible no es
466
- específico de SIGAF.
467
-
468
- Commit donde se corrigió la alucinación original: `f2b025a` en SIGAF.
469
-
470
- ### Extensión Familia 2 — citas archivo:línea en reportes
471
-
472
- Sesión 2026-05-16, proyecto SIGM. El usuario pidió analizar un reporte
473
- de auditoría nemesis con 16 hallazgos (F-01 a F-16) más 3 hallazgos
474
- heredados (H5.A1, H5.A2, H3.1), todos con citas `archivo:línea`
475
- específicas (`auth/service.py:191-243`, `dependencies.py:73-78`,
476
- `database/init/init.sh`, `catastro/repository.py:1260`, etc.).
477
-
478
- Detecté que aceptar el reporte sin verificar habría sido propagación
479
- de cita ajena. Apliqué el principio de la regla original adaptado al
480
- dominio técnico: cada cita crítica priorizada (top 6) se verificó con
481
- `Read` + `grep` contra el código real antes de re-emitir conclusiones.
482
-
483
- Resultado: 6/6 hallazgos top verificados al 100%, con **evidencia
484
- adicional** que el reporte no había detallado:
485
-
486
- - F-04 lockout: además del backend que no escribe `intentos_fallidos`,
487
- el schema declara `CHECK (intentos_fallidos >= 0 AND intentos_fallidos
488
- <= 10)` — el tope de 10 es invariante de la BD, doble confirmación.
489
- - Regresión `u.nombre_completo`: el reporte citó 2 sitios; la
490
- verificación con `grep -n "u.nombre_completo"` reveló que **podían
491
- haber más** y el reporte no había hecho sweep global.
492
-
493
- Esa última observación se promueve a sub-regla operativa (Paso 4
494
- del protocolo archivo:línea: detectar gaps del reporte con sweep por
495
- patrón).
496
-
497
- La adaptación se fusiona en esta regla en lugar de crear una nueva
498
- porque el principio es idéntico — solo cambia el dominio de la cita
499
- (normativa vs. archivo:línea). Mantener una sola regla evita
500
- duplicación operativa y refuerza que el origen del riesgo es siempre el
501
- mismo: una afirmación con apariencia de evidencia que en realidad no
502
- se verificó.
503
-
504
- ### Extensión Familia 2 — reportes COMPACTACION.md (2026-05-21)
505
-
506
- Sesión SIGM 2026-05-21. Tras `/swl:compactar` v10, el reporte declaró
507
- "11 commits acumulados sin push". Verificación con
508
- `git log origin/main..HEAD --oneline | wc -l` retornó **2**. El reporte se
509
- escribió desde la perspectiva del agente al cerrar contexto, sin re-verificar
510
- contra `origin/main` (que sigue local actualizada incluso con `git fetch`
511
- fallando por red).
512
-
513
- La adaptación se incorpora como sub-sección "Familia 2 extendida — reportes
514
- COMPACTACION.md y status reports SWL" arriba, no como Familia 3 separada. El
515
- principio es el mismo: afirmación cuantitativa en un reporte = sub-producto
516
- verificable. Cambia el dominio (compactación SWL vs. nemesis auditorías), no
517
- el protocolo.
518
-
519
- Lección operativa: las 3 cifras que más se desalinean tras un `/compact` son
520
- "commits sin push" (depende de fetch reciente), "DT activas" (depende del
521
- último Edit de DEUDAS.md vs lo que la prosa del reporte describe) y "tests
522
- verdes" (depende del último run de CI vs lo que el agente recuerda). Verificar
523
- esas 3 antes de decidir siguiente acción.
524
-
525
- ---
526
-
527
- ## Checklist antes de escribir una cita verificable (Familia 1)
528
-
529
- - [ ] ¿La cita tiene un número, artículo, fracción o referencia
530
- específica?
531
- - [ ] ¿Ejecuté `grep` o `Read` sobre la fuente real del proyecto?
532
- - [ ] ¿La fuente respalda textualmente la cita?
533
- - [ ] Si no respalda: ¿sustituí por descripción neutra o eliminé la cita?
534
- - [ ] Si no encontré fuente y el usuario no la dictó: ¿pregunté al
535
- usuario por la cita exacta antes de inventarla?
536
-
537
- ## Checklist antes de aceptar o re-emitir una cita archivo:línea (Familia 2)
538
-
539
- - [ ] ¿Identifiqué cuáles citas del reporte son críticas accionables vs.
540
- contextuales?
541
- - [ ] ¿Hice `Read` sobre cada cita crítica priorizada (top 4-6)?
542
- - [ ] ¿El archivo:línea citado dice textualmente lo que el reporte afirma?
543
- - [ ] ¿Hice sweep por patrón (`grep -rn`) para detectar hermanos del bug
544
- que el reporte no listó?
545
- - [ ] ¿Verifiqué evidencia complementaria (schema, ADRs, commits citados)
546
- antes de aceptar el hallazgo?
547
- - [ ] Al re-emitir conclusiones: ¿marqué explícitamente qué citas
548
- verifiqué vs. cuáles reproduzco sin verificar?
1
+ # Regla: Verificar citas verificables antes de escribirlas o aceptarlas
2
+
3
+ Esta regla es OBLIGATORIA y aplica a todo contenido que Claude genere o acepte
4
+ como válido en cualquier proyecto del usuario donde aparezca una cita
5
+ verificable. Cubre dos familias del mismo principio:
6
+
7
+ 1. **Citas normativas / legales / documentales**: artículo de ley o reglamento,
8
+ sección de un estándar, número de RFC/ISO, página de documento oficial,
9
+ referencia a un acuerdo institucional, nombre de un programa o catálogo
10
+ oficial, fecha de promulgación, o atribución de fundamento normativo a una
11
+ entidad de datos.
12
+ 2. **Citas técnicas archivo:línea**: cualquier afirmación que cite una
13
+ ubicación específica del codebase (`path/al/archivo.py:123`,
14
+ `module/file.ts:45-90`, `schema.sql:438`) en reportes de auditoría,
15
+ análisis de bugs, hallazgos de seguridad, code review, post-mortems,
16
+ reportes de revisión externa, o conclusiones que tú mismo escribas
17
+ acerca del código.
18
+
19
+ Las dos familias comparten el mismo problema y la misma defensa: el agente
20
+ o el reporte afirma evidencia específica, y esa evidencia puede inventarse,
21
+ trasladarse mal o estar desactualizada. El antídoto es siempre el mismo:
22
+ **`grep` / `Read` sobre la fuente real antes de aceptar o re-emitir la cita**.
23
+
24
+ ---
25
+
26
+ ## Principio
27
+
28
+ > Antes de escribir una cita verificable (normativa o técnica archivo:línea)
29
+ > en código, UI, documentación, reportes, comentarios, docstrings o
30
+ > conclusiones, **debes verificarla con `grep` o `Read` sobre la fuente real
31
+ > del proyecto**. Si no puedes encontrar evidencia textual de la cita, NO la
32
+ > escribas. Una cita plausible que suena correcta NO es una cita verificada.
33
+ >
34
+ > El mismo principio aplica cuando ACEPTAS una cita ajena: un reporte de
35
+ > otro agente, un hallazgo de auditoría, una afirmación del usuario sobre
36
+ > "el bug está en X:42". Si vas a actuar sobre la cita (priorizarla,
37
+ > remediarla, reproducirla en tu propio output), verifícala primero contra
38
+ > la fuente. Aceptar sin verificar es propagar la confabulación.
39
+
40
+ Las normas mexicanas (RINEMAABMS, LGCG, LAASSP, CONAC, Constitución, leyes
41
+ generales) y los estándares técnicos (RFC, ISO, OWASP, WCAG) son tentadores
42
+ para confabular contextos plausibles. **Las citas archivo:línea generadas
43
+ por otros agentes son tentadoras para aceptar sin verificar** — vienen con
44
+ apariencia de evidencia "ya hecha". Plausible ≠ verificado. El costo de
45
+ inventar o propagar una cita es pérdida de confianza del usuario y debug
46
+ innecesario; el costo de verificar es un `grep` o `Read` de 2 segundos.
47
+
48
+ ---
49
+
50
+ ## Qué cuenta como "cita verificable"
51
+
52
+ ### Familia 1 — citas normativas / legales / documentales
53
+
54
+ OBLIGATORIO verificar antes de escribir:
55
+
56
+ - Artículo numerado de una norma: "Art. 23 RINEMAABMS", "Art. 30 LGCG",
57
+ "Art. 134 CPEUM", "fracción IV del Art. 17", etc.
58
+ - Número de RFC / ISO / IEEE: "RFC 7231", "ISO/IEC 27001", "IEEE 802.11n".
59
+ - Sección de un estándar: "OWASP Top 10 A03", "WCAG 2.1 SC 1.4.3", "NIST
60
+ SP 800-63".
61
+ - Nombre de catálogo, programa o acuerdo oficial: "PAAASINE-INE", "PAF",
62
+ "Acuerdo INE/CG2024/15".
63
+ - Atribución de fundamento normativo a un dato/tabla/módulo: "según
64
+ Art. X de la norma Y".
65
+ - Fechas y números de páginas de documentos oficiales: "actualización
66
+ julio 2017, 71 páginas".
67
+ - Citas textuales entre comillas atribuidas a un documento concreto.
68
+
69
+ ### Familia 2 — citas técnicas archivo:línea
70
+
71
+ OBLIGATORIO verificar antes de escribir o de aceptar como base para acción:
72
+
73
+ - Ubicación específica de un bug, hallazgo o evidencia:
74
+ `auth/service.py:191-243`, `schema.sql:438-451`, `repository.py:1260`.
75
+ - Atribución de un fragmento de código a un archivo: "la función `foo`
76
+ en `bar/baz.ts:42` hace X".
77
+ - Cita textual de líneas de código incluidas en un reporte: si el reporte
78
+ pega 4 líneas como evidencia, esas 4 líneas deben coincidir letra por
79
+ letra con el archivo en el HEAD actual del repo.
80
+ - Citas dentro de reportes de auditoría externa, nemesis, code review,
81
+ análisis de seguridad, post-mortems, RCAs, hallazgos consolidados
82
+ (incluyendo los que tú mismo emites).
83
+ - Conclusiones derivadas de una cita: "es bug porque X:42 ignora Y" —
84
+ hay que confirmar primero que X:42 realmente hace lo que el reporte
85
+ dice.
86
+ - Citas en commit messages, PR descriptions o issues que pretenden ser
87
+ evidencia accionable.
88
+
89
+ NO requiere verificación previa:
90
+
91
+ - Conceptos genéricos del dominio sin atribución a artículo específico
92
+ ("auditoría interna", "contratación pública", "expediente de
93
+ contratación").
94
+ - Conocimiento técnico estable sin cita numérica ("SQL injection",
95
+ "OAuth2 flow", "JWT").
96
+ - Descripciones funcionales del propio código que estás editando en
97
+ ese momento.
98
+ - Referencias a archivos sin número de línea cuando solo se discute la
99
+ existencia, no el contenido ("el módulo `auth/` está implementado").
100
+
101
+ ---
102
+
103
+ ## Cómo verificar — protocolo obligatorio
104
+
105
+ ### Paso 1: identificar la fuente potencial
106
+
107
+ Antes de escribir la cita, identifica de dónde podría salir:
108
+
109
+ - Seeds del proyecto: `grep -rn "TEXTO_CITA" backend/app/seeds/`
110
+ - Modelos / docstrings: `grep -rn "TEXTO_CITA" backend/app/modules/`
111
+ - Documentación normativa: `grep -rn "TEXTO_CITA" referencia/normativa/`
112
+ - ADRs: `grep -rn "TEXTO_CITA" docs/adr/`
113
+ - README, CHANGELOG, planning: `grep -rn "TEXTO_CITA" docs/`
114
+
115
+ ### Paso 2: ejecutar la búsqueda
116
+
117
+ Usar `grep` con el patrón exacto de lo que vas a escribir:
118
+
119
+ ```bash
120
+ # Verificar "Art. 23 RINEMAABMS"
121
+ grep -rin "art.*23.*rinemaabms\|rinemaabms.*art.*23" path/
122
+
123
+ # Verificar nombre de catálogo
124
+ grep -rin "clasif" referencia/normativa/
125
+
126
+ # Verificar número RFC
127
+ grep -rin "RFC 7231" .
128
+ ```
129
+
130
+ ### Paso 3: leer la fuente original
131
+
132
+ Si grep devuelve coincidencias, abrir el archivo con `Read` y verificar
133
+ que el contexto sí respalda la cita. Una coincidencia léxica no es prueba
134
+ suficiente — el contexto puede ser opuesto al que asumes.
135
+
136
+ ### Paso 4: decidir
137
+
138
+ - **Si la fuente confirma la cita**: escríbela con el contenido que dice
139
+ textualmente el origen.
140
+ - **Si la fuente dice algo parecido pero distinto**: usa el wording real
141
+ del origen, no el que recuerdes de memoria.
142
+ - **Si no hay fuente**: NO escribas la cita. Sustituye por descripción
143
+ neutra sin atribución, o pide al usuario la cita exacta.
144
+
145
+ ---
146
+
147
+ ## Protocolo para citas archivo:línea en reportes
148
+
149
+ Cuando trabajas con un reporte que cita ubicaciones del codebase (auditoría
150
+ nemesis, hallazgos de revisor-seguridad-swl, output de revisor-codigo-swl,
151
+ informe externo, RCA, post-mortem, hallazgo del usuario):
152
+
153
+ ### Paso 1: clasificar las citas
154
+
155
+ Lista cada `archivo:línea` mencionada y clasifícala:
156
+
157
+ - **Crítica accionable** — bug que se va a remediar, hallazgo que se va a
158
+ priorizar, evidencia que se va a citar en un commit o PR. OBLIGATORIO
159
+ verificar.
160
+ - **Contextual** — mención de paso en un párrafo sin que ninguna acción
161
+ dependa de su exactitud. Verificación opcional pero recomendada al
162
+ primer hallazgo crítico que la cite indirectamente.
163
+
164
+ ### Paso 2: muestreo mínimo verificable
165
+
166
+ Si el reporte tiene N citas críticas, verificar como mínimo:
167
+
168
+ - **Las top 4-6 acciones priorizadas** del reporte (P1 / críticas).
169
+ - **Cualquier cita con número exacto de líneas** (`:191-243`, `:438-451`)
170
+ — porque exactitud específica es la más propensa a confabulación.
171
+ - **Cualquier hallazgo etiquetado "regresión", "latente" o "extra"** —
172
+ porque suelen detectarse de carambola y son los más frágiles.
173
+ - **Cualquier cita que contradiga decisiones documentadas** — un reporte
174
+ que dice "esto está mal" sobre algo que un ADR / APRENDIZAJES dice
175
+ "esto se decidió así" requiere verificación dura antes de actuar.
176
+
177
+ ### Paso 3: verificar con `Read` y `grep`, no asumir
178
+
179
+ Para cada cita crítica:
180
+
181
+ ```bash
182
+ # Verificar que las líneas existen y dicen lo que el reporte dice
183
+ Read file_path="<archivo>" offset=<inicio-2> limit=<rango+4>
184
+
185
+ # Buscar evidencia complementaria (¿hay más sitios con el mismo patrón?)
186
+ grep -rn "<patrón>" backend/app/ --include="*.py"
187
+ ```
188
+
189
+ Una afirmación del tipo "X:42 ignora la validación" debe verificarse
190
+ leyendo X:42 directamente. Si el reporte cita 4 líneas como evidencia,
191
+ las 4 líneas deben coincidir con el archivo en el HEAD actual.
192
+
193
+ ### Paso 4: detectar gaps del reporte
194
+
195
+ Aprovechar la verificación para detectar lo que el reporte NO dice:
196
+
197
+ - **Sweep por patrón**: si el reporte cita un bug en `X.py:1260` por usar
198
+ `u.col_inexistente`, hacer `grep -rn "u\.col_inexistente"` en TODO el
199
+ módulo para descartar regresiones adicionales. Los reportes suelen
200
+ parar en el primer hallazgo del patrón.
201
+ - **Búsqueda inversa**: si el reporte dice "RESUELTO en commit Y",
202
+ verificar que el commit realmente toca el archivo citado.
203
+ - **Evidencia complementaria**: si el reporte cita una columna SQL,
204
+ verificar el `CREATE TABLE` del schema correspondiente. La doble
205
+ evidencia (código + schema) refuerza o refuta el hallazgo.
206
+
207
+ ### Paso 5: separar lo verificado de lo no verificado
208
+
209
+ Al re-emitir conclusiones a partir del reporte:
210
+
211
+ - **Marca explícitamente qué citas verificaste personalmente** vs. qué
212
+ citas reproducís sin re-verificar.
213
+ - **NO presentes el reporte como si fuera tu análisis directo** si no
214
+ lo verificaste. Es propagación de cita ajena, no análisis propio.
215
+ - **Si el reporte tiene 11 acciones y solo verificaste 6**, dilo así.
216
+ "Verifiqué 6/11; las 5 restantes asumo correctas por consistencia
217
+ metodológica con las que sí verifiqué" es honesto. "Las 11 acciones
218
+ están confirmadas" cuando solo viste 6 es propagación deshonesta.
219
+
220
+ ---
221
+
222
+ ## Pattern de redacción cuando NO hay cita verificada
223
+
224
+ En vez de inventar fundamento normativo:
225
+
226
+ - "Documento oficial INE, actualización julio 2017" (cita textual del seed).
227
+ - "Catálogo administrativo interno" (descripción neutra).
228
+ - "Definido por el equipo de proyecto" (atribución honesta sin invento).
229
+ - Sin cualquier cita ni atribución (preferible a inventar).
230
+
231
+ NUNCA:
232
+
233
+ - "Art. X de Y" sin verificación.
234
+ - "Catálogo oficial Z" sin verificación.
235
+ - "Conforme a la sección N del estándar" sin verificación.
236
+
237
+ ---
238
+
239
+ ## Anti-patrones explícitos
240
+
241
+ ### Confabulación plausible
242
+
243
+ Inventar una cita que suena correcta porque el contexto sugiere que
244
+ podría existir. Ejemplo real (SIGAF, 2026-05-13): asocié "Art. 23
245
+ RINEMAABMS" como fundamento del Clasificador de Gasto del INE porque
246
+ RINEMAABMS regula contratación INE y el Art. 23 trata adquisiciones —
247
+ plausible pero falso. El seed `07_clasificador_gasto.sql` no menciona
248
+ ningún artículo, solo cita "Documento oficial INE, actualización julio
249
+ 2017, 71 páginas".
250
+
251
+ ### Asociación incorrecta entre instrumento y catálogo
252
+
253
+ Confundir un programa de planeación con un catálogo de clasificación.
254
+ Ejemplo: presentar "PAAASINE" (Programa Anual de Adquisiciones del INE,
255
+ instrumento de planeación) como si fuera el "catálogo oficial" del
256
+ Clasificador de Gasto. Son cosas distintas en el dominio.
257
+
258
+ ### Cita por intuición de memoria del modelo
259
+
260
+ Atribuir contenido a un artículo o estándar porque "lo aprendí en el
261
+ entrenamiento". El conocimiento de entrenamiento sobre normas mexicanas
262
+ específicas, especialmente las del INE/OIC y reglamentos administrativos,
263
+ es alto en confabulación. Trata cada cita normativa como si NO lo supieras
264
+ hasta que el grep al proyecto lo confirme.
265
+
266
+ ### Cita por inferencia transitiva
267
+
268
+ "Si la norma X regula Y, entonces la cita debe ser Art. N de X". No.
269
+ La transición lógica no es prueba documental.
270
+
271
+ ### Cita "para dar peso"
272
+
273
+ Inventar fundamento normativo para hacer ver la UI/docs como más
274
+ profesional o jurídicamente sólida. Una cita falsa es peor que ninguna
275
+ cita — destruye la confianza del usuario en TODO lo demás que escribiste.
276
+
277
+ ### Aceptar reporte ajeno sin re-verificar evidencia
278
+
279
+ Recibir un reporte de auditoría / nemesis / revisor con citas
280
+ archivo:línea y proceder a priorizar, planear remediación o re-emitir
281
+ las conclusiones SIN haber hecho `Read` ni `grep` sobre las citas
282
+ críticas. El reporte puede:
283
+
284
+ - Tener una cita correcta en archivo pero incorrecta en número de línea
285
+ (el código se movió post-reporte).
286
+ - Tener una cita totalmente inventada por confabulación del agente que
287
+ lo produjo.
288
+ - Estar desactualizado: el bug citado ya se cerró en un commit posterior.
289
+ - Confundir dos archivos similares (`router.py` de módulo A con
290
+ `router.py` de módulo B).
291
+
292
+ Propagar el reporte como si fuera tu análisis directo es deshonesto y
293
+ multiplica el costo del error. La verificación de las top 4-6 citas
294
+ críticas toma 5-10 minutos y separa lo verificado de lo asumido.
295
+
296
+ ### Sweep parcial cuando el patrón sugiere más sitios
297
+
298
+ Verificar la cita exacta del reporte (`X.py:1260`) y detenerse ahí
299
+ cuando el bug es **un patrón** (uso de columna inexistente, llamada a
300
+ función deprecada, falta de validación). Los reportes de auditoría
301
+ suelen parar en el primer hallazgo del patrón. Si verificaste que
302
+ `u.col_inexistente` está mal en `X.py:1260`, ejecuta `grep -rn` sobre
303
+ toda la base para encontrar los hermanos antes de marcar el hallazgo
304
+ como cerrado.
305
+
306
+ ### "El reporte ya lo verificó"
307
+
308
+ Falacia. Un reporte declara haber verificado, no demuestra haber
309
+ verificado. Si vas a actuar sobre la cita, tu firma vale lo que
310
+ verificaste personalmente — no lo que el reporte afirma haber hecho.
311
+
312
+ ---
313
+
314
+ ## Excepciones legítimas
315
+
316
+ NO aplica la regla cuando:
317
+
318
+ 1. **El usuario dictó la cita explícitamente**: si el usuario escribe
319
+ "agrega que esto es por el Art. 23 RINEMAABMS", asume que el usuario
320
+ verificó. Pero si la cita parece dudosa, repregunta.
321
+ 2. **La cita ya existe en el codebase verificado**: si encuentras "Art.
322
+ 23 RINEMAABMS" ya escrito en un docstring del modelo, puedes
323
+ reutilizarlo en UI sin re-verificar la fuente externa (asumes que
324
+ alguien antes la verificó).
325
+ 3. **Conceptos canónicos sin atribución específica**: "auditoría",
326
+ "expediente", "contratación" — no requieren cita.
327
+ 4. **Citas de standards técnicos universalmente conocidos sin número**:
328
+ "OWASP", "WCAG" sin sub-versión. Si pones "WCAG 2.1 SC 1.4.3" sí
329
+ aplica la regla.
330
+ 5. **Cita archivo:línea producida por TU MISMO en ESTE turno** sobre un
331
+ archivo que acabas de leer con `Read` en este mismo turno. La
332
+ evidencia es directa, no necesita re-verificación.
333
+ 6. **Reporte ajeno que solo vas a leer / archivar / referenciar como
334
+ contexto histórico** sin tomar acción. La verificación se activa
335
+ cuando vas a priorizar, remediar, propagar o concluir a partir del
336
+ reporte.
337
+
338
+ ---
339
+
340
+ ## Familia 2 extendida — reportes COMPACTACION.md y status reports SWL
341
+
342
+ Los reportes generados por `/swl:compactar` (Delta vN en `.planning/COMPACTACION.md`),
343
+ `/swl:checkpoint` (continue-here.md), y similares **son también sub-productos
344
+ verificables**. El agente que los escribió puede sintetizar afirmaciones cuantitativas
345
+ sin re-verificar contra `git`/`pytest`/`grep`, y el agente que los lee después
346
+ hereda los errores si los acepta como base para decisiones.
347
+
348
+ ### Cuándo aplica
349
+
350
+ OBLIGATORIO verificar antes de tomar acción sobre afirmaciones cuantitativas
351
+ extraídas de:
352
+
353
+ - `COMPACTACION.md` Delta vN (la última sección de cierre de sesión).
354
+ - `RESUMEN.md` de fase (conteos de archivos, commits, slices).
355
+ - `ESTADO.md` (DT activas, OP pendientes, fases completadas).
356
+ - `continue-here.md` (commits pendientes, archivos sin terminar).
357
+ - Reportes de auditoría con cifras agregadas ("N hallazgos críticos resueltos").
358
+
359
+ ### Verificaciones rápidas obligatorias
360
+
361
+ Cuando un reporte declara una cifra accionable, ejecutar la primitiva equivalente
362
+ ANTES de basar decisiones en ella:
363
+
364
+ | Afirmación del reporte | Verificación |
365
+ |---|---|
366
+ | "N commits sin push" | `git log origin/main..HEAD --oneline \| wc -l` |
367
+ | "N archivos modificados" | `git diff --stat HEAD~M..HEAD \| tail -1` |
368
+ | "N DT activas" | `grep -cE "^### (DT\|DA\|OP)-" .planning/DEUDAS.md` (sección Activas) |
369
+ | "N tests verdes" | output reciente de `pytest --co -q` o último run de CI |
370
+ | "Fase N completada" | revisar `NN-CIERRE.md` y commits asociados, no solo el reporte |
371
+ | "Cobertura X%" | re-ejecutar `coverage report` si la cifra es relevante para decisión |
372
+
373
+ ### Caso real (origen — sesión SIGM 2026-05-21)
374
+
375
+ El reporte v10 de COMPACTACION.md afirmó:
376
+
377
+ > "Trabajo pendiente mapeado: 11 commits acumulados sin push"
378
+
379
+ Verificación con `git log origin/main..HEAD --oneline | wc -l` retornó **2**.
380
+ Los otros 9 commits ya estaban en `origin/main`; el fetch falló por red pero la
381
+ referencia local seguía válida. Si el siguiente turno hubiera aceptado el dato
382
+ como cierto, habría "esperado créditos GH para pushear 11" sin necesidad.
383
+
384
+ Lección: el reporte de compactación es un artefacto de prosa con cifras — NO
385
+ es la fuente de verdad. La fuente es el filesystem + git + el output de las
386
+ herramientas. Tres segundos de `git log origin/main..HEAD` previenen propagación
387
+ de error.
388
+
389
+ ### Anti-patrón específico
390
+
391
+ - **Aceptar el reporte v10 (o vN) tras `/compact` como base de decisiones**: el
392
+ reporte fue escrito por el agente al cerrar contexto, sin re-verificar. Tras
393
+ la compactación, el agente NUEVO lo lee con confianza por defecto y propaga
394
+ cualquier desalineación. Aplicar Familia 2: verificar 2-3 cifras críticas
395
+ del reporte contra git/pytest/grep antes de planificar la siguiente acción.
396
+
397
+ ---
398
+
399
+ ## Familia 2 extendida — comentarios temporales en código
400
+
401
+ (Absorbe la regla `verificar-citas-temporales.md`, unificada aquí el 2026-06-11
402
+ porque su propio texto se declaraba extensión de esta Familia 2.)
403
+
404
+ > Un comentario en código que afirma alineación con otro commit, versión o
405
+ > contrato (`// Alineado con commits X+Y`, `// Refactorizado a vN.M.0`,
406
+ > `# Sincronizado con backend`, `<!-- Coherente con schema X -->`) **NO es
407
+ > verificación** — es afirmación temporal sin prueba. Antes de actuar sobre el
408
+ > comentario como si fuera evidencia, verificar contra la fuente real con
409
+ > `grep` / `Read` / `git show`.
410
+
411
+ El comentario puede haberse desactualizado silenciosamente si el commit
412
+ referenciado se revirtió, nunca se aplicó, o el refactor citado cambió después.
413
+
414
+ **Cuándo aplica**: comentarios que afirman alineación cross-stack o con commits,
415
+ versiones, schemas. NO aplica a comentarios de intención, `TODO`/`FIXME` con
416
+ ticket, ni explicaciones del POR QUÉ.
417
+
418
+ **Cómo verificar**: identificar QUÉ se afirma alineado → `git show <SHA> --
419
+ <archivo>` o `grep` del campo clave en ambos stacks → comparar campo por campo.
420
+ Si hay drift, NO confiar en el comentario: actualizarlo o eliminarlo en el mismo
421
+ commit (un comentario stale es peor que ninguno).
422
+
423
+ **Alternativas seguras** al comentario temporal: test de contrato en CI (en vez
424
+ de `// Alineado con commits X+Y`), versión semántica + lock (en vez de
425
+ `// Refactorizado a vN`), tipos generados/codegen (en vez de `# Sincronizado con
426
+ backend`), validador en pre-commit (en vez de `<!-- Coherente con schema -->`).
427
+ Si el comentario es la única opción, incluir **fecha y SHA explícitos** y la
428
+ condición de re-verificación.
429
+
430
+ **Caso de origen** (SIGAF 2026-05-22): `contrato.models.ts:2` decía "Alineados
431
+ con el backend refactorizado (commits 284df74 + 5869ac9)" pero el backend nunca
432
+ aplicó ese refactor; Pydantic con `extra=ignore` descartaba 5 campos en
433
+ silencio y los contratos se crearon sin monto ni vigencia durante semanas. El
434
+ comentario funcionó como falso anclaje de confianza para los reviewers.
435
+
436
+ **Anti-patrones**: confiar en el comentario en code review sin `git show`;
437
+ propagarlo en refactors (viaja con el copy-paste hasta volverse falso); no
438
+ actualizarlo al revertir el commit citado; usarlo como "prueba" en debates
439
+ técnicos.
440
+
441
+ ---
442
+
443
+ ## Origen de esta regla
444
+
445
+ ### Origen Familia 1 — citas normativas (versión inicial)
446
+
447
+ Sesión 2026-05-13, proyecto SIGAF. Durante implementación del refactor
448
+ ADR-076 F4 del form de Nuevo Expediente, agregué como fundamento del
449
+ catálogo "Clasificador por objeto y tipo de gasto para el INE" la cita
450
+ "Art. 23 RINEMAABMS · catálogo oficial PAAASINE-INE" sin haberla
451
+ verificado en ningún archivo del proyecto. Era plausible (RINEMAABMS
452
+ regula contratación INE; PAAASINE es el programa anual de adquisiciones)
453
+ pero ambas atribuciones eran falsas:
454
+
455
+ - El modelo `CatClasificadorGasto` y el seed `07_clasificador_gasto.sql`
456
+ no mencionan ningún artículo del RINEMAABMS.
457
+ - El seed cita textualmente "Documento oficial INE, actualización julio
458
+ 2017, 71 páginas" como fuente — sin asociarlo a artículo legal.
459
+ - PAAASINE es un instrumento de planeación, no un catálogo de
460
+ clasificación. Conceptualmente distintos.
461
+
462
+ El usuario detectó la alucinación al verificar el SQL de referencia y
463
+ pidió analizarla. La regla se promueve a global porque el patrón puede
464
+ repetirse en cualquier proyecto del usuario que toque normas mexicanas o
465
+ estándares técnicos numerados — el sesgo de confabulación plausible no es
466
+ específico de SIGAF.
467
+
468
+ Commit donde se corrigió la alucinación original: `f2b025a` en SIGAF.
469
+
470
+ ### Extensión Familia 2 — citas archivo:línea en reportes
471
+
472
+ Sesión 2026-05-16, proyecto SIGM. El usuario pidió analizar un reporte
473
+ de auditoría nemesis con 16 hallazgos (F-01 a F-16) más 3 hallazgos
474
+ heredados (H5.A1, H5.A2, H3.1), todos con citas `archivo:línea`
475
+ específicas (`auth/service.py:191-243`, `dependencies.py:73-78`,
476
+ `database/init/init.sh`, `catastro/repository.py:1260`, etc.).
477
+
478
+ Detecté que aceptar el reporte sin verificar habría sido propagación
479
+ de cita ajena. Apliqué el principio de la regla original adaptado al
480
+ dominio técnico: cada cita crítica priorizada (top 6) se verificó con
481
+ `Read` + `grep` contra el código real antes de re-emitir conclusiones.
482
+
483
+ Resultado: 6/6 hallazgos top verificados al 100%, con **evidencia
484
+ adicional** que el reporte no había detallado:
485
+
486
+ - F-04 lockout: además del backend que no escribe `intentos_fallidos`,
487
+ el schema declara `CHECK (intentos_fallidos >= 0 AND intentos_fallidos
488
+ <= 10)` — el tope de 10 es invariante de la BD, doble confirmación.
489
+ - Regresión `u.nombre_completo`: el reporte citó 2 sitios; la
490
+ verificación con `grep -n "u.nombre_completo"` reveló que **podían
491
+ haber más** y el reporte no había hecho sweep global.
492
+
493
+ Esa última observación se promueve a sub-regla operativa (Paso 4
494
+ del protocolo archivo:línea: detectar gaps del reporte con sweep por
495
+ patrón).
496
+
497
+ La adaptación se fusiona en esta regla en lugar de crear una nueva
498
+ porque el principio es idéntico — solo cambia el dominio de la cita
499
+ (normativa vs. archivo:línea). Mantener una sola regla evita
500
+ duplicación operativa y refuerza que el origen del riesgo es siempre el
501
+ mismo: una afirmación con apariencia de evidencia que en realidad no
502
+ se verificó.
503
+
504
+ ### Extensión Familia 2 — reportes COMPACTACION.md (2026-05-21)
505
+
506
+ Sesión SIGM 2026-05-21. Tras `/swl:compactar` v10, el reporte declaró
507
+ "11 commits acumulados sin push". Verificación con
508
+ `git log origin/main..HEAD --oneline | wc -l` retornó **2**. El reporte se
509
+ escribió desde la perspectiva del agente al cerrar contexto, sin re-verificar
510
+ contra `origin/main` (que sigue local actualizada incluso con `git fetch`
511
+ fallando por red).
512
+
513
+ La adaptación se incorpora como sub-sección "Familia 2 extendida — reportes
514
+ COMPACTACION.md y status reports SWL" arriba, no como Familia 3 separada. El
515
+ principio es el mismo: afirmación cuantitativa en un reporte = sub-producto
516
+ verificable. Cambia el dominio (compactación SWL vs. nemesis auditorías), no
517
+ el protocolo.
518
+
519
+ Lección operativa: las 3 cifras que más se desalinean tras un `/compact` son
520
+ "commits sin push" (depende de fetch reciente), "DT activas" (depende del
521
+ último Edit de DEUDAS.md vs lo que la prosa del reporte describe) y "tests
522
+ verdes" (depende del último run de CI vs lo que el agente recuerda). Verificar
523
+ esas 3 antes de decidir siguiente acción.
524
+
525
+ ---
526
+
527
+ ## Checklist antes de escribir una cita verificable (Familia 1)
528
+
529
+ - [ ] ¿La cita tiene un número, artículo, fracción o referencia
530
+ específica?
531
+ - [ ] ¿Ejecuté `grep` o `Read` sobre la fuente real del proyecto?
532
+ - [ ] ¿La fuente respalda textualmente la cita?
533
+ - [ ] Si no respalda: ¿sustituí por descripción neutra o eliminé la cita?
534
+ - [ ] Si no encontré fuente y el usuario no la dictó: ¿pregunté al
535
+ usuario por la cita exacta antes de inventarla?
536
+
537
+ ## Checklist antes de aceptar o re-emitir una cita archivo:línea (Familia 2)
538
+
539
+ - [ ] ¿Identifiqué cuáles citas del reporte son críticas accionables vs.
540
+ contextuales?
541
+ - [ ] ¿Hice `Read` sobre cada cita crítica priorizada (top 4-6)?
542
+ - [ ] ¿El archivo:línea citado dice textualmente lo que el reporte afirma?
543
+ - [ ] ¿Hice sweep por patrón (`grep -rn`) para detectar hermanos del bug
544
+ que el reporte no listó?
545
+ - [ ] ¿Verifiqué evidencia complementaria (schema, ADRs, commits citados)
546
+ antes de aceptar el hallazgo?
547
+ - [ ] Al re-emitir conclusiones: ¿marqué explícitamente qué citas
548
+ verifiqué vs. cuáles reproduzco sin verificar?