@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,303 @@
1
+ ---
2
+ name: orquestacion-async
3
+ description: >
4
+ Patrones de orquestación asíncrona para agentes: subagentes fire-and-forget,
5
+ gestión de tareas paralelas, corrección mid-task y supervisión no-bloqueante.
6
+ Basado en Deep Agents v0.5 (LangChain). Cargar cuando orquestador-swl necesite
7
+ ejecutar implementaciones en paralelo o gestionar agentes de larga duración.
8
+ version: "1.1.0"
9
+ evolved: true
10
+ evolved-from: "1.0.0"
11
+ evolved-at: "2026-04-24"
12
+ evolved-by: "aprender"
13
+ evolved-note: "Sección nueva: matriz agente × archivo con intersección vacía antes de lanzar paralelos"
14
+ herramientasPermitidas: [Read]
15
+ user-invocable: false
16
+ exclusiones:
17
+ - "No cargar para concurrencia Python pura con asyncio/aiohttp — si la tarea es I/O concurrente en código de aplicación (no orquestación de agentes SWL), cargar `async-python`."
18
+ - "No cargar para lanzar un solo agente secuencialmente — el overhead de las 5 herramientas de gestión solo vale si hay ≥2 agentes en paralelo o una tarea de larga duración que bloquea el supervisor."
19
+ - "No cargar para delegar un slice a un subagente sin necesidad de supervisión ni corrección mid-task — para delegación simple sin monitoreo, el orquestador puede invocar el agente directamente sin este patrón."
20
+ - "No cargar para pipelines de datos o ETL con pasos dependientes — los patrones fire-and-forget asumen independencia entre tareas; para pipelines ordenados con dependencias usar `datos-etl`."
21
+ evolvable: true # default para skill estandar
22
+ ---
23
+ # Orquestación Asíncrona de Agentes
24
+
25
+ Patrones para supervisión no-bloqueante de subagentes, basados en Deep Agents v0.5
26
+ y adaptados al sistema de delegación de swl-ses.
27
+
28
+ ## Cuándo NO cargar
29
+
30
+ - La tarea es concurrencia Python con asyncio/aiohttp (no agentes SWL) — cargar `async-python`.
31
+ - Se lanza un solo agente secuencialmente sin necesidad de supervisión — la delegación directa es más simple.
32
+ - El pipeline tiene pasos con dependencias ordenadas — para ETL con dependencias cargar `datos-etl`.
33
+
34
+ ## Cuándo cargar
35
+
36
+ - `orquestador-swl` necesita lanzar múltiples implementaciones en paralelo
37
+ - Una tarea toma más de 3 minutos y bloquea la interacción con el usuario
38
+ - Se necesita corrección mid-task de un agente en ejecución
39
+ - Gestión de múltiples agentes concurrentes con diferentes prioridades
40
+
41
+ ## Principio fundamental
42
+
43
+ > Un supervisor NUNCA debe bloquearse esperando a un subagente de larga duración.
44
+ > El supervisor debe poder: responder al usuario, lanzar más tareas, verificar
45
+ > progreso, y corregir el rumbo — todo mientras los subagentes trabajan.
46
+
47
+ ## Patrón: 5 herramientas de gestión async
48
+
49
+ Inspirado en el modelo de Deep Agents v0.5:
50
+
51
+ ### 1. `start_async_task` — Lanzar tarea
52
+ ```
53
+ Entrada: { agente, prompt, prioridad, timeout }
54
+ Salida: { taskId, estado: "en_progreso" }
55
+ ```
56
+ El supervisor recibe un ID de tarea inmediatamente y continúa operando.
57
+
58
+ ### 2. `check_async_task` — Verificar estado
59
+ ```
60
+ Entrada: { taskId }
61
+ Salida: { estado, progreso, resultado_parcial, errores }
62
+ ```
63
+ Polling ligero — no bloquea, retorna estado actual.
64
+
65
+ ### 3. `update_async_task` — Corrección mid-task
66
+ ```
67
+ Entrada: { taskId, instrucciones_adicionales }
68
+ Salida: { aceptado: true/false }
69
+ ```
70
+ Envía instrucciones de corrección al subagente en ejecución.
71
+ Solo funciona si el subagente está en estado "en_progreso".
72
+
73
+ ### 4. `cancel_async_task` — Cancelar tarea
74
+ ```
75
+ Entrada: { taskId, razon }
76
+ Salida: { cancelado: true, trabajo_parcial }
77
+ ```
78
+ Cancela un subagente y recupera trabajo parcial.
79
+
80
+ ### 5. `list_async_tasks` — Listar tareas
81
+ ```
82
+ Entrada: { filtro_estado? }
83
+ Salida: [{ taskId, agente, estado, inicio, duracion }]
84
+ ```
85
+ Vista general de todas las tareas gestionadas.
86
+
87
+ ## Estados de una tarea async
88
+
89
+ ```
90
+ ┌─────────────┐
91
+ │ creada │
92
+ └──────┬──────┘
93
+ │ start
94
+ ┌──────▼──────┐
95
+ ┌───── │ en_progreso │ ─────┐
96
+ │ └──────┬──────┘ │
97
+ update│ │ │ cancel
98
+ │ ┌──────▼──────┐ │
99
+ └────► │ exitosa │ │
100
+ └─────────────┘ │
101
+ ┌──────▼──────┐ │
102
+ │ fallida │ ◄────┘
103
+ └─────────────┘
104
+ ┌─────────────┐
105
+ │ cancelada │
106
+ └─────────────┘
107
+ ```
108
+
109
+ ## Implementación en swl-ses
110
+
111
+ ### Mapeo a herramientas existentes
112
+
113
+ | Herramienta async | Implementación swl-ses |
114
+ |-------------------|----------------------|
115
+ | `start_async_task` | `Agent()` con `run_in_background: true` |
116
+ | `check_async_task` | Verificar notificación de agente completado |
117
+ | `update_async_task` | `SendMessage` al agente con `to: agentId` |
118
+ | `cancel_async_task` | No disponible nativamente — requiere convención |
119
+ | `list_async_tasks` | `task-service.js` (hooks/lib/) |
120
+
121
+ ### Patrón de uso en orquestador-swl
122
+
123
+ ```markdown
124
+ ## Fase de implementación paralela
125
+
126
+ 1. Analizar el plan e identificar slices independientes
127
+ 2. Para cada slice independiente:
128
+ - Lanzar Agent() con run_in_background: true
129
+ - Registrar taskId en task-service.js
130
+ 3. Mientras los agentes trabajan:
131
+ - Responder al usuario sobre progreso
132
+ - Revisar resultados parciales si llegan notificaciones
133
+ - Lanzar nuevos agentes si hay más slices listos
134
+ 4. Cuando todos completen:
135
+ - Verificar resultados con revisor-codigo-swl
136
+ - Resolver conflictos si dos agentes tocaron los mismos archivos
137
+ ```
138
+
139
+ ### Corrección mid-task
140
+
141
+ Cuando un agente en background necesita ajuste:
142
+
143
+ ```markdown
144
+ 1. Detectar desviación (por notificación o verificación manual)
145
+ 2. Enviar SendMessage al agentId con instrucciones de corrección:
146
+ - "El endpoint cambió de /api/v1/users a /api/v2/users"
147
+ - "Usar SQLAlchemy async, no sync"
148
+ 3. El agente recibe la corrección en su contexto y ajusta
149
+ ```
150
+
151
+ ### Resolución de conflictos
152
+
153
+ Cuando dos agentes modifican el mismo archivo:
154
+
155
+ ```
156
+ 1. Detectar conflicto: edit-accumulator.js registra archivos tocados
157
+ 2. Si hay solapamiento:
158
+ a. Revisar diffs de ambos agentes
159
+ b. Determinar si son complementarios o contradictorios
160
+ c. Complementarios → merge manual o automático
161
+ d. Contradictorios → escalar al usuario con ambas versiones
162
+ 3. Nunca aplicar ciegamente el último cambio
163
+ ```
164
+
165
+ ## Límites y restricciones
166
+
167
+ ### De swl-ses
168
+ - `MAX_DEPTH = 2` — Un agente puede delegar, pero el delegado no puede delegar
169
+ - `max_concurrent_children = 3` — Máximo 3 subagentes concurrentes (configurable)
170
+ - Agentes delegados NO escriben a memoria compartida (MEMORY.md)
171
+ - Agentes delegados NO interactúan con el usuario directamente
172
+
173
+ ### Del runtime (Claude Code)
174
+ - Background agents notifican al completar — no hay polling periódico
175
+ - El contexto del agente padre no ve los tool calls internos del hijo
176
+ - SendMessage requiere el agentId exacto retornado por Agent()
177
+
178
+ ## Escenarios de uso
179
+
180
+ ### Escenario A: Feature con frontend + backend + tests
181
+ ```
182
+ orquestador-swl:
183
+ 1. Lanza backend-api-swl (Agent, background) → taskId_1
184
+ 2. Lanza frontend-react-swl (Agent, background) → taskId_2
185
+ 3. Espera notificaciones
186
+ 4. Backend completa → lanza tdd-qa-swl para tests de API → taskId_3
187
+ 5. Frontend completa → lanza tdd-qa-swl para tests de UI → taskId_4
188
+ 6. Todos completan → revisor-codigo-swl verifica todo junto
189
+ ```
190
+
191
+ ### Escenario B: Refactoring paralelo
192
+ ```
193
+ orquestador-swl:
194
+ 1. Divide módulos a refactorizar en grupos independientes
195
+ 2. Lanza N agentes en paralelo (máx 3)
196
+ 3. Cuando completa un grupo → verifica y lanza el siguiente
197
+ 4. Al final → merge + test completo
198
+ ```
199
+
200
+ ### Escenario C: Investigación + implementación
201
+ ```
202
+ orquestador-swl:
203
+ 1. Lanza investigador-swl (background) para research
204
+ 2. Mientras, prepara scaffold básico directamente
205
+ 3. Investigador completa → lee resultados
206
+ 4. Lanza implementador-swl con contexto del research
207
+ ```
208
+
209
+ ## Métricas de eficiencia
210
+
211
+ | Métrica | Fórmula | Objetivo |
212
+ |---------|---------|----------|
213
+ | Paralelismo efectivo | Tiempo secuencial / Tiempo real | ≥ 2.0x |
214
+ | Conflictos por tarea | Archivos con conflicto / Total archivos | ≤ 5% |
215
+ | Reintentos por corrección | Correcciones mid-task / Total tareas | ≤ 20% |
216
+ | Overhead de orquestación | Tokens orquestador / Tokens total | ≤ 15% |
217
+
218
+ ## Gotchas / Errores comunes no obvios
219
+
220
+ - **`check_task_status` retorna `completada` pero el archivo generado por el subagente no existe en disco**: el subagente reportó éxito pero terminó antes de escribir el archivo por una excepción silenciada. Causa: el estado `completada` en el patrón de 5 herramientas refleja que el subagente terminó su ejecución sin lanzar excepción al supervisor — si el error fue interno y capturado silenciosamente, el output no existe aunque el estado sea correcto. Solución: la herramienta `get_task_result` debe verificar explícitamente que los artefactos de output existen antes de reportar `completada`; agregar validación de postcondición: `assert Path(archivo_esperado).exists()`.
221
+ - **Lanzar 8 subagentes en paralelo con `start_async_task` sin semáforo consume el presupuesto de tokens del orquestador en segundos**: cada invocación de subagente consume el contexto del orquestador mientras espera resultados de todos ellos. Causa: el patrón fire-and-forget no limita la concurrencia — 8 agentes en paralelo pueden disparar 8× el costo esperado si el supervisor los monitorea activamente. Solución: limitar con un semáforo de concurrencia máxima de 3-4 agentes simultáneos, y usar `check_task_status` con backoff para no encuestar continuamente.
222
+ - **Corrección mid-task con `modify_task_prompt` produce un subagente que ignora la corrección y continúa con el plan original**: el subagente ya tiene el plan congelado en su contexto y la corrección llega como un mensaje adicional que no modifica el plan original. Causa: `modify_task_prompt` agrega instrucciones al contexto del agente pero si el plan ya está en ejecución, el subagente puede priorizarlo sobre las instrucciones nuevas. Solución: la corrección mid-task debe ser explícita sobre qué cambiar: en lugar de agregar "también haz X", indicar "STOP el paso actual, cambia a Y" con autoridad clara sobre el paso en conflicto.
223
+ - **`cancel_task` no libera los archivos que el subagente dejó en estado parcial**: cancelar una tarea detiene el agente pero los archivos que ya escribió permanecen con contenido incompleto. Causa: el patrón de cancelación no tiene rollback de los artefactos ya generados — solo detiene la ejecución futura. Solución: antes de `cancel_task`, registrar los archivos que el subagente está modificando (via `check_task_status` que devuelve `archivos_en_progreso`), y después de la cancelación, revertir esos archivos con `git checkout -- archivos` si el trabajo no es recuperable.
224
+
225
+ ---
226
+
227
+ ## Matriz agente × archivo: partición explícita antes de lanzar paralelos
228
+
229
+ ### Regla
230
+
231
+ Antes de lanzar **N agentes en paralelo** que modifican archivos, producir una
232
+ **matriz explícita** agente × archivo con **intersección vacía** entre filas.
233
+ Un archivo compartido por 2 agentes paralelos produce merge silencioso
234
+ impredecible: el último write gana, sin detección ni log.
235
+
236
+ ### Por qué
237
+
238
+ Los agentes fire-and-forget no tienen coordinación entre sí. Si el agente A
239
+ está editando `core/service.py` y el agente B también, la secuencia real es:
240
+
241
+ 1. A lee versión V0, piensa, escribe V1.
242
+ 2. B lee versión V0 (no V1), piensa, escribe V2.
243
+ 3. Resultado: los cambios de A desaparecen. Git no muestra conflicto porque
244
+ B ya "reconcilió" en su cabeza el archivo.
245
+
246
+ El patrón no se detecta por tests unitarios aislados. Solo se observa al leer
247
+ el diff final contra lo esperado — y suele descubrirse horas después.
248
+
249
+ ### Patrón canónico: matriz explícita pre-lanzamiento
250
+
251
+ ```markdown
252
+ ## Matriz de partición — Sprint X
253
+
254
+ | Agente | Archivos (exclusivos) |
255
+ |--------|----------------------|
256
+ | backend-python-swl | api/routers/emaia.py, core/service_usuarios.py |
257
+ | frontend-react-swl | ui/pages/usuarios.tsx, ui/components/FormUsuario.tsx |
258
+ | datos-swl | core/db/models.py, alembic/versions/00XX_usuarios.py |
259
+ | tdd-qa-swl | tests/integration/test_usuarios.py (solo lectura en el resto) |
260
+
261
+ Verificación: intersección de archivos entre filas = ∅.
262
+ Archivos no listados: NO se tocan en este sprint.
263
+ ```
264
+
265
+ ### Protocolo operativo
266
+
267
+ 1. **Antes de invocar agentes en paralelo**, el orquestador escribe la matriz
268
+ en `.planning/sprint-X/matriz-agentes.md` o equivalente.
269
+ 2. **Cada agente delegado recibe explícitamente** su lista de archivos en
270
+ el prompt de delegación: `"Tus archivos asignados son X, Y, Z. No tocar
271
+ ningún otro archivo sin escalar al orquestador."`.
272
+ 3. **Si un agente necesita tocar un archivo no asignado**, debe escalar
273
+ (pausar y reportar), no tomar decisión unilateral.
274
+ 4. **Post-ejecución**: verificar que el diff de cada agente está contenido
275
+ en sus archivos asignados. Un agente que tocó un archivo ajeno es señal
276
+ de drift del scope y debe revertirse.
277
+
278
+ ### Casos donde NO aplica
279
+
280
+ - **Tareas de un solo agente** (serial): la matriz es innecesaria.
281
+ - **Lecturas sin writes**: múltiples agentes pueden leer el mismo archivo
282
+ en paralelo sin riesgo; la matriz aplica a writes.
283
+ - **Archivos append-only con locking** (JSONL con `fs.appendFileSync`):
284
+ los appends atómicos no se pisan. Documentar explícitamente estos casos.
285
+
286
+ ### Anti-patrón
287
+
288
+ ```markdown
289
+ # MAL — delegación sin partición
290
+ "Lanzar backend-python-swl, frontend-react-swl y datos-swl en paralelo
291
+ para implementar la feature X."
292
+
293
+ # Cada agente descubre por sí mismo qué archivos toca. Garantizado:
294
+ # los 3 tocan `core/schemas.py` porque todos necesitan el tipo Usuario.
295
+ ```
296
+
297
+ ### Relacionado
298
+
299
+ - `checkpoints-verificacion` — cómo pausar agentes en checkpoints HITL.
300
+ - `git-worktrees-paralelo` — aislamiento físico con worktrees cuando la
301
+ matriz no se puede diseñar con intersección vacía.
302
+ - Regla en CLAUDE.md: "Matriz agente × archivo antes de lanzar paralelos
303
+ N≥3" — consolidar como regla del proyecto si el patrón se repite.
@@ -0,0 +1,269 @@
1
+ ---
2
+ name: paid-media-tracking
3
+ description: >
4
+ Implementación técnica de herramientas para campañas de publicidad pagada:
5
+ Google Ads API, análisis de search terms, conversión tracking server-side,
6
+ auditoría de cuentas programática y dashboards de rendimiento. Cargar cuando
7
+ se construya una integración con Google Ads API, se implemente análisis
8
+ automático de search terms, se diseñe un sistema de medición de ROAS,
9
+ o se audite la implementación técnica de conversión tracking.
10
+ version: "1.0.0"
11
+ herramientasPermitidas: [Read]
12
+ evolvable: true # default para skill estandar
13
+ exclusiones:
14
+ - "No cargar para tracking de conversiones en el browser o server-side con GTM, GA4, Meta CAPI — para implementación de tracking web cargar `tracking-measurement`."
15
+ - "No cargar para estrategia de pujas, definición de presupuesto o copy de anuncios — esas son decisiones de negocio y marketing, no técnicas."
16
+ - "No cargar para integraciones con plataformas distintas a Google Ads (Meta Ads, TikTok Ads, LinkedIn Ads) sin relación con la API de Google — para otras plataformas usar el SDK correspondiente."
17
+ - "No cargar para dashboards de métricas generales de negocio sin datos de Google Ads — para dashboards de observabilidad de sistemas cargar `monitoring-alertas`."
18
+ ---
19
+ # paid-media-tracking — Herramientas técnicas para publicidad pagada
20
+
21
+ ## Cuándo NO cargar
22
+
23
+ - La tarea es tracking de conversiones en el browser o server-side (GTM, GA4, Meta CAPI): cargar `tracking-measurement`.
24
+ - La tarea es estrategia de pujas, presupuesto o copy de anuncios: son decisiones de negocio, no de ingeniería.
25
+ - La integración es con Meta Ads, TikTok Ads o LinkedIn Ads sin relación con Google Ads API: usar el SDK del proveedor.
26
+ - La tarea es un dashboard de métricas generales de negocio sin datos específicos de Google Ads: cargar `monitoring-alertas`.
27
+
28
+ ## Cuándo cargar este skill
29
+
30
+ ```
31
+ ✅ Construir reportes automáticos de Google Ads (Python, Node)
32
+ ✅ Implementar un sistema de alertas sobre rendimiento de campañas
33
+ ✅ Integrar Google Ads API con un CRM o backend
34
+ ✅ Diseñar el schema de dataLayer para campañas de e-commerce
35
+ ✅ Construir un dashboard de ROAS con datos de la API
36
+ ✅ Automatizar la gestión de negative keywords programáticamente
37
+ ✅ Implementar auditoría técnica de cuentas Google Ads
38
+ ❌ Definir estrategia de pujas (es trabajo del PPC strategist, no del ingeniero)
39
+ ❌ Crear copys de anuncios (creativo, no técnico)
40
+ ❌ Tomar decisiones de presupuesto (decisión de negocio)
41
+ ```
42
+
43
+ > Para tracking de conversiones browser/server-side (GTM, GA4, Meta CAPI),
44
+ > cargar `Skill("tracking-measurement")` en su lugar o en paralelo.
45
+
46
+ ## Conceptos clave
47
+
48
+ - **ROAS** (Return on Ad Spend): `valor_conversiones / costo`. Métrica primaria de rentabilidad de campañas.
49
+ - **Micros**: Google Ads almacena costos en micros (millonésimas). `cost_micros / 1_000_000` = valor real.
50
+ - **GAQL**: Google Ads Query Language. SQL-like para consultar la API. Recursos, segmentos y métricas tienen nombres específicos.
51
+ - **MCC** (Manager Customer Center): cuenta paraguas que agrupa sub-cuentas. El `login_customer_id` debe apuntar al MCC.
52
+ - **Search Term View**: recurso de la API que expone los términos exactos que activaron los anuncios — diferente a las keywords configuradas.
53
+
54
+ ## Reglas obligatorias
55
+
56
+ ### Regla 1 — Siempre dividir `cost_micros` entre 1,000,000
57
+
58
+ Google Ads devuelve todos los costos en micros. Operar con micros produce
59
+ cifras de ROAS, CPA y presupuesto completamente erróneas.
60
+
61
+ ```python
62
+ # MAL — opera con micros directamente
63
+ roas = conversiones_valor / row.metrics.cost_micros
64
+
65
+ # BIEN — convierte primero
66
+ costo = row.metrics.cost_micros / 1_000_000
67
+ roas = conversiones_valor / costo if costo > 0 else 0
68
+ ```
69
+
70
+ **Verificación**: El costo de una campaña típica en MXN debe estar en
71
+ el rango de decenas a miles, nunca en millones.
72
+
73
+ ### Regla 2 — Manejar `GoogleAdsException` siempre
74
+
75
+ La API devuelve errores granulares por campo y operación. Un `except Exception`
76
+ silencia información crítica (quota excedida, permiso denegado, ID inválido).
77
+
78
+ ```python
79
+ from google.ads.googleads.errors import GoogleAdsException
80
+
81
+ try:
82
+ response = ga_service.search(customer_id=customer_id, query=query)
83
+ except GoogleAdsException as ex:
84
+ for error in ex.failure.errors:
85
+ logger.error(
86
+ "Error Google Ads [%s]: %s",
87
+ error.error_code,
88
+ error.message,
89
+ )
90
+ raise
91
+ ```
92
+
93
+ **Verificación**: Los logs deben mostrar `error_code` y `message` específicos,
94
+ no solo el texto genérico de la excepción.
95
+
96
+ ### Regla 3 — `customer_id` sin guiones
97
+
98
+ La Google Ads API rechaza el formato `123-456-7890`. El formato correcto es
99
+ la cadena de dígitos sin guiones: `"1234567890"`.
100
+
101
+ ```python
102
+ # MAL
103
+ customer_id = "123-456-7890"
104
+
105
+ # BIEN
106
+ customer_id = "1234567890"
107
+ # O limpiar al recibir del usuario:
108
+ customer_id = customer_id.replace("-", "")
109
+ ```
110
+
111
+ **Verificación**: Un `INVALID_CUSTOMER_ID` en los logs indica este problema.
112
+
113
+ ### Regla 4 — Nunca hardcodear credenciales de la API
114
+
115
+ `developer_token`, `refresh_token` y `client_secret` son credenciales de
116
+ producción. Van en variables de entorno o en un gestor de secretos.
117
+
118
+ ```python
119
+ # MAL
120
+ client = GoogleAdsClient.load_from_dict({
121
+ "developer_token": "ABcDeFgHiJkLmNoPq",
122
+ "refresh_token": "1//0gXyz...",
123
+ })
124
+
125
+ # BIEN
126
+ client = GoogleAdsClient.load_from_dict({
127
+ "developer_token": settings.GOOGLE_ADS_DEVELOPER_TOKEN,
128
+ "client_id": settings.GOOGLE_ADS_CLIENT_ID,
129
+ "client_secret": settings.GOOGLE_ADS_CLIENT_SECRET,
130
+ "refresh_token": settings.GOOGLE_ADS_REFRESH_TOKEN,
131
+ "login_customer_id": settings.GOOGLE_ADS_MCC_ID,
132
+ })
133
+ ```
134
+
135
+ ### Regla 5 — Cachear respuestas de la API al menos 1 hora
136
+
137
+ La API tiene quota diaria limitada (1,000 operaciones/día en nivel básico).
138
+ Llamar la API en cada request HTTP agota la quota en minutos con tráfico real.
139
+
140
+ ```python
141
+ from functools import lru_cache
142
+ import time
143
+
144
+ _cache: dict = {}
145
+ _TTL = 3600 # 1 hora
146
+
147
+ def obtener_con_cache(clave: str, fn_obtener):
148
+ """Caché simple con TTL para respuestas de Google Ads API."""
149
+ ahora = time.time()
150
+ if clave in _cache and (ahora - _cache[clave]["ts"]) < _TTL:
151
+ return _cache[clave]["data"]
152
+ datos = fn_obtener()
153
+ _cache[clave] = {"data": datos, "ts": ahora}
154
+ return datos
155
+ ```
156
+
157
+ ## Google Ads API — cliente Python
158
+
159
+ ```python
160
+ from google.ads.googleads.client import GoogleAdsClient
161
+ from google.ads.googleads.errors import GoogleAdsException
162
+
163
+ client = GoogleAdsClient.load_from_dict({
164
+ "developer_token": settings.GOOGLE_ADS_DEVELOPER_TOKEN,
165
+ "client_id": settings.GOOGLE_ADS_CLIENT_ID,
166
+ "client_secret": settings.GOOGLE_ADS_CLIENT_SECRET,
167
+ "refresh_token": settings.GOOGLE_ADS_REFRESH_TOKEN,
168
+ "login_customer_id": settings.GOOGLE_ADS_MCC_ID,
169
+ })
170
+
171
+ def obtener_rendimiento_campanas(customer_id: str, dias: int = 30) -> list[dict]:
172
+ """Obtiene métricas de rendimiento de campañas de los últimos N días."""
173
+ ga_service = client.get_service("GoogleAdsService")
174
+
175
+ query = f"""
176
+ SELECT
177
+ campaign.id,
178
+ campaign.name,
179
+ campaign.status,
180
+ metrics.impressions,
181
+ metrics.clicks,
182
+ metrics.conversions,
183
+ metrics.cost_micros,
184
+ metrics.conversions_value
185
+ FROM campaign
186
+ WHERE segments.date DURING LAST_{dias}_DAYS
187
+ AND campaign.status = 'ENABLED'
188
+ ORDER BY metrics.cost_micros DESC
189
+ """
190
+
191
+ try:
192
+ response = ga_service.search(customer_id=customer_id, query=query)
193
+ resultados = []
194
+ for row in response:
195
+ costo = row.metrics.cost_micros / 1_000_000
196
+ roas = (row.metrics.conversions_value / costo) if costo > 0 else 0
197
+
198
+ resultados.append({
199
+ "id": str(row.campaign.id),
200
+ "nombre": row.campaign.name,
201
+ "impresiones": row.metrics.impressions,
202
+ "clicks": row.metrics.clicks,
203
+ "conversiones": row.metrics.conversions,
204
+ "costo": round(costo, 2),
205
+ "roas": round(roas, 2),
206
+ })
207
+ return resultados
208
+
209
+ except GoogleAdsException as ex:
210
+ for error in ex.failure.errors:
211
+ raise ValueError(f"Error Google Ads: {error.message}") from ex
212
+ ```
213
+
214
+ ## Análisis de search terms para detección de desperdicio
215
+
216
+ Consultar la implementación completa de `analizar_search_terms` en
217
+ [recursos/auditoria-tracking.md](recursos/auditoria-tracking.md).
218
+
219
+ Patrón de detección de desperdicio: si `costo > 50` y `conversiones == 0`,
220
+ el término es candidato a negative keyword. Analizar bigramas y trigramas
221
+ (n=2 y n=3) sobre el vocabulario de search terms para encontrar patrones
222
+ de términos irrelevantes frecuentes.
223
+
224
+ ## Detección de discrepancias entre plataformas
225
+
226
+ Consultar la función `ejecutar_auditoria_completa` en
227
+ [recursos/auditoria-tracking.md](recursos/auditoria-tracking.md).
228
+
229
+ Umbral aceptable: discrepancia < 15% entre Google Ads y GA4.
230
+ Causas frecuentes: ventanas de conversión distintas, modelos de atribución
231
+ diferentes (last-click vs data-driven), o conversiones offline no importadas.
232
+
233
+ ## Anti-patrones críticos
234
+
235
+ | Anti-patrón | Problema | Solución |
236
+ |-------------|----------|----------|
237
+ | Operar con `cost_micros` sin convertir | ROAS y CPA erróneos por factor 1,000,000 | Dividir siempre entre `1_000_000` |
238
+ | `customer_id` con guiones `123-456-7890` | `INVALID_CUSTOMER_ID` de la API | `customer_id.replace("-", "")` |
239
+ | Llamar la API en cada request HTTP | Quota agotada en minutos | Caché con TTL de 1 hora mínimo |
240
+ | Credenciales en código fuente | Exposición en repositorio | Variables de entorno obligatorias |
241
+ | Filtrar sin considerar `campaign.status` | `PAUSED`/`REMOVED` contaminan reportes activos | Filtro explícito por status en GAQL |
242
+ | Usar `login_customer_id` de sub-cuenta en MCC | Accede a cuenta incorrecta o da error de permisos | Siempre el ID del MCC para cuentas administradas |
243
+
244
+ ## Checklist de verificación
245
+
246
+ - [ ] `cost_micros` se divide entre `1_000_000` antes de cualquier operación aritmética
247
+ - [ ] `GoogleAdsException` capturada con iteración sobre `ex.failure.errors`
248
+ - [ ] `customer_id` sin guiones antes de llamar a la API
249
+ - [ ] Credenciales en variables de entorno (`settings.*`), no hardcodeadas
250
+ - [ ] Respuestas de la API con caché de al menos 1 hora
251
+ - [ ] Filtro de `campaign.status` en todas las queries de campañas activas
252
+ - [ ] `search_stream` usado para queries que puedan devolver >10,000 filas
253
+
254
+ ## Referencias a recursos
255
+
256
+ | Tema | Archivo |
257
+ |------|---------|
258
+ | Google Ads API: autenticación, quota, GAQL avanzado, batch operations | [recursos/google-ads-api.md](recursos/google-ads-api.md) |
259
+ | Auditoría técnica: checklist de cuenta, métricas de calidad, reporte Python | [recursos/auditoria-tracking.md](recursos/auditoria-tracking.md) |
260
+
261
+ ## Gotchas / Errores comunes no obvios
262
+
263
+ **La GAQL query con `WHERE segments.date DURING LAST_30_DAYS` incluye el día actual con datos parciales, inflando el conteo de conversiones del período**: si se corre el reporte a las 10 AM, el día de hoy tiene solo 10 horas de datos pero se incluye en el agregado de 30 días como si fuera un día completo. Para comparativas de períodos (mes actual vs mes anterior), esto produce distorsión. Causa: `LAST_N_DAYS` incluye el día actual con datos hasta el momento de la query. Fix: usar `BETWEEN YYYY-MM-DD AND YYYY-MM-DD` con fechas explícitas excluyendo el día actual, calculadas en Python: `fecha_fin = datetime.today() - timedelta(days=1)`.
264
+
265
+ **El `login_customer_id` correcto para MCC es el ID de la cuenta administradora, pero las queries retornan datos de TODAS las sub-cuentas mezclados si no se especifica `customer_id` por sub-cuenta**: si el MCC administra 50 cuentas y se hace una query de campañas sin filtrar por `customer_id`, la API devuelve campañas de todas las sub-cuentas con los mismos nombres, haciendo imposible distinguir a qué cuenta pertenece cada fila. Causa: el `login_customer_id` habilita el acceso al MCC pero `customer_id` en `search()` determina el scope. Fix: iterar sobre los sub-`customer_id` obtenidos de `CustomerService` y hacer una query por cuenta, o usar el campo `customer.id` en el `SELECT` de GAQL para incluir el ID de cuenta en cada fila del resultado.
266
+
267
+ **`search_stream` no puede usarse con queries que incluyen `ORDER BY` porque la API de streaming no garantiza orden y lanza `STREAMING_NOT_SUPPORTED_FOR_SORTED_QUERIES`**: al migrar de `search()` a `search_stream()` para manejar resultados grandes, las queries con `ORDER BY metrics.cost_micros DESC` fallan con un error poco descriptivo. Causa: el streaming de Google Ads API envía filas en el orden de procesamiento interno del servidor, no en el orden especificado. Fix: usar `search()` con paginación para queries ordenadas, y `search_stream()` solo para queries sin `ORDER BY`. Si se necesita orden + volumen grande, hacer el sort en Python después de recibir todos los resultados.
268
+
269
+ **Las conversiones de Google Ads tienen una ventana de atribución de 30-90 días, por lo que los datos de ROAS de los últimos 7 días siguen cambiando durante semanas después**: un reporte ejecutado el lunes puede mostrar ROAS de 2.1 para la semana anterior, pero el mismo período consultado 3 semanas después puede mostrar ROAS de 2.8 porque se atribuyeron conversiones tardías. Causa: la API devuelve los datos con las conversiones atribuidas hasta el momento de la query, no las del período. Fix: para reportes comparativos históricos, documentar la fecha de extracción y no comparar el período "de esta semana" contra períodos anteriores sin usar datos ya consolidados (más de 90 días atrás). Para dashboards en tiempo real, aceptar que los últimos 90 días tienen datos en evolución y mostrar la fecha de actualización.