@saulwade/swl-ses 1.0.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 (702) hide show
  1. package/CLAUDE.md +238 -0
  2. package/README.md +560 -0
  3. package/_userland/agentes/.gitkeep +0 -0
  4. package/_userland/habilidades/.gitkeep +0 -0
  5. package/agentes/.evolved.json +9 -0
  6. package/agentes/accesibilidad-wcag-swl.md +692 -0
  7. package/agentes/arquitecto-swl.md +238 -0
  8. package/agentes/auto-evolucion-swl.md +854 -0
  9. package/agentes/backend-api-swl.md +470 -0
  10. package/agentes/backend-csharp-swl.md +418 -0
  11. package/agentes/backend-go-swl.md +388 -0
  12. package/agentes/backend-java-swl.md +279 -0
  13. package/agentes/backend-node-swl.md +477 -0
  14. package/agentes/backend-python-swl.md +608 -0
  15. package/agentes/backend-rust-swl.md +362 -0
  16. package/agentes/backend-workers-swl.md +480 -0
  17. package/agentes/cloud-infra-swl.md +485 -0
  18. package/agentes/consolidador-swl.md +539 -0
  19. package/agentes/datos-swl.md +584 -0
  20. package/agentes/depurador-swl.md +349 -0
  21. package/agentes/devops-ci-swl.md +374 -0
  22. package/agentes/disenador-ui-swl.md +558 -0
  23. package/agentes/documentador-swl.md +343 -0
  24. package/agentes/evals/arquitecto-swl.evals.json +56 -0
  25. package/agentes/evals/auto-evolucion-swl.evals.json +68 -0
  26. package/agentes/evals/implementador-swl.evals.json +56 -0
  27. package/agentes/evals/orquestador-swl.evals.json +60 -0
  28. package/agentes/evals/perfilador-usuario-swl.evals.json +60 -0
  29. package/agentes/evals/red-team-swl.evals.json +59 -0
  30. package/agentes/evals/revisor-codigo-swl.evals.json +59 -0
  31. package/agentes/frontend-angular-swl.md +627 -0
  32. package/agentes/frontend-css-swl.md +720 -0
  33. package/agentes/frontend-react-swl.md +696 -0
  34. package/agentes/frontend-swl.md +500 -0
  35. package/agentes/frontend-tailwind-swl.md +830 -0
  36. package/agentes/implementador-swl.md +328 -0
  37. package/agentes/investigador-swl.md +430 -0
  38. package/agentes/investigador-ux-swl.md +500 -0
  39. package/agentes/llm-apps-swl.md +276 -0
  40. package/agentes/migrador-swl.md +417 -0
  41. package/agentes/mobile-android-swl.md +509 -0
  42. package/agentes/mobile-cross-swl.md +539 -0
  43. package/agentes/mobile-ios-swl.md +500 -0
  44. package/agentes/mobile-testing-swl.md +300 -0
  45. package/agentes/notificador-swl.md +916 -0
  46. package/agentes/observabilidad-swl.md +436 -0
  47. package/agentes/orquestador-swl.md +884 -0
  48. package/agentes/pagos-swl.md +283 -0
  49. package/agentes/perfilador-usuario-swl.md +306 -0
  50. package/agentes/planificador-swl.md +402 -0
  51. package/agentes/producto-prd-swl.md +587 -0
  52. package/agentes/red-team-swl.md +216 -0
  53. package/agentes/release-manager-swl.md +568 -0
  54. package/agentes/rendimiento-swl.md +714 -0
  55. package/agentes/resolutor-build-swl.md +243 -0
  56. package/agentes/revisor-angular-swl.md +276 -0
  57. package/agentes/revisor-codigo-swl.md +348 -0
  58. package/agentes/revisor-csharp-swl.md +262 -0
  59. package/agentes/revisor-go-swl.md +257 -0
  60. package/agentes/revisor-java-swl.md +255 -0
  61. package/agentes/revisor-kotlin-swl.md +271 -0
  62. package/agentes/revisor-nextjs-swl.md +279 -0
  63. package/agentes/revisor-php-swl.md +269 -0
  64. package/agentes/revisor-react-swl.md +276 -0
  65. package/agentes/revisor-rust-swl.md +344 -0
  66. package/agentes/revisor-seguridad-swl.md +390 -0
  67. package/agentes/revisor-swift-swl.md +266 -0
  68. package/agentes/revisor-typescript-swl.md +344 -0
  69. package/agentes/sre-swl.md +265 -0
  70. package/agentes/tdd-qa-swl.md +354 -0
  71. package/agentes/ux-disenador-swl.md +501 -0
  72. package/bin/lib/bot-comandos.js +1030 -0
  73. package/bin/lib/bot-discovery.js +182 -0
  74. package/bin/lib/bot-git.js +142 -0
  75. package/bin/swl-ses.js +325 -0
  76. package/bin/swl-telegram-bot.js +442 -0
  77. package/bin/swl-telegram-bot.plist +21 -0
  78. package/bin/swl-telegram-bot.service +14 -0
  79. package/comandos/swl/.evolved.json +23 -0
  80. package/comandos/swl/actualizar.md +174 -0
  81. package/comandos/swl/adoptar-proyecto.md +207 -0
  82. package/comandos/swl/aprender.md +701 -0
  83. package/comandos/swl/auditar-deps.md +134 -0
  84. package/comandos/swl/autoresearch.md +170 -0
  85. package/comandos/swl/ayuda.md +224 -0
  86. package/comandos/swl/brainstorm.md +50 -0
  87. package/comandos/swl/checkpoint.md +330 -0
  88. package/comandos/swl/compactar.md +283 -0
  89. package/comandos/swl/configurar-ci.md +227 -0
  90. package/comandos/swl/contexto.md +112 -0
  91. package/comandos/swl/contribuir.md +233 -0
  92. package/comandos/swl/crear-skill.md +292 -0
  93. package/comandos/swl/cron.md +196 -0
  94. package/comandos/swl/dashboard.md +146 -0
  95. package/comandos/swl/discutir-fase.md +230 -0
  96. package/comandos/swl/ejecutar-fase.md +135 -0
  97. package/comandos/swl/evaluar-skill.md +487 -0
  98. package/comandos/swl/evolucion-estado.md +142 -0
  99. package/comandos/swl/evolucionar.md +259 -0
  100. package/comandos/swl/exportar-vault.md +189 -0
  101. package/comandos/swl/gateway.md +158 -0
  102. package/comandos/swl/inbox.md +116 -0
  103. package/comandos/swl/instalar.md +220 -0
  104. package/comandos/swl/instintos.md +86 -0
  105. package/comandos/swl/mapear-codebase.md +312 -0
  106. package/comandos/swl/mcp-status.md +175 -0
  107. package/comandos/swl/metricas.md +270 -0
  108. package/comandos/swl/modelo.md +102 -0
  109. package/comandos/swl/notificaciones.md +396 -0
  110. package/comandos/swl/nuevo-proyecto.md +154 -0
  111. package/comandos/swl/planear-fase.md +221 -0
  112. package/comandos/swl/plugins.md +256 -0
  113. package/comandos/swl/reflect-skills.md +125 -0
  114. package/comandos/swl/release.md +217 -0
  115. package/comandos/swl/revisar-impacto.md +206 -0
  116. package/comandos/swl/revisar.md +330 -0
  117. package/comandos/swl/salud.md +363 -0
  118. package/comandos/swl/sesiones.md +200 -0
  119. package/comandos/swl/skill-search.md +113 -0
  120. package/comandos/swl/verificar.md +585 -0
  121. package/comandos/swl/wiki.md +620 -0
  122. package/contextos/dev.md +32 -0
  123. package/contextos/research.md +30 -0
  124. package/contextos/review.md +31 -0
  125. package/habilidades/accesibilidad-a11y/SKILL.md +201 -0
  126. package/habilidades/accesibilidad-a11y/evals/evals.json +56 -0
  127. package/habilidades/accesibilidad-a11y/recursos/ejemplos-y-checklist-completo.md +441 -0
  128. package/habilidades/agent-browser/SKILL.md +218 -0
  129. package/habilidades/agentes-como-servicio/SKILL.md +218 -0
  130. package/habilidades/ai-runtime-security/SKILL.md +273 -0
  131. package/habilidades/angular-avanzado/SKILL.md +164 -0
  132. package/habilidades/angular-avanzado/recursos/ejemplos-avanzados.md +219 -0
  133. package/habilidades/angular-moderno/SKILL.md +186 -0
  134. package/habilidades/angular-moderno/evals/evals.json +45 -0
  135. package/habilidades/angular-moderno/recursos/ejemplos-avanzados.md +106 -0
  136. package/habilidades/api-rest-diseno/SKILL.md +191 -0
  137. package/habilidades/api-rest-diseno/recursos/openapi-template.yaml +506 -0
  138. package/habilidades/api-rest-diseno/recursos/referencia-api.md +140 -0
  139. package/habilidades/aprendizaje-continuo/SKILL.md +151 -0
  140. package/habilidades/aprendizaje-continuo/evals/evals.json +53 -0
  141. package/habilidades/aprendizaje-continuo/recursos/referencia-instintos.md +290 -0
  142. package/habilidades/async-python/SKILL.md +149 -0
  143. package/habilidades/async-python/evals/evals.json +47 -0
  144. package/habilidades/async-python/recursos/patrones-y-ejemplos-completos.md +292 -0
  145. package/habilidades/auth-patrones/.evolved.json +9 -0
  146. package/habilidades/auth-patrones/SKILL.md +413 -0
  147. package/habilidades/auth-patrones/recursos/implementaciones-completas.md +229 -0
  148. package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -0
  149. package/habilidades/auto-evolucion-protocolo/evals/evals.json +55 -0
  150. package/habilidades/auto-evolucion-protocolo/recursos/referencia-completa.md +145 -0
  151. package/habilidades/autoresearch/SKILL.md +268 -0
  152. package/habilidades/autoresearch/evals/evals.json +41 -0
  153. package/habilidades/autoresearch/recursos/checklist-template.md +191 -0
  154. package/habilidades/autoresearch/scripts/calcular-score.js +88 -0
  155. package/habilidades/azure-cloud/SKILL.md +308 -0
  156. package/habilidades/azure-cloud/recursos/aks.md +327 -0
  157. package/habilidades/backend-mcp-servidor/SKILL.md +270 -0
  158. package/habilidades/backend-production-resilience/SKILL.md +288 -0
  159. package/habilidades/brainstorming/SKILL.md +295 -0
  160. package/habilidades/brainstorming/recursos/componentes-html.md +247 -0
  161. package/habilidades/build-errors-cpp/SKILL.md +270 -0
  162. package/habilidades/build-errors-csharp/SKILL.md +265 -0
  163. package/habilidades/build-errors-go/SKILL.md +306 -0
  164. package/habilidades/build-errors-java/SKILL.md +278 -0
  165. package/habilidades/build-errors-kotlin/SKILL.md +303 -0
  166. package/habilidades/build-errors-nextjs/SKILL.md +312 -0
  167. package/habilidades/build-errors-php/SKILL.md +270 -0
  168. package/habilidades/build-errors-python/SKILL.md +292 -0
  169. package/habilidades/build-errors-rust/SKILL.md +284 -0
  170. package/habilidades/build-errors-swift/SKILL.md +272 -0
  171. package/habilidades/build-errors-typescript/SKILL.md +369 -0
  172. package/habilidades/checklist-calidad/SKILL.md +271 -0
  173. package/habilidades/checklist-calidad/recursos/quality-report-template.md +148 -0
  174. package/habilidades/checklist-seguridad/SKILL.md +285 -0
  175. package/habilidades/checkpoints-verificacion/SKILL.md +298 -0
  176. package/habilidades/checkpoints-verificacion/recursos/checkpoint-templates.md +360 -0
  177. package/habilidades/ci-cd-pipelines/SKILL.md +157 -0
  178. package/habilidades/ci-cd-pipelines/recursos/github-actions-template.yaml +403 -0
  179. package/habilidades/ci-cd-pipelines/recursos/pipelines-completos.md +487 -0
  180. package/habilidades/cloud-aws/SKILL.md +142 -0
  181. package/habilidades/cloud-aws/recursos/servicios-aws-referencia.md +321 -0
  182. package/habilidades/compactacion-contexto/SKILL.md +247 -0
  183. package/habilidades/contenedores-docker/SKILL.md +137 -0
  184. package/habilidades/contenedores-docker/recursos/dockerfile-template.dockerfile +160 -0
  185. package/habilidades/contenedores-docker/recursos/ejemplos-y-configuraciones.md +327 -0
  186. package/habilidades/context-builder/SKILL.md +170 -0
  187. package/habilidades/control-profundidad/SKILL.md +128 -0
  188. package/habilidades/csharp-experto/SKILL.md +322 -0
  189. package/habilidades/csharp-patrones/SKILL.md +316 -0
  190. package/habilidades/csharp-testing/SKILL.md +286 -0
  191. package/habilidades/css-moderno/SKILL.md +166 -0
  192. package/habilidades/css-moderno/evals/evals.json +43 -0
  193. package/habilidades/css-moderno/recursos/ejemplos-y-patrones-completos.md +337 -0
  194. package/habilidades/datos-etl/SKILL.md +129 -0
  195. package/habilidades/datos-etl/recursos/implementaciones-completas.md +322 -0
  196. package/habilidades/dbml-experto/SKILL.md +339 -0
  197. package/habilidades/dbml-experto/evals/evals.json +56 -0
  198. package/habilidades/dependencias-auditoria/SKILL.md +320 -0
  199. package/habilidades/deprecacion-migracion/SKILL.md +169 -0
  200. package/habilidades/deprecacion-migracion/recursos/implementaciones-completas.md +220 -0
  201. package/habilidades/design-tokens/SKILL.md +158 -0
  202. package/habilidades/design-tokens/recursos/tokens-y-configuracion.md +363 -0
  203. package/habilidades/devsecops-pipeline-security/SKILL.md +309 -0
  204. package/habilidades/diagrama-arquitectura/SKILL.md +165 -0
  205. package/habilidades/diagrama-arquitectura/assets/template.html +276 -0
  206. package/habilidades/discutir-fase/SKILL.md +188 -0
  207. package/habilidades/diseno-herramientas-agente/SKILL.md +199 -0
  208. package/habilidades/diseno-responsivo/SKILL.md +186 -0
  209. package/habilidades/diseno-responsivo/recursos/ejemplos-layouts.md +156 -0
  210. package/habilidades/django-experto/SKILL.md +205 -0
  211. package/habilidades/django-experto/recursos/async-django.md +390 -0
  212. package/habilidades/django-experto/recursos/drf-patrones.md +438 -0
  213. package/habilidades/django-experto/recursos/orm-avanzado.md +382 -0
  214. package/habilidades/django-experto/recursos/referencia-completa.md +188 -0
  215. package/habilidades/django-experto/recursos/testing-django.md +415 -0
  216. package/habilidades/doc-sync/SKILL.md +280 -0
  217. package/habilidades/drift-detection/SKILL.md +179 -0
  218. package/habilidades/ejecutar-fase/SKILL.md +468 -0
  219. package/habilidades/estilo-sin-ai-isms/SKILL.md +775 -0
  220. package/habilidades/estilo-sin-ai-isms/evals/evals.json +63 -0
  221. package/habilidades/estilo-sin-ai-isms/scripts/detectar_aiisms.py +500 -0
  222. package/habilidades/estructura-proyecto-claude/SKILL.md +215 -0
  223. package/habilidades/estructura-proyecto-claude/recursos/claude-md-template.md +261 -0
  224. package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +176 -0
  225. package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +289 -0
  226. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +77 -0
  227. package/habilidades/estructura-proyecto-claude/recursos/variantes-por-stack.md +177 -0
  228. package/habilidades/evaluacion-agentes/SKILL.md +314 -0
  229. package/habilidades/event-driven/SKILL.md +153 -0
  230. package/habilidades/event-driven/recursos/implementaciones-completas.md +423 -0
  231. package/habilidades/extraccion-documentos/SKILL.md +221 -0
  232. package/habilidades/extractor-de-aprendizajes/.evolved.json +9 -0
  233. package/habilidades/extractor-de-aprendizajes/SKILL.md +311 -0
  234. package/habilidades/extractor-de-aprendizajes/evals/evals.json +55 -0
  235. package/habilidades/fastapi-experto/SKILL.md +221 -0
  236. package/habilidades/fastapi-experto/recursos/async-patterns.md +438 -0
  237. package/habilidades/fastapi-experto/recursos/dependency-injection.md +330 -0
  238. package/habilidades/fastapi-experto/recursos/referencia-completa.md +79 -0
  239. package/habilidades/fastapi-experto/recursos/testing-httpx.md +420 -0
  240. package/habilidades/filament-admin/SKILL.md +290 -0
  241. package/habilidades/frontend-avanzado/SKILL.md +257 -0
  242. package/habilidades/frontend-avanzado/recursos/apis-nativas-ejemplos.md +341 -0
  243. package/habilidades/gcp-cloud/SKILL.md +260 -0
  244. package/habilidades/gcp-cloud/recursos/gke.md +234 -0
  245. package/habilidades/gcp-cloud/recursos/terraform-gcp.md +307 -0
  246. package/habilidades/generacion-mermaid/SKILL.md +229 -0
  247. package/habilidades/git-worktrees-paralelo/SKILL.md +270 -0
  248. package/habilidades/go-experto/SKILL.md +305 -0
  249. package/habilidades/go-patrones/SKILL.md +299 -0
  250. package/habilidades/go-testing/SKILL.md +291 -0
  251. package/habilidades/graphql-experto/SKILL.md +323 -0
  252. package/habilidades/guardrail-semantico/SKILL.md +282 -0
  253. package/habilidades/harness-claude-code/SKILL.md +299 -0
  254. package/habilidades/iam-secretos/SKILL.md +265 -0
  255. package/habilidades/iam-secretos/recursos/implementaciones-completas.md +356 -0
  256. package/habilidades/infra-github-actions/SKILL.md +166 -0
  257. package/habilidades/instalar-sistema/.evolved.json +9 -0
  258. package/habilidades/instalar-sistema/SKILL.md +221 -0
  259. package/habilidades/java-experto/SKILL.md +290 -0
  260. package/habilidades/java-patrones/SKILL.md +275 -0
  261. package/habilidades/java-testing/SKILL.md +288 -0
  262. package/habilidades/kotlin-compose/SKILL.md +278 -0
  263. package/habilidades/kotlin-compose/recursos/animaciones-performance.md +93 -0
  264. package/habilidades/kotlin-experto/SKILL.md +318 -0
  265. package/habilidades/kotlin-testing/SKILL.md +267 -0
  266. package/habilidades/kotlin-testing/recursos/testing-avanzado.md +74 -0
  267. package/habilidades/kubernetes-orquestacion/SKILL.md +152 -0
  268. package/habilidades/kubernetes-orquestacion/recursos/manifiestos-completos.md +452 -0
  269. package/habilidades/langchain-langraph/SKILL.md +386 -0
  270. package/habilidades/langchain-langraph/recursos/evaluacion-rag.md +321 -0
  271. package/habilidades/langchain-langraph/recursos/rag-maturity-model.md +225 -0
  272. package/habilidades/langchain-langraph/recursos/vectorstores.md +306 -0
  273. package/habilidades/legacy-code-rescue/SKILL.md +267 -0
  274. package/habilidades/likec4-experto/SKILL.md +412 -0
  275. package/habilidades/likec4-experto/evals/evals.json +69 -0
  276. package/habilidades/manejo-errores/.evolved.json +9 -0
  277. package/habilidades/manejo-errores/SKILL.md +407 -0
  278. package/habilidades/manejo-errores/recursos/implementaciones-completas.md +248 -0
  279. package/habilidades/mapear-codebase/SKILL.md +275 -0
  280. package/habilidades/memoria-busqueda/SKILL.md +194 -0
  281. package/habilidades/memoria-busqueda/evals/evals.json +44 -0
  282. package/habilidades/meta-skills-estandar/SKILL.md +298 -0
  283. package/habilidades/meta-skills-estandar/recursos/anti-patrones-y-leyes.md +205 -0
  284. package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +107 -0
  285. package/habilidades/meta-skills-estandar/recursos/idiomas-framework.md +60 -0
  286. package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -0
  287. package/habilidades/microservicios/SKILL.md +155 -0
  288. package/habilidades/microservicios/recursos/patrones-y-ejemplos-completos.md +325 -0
  289. package/habilidades/mobile-flutter/SKILL.md +199 -0
  290. package/habilidades/mobile-flutter/recursos/ejemplos-completos.md +319 -0
  291. package/habilidades/mobile-react-native/SKILL.md +176 -0
  292. package/habilidades/mobile-react-native/recursos/ejemplos-completos.md +216 -0
  293. package/habilidades/mongodb-experto/SKILL.md +302 -0
  294. package/habilidades/monitoring-alertas/SKILL.md +201 -0
  295. package/habilidades/monitoring-alertas/recursos/instrumentacion-y-alertas.md +301 -0
  296. package/habilidades/nestjs-experto/SKILL.md +307 -0
  297. package/habilidades/nestjs-experto/recursos/guards-interceptors.md +339 -0
  298. package/habilidades/nestjs-experto/recursos/modulos-di.md +287 -0
  299. package/habilidades/nestjs-experto/recursos/testing-nestjs.md +354 -0
  300. package/habilidades/nextjs-experto/SKILL.md +335 -0
  301. package/habilidades/nextjs-patrones/SKILL.md +303 -0
  302. package/habilidades/nextjs-testing/SKILL.md +331 -0
  303. package/habilidades/node-experto/.evolved.json +9 -0
  304. package/habilidades/node-experto/SKILL.md +266 -0
  305. package/habilidades/node-experto/recursos/patrones-completos.md +283 -0
  306. package/habilidades/notificaciones-multicanal/SKILL.md +159 -0
  307. package/habilidades/notificaciones-multicanal/recursos/config-template.json +115 -0
  308. package/habilidades/notificaciones-multicanal/recursos/configuracion-y-templates.md +303 -0
  309. package/habilidades/nuevo-proyecto/SKILL.md +204 -0
  310. package/habilidades/orquestacion-async/SKILL.md +303 -0
  311. package/habilidades/paid-media-tracking/SKILL.md +269 -0
  312. package/habilidades/paid-media-tracking/recursos/auditoria-tracking.md +220 -0
  313. package/habilidades/paid-media-tracking/recursos/google-ads-api.md +215 -0
  314. package/habilidades/patrones-python/SKILL.md +228 -0
  315. package/habilidades/patrones-python/evals/evals.json +56 -0
  316. package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -0
  317. package/habilidades/patrones-python/recursos/referencia-completa.md +202 -0
  318. package/habilidades/perfil-usuario/SKILL.md +200 -0
  319. package/habilidades/perfil-usuario/evals/evals.json +55 -0
  320. package/habilidades/performance-baseline/SKILL.md +297 -0
  321. package/habilidades/php-experto/SKILL.md +291 -0
  322. package/habilidades/php-patrones/SKILL.md +306 -0
  323. package/habilidades/php-testing/SKILL.md +280 -0
  324. package/habilidades/planear-fase/SKILL.md +269 -0
  325. package/habilidades/postgresql-experto/SKILL.md +151 -0
  326. package/habilidades/postgresql-experto/evals/evals.json +53 -0
  327. package/habilidades/postgresql-experto/recursos/referencia-completa.md +215 -0
  328. package/habilidades/prevencion-racionalizacion/SKILL.md +175 -0
  329. package/habilidades/prevencion-sobreingenieria/SKILL.md +323 -0
  330. package/habilidades/privacy-memoria/SKILL.md +141 -0
  331. package/habilidades/privacy-memoria/evals/evals.json +43 -0
  332. package/habilidades/prompt-engineering/SKILL.md +518 -0
  333. package/habilidades/prompt-engineering/recursos/patrones-avanzados.md +467 -0
  334. package/habilidades/rag-arquitectura/SKILL.md +338 -0
  335. package/habilidades/rails-experto/SKILL.md +237 -0
  336. package/habilidades/rails-experto/recursos/active-record.md +260 -0
  337. package/habilidades/rails-experto/recursos/hotwire-turbo.md +293 -0
  338. package/habilidades/rails-experto/recursos/testing-rspec.md +362 -0
  339. package/habilidades/react-experto/SKILL.md +209 -0
  340. package/habilidades/react-experto/evals/evals.json +55 -0
  341. package/habilidades/react-experto/recursos/patrones-y-ejemplos-completos.md +240 -0
  342. package/habilidades/react-optimizacion/SKILL.md +174 -0
  343. package/habilidades/react-optimizacion/recursos/patrones-avanzados.md +138 -0
  344. package/habilidades/redis-experto/SKILL.md +305 -0
  345. package/habilidades/release-semver/.evolved.json +9 -0
  346. package/habilidades/release-semver/SKILL.md +248 -0
  347. package/habilidades/release-semver/scripts/generar-changelog.sh +238 -0
  348. package/habilidades/rust-experto/SKILL.md +400 -0
  349. package/habilidades/rust-patrones/SKILL.md +296 -0
  350. package/habilidades/rust-testing/SKILL.md +311 -0
  351. package/habilidades/seguridad-skills-ia/SKILL.md +262 -0
  352. package/habilidades/sql-optimizacion/SKILL.md +200 -0
  353. package/habilidades/sql-optimizacion/evals/evals.json +54 -0
  354. package/habilidades/sql-optimizacion/recursos/patrones-sql-avanzados.md +131 -0
  355. package/habilidades/sre-patrones/SKILL.md +333 -0
  356. package/habilidades/sre-patrones/recursos/chaos-engineering.md +241 -0
  357. package/habilidades/sre-patrones/recursos/oncall-design.md +236 -0
  358. package/habilidades/stripe-pagos/SKILL.md +550 -0
  359. package/habilidades/stripe-pagos/recursos/errores-reintentos.md +390 -0
  360. package/habilidades/stripe-pagos/recursos/stripe-connect.md +290 -0
  361. package/habilidades/structured-outputs/SKILL.md +343 -0
  362. package/habilidades/swift-experto/SKILL.md +320 -0
  363. package/habilidades/swift-experto/recursos/keychain-y-wrappers.md +110 -0
  364. package/habilidades/swift-patrones/SKILL.md +313 -0
  365. package/habilidades/swift-patrones/recursos/tca-ejemplo-completo.md +113 -0
  366. package/habilidades/swift-testing/SKILL.md +254 -0
  367. package/habilidades/swift-testing/recursos/xcuitest-planes.md +143 -0
  368. package/habilidades/swl-dashboard/SKILL.md +370 -0
  369. package/habilidades/swl-markitdown/SKILL.md +285 -0
  370. package/habilidades/swl-markitdown/evals/evals.json +52 -0
  371. package/habilidades/swl-revisar-impacto/SKILL.md +233 -0
  372. package/habilidades/tailwind-experto/SKILL.md +240 -0
  373. package/habilidades/tailwind-experto/recursos/referencia-completa.md +184 -0
  374. package/habilidades/tdd-workflow/SKILL.md +293 -0
  375. package/habilidades/terraform-experto/SKILL.md +321 -0
  376. package/habilidades/testing-python/SKILL.md +340 -0
  377. package/habilidades/testing-python/recursos/ejemplos-completos.md +167 -0
  378. package/habilidades/threat-model-lite/SKILL.md +246 -0
  379. package/habilidades/tracing-processor/SKILL.md +212 -0
  380. package/habilidades/tracking-measurement/SKILL.md +239 -0
  381. package/habilidades/tracking-measurement/recursos/consent-mode.md +231 -0
  382. package/habilidades/tracking-measurement/recursos/gtm-datalayer.md +216 -0
  383. package/habilidades/tracking-measurement/recursos/meta-capi.md +262 -0
  384. package/habilidades/typescript-avanzado/SKILL.md +144 -0
  385. package/habilidades/typescript-avanzado/evals/evals.json +55 -0
  386. package/habilidades/typescript-avanzado/recursos/patrones-y-ejemplos-completos.md +298 -0
  387. package/habilidades/typescript-diagnosticos/SKILL.md +513 -0
  388. package/habilidades/ux-diseno/SKILL.md +116 -0
  389. package/habilidades/ux-diseno/evals/evals.json +43 -0
  390. package/habilidades/ux-diseno/recursos/patrones-ux-referencia.md +214 -0
  391. package/habilidades/validacion-ci-sistema/SKILL.md +136 -0
  392. package/habilidades/validacion-ci-sistema/recursos/validadores-completos.md +369 -0
  393. package/habilidades/validacion-ci-sistema/scripts/validar-sistema.sh +286 -0
  394. package/habilidades/verificacion-evidencia/SKILL.md +160 -0
  395. package/habilidades/verificar-trabajo/SKILL.md +303 -0
  396. package/habilidades/verificar-trabajo/recursos/plantilla-verificacion.md +60 -0
  397. package/habilidades/wiki-conocimiento/SKILL.md +276 -0
  398. package/habilidades/wireframes-flujos/SKILL.md +212 -0
  399. package/habilidades/wireframes-flujos/recursos/referencia-completa.md +192 -0
  400. package/habilidades/workflow-claude-code/SKILL.md +260 -0
  401. package/habilidades/workflow-claude-code/recursos/referencia-completa.md +109 -0
  402. package/hooks/_run-hook.sh +57 -0
  403. package/hooks/actualizar-perfil-usuario.js +364 -0
  404. package/hooks/agente-lifecycle.js +71 -0
  405. package/hooks/aiisms-detector.js +173 -0
  406. package/hooks/audit-trail.js +204 -0
  407. package/hooks/auto-background.js +97 -0
  408. package/hooks/auto-consolidacion.js +178 -0
  409. package/hooks/auto-evolucion.js +666 -0
  410. package/hooks/auto-restaurar-settings.js +360 -0
  411. package/hooks/calidad-pre-commit.js +929 -0
  412. package/hooks/calidad-typescript.js +511 -0
  413. package/hooks/captura-feedback-usuario.js +148 -0
  414. package/hooks/check-update.js +211 -0
  415. package/hooks/clasificador-mensajes.js +271 -0
  416. package/hooks/degradacion-instintos.js +272 -0
  417. package/hooks/escaneo-secretos.js +389 -0
  418. package/hooks/extraccion-aprendizajes.js +763 -0
  419. package/hooks/grafo-contexto.js +129 -0
  420. package/hooks/graph-update.js +67 -0
  421. package/hooks/guardrail-modelo.js +247 -0
  422. package/hooks/inbox-aviso.js +75 -0
  423. package/hooks/inyeccion-contexto.js +246 -0
  424. package/hooks/lib/abort-registry.js +214 -0
  425. package/hooks/lib/agent-backend.js +210 -0
  426. package/hooks/lib/agent-comms.js +263 -0
  427. package/hooks/lib/agent-issue-codes.js +284 -0
  428. package/hooks/lib/agent-matcher.js +189 -0
  429. package/hooks/lib/async-hook-registry.js +252 -0
  430. package/hooks/lib/atomic-write.js +130 -0
  431. package/hooks/lib/auto-consolidator.js +335 -0
  432. package/hooks/lib/canary-skills.js +187 -0
  433. package/hooks/lib/consolidation-lock.js +291 -0
  434. package/hooks/lib/context-builder.js +430 -0
  435. package/hooks/lib/context-compressor.js +657 -0
  436. package/hooks/lib/convergence-detector.js +105 -0
  437. package/hooks/lib/delegation-tracker.js +198 -0
  438. package/hooks/lib/detectar-package-manager.js +423 -0
  439. package/hooks/lib/edit-accumulator.js +171 -0
  440. package/hooks/lib/error-classifier.js +308 -0
  441. package/hooks/lib/event-bus.js +112 -0
  442. package/hooks/lib/evolution-tracker.js +442 -0
  443. package/hooks/lib/execution-state.js +316 -0
  444. package/hooks/lib/fingerprint-id.js +135 -0
  445. package/hooks/lib/gateway-notify.js +116 -0
  446. package/hooks/lib/graph-security.js +75 -0
  447. package/hooks/lib/guardrail-metrics.js +202 -0
  448. package/hooks/lib/hook-circuit-breaker.js +206 -0
  449. package/hooks/lib/loop-detector.js +267 -0
  450. package/hooks/lib/mcp-health.js +184 -0
  451. package/hooks/lib/mcp-pool.js +436 -0
  452. package/hooks/lib/memory-search.js +506 -0
  453. package/hooks/lib/merkle-audit.js +96 -0
  454. package/hooks/lib/model-router.js +222 -0
  455. package/hooks/lib/normalize-error.js +324 -0
  456. package/hooks/lib/normalize-input.js +65 -0
  457. package/hooks/lib/nudge-tracker.js +306 -0
  458. package/hooks/lib/otlp-exporter.js +365 -0
  459. package/hooks/lib/performance-marks.js +239 -0
  460. package/hooks/lib/privacy-filter.js +128 -0
  461. package/hooks/lib/prompt-injection-scanner.js +209 -0
  462. package/hooks/lib/provenance-tracker.js +183 -0
  463. package/hooks/lib/rate-limit-tracker.js +253 -0
  464. package/hooks/lib/reflect-classifier.js +164 -0
  465. package/hooks/lib/resource-quota.js +122 -0
  466. package/hooks/lib/retry-jitter.js +165 -0
  467. package/hooks/lib/risk-engine.js +368 -0
  468. package/hooks/lib/run-log.js +408 -0
  469. package/hooks/lib/session-fts.js +379 -0
  470. package/hooks/lib/session-store.js +293 -0
  471. package/hooks/lib/singleton-guard.js +159 -0
  472. package/hooks/lib/skill-auditor.js +588 -0
  473. package/hooks/lib/sync-status.js +228 -0
  474. package/hooks/lib/taint-tracker.js +107 -0
  475. package/hooks/lib/task-service.js +295 -0
  476. package/hooks/lib/tech-skills-map.js +146 -0
  477. package/hooks/lib/telegram-cliente.js +159 -0
  478. package/hooks/lib/telegram-config.js +170 -0
  479. package/hooks/lib/token-budget.js +156 -0
  480. package/hooks/lib/token-estimator.js +420 -0
  481. package/hooks/lib/toon-compressor.js +245 -0
  482. package/hooks/lib/usage-model.js +183 -0
  483. package/hooks/lib/variable-resolver.js +230 -0
  484. package/hooks/linea-estado.js +324 -0
  485. package/hooks/metricas-evolucion.js +209 -0
  486. package/hooks/monitor-contexto.js +325 -0
  487. package/hooks/notificacion-sesion-stop.js +198 -0
  488. package/hooks/notificacion-telegram-notification.js +4 -0
  489. package/hooks/notificacion-telegram-subagent.js +4 -0
  490. package/hooks/notificacion-telegram.js +267 -0
  491. package/hooks/preservar-estado-pre-compact.js +150 -0
  492. package/hooks/proteccion-rutas.js +366 -0
  493. package/hooks/registro-turnos.js +209 -0
  494. package/hooks/resumen-sesion.js +249 -0
  495. package/hooks/risk-scoring.js +323 -0
  496. package/hooks/rotar-audit-auto.js +122 -0
  497. package/hooks/sugerir-regenerar-inventario.js +170 -0
  498. package/hooks/telemetria-agentes.js +167 -0
  499. package/hooks/tracking-costos.js +688 -0
  500. package/instintos/global.yaml +8 -0
  501. package/instintos/perfil-usuario.yaml +53 -0
  502. package/instintos/prompt-appendices.yaml +57 -0
  503. package/instintos/proyecto.yaml +372 -0
  504. package/manifiestos/gateway-config.json +77 -0
  505. package/manifiestos/handoff-context.json +223 -0
  506. package/manifiestos/hook-profiles.json +44 -0
  507. package/manifiestos/hooks-config.json +360 -0
  508. package/manifiestos/modulos.json +1173 -0
  509. package/manifiestos/perfiles.json +404 -0
  510. package/package.json +86 -0
  511. package/plantillas/ESTADO.md +109 -0
  512. package/plantillas/HOJA-RUTA.md +143 -0
  513. package/plantillas/PROYECTO.md +122 -0
  514. package/plantillas/REQUISITOS.md +132 -0
  515. package/plantillas/auditor-veto-template.md +105 -0
  516. package/plantillas/github-workflows/README.md +47 -0
  517. package/plantillas/github-workflows/release-please.yml +44 -0
  518. package/plantillas/github-workflows/swl-ci.yml +107 -0
  519. package/plantillas/github-workflows/swl-security.yml +51 -0
  520. package/plantillas/mcp-mineru.json +13 -0
  521. package/plantillas/research/ARQUITECTURA.md +220 -0
  522. package/plantillas/research/FUNCIONALIDADES.md +175 -0
  523. package/plantillas/research/RESUMEN.md +165 -0
  524. package/plantillas/research/STACK.md +233 -0
  525. package/plantillas/research/TRAMPAS.md +299 -0
  526. package/plantillas/skill-evals-template.json +44 -0
  527. package/plugin.json +343 -0
  528. package/reglas/accesibilidad.md +269 -0
  529. package/reglas/api-diseno.md +400 -0
  530. package/reglas/arquitectura.md +352 -0
  531. package/reglas/brevedad-output.md +124 -0
  532. package/reglas/cloud-infra.md +247 -0
  533. package/reglas/docs.md +245 -0
  534. package/reglas/estilo-codigo.md +201 -0
  535. package/reglas/git-workflow.md +245 -0
  536. package/reglas/gobernanza.md +271 -0
  537. package/reglas/harness-claude-code.md +213 -0
  538. package/reglas/hooks.md +186 -0
  539. package/reglas/lenguajes/csharp/estilo-codigo.md +231 -0
  540. package/reglas/lenguajes/csharp/hooks.md +281 -0
  541. package/reglas/lenguajes/csharp/patrones.md +226 -0
  542. package/reglas/lenguajes/csharp/seguridad.md +258 -0
  543. package/reglas/lenguajes/csharp/testing.md +176 -0
  544. package/reglas/lenguajes/go/estilo-codigo.md +195 -0
  545. package/reglas/lenguajes/go/hooks.md +249 -0
  546. package/reglas/lenguajes/go/patrones.md +249 -0
  547. package/reglas/lenguajes/go/seguridad.md +225 -0
  548. package/reglas/lenguajes/go/testing.md +272 -0
  549. package/reglas/lenguajes/java/estilo-codigo.md +217 -0
  550. package/reglas/lenguajes/java/hooks.md +251 -0
  551. package/reglas/lenguajes/java/patrones.md +226 -0
  552. package/reglas/lenguajes/java/seguridad.md +233 -0
  553. package/reglas/lenguajes/java/testing.md +238 -0
  554. package/reglas/lenguajes/kotlin/estilo-codigo.md +208 -0
  555. package/reglas/lenguajes/kotlin/hooks.md +245 -0
  556. package/reglas/lenguajes/kotlin/patrones.md +201 -0
  557. package/reglas/lenguajes/kotlin/seguridad.md +202 -0
  558. package/reglas/lenguajes/kotlin/testing.md +236 -0
  559. package/reglas/lenguajes/nextjs/estilo-codigo.md +175 -0
  560. package/reglas/lenguajes/nextjs/hooks.md +186 -0
  561. package/reglas/lenguajes/nextjs/patrones.md +225 -0
  562. package/reglas/lenguajes/nextjs/seguridad.md +216 -0
  563. package/reglas/lenguajes/nextjs/testing.md +193 -0
  564. package/reglas/lenguajes/php/estilo-codigo.md +228 -0
  565. package/reglas/lenguajes/php/hooks.md +165 -0
  566. package/reglas/lenguajes/php/patrones.md +233 -0
  567. package/reglas/lenguajes/php/seguridad.md +186 -0
  568. package/reglas/lenguajes/php/testing.md +205 -0
  569. package/reglas/lenguajes/rust/estilo-codigo.md +207 -0
  570. package/reglas/lenguajes/rust/hooks.md +240 -0
  571. package/reglas/lenguajes/rust/patrones.md +250 -0
  572. package/reglas/lenguajes/rust/seguridad.md +221 -0
  573. package/reglas/lenguajes/rust/testing.md +194 -0
  574. package/reglas/lenguajes/swift/estilo-codigo.md +238 -0
  575. package/reglas/lenguajes/swift/hooks.md +257 -0
  576. package/reglas/lenguajes/swift/patrones.md +235 -0
  577. package/reglas/lenguajes/swift/seguridad.md +248 -0
  578. package/reglas/lenguajes/swift/testing.md +242 -0
  579. package/reglas/markitdown.md +60 -0
  580. package/reglas/memoria-consolidada.md +209 -0
  581. package/reglas/patrones.md +225 -0
  582. package/reglas/performance.md +195 -0
  583. package/reglas/pruebas.md +159 -0
  584. package/reglas/seguridad-agentes.md +351 -0
  585. package/reglas/seguridad.md +151 -0
  586. package/reglas/skills-estandar.md +373 -0
  587. package/reglas/testing.md +193 -0
  588. package/schemas/agent-contract.json +176 -0
  589. package/schemas/agent-frontmatter.schema.json +149 -0
  590. package/schemas/agent-message.schema.json +53 -0
  591. package/schemas/agent-output-implementacion.schema.json +85 -0
  592. package/schemas/agent-output-planificacion.schema.json +113 -0
  593. package/schemas/agent-output-review.schema.json +78 -0
  594. package/schemas/diary-entry.schema.json +80 -0
  595. package/schemas/hook-profiles.schema.json +39 -0
  596. package/schemas/hooks-config.schema.json +74 -0
  597. package/schemas/instinct.schema.json +115 -0
  598. package/schemas/modulos.schema.json +29 -0
  599. package/schemas/perfiles.schema.json +28 -0
  600. package/schemas/plugin.schema.json +64 -0
  601. package/schemas/skill-evals.schema.json +95 -0
  602. package/schemas/skill-frontmatter.schema.json +170 -0
  603. package/scripts/actualizar.js +145 -0
  604. package/scripts/audit-skills.sh +78 -0
  605. package/scripts/auditar-agentes-gaps.js +149 -0
  606. package/scripts/auditar-cobertura-frameworks.js +241 -0
  607. package/scripts/auditar-skills-gaps.js +206 -0
  608. package/scripts/bootstrap-instintos.js +259 -0
  609. package/scripts/check-update.js +109 -0
  610. package/scripts/comandos/agents.js +105 -0
  611. package/scripts/comandos/info.js +108 -0
  612. package/scripts/comandos/install-asistido.js +186 -0
  613. package/scripts/comandos/skills.js +211 -0
  614. package/scripts/configurar-branch-protection.js +418 -0
  615. package/scripts/daemon-swl.py +388 -0
  616. package/scripts/desinstalar.js +130 -0
  617. package/scripts/doctor.js +559 -0
  618. package/scripts/field-report.js +199 -0
  619. package/scripts/generar-inventario.js +317 -0
  620. package/scripts/inbox-tmux-inject.js +161 -0
  621. package/scripts/inferir-herramientas-permitidas.js +586 -0
  622. package/scripts/inicializar.js +133 -0
  623. package/scripts/instalador.js +1031 -0
  624. package/scripts/instalar-git-hook.js +122 -0
  625. package/scripts/lib/agp-frontmatter.js +222 -0
  626. package/scripts/lib/append-con-marcadores.js +199 -0
  627. package/scripts/lib/artefactos-python.js +43 -0
  628. package/scripts/lib/audit-query.js +221 -0
  629. package/scripts/lib/autostart-linux.js +347 -0
  630. package/scripts/lib/autostart-macos.js +360 -0
  631. package/scripts/lib/autostart-windows.js +307 -0
  632. package/scripts/lib/budget-enforcer.js +252 -0
  633. package/scripts/lib/claude-sessions.js +285 -0
  634. package/scripts/lib/configurar-ci.js +380 -0
  635. package/scripts/lib/console-span-exporter.js +92 -0
  636. package/scripts/lib/contadores-inventario.js +217 -0
  637. package/scripts/lib/dashboard-widgets.js +290 -0
  638. package/scripts/lib/detectar-runtime.js +279 -0
  639. package/scripts/lib/detectar-stack.js +187 -0
  640. package/scripts/lib/diary-entry.js +234 -0
  641. package/scripts/lib/drift-detector.js +545 -0
  642. package/scripts/lib/estado.js +124 -0
  643. package/scripts/lib/gestor-componentes.js +243 -0
  644. package/scripts/lib/gitignore-manifest.js +305 -0
  645. package/scripts/lib/graph-analyze.py +556 -0
  646. package/scripts/lib/graph-builder.py +485 -0
  647. package/scripts/lib/graph-cluster.py +259 -0
  648. package/scripts/lib/health-row.js +168 -0
  649. package/scripts/lib/hooks-settings.js +789 -0
  650. package/scripts/lib/manifiestos.js +138 -0
  651. package/scripts/lib/mc-client.js +137 -0
  652. package/scripts/lib/notificaciones-telegram.js +1107 -0
  653. package/scripts/lib/npm-version.js +261 -0
  654. package/scripts/lib/paquetes-conocidos.js +50 -0
  655. package/scripts/lib/preservar-usuario.js +586 -0
  656. package/scripts/lib/prompt-builder.js +264 -0
  657. package/scripts/lib/resolver-externo.js +332 -0
  658. package/scripts/lib/schedule-parser.js +305 -0
  659. package/scripts/lib/scoring-instintos.js +240 -0
  660. package/scripts/lib/seguridad.js +160 -0
  661. package/scripts/lib/selector-interactivo.js +152 -0
  662. package/scripts/lib/semantic-search.js +242 -0
  663. package/scripts/lib/skill-discovery.js +234 -0
  664. package/scripts/lib/skill-metrics.js +246 -0
  665. package/scripts/lib/skill-normalizer.js +112 -0
  666. package/scripts/lib/skills-hub.js +340 -0
  667. package/scripts/lib/span-schema.js +134 -0
  668. package/scripts/lib/tool-cost-analyzer.js +255 -0
  669. package/scripts/lib/tracing-processor-interface.js +286 -0
  670. package/scripts/lib/transformadores/base.js +80 -0
  671. package/scripts/lib/transformadores/claude.js +124 -0
  672. package/scripts/lib/transformadores/codex.js +115 -0
  673. package/scripts/lib/transformadores/copilot.js +106 -0
  674. package/scripts/lib/transformadores/gemini.js +74 -0
  675. package/scripts/lib/transformadores/index.js +35 -0
  676. package/scripts/lib/transformadores/opencode.js +75 -0
  677. package/scripts/lib/ui.js +259 -0
  678. package/scripts/limpiar-artefactos-python.js +131 -0
  679. package/scripts/mcp-orchestrator.py +386 -0
  680. package/scripts/mcp-pool-manager.py +352 -0
  681. package/scripts/mcp-telemetry.py +378 -0
  682. package/scripts/poblar-evolvable.js +226 -0
  683. package/scripts/publicar.js +287 -0
  684. package/scripts/reflect-skills.js +403 -0
  685. package/scripts/rotar-audit-logs.js +185 -0
  686. package/scripts/run-skill-evals.js +242 -0
  687. package/scripts/smoke-test.js +374 -0
  688. package/scripts/token-analysis.py +471 -0
  689. package/scripts/validar-manifest.js +195 -0
  690. package/scripts/validar-memoria.js +321 -0
  691. package/scripts/validar-tests-aislamiento.js +184 -0
  692. package/scripts/validar-tokens-test.js +208 -0
  693. package/scripts/validar.js +147 -0
  694. package/scripts/validate-markdown.py +339 -0
  695. package/scripts/validate-skills.py +385 -0
  696. package/scripts/vendor/claude-usage/README.md +116 -0
  697. package/scripts/vendor/claude-usage/cli.py +334 -0
  698. package/scripts/vendor/claude-usage/dashboard.py +795 -0
  699. package/scripts/vendor/claude-usage/scanner.py +467 -0
  700. package/scripts/vendor/markitdown/cli.py +194 -0
  701. package/scripts/verificar-evolucion.js +289 -0
  702. package/scripts/verificar-release.js +494 -0
@@ -0,0 +1,608 @@
1
+ ---
2
+ name: backend-python-swl
3
+ description: >
4
+ Especialista Python backend de profundidad avanzada. Invocar cuando se necesita
5
+ implementar FastAPI con middleware, background tasks, WebSockets o SSE; Django
6
+ con ORM avanzado, signals o management commands; SQLAlchemy async con session
7
+ management o migraciones Alembic; Celery/Dramatiq para task queues; o Pydantic
8
+ v2 con discriminated unions y validators complejos. Más profundo que
9
+ implementador-swl en Python — cubre casos edge de async Python, profiling,
10
+ caching y connection pooling. Invocar también para auditar performance de código
11
+ Python existente o diseñar la estrategia de testing avanzada con factories y
12
+ mocks. NO invocar para frontend, infraestructura o Node.js.
13
+ tools: Read, Write, Edit, Bash, Grep, Glob, Skill
14
+ model: claude-sonnet-4-6
15
+ modeloAlterno: claude-haiku-4-5-20251001
16
+ ventanaContexto: 200k
17
+ permissionMode: acceptEdits
18
+ color: yellow
19
+ version: 1.1.0
20
+ nivelRiesgo: MEDIO
21
+ skillsInvocables: fastapi-experto, django-experto, patrones-python, async-python, testing-python, postgresql-experto, sql-optimizacion, manejo-errores
22
+ skillsRestringidos: angular-moderno, typescript-avanzado, react-native-best-practices
23
+ permisosRed: false
24
+ permisosEscritura: true
25
+ permisosComandos: true
26
+ evolved: true
27
+ evolved-from: "5.2.0"
28
+ evolved-at: "2026-04-02"
29
+ evolved-by: "mutación SIGAF"
30
+ evolved-note: "Evolución incorporada desde proyecto SIGAF"
31
+ toolBudget:
32
+ simple: 15
33
+ standard: 30
34
+ complex: 60
35
+ evolvable: true
36
+ evolvable_scope: [description, examples, instructions]
37
+ invariantes:
38
+ - campo: nivelRiesgo
39
+ operador: eq
40
+ valor: MEDIO
41
+ razon: Este agente no debe escalar riesgo sin ADR explicito.
42
+ exclusiones:
43
+ - "No invocar para frontend, Angular, React o CSS — esos trabajos corresponden a frontend-*-swl."
44
+ - "No invocar para infraestructura, CI/CD o Kubernetes — usar devops-ci-swl o cloud-infra-swl."
45
+ - "No invocar para Node.js, Java, Go, Rust, C# o cualquier lenguaje distinto a Python — usar el agente de stack correspondiente."
46
+ - "No invocar para decisiones de diseño de API de alto nivel — backend-api-swl define el contrato; este agente lo implementa."
47
+ ---
48
+ ## Cuándo NO invocarme
49
+
50
+ - Para frontend, Angular, React o CSS — esos trabajos corresponden a `frontend-*-swl`.
51
+ - Para infraestructura, CI/CD o Kubernetes — usar `devops-ci-swl` o `cloud-infra-swl`.
52
+ - Para Node.js, Java, Go, Rust, C# o cualquier lenguaje distinto a Python — usar el agente de stack correspondiente.
53
+ - Para decisiones de diseño de API de alto nivel — `backend-api-swl` define el contrato; este agente lo implementa.
54
+
55
+ Eres un especialista senior Python backend. Tu dominio es el Python async moderno,
56
+ el ORM SQLAlchemy en sus patrones más complejos, y la gestión de sistemas de
57
+ procesamiento en background. Produces código idiomático, tipado con mypy strict,
58
+ testeado exhaustivamente y observable en producción.
59
+
60
+ Aplica la regla `brevedad-output.md` en todo output.
61
+
62
+ ## Protocolo obligatorio al iniciar
63
+
64
+ 1. **Leer el plan o spec completa** — identificar tecnologías involucradas.
65
+ 2. **Invocar skills** — como mínimo el skill principal según la tecnología:
66
+ - FastAPI: `Skill("fastapi-experto")`
67
+ - Django: `Skill("django-experto")`
68
+ - Async patterns: `Skill("async-python")`
69
+ - Testing: `Skill("testing-python")`
70
+ 3. **Verificar el entorno**: Python version, dependencias instaladas, configuración mypy.
71
+ 4. **Leer código existente** antes de añadir patrones nuevos.
72
+
73
+ ## FastAPI avanzado
74
+
75
+ ### Middleware personalizado
76
+ ```python
77
+ # middleware/timing.py
78
+ import time
79
+ import structlog
80
+ from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint
81
+ from starlette.requests import Request
82
+ from starlette.responses import Response
83
+
84
+ logger = structlog.get_logger()
85
+
86
+ class TimingMiddleware(BaseHTTPMiddleware):
87
+ async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response:
88
+ start = time.perf_counter()
89
+ request_id = request.headers.get("X-Request-ID", "")
90
+
91
+ bound_logger = logger.bind(
92
+ request_id=request_id,
93
+ method=request.method,
94
+ path=request.url.path,
95
+ )
96
+
97
+ try:
98
+ response = await call_next(request)
99
+ except Exception as exc:
100
+ bound_logger.error("Unhandled exception", exc_info=exc)
101
+ raise
102
+ finally:
103
+ duration_ms = round((time.perf_counter() - start) * 1000, 2)
104
+ bound_logger.info("Request completado", duration_ms=duration_ms, status=response.status_code)
105
+
106
+ response.headers["X-Duration-Ms"] = str(duration_ms)
107
+ return response
108
+ ```
109
+
110
+ ### Background Tasks con gestión de errores
111
+ ```python
112
+ # services/notificaciones.py
113
+ import asyncio
114
+ import structlog
115
+ from fastapi import BackgroundTasks
116
+ from typing import Any
117
+
118
+ logger = structlog.get_logger()
119
+
120
+ async def _enviar_email_async(destinatario: str, asunto: str, cuerpo: str) -> None:
121
+ """Tarea interna. Nunca llamar directamente desde endpoints."""
122
+ try:
123
+ # lógica de envío
124
+ await asyncio.sleep(0) # yield al event loop
125
+ logger.info("Email enviado", destinatario=destinatario, asunto=asunto)
126
+ except Exception as exc:
127
+ logger.error("Error enviando email", destinatario=destinatario, exc_info=exc)
128
+ # NO re-raise — background tasks no deben crashear el proceso
129
+
130
+ def programar_notificacion(
131
+ background_tasks: BackgroundTasks,
132
+ destinatario: str,
133
+ asunto: str,
134
+ cuerpo: str,
135
+ ) -> None:
136
+ """API pública para endpoints. Agrega la tarea sin bloquear."""
137
+ background_tasks.add_task(_enviar_email_async, destinatario, asunto, cuerpo)
138
+ ```
139
+
140
+ ### WebSockets con heartbeat y reconexión
141
+ ```python
142
+ # routes/ws.py
143
+ import asyncio
144
+ import json
145
+ from fastapi import APIRouter, WebSocket, WebSocketDisconnect
146
+ from typing import Any
147
+
148
+ router = APIRouter()
149
+
150
+ class ConexionManager:
151
+ def __init__(self) -> None:
152
+ self._activas: dict[str, WebSocket] = {}
153
+
154
+ async def conectar(self, websocket: WebSocket, client_id: str) -> None:
155
+ await websocket.accept()
156
+ self._activas[client_id] = websocket
157
+
158
+ def desconectar(self, client_id: str) -> None:
159
+ self._activas.pop(client_id, None)
160
+
161
+ async def enviar_a(self, client_id: str, data: dict[str, Any]) -> None:
162
+ ws = self._activas.get(client_id)
163
+ if ws:
164
+ await ws.send_text(json.dumps(data))
165
+
166
+ async def broadcast(self, data: dict[str, Any]) -> None:
167
+ desconectados: list[str] = []
168
+ for cid, ws in self._activas.items():
169
+ try:
170
+ await ws.send_text(json.dumps(data))
171
+ except Exception:
172
+ desconectados.append(cid)
173
+ for cid in desconectados:
174
+ self.desconectar(cid)
175
+
176
+ manager = ConexionManager()
177
+
178
+ @router.websocket("/ws/{client_id}")
179
+ async def websocket_endpoint(websocket: WebSocket, client_id: str) -> None:
180
+ await manager.conectar(websocket, client_id)
181
+ heartbeat_task = asyncio.create_task(_heartbeat(websocket))
182
+ try:
183
+ while True:
184
+ data = await websocket.receive_text()
185
+ await manager.enviar_a(client_id, {"echo": data})
186
+ except WebSocketDisconnect:
187
+ pass
188
+ finally:
189
+ heartbeat_task.cancel()
190
+ manager.desconectar(client_id)
191
+
192
+ async def _heartbeat(websocket: WebSocket) -> None:
193
+ while True:
194
+ await asyncio.sleep(30)
195
+ try:
196
+ await websocket.send_text('{"type":"ping"}')
197
+ except Exception:
198
+ break
199
+ ```
200
+
201
+ ### Server-Sent Events (SSE)
202
+ ```python
203
+ # routes/eventos.py
204
+ import asyncio
205
+ from fastapi import APIRouter
206
+ from fastapi.responses import StreamingResponse
207
+ from typing import AsyncGenerator
208
+
209
+ router = APIRouter()
210
+
211
+ async def _generar_eventos(usuario_id: str) -> AsyncGenerator[str, None]:
212
+ """Genera eventos SSE. Maneja desconexión limpiamente."""
213
+ try:
214
+ while True:
215
+ evento = await obtener_siguiente_evento(usuario_id)
216
+ if evento:
217
+ yield f"data: {evento.json()}\n\n"
218
+ await asyncio.sleep(1)
219
+ except asyncio.CancelledError:
220
+ pass # cliente desconectado — salida limpia
221
+
222
+ @router.get("/stream/{usuario_id}")
223
+ async def stream_eventos(usuario_id: str) -> StreamingResponse:
224
+ return StreamingResponse(
225
+ _generar_eventos(usuario_id),
226
+ media_type="text/event-stream",
227
+ headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"},
228
+ )
229
+ ```
230
+
231
+ ## SQLAlchemy async — patrones avanzados
232
+
233
+ ### Session management correcto
234
+ ```python
235
+ # db/session.py
236
+ from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker
237
+
238
+ engine = create_async_engine(
239
+ settings.DATABASE_URL,
240
+ pool_size=10,
241
+ max_overflow=20,
242
+ pool_pre_ping=True, # verifica conexiones muertas
243
+ pool_recycle=3600, # recicla conexiones cada hora
244
+ echo=settings.DEBUG,
245
+ )
246
+
247
+ AsyncSessionLocal = async_sessionmaker(
248
+ engine,
249
+ expire_on_commit=False, # OBLIGATORIO para async — evita lazy loads post-commit
250
+ autoflush=False,
251
+ )
252
+
253
+ async def get_db() -> AsyncGenerator[AsyncSession, None]:
254
+ async with AsyncSessionLocal() as session:
255
+ try:
256
+ yield session
257
+ except Exception:
258
+ await session.rollback()
259
+ raise
260
+ ```
261
+
262
+ ### Relaciones — reglas de carga
263
+ ```python
264
+ from sqlalchemy.orm import relationship, Mapped, mapped_column
265
+ from sqlalchemy import String, ForeignKey
266
+ import uuid
267
+
268
+ class Documento(Base):
269
+ __tablename__ = "documentos"
270
+
271
+ id: Mapped[uuid.UUID] = mapped_column(primary_key=True, default=uuid.uuid4)
272
+ titulo: Mapped[str] = mapped_column(String(255), nullable=False)
273
+ autor_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("usuarios.id"))
274
+
275
+ # lazy="selectin" para relaciones a entidades de usuario — NUNCA lazy="joined"
276
+ autor: Mapped["Usuario"] = relationship(lazy="selectin")
277
+
278
+ # lazy="selectin" para catálogos accedidos frecuentemente
279
+ tipo: Mapped["TipoDocumento"] = relationship(lazy="selectin")
280
+
281
+ # lazy="raise" para relaciones que NO se deben cargar automáticamente
282
+ versiones: Mapped[list["VersionDocumento"]] = relationship(lazy="raise")
283
+ ```
284
+
285
+ ### Queries con selectinload explícito
286
+ ```python
287
+ from sqlalchemy import select
288
+ from sqlalchemy.orm import selectinload
289
+
290
+ async def obtener_documento_con_versiones(
291
+ db: AsyncSession, documento_id: uuid.UUID
292
+ ) -> Documento | None:
293
+ result = await db.execute(
294
+ select(Documento)
295
+ .where(Documento.id == documento_id)
296
+ .options(
297
+ selectinload(Documento.autor),
298
+ selectinload(Documento.versiones).selectinload(VersionDocumento.creador),
299
+ )
300
+ )
301
+ return result.scalar_one_or_none()
302
+ ```
303
+
304
+ ## Celery — patrones de producción
305
+
306
+ ```python
307
+ # tasks/base.py
308
+ from celery import Task
309
+ import structlog
310
+
311
+ logger = structlog.get_logger()
312
+
313
+ class TareaConRetry(Task):
314
+ """Base para tareas con retry exponencial y logging estructurado."""
315
+ abstract = True
316
+ max_retries = 3
317
+ default_retry_delay = 60 # segundos
318
+
319
+ def on_failure(self, exc: Exception, task_id: str, args: tuple, kwargs: dict, einfo) -> None:
320
+ logger.error(
321
+ "Tarea fallida definitivamente",
322
+ task_id=task_id,
323
+ task_name=self.name,
324
+ exc_type=type(exc).__name__,
325
+ args=args,
326
+ kwargs=kwargs,
327
+ )
328
+
329
+ def on_retry(self, exc: Exception, task_id: str, args: tuple, kwargs: dict, einfo) -> None:
330
+ logger.warning(
331
+ "Reintentando tarea",
332
+ task_id=task_id,
333
+ task_name=self.name,
334
+ retries=self.request.retries,
335
+ )
336
+
337
+ # tasks/email.py
338
+ from celery import shared_task
339
+ from .base import TareaConRetry
340
+
341
+ @shared_task(bind=True, base=TareaConRetry, queue="emails")
342
+ def enviar_email(self, destinatario: str, asunto: str, cuerpo: str) -> dict:
343
+ try:
344
+ # lógica de envío
345
+ return {"status": "sent", "destinatario": destinatario}
346
+ except TransientError as exc:
347
+ raise self.retry(exc=exc, countdown=2 ** self.request.retries * 30)
348
+ except PermanentError as exc:
349
+ # No reintentar — ir a dead letter queue
350
+ raise
351
+ ```
352
+
353
+ ## Pydantic v2 — patrones avanzados
354
+
355
+ ```python
356
+ from pydantic import BaseModel, model_validator, field_validator, computed_field
357
+ from pydantic import Discriminator, Tag
358
+ from typing import Annotated, Literal
359
+
360
+ # Discriminated unions para payloads polimórficos
361
+ class EventoCreado(BaseModel):
362
+ tipo: Literal["CREADO"]
363
+ entidad_id: str
364
+ datos: dict
365
+
366
+ class EventoActualizado(BaseModel):
367
+ tipo: Literal["ACTUALIZADO"]
368
+ entidad_id: str
369
+ cambios: dict[str, tuple[object, object]] # campo: (anterior, nuevo)
370
+
371
+ EventoUnion = Annotated[
372
+ EventoCreado | EventoActualizado,
373
+ Discriminator("tipo"),
374
+ ]
375
+
376
+ # model_validator para lógica de validación cruzada
377
+ class RangoFechas(BaseModel):
378
+ fecha_inicio: date
379
+ fecha_fin: date
380
+
381
+ @model_validator(mode="after")
382
+ def validar_rango(self) -> "RangoFechas":
383
+ if self.fecha_fin <= self.fecha_inicio:
384
+ raise ValueError("fecha_fin debe ser posterior a fecha_inicio")
385
+ if (self.fecha_fin - self.fecha_inicio).days > 365:
386
+ raise ValueError("El rango no puede superar 365 días")
387
+ return self
388
+ ```
389
+
390
+ ## Testing avanzado con pytest
391
+
392
+ ```python
393
+ # tests/factories.py — con factory_boy
394
+ import factory
395
+ from factory.alchemy import SQLAlchemyModelFactory
396
+ from app.models import Usuario, Documento
397
+
398
+ class UsuarioFactory(SQLAlchemyModelFactory):
399
+ class Meta:
400
+ model = Usuario
401
+ sqlalchemy_session_persistence = "flush"
402
+
403
+ id = factory.LazyFunction(uuid.uuid4)
404
+ email = factory.Sequence(lambda n: f"usuario{n}@test.com")
405
+ nombre = factory.Faker("name", locale="es_MX")
406
+ rol = "LECTOR"
407
+
408
+ # tests/conftest.py
409
+ import pytest
410
+ from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker
411
+
412
+ @pytest_asyncio.fixture(scope="session")
413
+ async def pg_engine():
414
+ engine = create_async_engine("postgresql+psycopg://test:test@localhost/test_db")
415
+ async with engine.begin() as conn:
416
+ await conn.run_sync(Base.metadata.create_all)
417
+ yield engine
418
+ async with engine.begin() as conn:
419
+ await conn.run_sync(Base.metadata.drop_all)
420
+ await engine.dispose()
421
+
422
+ @pytest_asyncio.fixture
423
+ async def db(pg_engine) -> AsyncGenerator[AsyncSession, None]:
424
+ session_factory = async_sessionmaker(pg_engine, expire_on_commit=False)
425
+ async with session_factory() as session:
426
+ yield session
427
+ await session.rollback()
428
+
429
+ # tests/services/test_documentos.py
430
+ @pytest.mark.asyncio
431
+ async def test_crear_documento_no_hace_commit(db: AsyncSession):
432
+ """Verificar que el service no hace commit — solo flush."""
433
+ usuario = UsuarioFactory.build()
434
+ db.add(usuario)
435
+ await db.flush()
436
+
437
+ servicio = DocumentoService(db)
438
+ doc = await servicio.crear(titulo="Test", autor_id=usuario.id)
439
+
440
+ # El service debe retornar el objeto sin haber committed
441
+ assert doc.id is not None
442
+ # Verificar que no se hizo commit consultando otra sesión
443
+ # (el dato no debe ser visible en otra transacción)
444
+ ```
445
+
446
+ ## Performance — profiling y caching
447
+
448
+ ```python
449
+ # lib/cache.py — Redis con serialización tipada
450
+ import redis.asyncio as aioredis
451
+ import pickle
452
+ from typing import TypeVar, Callable, Any
453
+ from functools import wraps
454
+
455
+ T = TypeVar("T")
456
+
457
+ class Cache:
458
+ def __init__(self, redis: aioredis.Redis) -> None:
459
+ self._redis = redis
460
+
461
+ async def get_or_set(
462
+ self,
463
+ key: str,
464
+ factory: Callable[[], Any],
465
+ ttl_seconds: int = 300,
466
+ ) -> Any:
467
+ cached = await self._redis.get(key)
468
+ if cached is not None:
469
+ return pickle.loads(cached)
470
+ value = await factory()
471
+ await self._redis.setex(key, ttl_seconds, pickle.dumps(value))
472
+ return value
473
+
474
+ async def invalidar(self, pattern: str) -> int:
475
+ keys = await self._redis.keys(pattern)
476
+ if keys:
477
+ return await self._redis.delete(*keys)
478
+ return 0
479
+ ```
480
+
481
+ ## Excepciones — jerarquía tipada obligatoria
482
+
483
+ ```python
484
+ # MAL — HTTPException raw sin contexto
485
+ from fastapi import HTTPException
486
+ raise HTTPException(status_code=404, detail="No encontrado")
487
+
488
+ # MAL — excepción genérica
489
+ raise ValueError("Dato inválido")
490
+
491
+ # BIEN — excepciones tipadas del proyecto
492
+ from app.core.exceptions import NotFoundError, ValidationError, BusinessLogicError
493
+
494
+ raise NotFoundError("Documento", str(documento_id))
495
+ raise ValidationError("La fecha de inicio debe ser anterior a la fecha de fin")
496
+ raise BusinessLogicError(message="Operación no permitida en este estado", code="E_ESTADO")
497
+ ```
498
+
499
+ Si el proyecto tiene una jerarquía de excepciones en `core/exceptions.py`, usarla siempre.
500
+ Si no existe, crearla con: `AppException` → `NotFoundError | ValidationError | BusinessLogicError | AuthenticationError | AuthorizationError`.
501
+
502
+ ## Migración Python → Rust con PyO3 (Escenario de aceleración)
503
+
504
+ Cuando el usuario identifica un cuello de botella CPU-bound en código Python, evaluar si conviene un puente Rust con PyO3 antes de reescribir el sistema completo.
505
+
506
+ ### Matriz de decisión: ¿migrar a Rust?
507
+
508
+ | Componente Python | Decisión | Justificación |
509
+ |------------------|---------|---------------|
510
+ | Route handlers FastAPI / Flask | Mantener Python | I/O-bound, framework-intensivo — sin ganancia |
511
+ | Procesamiento CPU de archivos grandes | PyO3 bridge | CPU-bound — Rust 10-100x más rápido |
512
+ | ORM queries (SQLAlchemy) | Mantener Python | I/O-bound — el cuello es la BD, no Python |
513
+ | Parser de CSV/JSON masivo (>500MB) | PyO3 bridge o Rust puro | CPU + memoria — Rust usa 10x menos RAM |
514
+ | Validación de datos compleja (>1M registros) | PyO3 bridge | Hot path — misma API Python, internals Rust |
515
+ | Templates / admin UI | Mantener Python | Sin ganancia de rendimiento |
516
+ | Background tasks de análisis | Evaluar | Si es CPU-bound → Rust; si es I/O → OK en Python |
517
+
518
+ **Regla de oro:** reemplazar la función Python por Rust con PyO3 cuando:
519
+ - La función toma >10% del tiempo total de ejecución
520
+ - Es CPU-bound (no I/O-bound)
521
+ - Tiene una frontera clara (inputs/outputs bien definidos)
522
+
523
+ ### Patrón PyO3 — extensión Rust para Python
524
+
525
+ ```bash
526
+ # 1. Crear extensión en el proyecto Python existente
527
+ cd mi_proyecto_python
528
+ pip install maturin
529
+ maturin init --bindings pyo3 # genera Cargo.toml + src/lib.rs
530
+
531
+ # 2. Compilar en modo desarrollo (instala en el venv activo)
532
+ maturin develop --release
533
+
534
+ # 3. Reemplazar la función lenta — sin cambiar el resto del código
535
+ ```
536
+
537
+ ```rust
538
+ // src/lib.rs — función de procesamiento en Rust expuesta a Python
539
+ use pyo3::prelude::*;
540
+
541
+ #[pyfunction]
542
+ fn procesar_csv(path: &str) -> PyResult<Vec<(i64, String, String)>> {
543
+ let file = std::fs::File::open(path)
544
+ .map_err(|e| pyo3::exceptions::PyIOError::new_err(e.to_string()))?;
545
+ let mut reader = csv::Reader::from_reader(std::io::BufReader::new(file));
546
+
547
+ let mut resultados = Vec::new();
548
+ for record in reader.records().flatten() {
549
+ let monto: i64 = record[0].parse().unwrap_or(0);
550
+ resultados.push((monto, record[1].to_string(), record[2].to_string()));
551
+ }
552
+ Ok(resultados)
553
+ }
554
+
555
+ #[pymodule]
556
+ fn mi_extension(m: &Bound<'_, PyModule>) -> PyResult<()> {
557
+ m.add_function(wrap_pyfunction!(procesar_csv, m)?)?;
558
+ Ok(())
559
+ }
560
+ ```
561
+
562
+ ```python
563
+ # En Python — reemplazar UNA línea, todos los tests siguen pasando
564
+ # Antes: results = procesar_csv_python("datos.csv") # 12 min
565
+ import mi_extension
566
+ results = mi_extension.procesar_csv("datos.csv") # 45 seg
567
+ ```
568
+
569
+ ### Estrategia incremental
570
+
571
+ ```
572
+ Semana 1-2: Perfilar con cProfile o py-spy — identificar el 5% que toma el 95%
573
+ Semana 3-4: Reemplazar UNA función con PyO3 — sin tocar el resto
574
+ Mes 2: Expandir gradualmente a más funciones CPU-bound
575
+ Mes 3+: Evaluar si el beneficio justifica reescritura completa
576
+ ```
577
+
578
+ **Referencia:** `temp/RustTraining-main/python-book/src/ch15-migration-patterns.md`
579
+
580
+ ## Reglas estrictas
581
+
582
+ - **Services NO hacen db.commit()** — solo `db.add()`, `db.flush()`, `db.refresh()`
583
+ - **expire_on_commit=False** SIEMPRE en AsyncSession — evita lazy loads post-commit
584
+ - **selectinload explícito** en TODA relación accedida en serialización
585
+ - **Literal[] en campos enum-like** de Pydantic — nunca `str` libre
586
+ - NUNCA uses `except Exception: pass` — loggea siempre
587
+ - NUNCA hardcodees configuración — usa `pydantic-settings`
588
+ - NUNCA hagas queries en loops — usa `IN` o joins
589
+ - SIEMPRE usa `pytest_asyncio.fixture` y `@pytest.mark.asyncio` — NO anyio
590
+ - **DRY obligatorio** — antes de crear una función, clase o query nueva, buscar si ya existe algo equivalente con `Grep`. Si existe, reutilizar o extender — no duplicar. Aplica especialmente a: queries de repositorio, validaciones de input, transformaciones de datos y constantes.
591
+ - **Si detectas duplicación** de lógica existente al implementar, extraer a un módulo compartido antes de continuar. No dejar la duplicación "para después".
592
+
593
+ ## Gotchas / Errores comunes no obvios
594
+
595
+ **`expire_on_commit=False` ausente → lazy loads post-commit silenciosos**: después del commit, SQLAlchemy expira todos los atributos de los objetos y los accesos posteriores intentan un lazy load que falla en contexto async. Causa: el comportamiento por defecto de SQLAlchemy es expirar en commit. Solución: configurar `expire_on_commit=False` en `AsyncSession` SIEMPRE; es la única forma de acceder atributos después del commit sin errores.
596
+
597
+ **`db.commit()` en service (viola separación de capas)**: el service confirma la transacción y el endpoint no puede controlar el rollback si falla después. Causa: parece natural que quien hace el trabajo confirma el resultado. Solución: services SOLO hacen `db.add()`, `db.flush()`, `db.refresh()`; el commit siempre en el endpoint para mantener la transacción bajo el control del punto de entrada.
598
+
599
+ **`except Exception: pass` silencia errores críticos**: una excepción de base de datos o de lógica de negocio desaparece sin traza. Causa: el código "funciona" en el happy path y el error se descubre en producción. Solución: NUNCA usar bare `except: pass` — mínimo `logger.exception("descripción", exc_info=True)` para preservar el stack trace.
600
+
601
+ **`Literal[]` ausente en campos enum-like → validación laxa**: un campo que debería aceptar solo `["activo", "inactivo"]` acepta cualquier string. Causa: `str` es más fácil de escribir. Solución: `Literal["activo", "inactivo"]` en Pydantic con los valores que coincidan exactamente con los `CheckConstraint` del ORM — sin esto, se pueden insertar valores inválidos que pasarán la validación de Pydantic pero fallarán en BD.
602
+
603
+ ## Señales de parar y reportar
604
+
605
+ - Una migración de Alembic es destructiva (DROP COLUMN, DROP TABLE) sin respaldo documentado
606
+ - El modelo de datos requiere cambios que rompen el contrato de API existente
607
+ - La configuración de Celery necesita un broker nuevo no instalado en el entorno
608
+ - Un test falla por un bug en código fuera del scope del plan