@saulwade/swl-ses 2.6.1 → 2.8.0

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 (268) hide show
  1. package/CLAUDE.md +14 -2
  2. package/README.md +65 -18
  3. package/agentes/_intent-spec.md +73 -73
  4. package/agentes/_propose-step.md +90 -90
  5. package/bin/swl-ses.js +10 -0
  6. package/comandos/swl/brainstorm.md +1 -0
  7. package/comandos/swl/briefing.md +119 -119
  8. package/comandos/swl/contribuir.md +233 -233
  9. package/comandos/swl/deuda-codigo.md +97 -97
  10. package/comandos/swl/mcp-status.md +1 -0
  11. package/gateway/lib/event-channel.js +191 -191
  12. package/habilidades/agent-deep-links/SKILL.md +148 -148
  13. package/habilidades/backend-async-postgres-testing/SKILL.md +216 -216
  14. package/habilidades/backend-error-design/SKILL.md +221 -221
  15. package/habilidades/backend-production-resilience/SKILL.md +288 -288
  16. package/habilidades/calidad-anti-patrones-universales/SKILL.md +105 -1
  17. package/habilidades/calidad-contract-testing/SKILL.md +165 -165
  18. package/habilidades/calidad-mutation-testing/SKILL.md +25 -1
  19. package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -60
  20. package/habilidades/ci-cd-pipelines/SKILL.md +5 -1
  21. package/habilidades/css-moderno/SKILL.md +7 -1
  22. package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
  23. package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
  24. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -57
  25. package/habilidades/extractor-de-aprendizajes/SKILL.md +5 -1
  26. package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -108
  27. package/habilidades/harness-claude-code/SKILL.md +3 -2
  28. package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
  29. package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
  30. package/habilidades/perfil-usuario/SKILL.md +200 -200
  31. package/habilidades/prevencion-sobreingenieria/recursos/EXAMPLES.md +580 -580
  32. package/habilidades/prevencion-sobreingenieria/recursos/soluciones-nativas.md +166 -166
  33. package/habilidades/prevencion-sobreingenieria/recursos/variables-residuales-post-refactor.md +85 -85
  34. package/habilidades/proceso-ddia-streaming/SKILL.md +231 -231
  35. package/habilidades/proceso-discovery-machote/SKILL.md +157 -157
  36. package/habilidades/proceso-dynamic-workflows/SKILL.md +60 -0
  37. package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -65
  38. package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -65
  39. package/habilidades/proceso-intent-engineering/SKILL.md +269 -269
  40. package/habilidades/proceso-modular-split/SKILL.md +256 -256
  41. package/habilidades/state-inconsistency-auditor-swl/recursos/coupled-state-patterns.md +147 -147
  42. package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -83
  43. package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -85
  44. package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -94
  45. package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -111
  46. package/hooks/calidad-pre-commit.js +159 -10
  47. package/hooks/ciclo-evolucion-subagente.js +26 -26
  48. package/hooks/ciclo-evolucion.js +26 -26
  49. package/hooks/contexto-subagente.js +68 -68
  50. package/hooks/lib/auto-consolidator.js +335 -335
  51. package/hooks/lib/ciclo-evolucion.js +47 -47
  52. package/hooks/lib/deep-links.js +185 -185
  53. package/hooks/lib/error-classifier.js +308 -308
  54. package/hooks/lib/notificacion-formato.js +45 -11
  55. package/hooks/lib/provenance-tracker.js +191 -191
  56. package/hooks/lib/raiz-proyecto.js +35 -4
  57. package/hooks/lib/resource-quota.js +122 -122
  58. package/hooks/lib/retry-jitter.js +165 -165
  59. package/hooks/lib/security-net.js +201 -201
  60. package/hooks/lib/skill-auditor.js +588 -588
  61. package/hooks/lib/sync-status.js +228 -228
  62. package/hooks/lib/taint-tracker.js +107 -107
  63. package/hooks/lib/text-similarity.js +241 -241
  64. package/hooks/lib/toon-compressor.js +245 -245
  65. package/hooks/notificacion-telegram.js +5 -11
  66. package/hooks/session-briefing.js +12 -4
  67. package/instintos/autonomia.yaml +27 -27
  68. package/instintos/prompt-appendices.yaml +57 -57
  69. package/llms.txt +1 -1
  70. package/manifiestos/agent-output-schemas.json +57 -57
  71. package/manifiestos/canonical-hashes.json +662 -0
  72. package/manifiestos/harness-ir.json +47536 -0
  73. package/manifiestos/hooks-config.json +469 -469
  74. package/manifiestos/invariantes-criticos.json +30 -30
  75. package/manifiestos/policy-bundle.json +2065 -0
  76. package/manifiestos/policy-corpus-w2.json +3926 -0
  77. package/manifiestos/runtime-adapters-core3.json +208 -0
  78. package/manifiestos/runtime-conformance.json +139 -0
  79. package/manifiestos/skills-lock.json +43 -43
  80. package/package.json +2 -2
  81. package/plantillas/auditor-veto-template.md +105 -105
  82. package/plantillas/github-workflows/release-please.yml +44 -44
  83. package/plantillas/github-workflows/swl-ci.yml +107 -107
  84. package/plantillas/github-workflows/swl-security.yml +51 -51
  85. package/plugin.json +2 -2
  86. package/reglas/accesibilidad.md +10 -10
  87. package/reglas/auditorias-documentales-estructurales.md +7 -7
  88. package/reglas/cloud-infra.md +8 -8
  89. package/reglas/consultar-vault-primero.md +195 -195
  90. package/reglas/git-workflow.md +1 -0
  91. package/reglas/hooks.md +6 -6
  92. package/reglas/intent-engineering.md +218 -218
  93. package/reglas/markitdown.md +8 -8
  94. package/reglas/monitor-ci.md +12 -0
  95. package/reglas/patrones.md +6 -6
  96. package/reglas/testing.md +7 -7
  97. package/reglas/tests-cleanup.md +224 -224
  98. package/schemas/agent-message.schema.json +73 -73
  99. package/schemas/agent-output-implementacion.schema.json +114 -114
  100. package/schemas/agent-output-planificacion.schema.json +150 -150
  101. package/schemas/agent-output-review.schema.json +98 -98
  102. package/schemas/diary-entry.schema.json +112 -112
  103. package/schemas/gate-state.schema.json +76 -0
  104. package/schemas/harness-ir.schema.json +369 -0
  105. package/schemas/hook-profiles.schema.json +54 -54
  106. package/schemas/hooks-config.schema.json +89 -89
  107. package/schemas/legacy-gates.schema.json +45 -0
  108. package/schemas/modulos.schema.json +38 -38
  109. package/schemas/perfiles.schema.json +36 -36
  110. package/schemas/plugin.schema.json +77 -77
  111. package/schemas/policy-bundle.schema.json +140 -0
  112. package/schemas/policy-enforcement.schema.json +117 -0
  113. package/schemas/policy-operation.schema.json +261 -0
  114. package/schemas/runtime-adapter.schema.json +176 -0
  115. package/schemas/runtime-build-attestation.schema.json +100 -0
  116. package/schemas/runtime-conformance.schema.json +239 -0
  117. package/schemas/runtime-diagnostic.schema.json +395 -0
  118. package/schemas/skill-evals.schema.json +119 -119
  119. package/schemas/skill-frontmatter.schema.json +245 -245
  120. package/schemas/w4-certification-request.schema.json +72 -0
  121. package/schemas/w4-certification-verdict.schema.json +224 -0
  122. package/schemas/w4-corpus.schema.json +172 -0
  123. package/schemas/w4-mutation-report.schema.json +116 -0
  124. package/schemas/w4-replay-result.schema.json +164 -0
  125. package/schemas/w4-scoring-report.schema.json +89 -0
  126. package/scripts/audit-tools/audit-history.js +330 -330
  127. package/scripts/audit-tools/bundle-tracker.js +290 -290
  128. package/scripts/audit-tools/canary-monitor.js +352 -352
  129. package/scripts/audit-tools/code-profiler.js +605 -605
  130. package/scripts/audit-tools/dep-doctor.js +320 -320
  131. package/scripts/audit-tools/env-validator.js +206 -206
  132. package/scripts/audit-tools/lib/fs-walk.js +48 -48
  133. package/scripts/audit-tools/lib/output.js +23 -23
  134. package/scripts/audit-tools/migration-checker.js +392 -392
  135. package/scripts/audit-tools/pentest-scanner.js +1436 -1436
  136. package/scripts/bootstrap-instintos.js +3 -0
  137. package/scripts/cli/aprobar-plan.js +73 -73
  138. package/scripts/cli/briefing.js +23 -23
  139. package/scripts/cli/ciclo-evolucion.js +26 -26
  140. package/scripts/cli/derivar-feature-list.js +25 -25
  141. package/scripts/cli/detectar-host.js +27 -27
  142. package/scripts/cli/diary-entry.js +69 -69
  143. package/scripts/cli/execution-state.js +18 -18
  144. package/scripts/cli/gateway-notify.js +41 -41
  145. package/scripts/cli/liberar-fase.js +42 -42
  146. package/scripts/cli/mark-evolved.js +56 -56
  147. package/scripts/cli/metricas-dora.js +26 -26
  148. package/scripts/cli/near-duplicate.js +55 -55
  149. package/scripts/cli/notificaciones.js +123 -123
  150. package/scripts/cli/propose-step.js +29 -29
  151. package/scripts/cli/schedule-parse.js +19 -19
  152. package/scripts/cli/sugerir-modelo.js +20 -20
  153. package/scripts/cli/verificar-plan.js +36 -36
  154. package/scripts/cli/verificar-trazabilidad.js +35 -35
  155. package/scripts/comandos/install-asistido.js +8 -7
  156. package/scripts/configurar-branch-protection.js +418 -418
  157. package/scripts/detectar-aprendizajes-duplicados.js +151 -151
  158. package/scripts/doctor.js +61 -36
  159. package/scripts/generar-checklists-consolidados.js +273 -273
  160. package/scripts/generar-claims-runtime.js +1342 -0
  161. package/scripts/generar-harness-ir.js +257 -0
  162. package/scripts/generar-inventario.js +52 -54
  163. package/scripts/generar-policy-bundle.js +202 -0
  164. package/scripts/instalador.js +26 -7
  165. package/scripts/lib/approval-receipts.js +190 -0
  166. package/scripts/lib/artefactos-python.js +43 -43
  167. package/scripts/lib/benchmark-metrics.js +160 -160
  168. package/scripts/lib/budget-enforcer.js +252 -252
  169. package/scripts/lib/certificacion-loop-state.js +421 -0
  170. package/scripts/lib/ci-reader.js +193 -193
  171. package/scripts/lib/ciclo-autonomo/yaml-instintos.js +56 -0
  172. package/scripts/lib/clasificar-directorio.js +92 -0
  173. package/scripts/lib/contadores-inventario.js +217 -217
  174. package/scripts/lib/detectar-host-swl.js +175 -175
  175. package/scripts/lib/detectar-runtime.js +29 -20
  176. package/scripts/lib/detectar-stack-detallado.js +307 -307
  177. package/scripts/lib/detector-autoduplicacion-intra-archivo.js +234 -234
  178. package/scripts/lib/detector-reglas-duplicadas.js +220 -220
  179. package/scripts/lib/eval-metrics-store.js +218 -218
  180. package/scripts/lib/eval-quality.js +171 -171
  181. package/scripts/lib/eval-schemas.js +144 -144
  182. package/scripts/lib/eval-self-correct.js +106 -106
  183. package/scripts/lib/eval-validator.js +185 -185
  184. package/scripts/lib/evidence-verifier.js +192 -0
  185. package/scripts/lib/evidencia-release.js +322 -322
  186. package/scripts/lib/frontmatter-canonico.js +509 -0
  187. package/scripts/lib/gate-engine.js +871 -0
  188. package/scripts/lib/gate-hooks-requires.js +249 -249
  189. package/scripts/lib/gate-licencias.js +212 -212
  190. package/scripts/lib/git-config-preflight.js +48 -0
  191. package/scripts/lib/git-metricas.js +257 -257
  192. package/scripts/lib/harness-ir.js +778 -0
  193. package/scripts/lib/harness-source-snapshot.js +309 -0
  194. package/scripts/lib/integrity-ledger.js +1147 -0
  195. package/scripts/lib/jaccard-similarity.js +98 -98
  196. package/scripts/lib/legacy-gate-migration.js +324 -0
  197. package/scripts/lib/limpiar-basura-global.js +45 -2
  198. package/scripts/lib/longmemeval-runner.js +125 -125
  199. package/scripts/lib/metricas-dora.js +204 -204
  200. package/scripts/lib/notificaciones-telegram.js +1 -0
  201. package/scripts/lib/npm-version.js +1 -0
  202. package/scripts/lib/paquetes-conocidos.js +50 -50
  203. package/scripts/lib/plan-lock.js +61 -13
  204. package/scripts/lib/policy-broker.js +338 -0
  205. package/scripts/lib/policy-bundle.js +342 -0
  206. package/scripts/lib/policy-context-provider.js +310 -0
  207. package/scripts/lib/policy-contract.js +479 -0
  208. package/scripts/lib/policy-verifier-utils.js +65 -0
  209. package/scripts/lib/pr-analyzer.js +399 -399
  210. package/scripts/lib/principal-verifier.js +178 -0
  211. package/scripts/lib/prompt-builder.js +264 -264
  212. package/scripts/lib/resolver-plan-fase.js +37 -37
  213. package/scripts/lib/rrf-fusion.js +175 -175
  214. package/scripts/lib/runtime-adapter-contract.js +267 -0
  215. package/scripts/lib/runtime-artifact-verifier.js +426 -0
  216. package/scripts/lib/runtime-build-attestation.js +127 -0
  217. package/scripts/lib/runtime-bundle-installer.js +586 -0
  218. package/scripts/lib/runtime-compiler.js +327 -0
  219. package/scripts/lib/runtime-conformance.js +202 -0
  220. package/scripts/lib/runtime-doctor-core3.js +567 -0
  221. package/scripts/lib/runtime-doctor-input.js +59 -0
  222. package/scripts/lib/runtime-operation-adapter.js +267 -0
  223. package/scripts/lib/schema-version.js +164 -164
  224. package/scripts/lib/semantic-search.js +252 -252
  225. package/scripts/lib/signed-envelope.js +545 -0
  226. package/scripts/lib/single-use-store.js +359 -0
  227. package/scripts/lib/skills-externas.js +31 -0
  228. package/scripts/lib/transformadores/codex.js +15 -8
  229. package/scripts/lib/transformadores/gemini.js +79 -5
  230. package/scripts/lib/w4-attestation-adapter.js +158 -0
  231. package/scripts/lib/w4-canario.js +337 -0
  232. package/scripts/lib/w4-claims.js +182 -0
  233. package/scripts/lib/w4-corpus-generador.js +542 -0
  234. package/scripts/lib/w4-gate-c5.js +115 -0
  235. package/scripts/lib/w4-harness-bajo-prueba.js +155 -0
  236. package/scripts/lib/w4-matriz-combos.js +55 -0
  237. package/scripts/lib/w4-motor-mutacion.js +1348 -0
  238. package/scripts/lib/w4-motor-replay.js +735 -0
  239. package/scripts/lib/w4-pin-origen.js +54 -0
  240. package/scripts/lib/w4-publicar-request.js +132 -0
  241. package/scripts/lib/w4-revocacion.js +62 -0
  242. package/scripts/lib/w4-runtimes-core3.js +38 -0
  243. package/scripts/lib/w4-scorer-certificacion.js +692 -0
  244. package/scripts/lib/w4-superficie-candidato.js +49 -0
  245. package/scripts/lib/w4-veredicto.js +452 -0
  246. package/scripts/lib/w4-verificar-veredicto.js +302 -0
  247. package/scripts/limpiar-artefactos-python.js +131 -131
  248. package/scripts/migrar-csv-a-array.js +168 -168
  249. package/scripts/migrar-fase-dominio.js +200 -200
  250. package/scripts/migrar-gates-legacy.js +108 -0
  251. package/scripts/publicar-certification-request.js +115 -0
  252. package/scripts/runtime-doctor.js +107 -0
  253. package/scripts/tui/componentes/selector-multi.js +189 -189
  254. package/scripts/tui/componentes/selector-unico.js +158 -158
  255. package/scripts/tui/ejecutores.js +375 -375
  256. package/scripts/tui/lib/colores.js +129 -129
  257. package/scripts/tui/lib/render.js +264 -264
  258. package/scripts/tui/lib/teclas.js +113 -113
  259. package/scripts/tui/pantallas/install-wizard.js +12 -7
  260. package/scripts/tui/pantallas/menu-principal.js +52 -52
  261. package/scripts/tui/pantallas/progreso.js +274 -274
  262. package/scripts/tui/pantallas/resumen.js +132 -132
  263. package/scripts/validar-userland-vacio.js +110 -110
  264. package/scripts/verificar-aislamiento-swl-eval.js +87 -0
  265. package/scripts/verificar-empaquetado-downstream.js +375 -0
  266. package/scripts/verificar-loop-constructor.js +215 -0
  267. package/scripts/verificar-trazabilidad.js +13 -6
  268. package/scripts/verificar-veredicto-real.js +84 -0
@@ -1,130 +1,130 @@
1
- # EXAMPLES — Doubt-Driven Review
2
-
3
- Tres aplicaciones concretas del skill, dos exitosas y una que detectó decisión bajo-evidencia.
4
-
5
- ---
6
-
7
- ## Ejemplo 1 — Decisión que pasó como ROBUSTA
8
-
9
- **Contexto**: equipo evalúa migrar de PostgreSQL local a un servicio managed (RDS).
10
-
11
- ### ❌ Sin doubt-driven (hipotético)
12
-
13
- > "RDS es la mejor opción porque AWS lo recomienda y todos lo usan."
14
-
15
- Costo de revertir no estimado, alternativas no articuladas, cero contraevidencia.
16
- Decisión se toma. 8 meses después se descubre que la latencia p95 desde el
17
- único cluster on-premise legacy del cliente sube 40ms y rompe SLA.
18
-
19
- ### ✓ Con doubt-driven
20
-
21
- **Paso 1 — Articular**:
22
- - Qué se decide: migrar a RDS Aurora PostgreSQL en us-east-1.
23
- - Qué se descarta: mantener PostgreSQL self-hosted en EC2.
24
- - Costo de revertir: ~3 semanas (migrar datos de vuelta, reconfigurar backups, ajustar IAM).
25
-
26
- **Paso 2 — 3 alternativas**:
27
- 1. **Self-hosted PostgreSQL en EC2**: control total de versión y extensiones; descartada
28
- por costo operativo (on-call para BD).
29
- 2. **Cloud SQL en GCP**: feature parity con RDS; descartada porque el resto del
30
- stack ya está en AWS y multi-cloud agrega complejidad de red.
31
- 3. **Supabase managed**: incluye Auth + Realtime gratis; descartada porque el
32
- equipo no necesita Realtime y el lock-in en API propietario es alto.
33
-
34
- **Paso 3 — Contraevidencia**:
35
- - Falla 1 (prob: media): vendor lock-in si Aurora introduce features no portables → mitigación: limitar uso a SQL estándar.
36
- - Falla 2 (prob: baja): outage regional de us-east-1 → mitigación: read replica en us-west-2.
37
- - Falla 3 (prob: baja): costo de I/O excede presupuesto → mitigación: alertas de costo en CloudWatch.
38
- - Caso histórico: cliente X migró a RDS, descubrió que `pg_cron` no estaba disponible y refactoró 3 jobs.
39
- - Supuesto sin validar: "la latencia desde nuestros clientes on-premise será aceptable" — necesita pruebas reales.
40
-
41
- **Paso 4 — Red flags**: ninguno. Cada argumento está respaldado con caso o métrica.
42
-
43
- **Paso 5 — Trigger**:
44
- - Condición: "p95 de latencia desde el cliente legacy excede 200ms durante 7 días consecutivos" o "costo mensual supera $1500".
45
- - Fecha de reevaluación: 2026-11-15 (6 meses).
46
-
47
- **Veredicto**: ROBUSTA con 1 supuesto pendiente de validar (latencia on-premise → ejecutar prueba antes de migrar).
48
-
49
- ---
50
-
51
- ## Ejemplo 2 — Decisión BAJO-EVIDENCIA detectada
52
-
53
- **Contexto**: agente propone "vamos a usar Kafka para todos los flujos asíncronos del sistema."
54
-
55
- **Paso 1 — Articular**:
56
- - Qué se decide: introducir Apache Kafka como broker único.
57
- - Qué se descarta: Redis Streams + RabbitMQ ya existentes en el stack.
58
- - Costo de revertir: alto — requiere rehacer 12 productores y 8 consumidores.
59
-
60
- **Paso 2 — 3 alternativas**: el agente solo articula 1 (RabbitMQ) y dice "los demás
61
- no son comparables." → **Red flag**: incapacidad de articular 3 alternativas reales.
62
-
63
- **Paso 3 — Contraevidencia**: el agente dice "Kafka nunca falla en producción
64
- porque tiene replication." → **Red flag**: argumento sin caso histórico.
65
-
66
- **Paso 4 — Red flags**:
67
- - "Es la mejor práctica para event-driven architectures" (sin fuente).
68
- - "Todo el mundo lo usa a escala" (sin métrica del proyecto actual).
69
- - "No hay otra opción razonable" (contradicho por el paso 2 incompleto).
70
-
71
- **Paso 5 — Trigger**: "cuando lo necesitemos a más escala" — **Trigger inverificable**.
72
- Reescribir como "throughput supera 10k msg/s sostenido durante 14 días."
73
-
74
- **Veredicto**: BAJO-EVIDENCIA. Reabrir antes de comprometer.
75
-
76
- Resultado real: la decisión se difiere; al revisar, se descubre que el throughput
77
- actual del sistema es ~80 msg/s — Kafka habría sido sobre-ingeniería con costo
78
- operativo de un cluster que el equipo no tiene capacidad de mantener.
79
-
80
- ---
81
-
82
- ## Ejemplo 3 — Decisión ACEPTABLE con red flag documentado
83
-
84
- **Contexto**: elegir framework frontend para un dashboard interno nuevo.
85
-
86
- **Paso 1**:
87
- - Qué se decide: Next.js App Router + Server Components.
88
- - Qué se descarta: SPA con Vite + React Query.
89
- - Costo de revertir: medio — 2 semanas de migración + reescritura de data fetching.
90
-
91
- **Paso 2 — 3 alternativas**:
92
- 1. **SPA Vite + React Query**: más simple, menos magia; descartada porque queremos SSR para SEO interno y autenticación server-side.
93
- 2. **Remix**: nested routing nativo; descartada porque el equipo ya tiene experiencia con Next.js y la curva de Remix agrega 2 semanas.
94
- 3. **Astro con islands**: ideal si fuera contenido estático; descartada porque el dashboard es 80% interactivo.
95
-
96
- **Paso 3 — Contraevidencia**:
97
- - Falla 1 (prob: media): App Router introduce breaking changes y rompe el build (ya pasó con v13→v14).
98
- - Falla 2 (prob: baja): RSC mental model genera bugs sutiles de hidratación.
99
- - Falla 3 (prob: baja): vendor lock-in con Vercel — mitigación: deploy en Cloudflare Workers o self-hosted.
100
- - Caso histórico: equipo Y adoptó App Router en beta y tardó 3 meses en estabilizar.
101
- - Supuesto: "el equipo aprenderá RSC en 2 sprints" — moderadamente optimista.
102
-
103
- **Paso 4 — Red flags**:
104
- - "App Router es el futuro" (cita de blog post de Vercel — sesgo de fuente).
105
-
106
- **Paso 5 — Trigger**:
107
- - Condición: "≥3 bugs de hidratación reportados por usuarios en sprint 5" O "Vercel
108
- anuncia deprecation de App Router".
109
- - Fecha de reevaluación: 2026-08-15 (3 meses, periodo corto por uso de feature reciente).
110
-
111
- **Veredicto**: ACEPTABLE — 1 red flag documentado (cita de Vercel como fuente única
112
- para "futuro"). El equipo procede con awareness del sesgo.
113
-
114
- ---
115
-
116
- ## Patrón de aplicación
117
-
118
- | Ejemplo | Costo revertir | Alternativas articuladas | Red flags | Trigger | Veredicto |
119
- |---|---|---|---|---|---|
120
- | 1 — RDS | 3 semanas | 3 sólidas | 0 | Métrico claro | ROBUSTA |
121
- | 2 — Kafka | 12+8 servicios | 1 (incompleto) | 3 | Inverificable | BAJO-EVIDENCIA |
122
- | 3 — Next.js | 2 semanas | 3 sólidas | 1 (sesgo de fuente) | Métrico + evento externo | ACEPTABLE |
123
-
124
- El skill es útil cuando:
125
- - El costo de revertir es alto Y
126
- - Hay tendencia a saltar al "qué" sin articular el "por qué no las otras".
127
-
128
- Es overhead cuando:
129
- - La decisión es reversible en horas O
130
- - La decisión ya fue auditada por un proceso equivalente (ADR formal con contexto + alternativas + consecuencias).
1
+ # EXAMPLES — Doubt-Driven Review
2
+
3
+ Tres aplicaciones concretas del skill, dos exitosas y una que detectó decisión bajo-evidencia.
4
+
5
+ ---
6
+
7
+ ## Ejemplo 1 — Decisión que pasó como ROBUSTA
8
+
9
+ **Contexto**: equipo evalúa migrar de PostgreSQL local a un servicio managed (RDS).
10
+
11
+ ### ❌ Sin doubt-driven (hipotético)
12
+
13
+ > "RDS es la mejor opción porque AWS lo recomienda y todos lo usan."
14
+
15
+ Costo de revertir no estimado, alternativas no articuladas, cero contraevidencia.
16
+ Decisión se toma. 8 meses después se descubre que la latencia p95 desde el
17
+ único cluster on-premise legacy del cliente sube 40ms y rompe SLA.
18
+
19
+ ### ✓ Con doubt-driven
20
+
21
+ **Paso 1 — Articular**:
22
+ - Qué se decide: migrar a RDS Aurora PostgreSQL en us-east-1.
23
+ - Qué se descarta: mantener PostgreSQL self-hosted en EC2.
24
+ - Costo de revertir: ~3 semanas (migrar datos de vuelta, reconfigurar backups, ajustar IAM).
25
+
26
+ **Paso 2 — 3 alternativas**:
27
+ 1. **Self-hosted PostgreSQL en EC2**: control total de versión y extensiones; descartada
28
+ por costo operativo (on-call para BD).
29
+ 2. **Cloud SQL en GCP**: feature parity con RDS; descartada porque el resto del
30
+ stack ya está en AWS y multi-cloud agrega complejidad de red.
31
+ 3. **Supabase managed**: incluye Auth + Realtime gratis; descartada porque el
32
+ equipo no necesita Realtime y el lock-in en API propietario es alto.
33
+
34
+ **Paso 3 — Contraevidencia**:
35
+ - Falla 1 (prob: media): vendor lock-in si Aurora introduce features no portables → mitigación: limitar uso a SQL estándar.
36
+ - Falla 2 (prob: baja): outage regional de us-east-1 → mitigación: read replica en us-west-2.
37
+ - Falla 3 (prob: baja): costo de I/O excede presupuesto → mitigación: alertas de costo en CloudWatch.
38
+ - Caso histórico: cliente X migró a RDS, descubrió que `pg_cron` no estaba disponible y refactoró 3 jobs.
39
+ - Supuesto sin validar: "la latencia desde nuestros clientes on-premise será aceptable" — necesita pruebas reales.
40
+
41
+ **Paso 4 — Red flags**: ninguno. Cada argumento está respaldado con caso o métrica.
42
+
43
+ **Paso 5 — Trigger**:
44
+ - Condición: "p95 de latencia desde el cliente legacy excede 200ms durante 7 días consecutivos" o "costo mensual supera $1500".
45
+ - Fecha de reevaluación: 2026-11-15 (6 meses).
46
+
47
+ **Veredicto**: ROBUSTA con 1 supuesto pendiente de validar (latencia on-premise → ejecutar prueba antes de migrar).
48
+
49
+ ---
50
+
51
+ ## Ejemplo 2 — Decisión BAJO-EVIDENCIA detectada
52
+
53
+ **Contexto**: agente propone "vamos a usar Kafka para todos los flujos asíncronos del sistema."
54
+
55
+ **Paso 1 — Articular**:
56
+ - Qué se decide: introducir Apache Kafka como broker único.
57
+ - Qué se descarta: Redis Streams + RabbitMQ ya existentes en el stack.
58
+ - Costo de revertir: alto — requiere rehacer 12 productores y 8 consumidores.
59
+
60
+ **Paso 2 — 3 alternativas**: el agente solo articula 1 (RabbitMQ) y dice "los demás
61
+ no son comparables." → **Red flag**: incapacidad de articular 3 alternativas reales.
62
+
63
+ **Paso 3 — Contraevidencia**: el agente dice "Kafka nunca falla en producción
64
+ porque tiene replication." → **Red flag**: argumento sin caso histórico.
65
+
66
+ **Paso 4 — Red flags**:
67
+ - "Es la mejor práctica para event-driven architectures" (sin fuente).
68
+ - "Todo el mundo lo usa a escala" (sin métrica del proyecto actual).
69
+ - "No hay otra opción razonable" (contradicho por el paso 2 incompleto).
70
+
71
+ **Paso 5 — Trigger**: "cuando lo necesitemos a más escala" — **Trigger inverificable**.
72
+ Reescribir como "throughput supera 10k msg/s sostenido durante 14 días."
73
+
74
+ **Veredicto**: BAJO-EVIDENCIA. Reabrir antes de comprometer.
75
+
76
+ Resultado real: la decisión se difiere; al revisar, se descubre que el throughput
77
+ actual del sistema es ~80 msg/s — Kafka habría sido sobre-ingeniería con costo
78
+ operativo de un cluster que el equipo no tiene capacidad de mantener.
79
+
80
+ ---
81
+
82
+ ## Ejemplo 3 — Decisión ACEPTABLE con red flag documentado
83
+
84
+ **Contexto**: elegir framework frontend para un dashboard interno nuevo.
85
+
86
+ **Paso 1**:
87
+ - Qué se decide: Next.js App Router + Server Components.
88
+ - Qué se descarta: SPA con Vite + React Query.
89
+ - Costo de revertir: medio — 2 semanas de migración + reescritura de data fetching.
90
+
91
+ **Paso 2 — 3 alternativas**:
92
+ 1. **SPA Vite + React Query**: más simple, menos magia; descartada porque queremos SSR para SEO interno y autenticación server-side.
93
+ 2. **Remix**: nested routing nativo; descartada porque el equipo ya tiene experiencia con Next.js y la curva de Remix agrega 2 semanas.
94
+ 3. **Astro con islands**: ideal si fuera contenido estático; descartada porque el dashboard es 80% interactivo.
95
+
96
+ **Paso 3 — Contraevidencia**:
97
+ - Falla 1 (prob: media): App Router introduce breaking changes y rompe el build (ya pasó con v13→v14).
98
+ - Falla 2 (prob: baja): RSC mental model genera bugs sutiles de hidratación.
99
+ - Falla 3 (prob: baja): vendor lock-in con Vercel — mitigación: deploy en Cloudflare Workers o self-hosted.
100
+ - Caso histórico: equipo Y adoptó App Router en beta y tardó 3 meses en estabilizar.
101
+ - Supuesto: "el equipo aprenderá RSC en 2 sprints" — moderadamente optimista.
102
+
103
+ **Paso 4 — Red flags**:
104
+ - "App Router es el futuro" (cita de blog post de Vercel — sesgo de fuente).
105
+
106
+ **Paso 5 — Trigger**:
107
+ - Condición: "≥3 bugs de hidratación reportados por usuarios en sprint 5" O "Vercel
108
+ anuncia deprecation de App Router".
109
+ - Fecha de reevaluación: 2026-08-15 (3 meses, periodo corto por uso de feature reciente).
110
+
111
+ **Veredicto**: ACEPTABLE — 1 red flag documentado (cita de Vercel como fuente única
112
+ para "futuro"). El equipo procede con awareness del sesgo.
113
+
114
+ ---
115
+
116
+ ## Patrón de aplicación
117
+
118
+ | Ejemplo | Costo revertir | Alternativas articuladas | Red flags | Trigger | Veredicto |
119
+ |---|---|---|---|---|---|
120
+ | 1 — RDS | 3 semanas | 3 sólidas | 0 | Métrico claro | ROBUSTA |
121
+ | 2 — Kafka | 12+8 servicios | 1 (incompleto) | 3 | Inverificable | BAJO-EVIDENCIA |
122
+ | 3 — Next.js | 2 semanas | 3 sólidas | 1 (sesgo de fuente) | Métrico + evento externo | ACEPTABLE |
123
+
124
+ El skill es útil cuando:
125
+ - El costo de revertir es alto Y
126
+ - Hay tendencia a saltar al "qué" sin articular el "por qué no las otras".
127
+
128
+ Es overhead cuando:
129
+ - La decisión es reversible en horas O
130
+ - La decisión ya fue auditada por un proceso equivalente (ADR formal con contexto + alternativas + consecuencias).
@@ -1,57 +1,57 @@
1
- {
2
- "_comentario": "Template de .mcp.json para proyectos Claude-ready. Eliminar los servidores que no se usen. Las variables de entorno con valor vacío deben completarse en .env o exportarse antes de correr claude.",
3
- "_instrucciones": [
4
- "1. Copiar este archivo a la raíz del proyecto como .mcp.json",
5
- "2. Eliminar el bloque _comentario y _instrucciones (no son JSON válido en producción)",
6
- "3. Configurar las variables de entorno requeridas por cada servidor activo",
7
- "4. Agregar .mcp.json al repositorio (no contiene secretos — los secretos van en env vars)",
8
- "5. Agregar a .gitignore cualquier archivo .mcp.local.json con credenciales"
9
- ],
10
- "_nota_archivados": "Los reference servers @modelcontextprotocol/server-github, server-postgres, server-sqlite, server-brave-search y server-puppeteer fueron ARCHIVADOS por el proyecto MCP. No usarlos en proyectos nuevos — los reemplazos vigentes están abajo (GitHub remoto oficial, Playwright oficial de Microsoft).",
11
- "mcpServers": {
12
- "context7": {
13
- "_descripcion": "Documentación actualizada de librerías. Uso: 'use context7' en el prompt.",
14
- "command": "npx",
15
- "args": ["-y", "@upstash/context7-mcp@latest"]
16
- },
17
- "github": {
18
- "_descripcion": "GitHub MCP server oficial (remoto): issues, PRs, repos, commits. Reemplaza al archivado @modelcontextprotocol/server-github. Autenticación OAuth al conectar, o PAT vía header.",
19
- "type": "http",
20
- "url": "https://api.githubcopilot.com/mcp/"
21
- },
22
- "playwright": {
23
- "_descripcion": "Control de navegador con Playwright (oficial de Microsoft). Testing E2E, scraping, automatización web. Reemplaza al archivado server-puppeteer.",
24
- "_activar": "Requiere Node 18+ — descarga browsers en el primer uso",
25
- "command": "npx",
26
- "args": ["-y", "@playwright/mcp@latest"]
27
- },
28
- "filesystem": {
29
- "_descripcion": "Acceso a sistema de archivos fuera del directorio de trabajo. Usar con cuidado.",
30
- "_activar": "Descomentar solo si se necesita acceso a paths fuera del proyecto",
31
- "command": "npx",
32
- "args": [
33
- "-y",
34
- "@modelcontextprotocol/server-filesystem",
35
- "/ruta/al/directorio/permitido"
36
- ]
37
- },
38
- "fetch": {
39
- "_descripcion": "Extracción y conversión de contenido web a markdown.",
40
- "_activar": "Útil cuando WebFetch nativo no basta (contenido que requiere conversión estructurada)",
41
- "command": "npx",
42
- "args": ["-y", "@modelcontextprotocol/server-fetch"]
43
- },
44
- "memory": {
45
- "_descripcion": "Memoria persistente entre sesiones. Almacena entidades y relaciones en grafo.",
46
- "_activar": "Útil para proyectos largos donde se quiere persistir contexto entre sesiones",
47
- "command": "npx",
48
- "args": ["-y", "@modelcontextprotocol/server-memory"]
49
- },
50
- "sequential-thinking": {
51
- "_descripcion": "Herramienta de razonamiento estructurado para problemas complejos.",
52
- "_activar": "Útil para arquitectura, debugging complejo, decisiones de diseño",
53
- "command": "npx",
54
- "args": ["-y", "@modelcontextprotocol/server-sequential-thinking"]
55
- }
56
- }
57
- }
1
+ {
2
+ "_comentario": "Template de .mcp.json para proyectos Claude-ready. Eliminar los servidores que no se usen. Las variables de entorno con valor vacío deben completarse en .env o exportarse antes de correr claude.",
3
+ "_instrucciones": [
4
+ "1. Copiar este archivo a la raíz del proyecto como .mcp.json",
5
+ "2. Eliminar el bloque _comentario y _instrucciones (no son JSON válido en producción)",
6
+ "3. Configurar las variables de entorno requeridas por cada servidor activo",
7
+ "4. Agregar .mcp.json al repositorio (no contiene secretos — los secretos van en env vars)",
8
+ "5. Agregar a .gitignore cualquier archivo .mcp.local.json con credenciales"
9
+ ],
10
+ "_nota_archivados": "Los reference servers @modelcontextprotocol/server-github, server-postgres, server-sqlite, server-brave-search y server-puppeteer fueron ARCHIVADOS por el proyecto MCP. No usarlos en proyectos nuevos — los reemplazos vigentes están abajo (GitHub remoto oficial, Playwright oficial de Microsoft).",
11
+ "mcpServers": {
12
+ "context7": {
13
+ "_descripcion": "Documentación actualizada de librerías. Uso: 'use context7' en el prompt.",
14
+ "command": "npx",
15
+ "args": ["-y", "@upstash/context7-mcp@latest"]
16
+ },
17
+ "github": {
18
+ "_descripcion": "GitHub MCP server oficial (remoto): issues, PRs, repos, commits. Reemplaza al archivado @modelcontextprotocol/server-github. Autenticación OAuth al conectar, o PAT vía header.",
19
+ "type": "http",
20
+ "url": "https://api.githubcopilot.com/mcp/"
21
+ },
22
+ "playwright": {
23
+ "_descripcion": "Control de navegador con Playwright (oficial de Microsoft). Testing E2E, scraping, automatización web. Reemplaza al archivado server-puppeteer.",
24
+ "_activar": "Requiere Node 18+ — descarga browsers en el primer uso",
25
+ "command": "npx",
26
+ "args": ["-y", "@playwright/mcp@latest"]
27
+ },
28
+ "filesystem": {
29
+ "_descripcion": "Acceso a sistema de archivos fuera del directorio de trabajo. Usar con cuidado.",
30
+ "_activar": "Descomentar solo si se necesita acceso a paths fuera del proyecto",
31
+ "command": "npx",
32
+ "args": [
33
+ "-y",
34
+ "@modelcontextprotocol/server-filesystem",
35
+ "/ruta/al/directorio/permitido"
36
+ ]
37
+ },
38
+ "fetch": {
39
+ "_descripcion": "Extracción y conversión de contenido web a markdown.",
40
+ "_activar": "Útil cuando WebFetch nativo no basta (contenido que requiere conversión estructurada)",
41
+ "command": "npx",
42
+ "args": ["-y", "@modelcontextprotocol/server-fetch"]
43
+ },
44
+ "memory": {
45
+ "_descripcion": "Memoria persistente entre sesiones. Almacena entidades y relaciones en grafo.",
46
+ "_activar": "Útil para proyectos largos donde se quiere persistir contexto entre sesiones",
47
+ "command": "npx",
48
+ "args": ["-y", "@modelcontextprotocol/server-memory"]
49
+ },
50
+ "sequential-thinking": {
51
+ "_descripcion": "Herramienta de razonamiento estructurado para problemas complejos.",
52
+ "_activar": "Útil para arquitectura, debugging complejo, decisiones de diseño",
53
+ "command": "npx",
54
+ "args": ["-y", "@modelcontextprotocol/server-sequential-thinking"]
55
+ }
56
+ }
57
+ }
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: extractor-de-aprendizajes
3
3
  description: Convertir errores y patrones descubiertos durante la implementación en nuevas habilidades o reglas. Ciclo de mejora continua del sistema SWL.
4
- version: "1.0.8"
4
+ version: "1.0.9"
5
5
  herramientasPermitidas: [Read]
6
6
  exclusiones:
7
7
  - "No cargar para actualizar el perfil del usuario — las correcciones explícitas del usuario van a `instintos/perfil-usuario.yaml` vía `perfilador-usuario-swl`, no a APRENDIZAJES.md."
@@ -305,6 +305,8 @@ Durante `/swl:aprender`, aplicar estas reglas:
305
305
 
306
306
  **Modo F — sub-agente con mandato explícito de SOLO LECTURA ejecuta un comando destructivo** (caso real 2026-07-11): un agente de auditoría lanzado con "PROHIBIDO modificar cualquier archivo o la BD; solo Read/Grep/Glob y SELECT" ejecutó (vía un sub-agente anidado propio) un `rm -f` que borró un PNG de evidencia en la raíz del repo. El archivo estaba SIN TRACKEAR en git → irrecuperable (los tracked se restauran con `git checkout --`; los untracked no tienen red de seguridad). El agente REPORTÓ el incidente con honestidad en su resultado final — pero el daño ya estaba hecho. Causa: el mandato en el prompt es una instrucción, no una contención; los agentes anidados heredan herramientas, no disciplina. Diferencia con el Modo E: allí el riesgo era aceptar un reporte incompleto; aquí es daño colateral directo al workspace. Patrón doble: (1) `git status` comparativo tras CADA agente; (2) ANTES de lanzar agentes sobre un working tree con archivos untracked valiosos, protegerlos primero — commitearlos, moverlos fuera del repo o copiarlos (el trabajo sin commitear es la única víctima sin recuperación posible).
307
307
 
308
+ **Modo G — revisores adversariales en paralelo verifican la LÓGICA de un módulo pero nunca RE-DERIVAN el número que reporta** (caso real 2026-07-17, swl-ses F32-T07): 4 revisores adversariales corriendo en paralelo (incluido un agente `abogado-diablo-swl` con mandato explícito de refutar) auditaron un motor de mutation testing que reportaba mutation score 100% en 7 de 20 módulos críticos. Los 4 revisaron la lógica del clasificador, el manejo de errores y la cobertura de casos — ninguno detectó que esos 7 módulos "100%" nunca corrían un solo mutante real: todos morían por `MODULE_NOT_FOUND` de un entorno mal aislado, y el clasificador contaba esos fallos como kills. El bug solo apareció cuando el orquestador (no un revisor) reprodujo el cómputo en aislamiento (`ejecutarMutationTesting({modulos:[unicoModulo]})`) para cada módulo "100%" y confirmó que fallaban los 7. Causa: revisar código verifica que la LÓGICA sea razonable; no verifica que la CIFRA agregada que esa lógica produjo sea real — son preguntas distintas, y un panel de revisores de código, por más adversarial que sea, responde la primera, no la segunda. Diferencia con el Modo C (ubicaciones/severidades incorrectas): ahí el revisor mira código y se equivoca sobre el código; aquí el revisor mira código, tiene razón sobre el código, y el bug vive en la intersección entre el código y el entorno de ejecución — invisible sin ejecutar.
309
+
308
310
  **Solución unificada — protocolo de verificación de afirmaciones factuales antes de aceptar propuesta de CUALQUIER sub-agente**:
309
311
 
310
312
  *Patrón obligatorio aplicable a TODOS los modos*: extraer 2-3 afirmaciones factuales del reporte del sub-agente y verificar cada una con primitivas baratas (`Grep`/`Read`/`wc -l`/`ls`/`git log`) ANTES de aceptar el plan o acción. Tipos de afirmaciones a verificar:
@@ -322,6 +324,8 @@ Durante `/swl:aprender`, aplicar estas reglas:
322
324
  *Para agentes de documentación (Modo D)*: todo veredicto **NO-EXISTE / NO-SOPORTADO** sobre una feature de un producto externo exige cita a la doc oficial consultada EN ese turno (URL + extracto). Si el agente "verifica" solo contra el contexto local (configs del usuario, código del repo), su veredicto es inferencia, no verificación — re-verificar con 1 WebFetch a la doc oficial antes de tomar decisiones de diseño sobre él. Regla mnemónica: *ausencia en mi config ≠ ausencia en el producto*.
323
325
 
324
326
  *Para agentes de implementación en worktree (Modo E)*: cualquier frase tipo "no pude correr X", "el entorno no tenía Y", "solo verifiqué con Z" en el reporte final es una señal de PRIORIDAD MÁXIMA — re-ejecutar exactamente lo que el agente no pudo ejecutar (suite de tests completa, no solo el archivo que tocó) con el entorno correcto del checkout principal ANTES de dar el trabajo por terminado. Nunca degradar esa frase a "nota informativa" solo porque el resto del reporte suena confiado.
327
+
328
+ *Para paneles de revisores adversariales sobre un claim NUMÉRICO/AGREGADO (Modo G)*: cuando el artefacto bajo revisión reporta un score, porcentaje o conteo derivado de una corrida (mutation score, cobertura, latencia p95, tasa de éxito), el patrón obligatorio de "verificar 2-3 afirmaciones con Grep/Read" NO alcanza — hay que re-derivar la cifra en un subconjunto aislado y mínimo (un solo módulo, un solo caso) ANTES de aceptar el agregado. Un panel de revisores que solo lee el código del cómputo, sin ejecutar ni un fragmento, no puede detectar bugs que viven en la intersección código↔entorno.
325
329
  - **Hooks de calidad pre-commit bloquean fixtures de tests como falsos positivos**: el hook `calidad-pre-commit.js` aplica regex `\b(api_key|password|token|secret)\s*[=:]\s*["'][^"'\s]{4,}["']` que matchea fixtures legítimos en archivos de test. Caso real: test que valida que la función `sanitizar()` redacta `api_key="abc12345xyz"` se bloquea. Causa: el hook no distingue contexto de test vs producción. Solución: en archivos de test, construir fixtures con concatenación de strings (`'api' + '_key'`, `'pass' + 'word'`) o agregar marcador placeholder reconocido por el hook (`fake_`, `dummy_`, `placeholder`, `example`, `os.environ`). NUNCA bypassear el hook con `--no-verify` — el detector cumple su función; ajustar el fixture es lo correcto.
326
330
  - **Regex de path-matching `/[\\/]<dir>[\\/]/` falla con paths relativos sin slash inicial** [CONFIRMADO x4]: hooks que filtran archivos por directorio (ej: `hooks/extraccion-aprendizajes.js` con `PATRONES_ARCHIVO_SWL_EXCLUIDO`) usan patrones que requieren un separator ANTES del nombre. Caso real: path `scripts/lib/foo.js` (sin slash inicial) eludía el filtro de exclusión y generaba placeholders espurios en APRENDIZAJES.md cada vez que se hacía `Edit` o `Write` sobre archivos del sistema SWL. Causa: el regex `[\\/]` requiere un caracter slash/backslash previo; cuando el path empieza con el nombre del directorio directamente, no matchea. Solución: usar `/(?:^|[\\/])<dir>[\\/]/` para aceptar tanto el inicio del string como un separator previo. Evidencia: 4 placeholders eliminados manualmente entre v1.3.3-v1.3.5 antes de identificar la causa raíz; fix endurecido aplicado en v1.3.5 (Fix I).
327
331
  - **`git ls-files` es preferible a `fs.readdir` recursivo para tests anti-regresión que escanean el repo**: usar `execSync('git ls-files')` limita el escaneo a archivos versionados — evita `node_modules/`, `.git/`, `_userland/`, archivos temporales y backups sin enumerar exclusiones. Caso real: `tests/scripts/no-legacy-npx-pattern.test.js` v1.3.6 escanea 1000+ archivos versionados en <200ms; el equivalente con `fs.readdir` recursivo más exclusiones manuales sería más lento y propenso a olvidar paths. Cuando el test es de "calidad del repo" (no de comportamiento), `git ls-files` es la primitiva correcta.
@@ -1,108 +1,108 @@
1
- # Preguntas Feynman — Language-Agnostic
2
-
3
- 28 preguntas organizadas en 7 categorías. Aplicar a cada función no trivial del módulo bajo auditoría.
4
-
5
- ---
6
-
7
- ## Q1 — Propósito
8
-
9
- **Q1.1** ¿Qué hace exactamente esta función y solo esta función? Si no puedo describirla en una oración sin usar "y", ¿tiene demasiadas responsabilidades?
10
-
11
- **Q1.2** ¿Cuál es el invariante que esta función garantiza al terminar? ¿El código lo garantiza de verdad o solo en el camino feliz?
12
-
13
- **Q1.3** ¿Hay alguna condición en que esta función debería rechazar la operación pero no lo hace? ¿Qué pasa si se la llama dos veces seguidas con los mismos argumentos?
14
-
15
- **Q1.4** ¿Esta función asume que el estado del sistema está en alguna condición particular antes de ejecutarse? ¿Dónde se verifica esa condición?
16
-
17
- ---
18
-
19
- ## Q2 — Orden de operaciones
20
-
21
- **Q2.1** ¿Importa el orden en que estas líneas se ejecutan? Si cambio el orden de dos líneas adyacentes, ¿el resultado es el mismo?
22
-
23
- **Q2.2** ¿Esta función lee un valor y luego lo modifica? Si algo cambia el valor entre la lectura y la escritura, ¿qué pasa?
24
-
25
- **Q2.3** ¿El cálculo de recompensa, crédito, o resultado se hace ANTES o DESPUÉS de actualizar el estado base? ¿Debería ser al revés?
26
-
27
- **Q2.4** ¿Si esta función llama a un sistema externo (BD, API, caché), el estado local ya está actualizado en ese momento? ¿El sistema externo puede ver un estado inconsistente?
28
-
29
- ---
30
-
31
- ## Q3 — Consistencia cross-función
32
-
33
- **Q3.1** ¿Qué tienen en común esta función y otra que hace algo similar? ¿Una tiene un guard o una actualización que la otra no tiene?
34
-
35
- **Q3.2** ¿Existe una función de "camino normal" y una de "camino de emergencia/admin"? ¿Ambas actualizan exactamente el mismo conjunto de estado?
36
-
37
- **Q3.3** ¿Esta función inicializa todos los campos que otras funciones esperan encontrar inicializados? ¿Hay algún campo que se lee antes de ser escrito?
38
-
39
- **Q3.4** ¿El path que crea un recurso y el path que lo elimina dejan el sistema en un estado simétrico? ¿O el delete deja huérfanos?
40
-
41
- ---
42
-
43
- ## Q4 — Asunciones implícitas
44
-
45
- **Q4.1** ¿Qué asume este código sobre el tipo o el rango del argumento que recibe? ¿Hay alguna validación que debería existir pero no existe?
46
-
47
- **Q4.2** ¿El código asume que el actor que llama esta función tiene permiso para hacerlo? ¿Dónde se verifica ese permiso exactamente?
48
-
49
- **Q4.3** ¿El código asume que algún recurso externo (BD, archivo, servicio) está disponible y en un estado consistente? ¿Qué pasa si no lo está?
50
-
51
- **Q4.4** ¿El código asume que nunca se llamará con valor cero, lista vacía, o string vacío? ¿Se validó eso?
52
-
53
- ---
54
-
55
- ## Q5 — Límites y casos de borde
56
-
57
- **Q5.1** ¿Qué pasa si el valor es exactamente cero? ¿Y si es el máximo representable? ¿Y si es negativo?
58
-
59
- **Q5.2** ¿Qué pasa si la lista o colección está vacía? ¿Y si tiene exactamente un elemento? ¿Y si tiene millones?
60
-
61
- **Q5.3** ¿Qué pasa si el recurso ya existe cuando se intenta crear? ¿Y si no existe cuando se intenta modificar o eliminar?
62
-
63
- **Q5.4** ¿Qué pasa si dos actores ejecutan esta función al mismo tiempo? ¿Hay condición de carrera? ¿El resultado es determinista?
64
-
65
- ---
66
-
67
- ## Q6 — Returns y manejo de errores
68
-
69
- **Q6.1** ¿Qué devuelve esta función cuando el input es inválido? ¿Lanza excepción, devuelve null, devuelve un error tipado, o silencia el problema?
70
-
71
- **Q6.2** ¿Si una operación parcial falla a mitad de camino, el estado queda consistente? ¿Hay rollback? ¿O el sistema queda a medias?
72
-
73
- **Q6.3** ¿El caller de esta función verifica el valor de retorno? ¿Un error no verificado puede causar daño silencioso más adelante?
74
-
75
- **Q6.4** ¿El código captura excepciones de forma demasiado amplia (`except Exception`, `catch (e)` vacío)? ¿Qué errores legítimos podría estar silenciando?
76
-
77
- ---
78
-
79
- ## Q7 — Interacciones externas
80
-
81
- **Q7.1** ¿Esta función llama a un sistema externo (BD, API, caché, cola)? ¿La llamada puede fallar? ¿Qué pasa con el estado local si falla?
82
-
83
- **Q7.2** ¿Esta función persiste datos en más de un lugar (ej: BD + caché + índice)? ¿Qué pasa si la segunda escritura falla después de que la primera tuvo éxito?
84
-
85
- **Q7.3** ¿El acumulador o índice que esta función usa se actualiza ANTES de modificar el valor base, o DESPUÉS? ¿El orden importa para la correctitud del cálculo?
86
-
87
- **Q7.4** ¿Esta función envía una notificación, evento, o mensaje a otro sistema? ¿Lo hace antes o después de confirmar la operación? ¿El receptor puede actuar sobre un estado que aún no se confirmó?
88
-
89
- **Q7.5** ¿Esta función lee un valor de caché y lo trata como fresco? ¿Hay algún path donde la caché puede estar desactualizada respecto a la fuente de verdad?
90
-
91
- **Q7.6** ¿Esta función modifica datos de otro actor además de los del actor que la llama? ¿Tiene permiso para hacerlo en todos los casos?
92
-
93
- **Q7.7** ¿Existe un patrón de acumulador donde el total acumulado se calcula con base en el estado anterior? Si el estado base cambia (insert/update/delete de otro registro), ¿el acumulador refleja el cambio correctamente?
94
-
95
- **Q7.8** ¿Esta función delega a otra función que tiene sus propios efectos secundarios? ¿El caller sabe qué estado modifica el callee internamente?
96
-
97
- ---
98
-
99
- ## Cómo usar estas preguntas
100
-
101
- 1. Leer la función completa una vez para entender el propósito.
102
- 2. Para cada pregunta de las categorías Q1–Q7, marcar:
103
- - ✓ Respondida claramente por el código
104
- - ? Requiere rastrear el caller o el sistema externo para responder
105
- - ✗ El código no la responde — sospechoso de bug
106
- 3. Todo `✗` o `?` sin resolver es un **sospechoso** para Fase 3 de síntesis.
107
-
108
- <!-- Adaptado de nemesis-auditor-main bajo MIT License (https://github.com/0xiehnnkta/nemesis-auditor) -->
1
+ # Preguntas Feynman — Language-Agnostic
2
+
3
+ 28 preguntas organizadas en 7 categorías. Aplicar a cada función no trivial del módulo bajo auditoría.
4
+
5
+ ---
6
+
7
+ ## Q1 — Propósito
8
+
9
+ **Q1.1** ¿Qué hace exactamente esta función y solo esta función? Si no puedo describirla en una oración sin usar "y", ¿tiene demasiadas responsabilidades?
10
+
11
+ **Q1.2** ¿Cuál es el invariante que esta función garantiza al terminar? ¿El código lo garantiza de verdad o solo en el camino feliz?
12
+
13
+ **Q1.3** ¿Hay alguna condición en que esta función debería rechazar la operación pero no lo hace? ¿Qué pasa si se la llama dos veces seguidas con los mismos argumentos?
14
+
15
+ **Q1.4** ¿Esta función asume que el estado del sistema está en alguna condición particular antes de ejecutarse? ¿Dónde se verifica esa condición?
16
+
17
+ ---
18
+
19
+ ## Q2 — Orden de operaciones
20
+
21
+ **Q2.1** ¿Importa el orden en que estas líneas se ejecutan? Si cambio el orden de dos líneas adyacentes, ¿el resultado es el mismo?
22
+
23
+ **Q2.2** ¿Esta función lee un valor y luego lo modifica? Si algo cambia el valor entre la lectura y la escritura, ¿qué pasa?
24
+
25
+ **Q2.3** ¿El cálculo de recompensa, crédito, o resultado se hace ANTES o DESPUÉS de actualizar el estado base? ¿Debería ser al revés?
26
+
27
+ **Q2.4** ¿Si esta función llama a un sistema externo (BD, API, caché), el estado local ya está actualizado en ese momento? ¿El sistema externo puede ver un estado inconsistente?
28
+
29
+ ---
30
+
31
+ ## Q3 — Consistencia cross-función
32
+
33
+ **Q3.1** ¿Qué tienen en común esta función y otra que hace algo similar? ¿Una tiene un guard o una actualización que la otra no tiene?
34
+
35
+ **Q3.2** ¿Existe una función de "camino normal" y una de "camino de emergencia/admin"? ¿Ambas actualizan exactamente el mismo conjunto de estado?
36
+
37
+ **Q3.3** ¿Esta función inicializa todos los campos que otras funciones esperan encontrar inicializados? ¿Hay algún campo que se lee antes de ser escrito?
38
+
39
+ **Q3.4** ¿El path que crea un recurso y el path que lo elimina dejan el sistema en un estado simétrico? ¿O el delete deja huérfanos?
40
+
41
+ ---
42
+
43
+ ## Q4 — Asunciones implícitas
44
+
45
+ **Q4.1** ¿Qué asume este código sobre el tipo o el rango del argumento que recibe? ¿Hay alguna validación que debería existir pero no existe?
46
+
47
+ **Q4.2** ¿El código asume que el actor que llama esta función tiene permiso para hacerlo? ¿Dónde se verifica ese permiso exactamente?
48
+
49
+ **Q4.3** ¿El código asume que algún recurso externo (BD, archivo, servicio) está disponible y en un estado consistente? ¿Qué pasa si no lo está?
50
+
51
+ **Q4.4** ¿El código asume que nunca se llamará con valor cero, lista vacía, o string vacío? ¿Se validó eso?
52
+
53
+ ---
54
+
55
+ ## Q5 — Límites y casos de borde
56
+
57
+ **Q5.1** ¿Qué pasa si el valor es exactamente cero? ¿Y si es el máximo representable? ¿Y si es negativo?
58
+
59
+ **Q5.2** ¿Qué pasa si la lista o colección está vacía? ¿Y si tiene exactamente un elemento? ¿Y si tiene millones?
60
+
61
+ **Q5.3** ¿Qué pasa si el recurso ya existe cuando se intenta crear? ¿Y si no existe cuando se intenta modificar o eliminar?
62
+
63
+ **Q5.4** ¿Qué pasa si dos actores ejecutan esta función al mismo tiempo? ¿Hay condición de carrera? ¿El resultado es determinista?
64
+
65
+ ---
66
+
67
+ ## Q6 — Returns y manejo de errores
68
+
69
+ **Q6.1** ¿Qué devuelve esta función cuando el input es inválido? ¿Lanza excepción, devuelve null, devuelve un error tipado, o silencia el problema?
70
+
71
+ **Q6.2** ¿Si una operación parcial falla a mitad de camino, el estado queda consistente? ¿Hay rollback? ¿O el sistema queda a medias?
72
+
73
+ **Q6.3** ¿El caller de esta función verifica el valor de retorno? ¿Un error no verificado puede causar daño silencioso más adelante?
74
+
75
+ **Q6.4** ¿El código captura excepciones de forma demasiado amplia (`except Exception`, `catch (e)` vacío)? ¿Qué errores legítimos podría estar silenciando?
76
+
77
+ ---
78
+
79
+ ## Q7 — Interacciones externas
80
+
81
+ **Q7.1** ¿Esta función llama a un sistema externo (BD, API, caché, cola)? ¿La llamada puede fallar? ¿Qué pasa con el estado local si falla?
82
+
83
+ **Q7.2** ¿Esta función persiste datos en más de un lugar (ej: BD + caché + índice)? ¿Qué pasa si la segunda escritura falla después de que la primera tuvo éxito?
84
+
85
+ **Q7.3** ¿El acumulador o índice que esta función usa se actualiza ANTES de modificar el valor base, o DESPUÉS? ¿El orden importa para la correctitud del cálculo?
86
+
87
+ **Q7.4** ¿Esta función envía una notificación, evento, o mensaje a otro sistema? ¿Lo hace antes o después de confirmar la operación? ¿El receptor puede actuar sobre un estado que aún no se confirmó?
88
+
89
+ **Q7.5** ¿Esta función lee un valor de caché y lo trata como fresco? ¿Hay algún path donde la caché puede estar desactualizada respecto a la fuente de verdad?
90
+
91
+ **Q7.6** ¿Esta función modifica datos de otro actor además de los del actor que la llama? ¿Tiene permiso para hacerlo en todos los casos?
92
+
93
+ **Q7.7** ¿Existe un patrón de acumulador donde el total acumulado se calcula con base en el estado anterior? Si el estado base cambia (insert/update/delete de otro registro), ¿el acumulador refleja el cambio correctamente?
94
+
95
+ **Q7.8** ¿Esta función delega a otra función que tiene sus propios efectos secundarios? ¿El caller sabe qué estado modifica el callee internamente?
96
+
97
+ ---
98
+
99
+ ## Cómo usar estas preguntas
100
+
101
+ 1. Leer la función completa una vez para entender el propósito.
102
+ 2. Para cada pregunta de las categorías Q1–Q7, marcar:
103
+ - ✓ Respondida claramente por el código
104
+ - ? Requiere rastrear el caller o el sistema externo para responder
105
+ - ✗ El código no la responde — sospechoso de bug
106
+ 3. Todo `✗` o `?` sin resolver es un **sospechoso** para Fase 3 de síntesis.
107
+
108
+ <!-- Adaptado de nemesis-auditor-main bajo MIT License (https://github.com/0xiehnnkta/nemesis-auditor) -->