@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.
- package/CLAUDE.md +238 -0
- package/README.md +560 -0
- package/_userland/agentes/.gitkeep +0 -0
- package/_userland/habilidades/.gitkeep +0 -0
- package/agentes/.evolved.json +9 -0
- package/agentes/accesibilidad-wcag-swl.md +692 -0
- package/agentes/arquitecto-swl.md +238 -0
- package/agentes/auto-evolucion-swl.md +854 -0
- package/agentes/backend-api-swl.md +470 -0
- package/agentes/backend-csharp-swl.md +418 -0
- package/agentes/backend-go-swl.md +388 -0
- package/agentes/backend-java-swl.md +279 -0
- package/agentes/backend-node-swl.md +477 -0
- package/agentes/backend-python-swl.md +608 -0
- package/agentes/backend-rust-swl.md +362 -0
- package/agentes/backend-workers-swl.md +480 -0
- package/agentes/cloud-infra-swl.md +485 -0
- package/agentes/consolidador-swl.md +539 -0
- package/agentes/datos-swl.md +584 -0
- package/agentes/depurador-swl.md +349 -0
- package/agentes/devops-ci-swl.md +374 -0
- package/agentes/disenador-ui-swl.md +558 -0
- package/agentes/documentador-swl.md +343 -0
- package/agentes/evals/arquitecto-swl.evals.json +56 -0
- package/agentes/evals/auto-evolucion-swl.evals.json +68 -0
- package/agentes/evals/implementador-swl.evals.json +56 -0
- package/agentes/evals/orquestador-swl.evals.json +60 -0
- package/agentes/evals/perfilador-usuario-swl.evals.json +60 -0
- package/agentes/evals/red-team-swl.evals.json +59 -0
- package/agentes/evals/revisor-codigo-swl.evals.json +59 -0
- package/agentes/frontend-angular-swl.md +627 -0
- package/agentes/frontend-css-swl.md +720 -0
- package/agentes/frontend-react-swl.md +696 -0
- package/agentes/frontend-swl.md +500 -0
- package/agentes/frontend-tailwind-swl.md +830 -0
- package/agentes/implementador-swl.md +328 -0
- package/agentes/investigador-swl.md +430 -0
- package/agentes/investigador-ux-swl.md +500 -0
- package/agentes/llm-apps-swl.md +276 -0
- package/agentes/migrador-swl.md +417 -0
- package/agentes/mobile-android-swl.md +509 -0
- package/agentes/mobile-cross-swl.md +539 -0
- package/agentes/mobile-ios-swl.md +500 -0
- package/agentes/mobile-testing-swl.md +300 -0
- package/agentes/notificador-swl.md +916 -0
- package/agentes/observabilidad-swl.md +436 -0
- package/agentes/orquestador-swl.md +884 -0
- package/agentes/pagos-swl.md +283 -0
- package/agentes/perfilador-usuario-swl.md +306 -0
- package/agentes/planificador-swl.md +402 -0
- package/agentes/producto-prd-swl.md +587 -0
- package/agentes/red-team-swl.md +216 -0
- package/agentes/release-manager-swl.md +568 -0
- package/agentes/rendimiento-swl.md +714 -0
- package/agentes/resolutor-build-swl.md +243 -0
- package/agentes/revisor-angular-swl.md +276 -0
- package/agentes/revisor-codigo-swl.md +348 -0
- package/agentes/revisor-csharp-swl.md +262 -0
- package/agentes/revisor-go-swl.md +257 -0
- package/agentes/revisor-java-swl.md +255 -0
- package/agentes/revisor-kotlin-swl.md +271 -0
- package/agentes/revisor-nextjs-swl.md +279 -0
- package/agentes/revisor-php-swl.md +269 -0
- package/agentes/revisor-react-swl.md +276 -0
- package/agentes/revisor-rust-swl.md +344 -0
- package/agentes/revisor-seguridad-swl.md +390 -0
- package/agentes/revisor-swift-swl.md +266 -0
- package/agentes/revisor-typescript-swl.md +344 -0
- package/agentes/sre-swl.md +265 -0
- package/agentes/tdd-qa-swl.md +354 -0
- package/agentes/ux-disenador-swl.md +501 -0
- package/bin/lib/bot-comandos.js +1030 -0
- package/bin/lib/bot-discovery.js +182 -0
- package/bin/lib/bot-git.js +142 -0
- package/bin/swl-ses.js +325 -0
- package/bin/swl-telegram-bot.js +442 -0
- package/bin/swl-telegram-bot.plist +21 -0
- package/bin/swl-telegram-bot.service +14 -0
- package/comandos/swl/.evolved.json +23 -0
- package/comandos/swl/actualizar.md +174 -0
- package/comandos/swl/adoptar-proyecto.md +207 -0
- package/comandos/swl/aprender.md +701 -0
- package/comandos/swl/auditar-deps.md +134 -0
- package/comandos/swl/autoresearch.md +170 -0
- package/comandos/swl/ayuda.md +224 -0
- package/comandos/swl/brainstorm.md +50 -0
- package/comandos/swl/checkpoint.md +330 -0
- package/comandos/swl/compactar.md +283 -0
- package/comandos/swl/configurar-ci.md +227 -0
- package/comandos/swl/contexto.md +112 -0
- package/comandos/swl/contribuir.md +233 -0
- package/comandos/swl/crear-skill.md +292 -0
- package/comandos/swl/cron.md +196 -0
- package/comandos/swl/dashboard.md +146 -0
- package/comandos/swl/discutir-fase.md +230 -0
- package/comandos/swl/ejecutar-fase.md +135 -0
- package/comandos/swl/evaluar-skill.md +487 -0
- package/comandos/swl/evolucion-estado.md +142 -0
- package/comandos/swl/evolucionar.md +259 -0
- package/comandos/swl/exportar-vault.md +189 -0
- package/comandos/swl/gateway.md +158 -0
- package/comandos/swl/inbox.md +116 -0
- package/comandos/swl/instalar.md +220 -0
- package/comandos/swl/instintos.md +86 -0
- package/comandos/swl/mapear-codebase.md +312 -0
- package/comandos/swl/mcp-status.md +175 -0
- package/comandos/swl/metricas.md +270 -0
- package/comandos/swl/modelo.md +102 -0
- package/comandos/swl/notificaciones.md +396 -0
- package/comandos/swl/nuevo-proyecto.md +154 -0
- package/comandos/swl/planear-fase.md +221 -0
- package/comandos/swl/plugins.md +256 -0
- package/comandos/swl/reflect-skills.md +125 -0
- package/comandos/swl/release.md +217 -0
- package/comandos/swl/revisar-impacto.md +206 -0
- package/comandos/swl/revisar.md +330 -0
- package/comandos/swl/salud.md +363 -0
- package/comandos/swl/sesiones.md +200 -0
- package/comandos/swl/skill-search.md +113 -0
- package/comandos/swl/verificar.md +585 -0
- package/comandos/swl/wiki.md +620 -0
- package/contextos/dev.md +32 -0
- package/contextos/research.md +30 -0
- package/contextos/review.md +31 -0
- package/habilidades/accesibilidad-a11y/SKILL.md +201 -0
- package/habilidades/accesibilidad-a11y/evals/evals.json +56 -0
- package/habilidades/accesibilidad-a11y/recursos/ejemplos-y-checklist-completo.md +441 -0
- package/habilidades/agent-browser/SKILL.md +218 -0
- package/habilidades/agentes-como-servicio/SKILL.md +218 -0
- package/habilidades/ai-runtime-security/SKILL.md +273 -0
- package/habilidades/angular-avanzado/SKILL.md +164 -0
- package/habilidades/angular-avanzado/recursos/ejemplos-avanzados.md +219 -0
- package/habilidades/angular-moderno/SKILL.md +186 -0
- package/habilidades/angular-moderno/evals/evals.json +45 -0
- package/habilidades/angular-moderno/recursos/ejemplos-avanzados.md +106 -0
- package/habilidades/api-rest-diseno/SKILL.md +191 -0
- package/habilidades/api-rest-diseno/recursos/openapi-template.yaml +506 -0
- package/habilidades/api-rest-diseno/recursos/referencia-api.md +140 -0
- package/habilidades/aprendizaje-continuo/SKILL.md +151 -0
- package/habilidades/aprendizaje-continuo/evals/evals.json +53 -0
- package/habilidades/aprendizaje-continuo/recursos/referencia-instintos.md +290 -0
- package/habilidades/async-python/SKILL.md +149 -0
- package/habilidades/async-python/evals/evals.json +47 -0
- package/habilidades/async-python/recursos/patrones-y-ejemplos-completos.md +292 -0
- package/habilidades/auth-patrones/.evolved.json +9 -0
- package/habilidades/auth-patrones/SKILL.md +413 -0
- package/habilidades/auth-patrones/recursos/implementaciones-completas.md +229 -0
- package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -0
- package/habilidades/auto-evolucion-protocolo/evals/evals.json +55 -0
- package/habilidades/auto-evolucion-protocolo/recursos/referencia-completa.md +145 -0
- package/habilidades/autoresearch/SKILL.md +268 -0
- package/habilidades/autoresearch/evals/evals.json +41 -0
- package/habilidades/autoresearch/recursos/checklist-template.md +191 -0
- package/habilidades/autoresearch/scripts/calcular-score.js +88 -0
- package/habilidades/azure-cloud/SKILL.md +308 -0
- package/habilidades/azure-cloud/recursos/aks.md +327 -0
- package/habilidades/backend-mcp-servidor/SKILL.md +270 -0
- package/habilidades/backend-production-resilience/SKILL.md +288 -0
- package/habilidades/brainstorming/SKILL.md +295 -0
- package/habilidades/brainstorming/recursos/componentes-html.md +247 -0
- package/habilidades/build-errors-cpp/SKILL.md +270 -0
- package/habilidades/build-errors-csharp/SKILL.md +265 -0
- package/habilidades/build-errors-go/SKILL.md +306 -0
- package/habilidades/build-errors-java/SKILL.md +278 -0
- package/habilidades/build-errors-kotlin/SKILL.md +303 -0
- package/habilidades/build-errors-nextjs/SKILL.md +312 -0
- package/habilidades/build-errors-php/SKILL.md +270 -0
- package/habilidades/build-errors-python/SKILL.md +292 -0
- package/habilidades/build-errors-rust/SKILL.md +284 -0
- package/habilidades/build-errors-swift/SKILL.md +272 -0
- package/habilidades/build-errors-typescript/SKILL.md +369 -0
- package/habilidades/checklist-calidad/SKILL.md +271 -0
- package/habilidades/checklist-calidad/recursos/quality-report-template.md +148 -0
- package/habilidades/checklist-seguridad/SKILL.md +285 -0
- package/habilidades/checkpoints-verificacion/SKILL.md +298 -0
- package/habilidades/checkpoints-verificacion/recursos/checkpoint-templates.md +360 -0
- package/habilidades/ci-cd-pipelines/SKILL.md +157 -0
- package/habilidades/ci-cd-pipelines/recursos/github-actions-template.yaml +403 -0
- package/habilidades/ci-cd-pipelines/recursos/pipelines-completos.md +487 -0
- package/habilidades/cloud-aws/SKILL.md +142 -0
- package/habilidades/cloud-aws/recursos/servicios-aws-referencia.md +321 -0
- package/habilidades/compactacion-contexto/SKILL.md +247 -0
- package/habilidades/contenedores-docker/SKILL.md +137 -0
- package/habilidades/contenedores-docker/recursos/dockerfile-template.dockerfile +160 -0
- package/habilidades/contenedores-docker/recursos/ejemplos-y-configuraciones.md +327 -0
- package/habilidades/context-builder/SKILL.md +170 -0
- package/habilidades/control-profundidad/SKILL.md +128 -0
- package/habilidades/csharp-experto/SKILL.md +322 -0
- package/habilidades/csharp-patrones/SKILL.md +316 -0
- package/habilidades/csharp-testing/SKILL.md +286 -0
- package/habilidades/css-moderno/SKILL.md +166 -0
- package/habilidades/css-moderno/evals/evals.json +43 -0
- package/habilidades/css-moderno/recursos/ejemplos-y-patrones-completos.md +337 -0
- package/habilidades/datos-etl/SKILL.md +129 -0
- package/habilidades/datos-etl/recursos/implementaciones-completas.md +322 -0
- package/habilidades/dbml-experto/SKILL.md +339 -0
- package/habilidades/dbml-experto/evals/evals.json +56 -0
- package/habilidades/dependencias-auditoria/SKILL.md +320 -0
- package/habilidades/deprecacion-migracion/SKILL.md +169 -0
- package/habilidades/deprecacion-migracion/recursos/implementaciones-completas.md +220 -0
- package/habilidades/design-tokens/SKILL.md +158 -0
- package/habilidades/design-tokens/recursos/tokens-y-configuracion.md +363 -0
- package/habilidades/devsecops-pipeline-security/SKILL.md +309 -0
- package/habilidades/diagrama-arquitectura/SKILL.md +165 -0
- package/habilidades/diagrama-arquitectura/assets/template.html +276 -0
- package/habilidades/discutir-fase/SKILL.md +188 -0
- package/habilidades/diseno-herramientas-agente/SKILL.md +199 -0
- package/habilidades/diseno-responsivo/SKILL.md +186 -0
- package/habilidades/diseno-responsivo/recursos/ejemplos-layouts.md +156 -0
- package/habilidades/django-experto/SKILL.md +205 -0
- package/habilidades/django-experto/recursos/async-django.md +390 -0
- package/habilidades/django-experto/recursos/drf-patrones.md +438 -0
- package/habilidades/django-experto/recursos/orm-avanzado.md +382 -0
- package/habilidades/django-experto/recursos/referencia-completa.md +188 -0
- package/habilidades/django-experto/recursos/testing-django.md +415 -0
- package/habilidades/doc-sync/SKILL.md +280 -0
- package/habilidades/drift-detection/SKILL.md +179 -0
- package/habilidades/ejecutar-fase/SKILL.md +468 -0
- package/habilidades/estilo-sin-ai-isms/SKILL.md +775 -0
- package/habilidades/estilo-sin-ai-isms/evals/evals.json +63 -0
- package/habilidades/estilo-sin-ai-isms/scripts/detectar_aiisms.py +500 -0
- package/habilidades/estructura-proyecto-claude/SKILL.md +215 -0
- package/habilidades/estructura-proyecto-claude/recursos/claude-md-template.md +261 -0
- package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +176 -0
- package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +289 -0
- package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +77 -0
- package/habilidades/estructura-proyecto-claude/recursos/variantes-por-stack.md +177 -0
- package/habilidades/evaluacion-agentes/SKILL.md +314 -0
- package/habilidades/event-driven/SKILL.md +153 -0
- package/habilidades/event-driven/recursos/implementaciones-completas.md +423 -0
- package/habilidades/extraccion-documentos/SKILL.md +221 -0
- package/habilidades/extractor-de-aprendizajes/.evolved.json +9 -0
- package/habilidades/extractor-de-aprendizajes/SKILL.md +311 -0
- package/habilidades/extractor-de-aprendizajes/evals/evals.json +55 -0
- package/habilidades/fastapi-experto/SKILL.md +221 -0
- package/habilidades/fastapi-experto/recursos/async-patterns.md +438 -0
- package/habilidades/fastapi-experto/recursos/dependency-injection.md +330 -0
- package/habilidades/fastapi-experto/recursos/referencia-completa.md +79 -0
- package/habilidades/fastapi-experto/recursos/testing-httpx.md +420 -0
- package/habilidades/filament-admin/SKILL.md +290 -0
- package/habilidades/frontend-avanzado/SKILL.md +257 -0
- package/habilidades/frontend-avanzado/recursos/apis-nativas-ejemplos.md +341 -0
- package/habilidades/gcp-cloud/SKILL.md +260 -0
- package/habilidades/gcp-cloud/recursos/gke.md +234 -0
- package/habilidades/gcp-cloud/recursos/terraform-gcp.md +307 -0
- package/habilidades/generacion-mermaid/SKILL.md +229 -0
- package/habilidades/git-worktrees-paralelo/SKILL.md +270 -0
- package/habilidades/go-experto/SKILL.md +305 -0
- package/habilidades/go-patrones/SKILL.md +299 -0
- package/habilidades/go-testing/SKILL.md +291 -0
- package/habilidades/graphql-experto/SKILL.md +323 -0
- package/habilidades/guardrail-semantico/SKILL.md +282 -0
- package/habilidades/harness-claude-code/SKILL.md +299 -0
- package/habilidades/iam-secretos/SKILL.md +265 -0
- package/habilidades/iam-secretos/recursos/implementaciones-completas.md +356 -0
- package/habilidades/infra-github-actions/SKILL.md +166 -0
- package/habilidades/instalar-sistema/.evolved.json +9 -0
- package/habilidades/instalar-sistema/SKILL.md +221 -0
- package/habilidades/java-experto/SKILL.md +290 -0
- package/habilidades/java-patrones/SKILL.md +275 -0
- package/habilidades/java-testing/SKILL.md +288 -0
- package/habilidades/kotlin-compose/SKILL.md +278 -0
- package/habilidades/kotlin-compose/recursos/animaciones-performance.md +93 -0
- package/habilidades/kotlin-experto/SKILL.md +318 -0
- package/habilidades/kotlin-testing/SKILL.md +267 -0
- package/habilidades/kotlin-testing/recursos/testing-avanzado.md +74 -0
- package/habilidades/kubernetes-orquestacion/SKILL.md +152 -0
- package/habilidades/kubernetes-orquestacion/recursos/manifiestos-completos.md +452 -0
- package/habilidades/langchain-langraph/SKILL.md +386 -0
- package/habilidades/langchain-langraph/recursos/evaluacion-rag.md +321 -0
- package/habilidades/langchain-langraph/recursos/rag-maturity-model.md +225 -0
- package/habilidades/langchain-langraph/recursos/vectorstores.md +306 -0
- package/habilidades/legacy-code-rescue/SKILL.md +267 -0
- package/habilidades/likec4-experto/SKILL.md +412 -0
- package/habilidades/likec4-experto/evals/evals.json +69 -0
- package/habilidades/manejo-errores/.evolved.json +9 -0
- package/habilidades/manejo-errores/SKILL.md +407 -0
- package/habilidades/manejo-errores/recursos/implementaciones-completas.md +248 -0
- package/habilidades/mapear-codebase/SKILL.md +275 -0
- package/habilidades/memoria-busqueda/SKILL.md +194 -0
- package/habilidades/memoria-busqueda/evals/evals.json +44 -0
- package/habilidades/meta-skills-estandar/SKILL.md +298 -0
- package/habilidades/meta-skills-estandar/recursos/anti-patrones-y-leyes.md +205 -0
- package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +107 -0
- package/habilidades/meta-skills-estandar/recursos/idiomas-framework.md +60 -0
- package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -0
- package/habilidades/microservicios/SKILL.md +155 -0
- package/habilidades/microservicios/recursos/patrones-y-ejemplos-completos.md +325 -0
- package/habilidades/mobile-flutter/SKILL.md +199 -0
- package/habilidades/mobile-flutter/recursos/ejemplos-completos.md +319 -0
- package/habilidades/mobile-react-native/SKILL.md +176 -0
- package/habilidades/mobile-react-native/recursos/ejemplos-completos.md +216 -0
- package/habilidades/mongodb-experto/SKILL.md +302 -0
- package/habilidades/monitoring-alertas/SKILL.md +201 -0
- package/habilidades/monitoring-alertas/recursos/instrumentacion-y-alertas.md +301 -0
- package/habilidades/nestjs-experto/SKILL.md +307 -0
- package/habilidades/nestjs-experto/recursos/guards-interceptors.md +339 -0
- package/habilidades/nestjs-experto/recursos/modulos-di.md +287 -0
- package/habilidades/nestjs-experto/recursos/testing-nestjs.md +354 -0
- package/habilidades/nextjs-experto/SKILL.md +335 -0
- package/habilidades/nextjs-patrones/SKILL.md +303 -0
- package/habilidades/nextjs-testing/SKILL.md +331 -0
- package/habilidades/node-experto/.evolved.json +9 -0
- package/habilidades/node-experto/SKILL.md +266 -0
- package/habilidades/node-experto/recursos/patrones-completos.md +283 -0
- package/habilidades/notificaciones-multicanal/SKILL.md +159 -0
- package/habilidades/notificaciones-multicanal/recursos/config-template.json +115 -0
- package/habilidades/notificaciones-multicanal/recursos/configuracion-y-templates.md +303 -0
- package/habilidades/nuevo-proyecto/SKILL.md +204 -0
- package/habilidades/orquestacion-async/SKILL.md +303 -0
- package/habilidades/paid-media-tracking/SKILL.md +269 -0
- package/habilidades/paid-media-tracking/recursos/auditoria-tracking.md +220 -0
- package/habilidades/paid-media-tracking/recursos/google-ads-api.md +215 -0
- package/habilidades/patrones-python/SKILL.md +228 -0
- package/habilidades/patrones-python/evals/evals.json +56 -0
- package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -0
- package/habilidades/patrones-python/recursos/referencia-completa.md +202 -0
- package/habilidades/perfil-usuario/SKILL.md +200 -0
- package/habilidades/perfil-usuario/evals/evals.json +55 -0
- package/habilidades/performance-baseline/SKILL.md +297 -0
- package/habilidades/php-experto/SKILL.md +291 -0
- package/habilidades/php-patrones/SKILL.md +306 -0
- package/habilidades/php-testing/SKILL.md +280 -0
- package/habilidades/planear-fase/SKILL.md +269 -0
- package/habilidades/postgresql-experto/SKILL.md +151 -0
- package/habilidades/postgresql-experto/evals/evals.json +53 -0
- package/habilidades/postgresql-experto/recursos/referencia-completa.md +215 -0
- package/habilidades/prevencion-racionalizacion/SKILL.md +175 -0
- package/habilidades/prevencion-sobreingenieria/SKILL.md +323 -0
- package/habilidades/privacy-memoria/SKILL.md +141 -0
- package/habilidades/privacy-memoria/evals/evals.json +43 -0
- package/habilidades/prompt-engineering/SKILL.md +518 -0
- package/habilidades/prompt-engineering/recursos/patrones-avanzados.md +467 -0
- package/habilidades/rag-arquitectura/SKILL.md +338 -0
- package/habilidades/rails-experto/SKILL.md +237 -0
- package/habilidades/rails-experto/recursos/active-record.md +260 -0
- package/habilidades/rails-experto/recursos/hotwire-turbo.md +293 -0
- package/habilidades/rails-experto/recursos/testing-rspec.md +362 -0
- package/habilidades/react-experto/SKILL.md +209 -0
- package/habilidades/react-experto/evals/evals.json +55 -0
- package/habilidades/react-experto/recursos/patrones-y-ejemplos-completos.md +240 -0
- package/habilidades/react-optimizacion/SKILL.md +174 -0
- package/habilidades/react-optimizacion/recursos/patrones-avanzados.md +138 -0
- package/habilidades/redis-experto/SKILL.md +305 -0
- package/habilidades/release-semver/.evolved.json +9 -0
- package/habilidades/release-semver/SKILL.md +248 -0
- package/habilidades/release-semver/scripts/generar-changelog.sh +238 -0
- package/habilidades/rust-experto/SKILL.md +400 -0
- package/habilidades/rust-patrones/SKILL.md +296 -0
- package/habilidades/rust-testing/SKILL.md +311 -0
- package/habilidades/seguridad-skills-ia/SKILL.md +262 -0
- package/habilidades/sql-optimizacion/SKILL.md +200 -0
- package/habilidades/sql-optimizacion/evals/evals.json +54 -0
- package/habilidades/sql-optimizacion/recursos/patrones-sql-avanzados.md +131 -0
- package/habilidades/sre-patrones/SKILL.md +333 -0
- package/habilidades/sre-patrones/recursos/chaos-engineering.md +241 -0
- package/habilidades/sre-patrones/recursos/oncall-design.md +236 -0
- package/habilidades/stripe-pagos/SKILL.md +550 -0
- package/habilidades/stripe-pagos/recursos/errores-reintentos.md +390 -0
- package/habilidades/stripe-pagos/recursos/stripe-connect.md +290 -0
- package/habilidades/structured-outputs/SKILL.md +343 -0
- package/habilidades/swift-experto/SKILL.md +320 -0
- package/habilidades/swift-experto/recursos/keychain-y-wrappers.md +110 -0
- package/habilidades/swift-patrones/SKILL.md +313 -0
- package/habilidades/swift-patrones/recursos/tca-ejemplo-completo.md +113 -0
- package/habilidades/swift-testing/SKILL.md +254 -0
- package/habilidades/swift-testing/recursos/xcuitest-planes.md +143 -0
- package/habilidades/swl-dashboard/SKILL.md +370 -0
- package/habilidades/swl-markitdown/SKILL.md +285 -0
- package/habilidades/swl-markitdown/evals/evals.json +52 -0
- package/habilidades/swl-revisar-impacto/SKILL.md +233 -0
- package/habilidades/tailwind-experto/SKILL.md +240 -0
- package/habilidades/tailwind-experto/recursos/referencia-completa.md +184 -0
- package/habilidades/tdd-workflow/SKILL.md +293 -0
- package/habilidades/terraform-experto/SKILL.md +321 -0
- package/habilidades/testing-python/SKILL.md +340 -0
- package/habilidades/testing-python/recursos/ejemplos-completos.md +167 -0
- package/habilidades/threat-model-lite/SKILL.md +246 -0
- package/habilidades/tracing-processor/SKILL.md +212 -0
- package/habilidades/tracking-measurement/SKILL.md +239 -0
- package/habilidades/tracking-measurement/recursos/consent-mode.md +231 -0
- package/habilidades/tracking-measurement/recursos/gtm-datalayer.md +216 -0
- package/habilidades/tracking-measurement/recursos/meta-capi.md +262 -0
- package/habilidades/typescript-avanzado/SKILL.md +144 -0
- package/habilidades/typescript-avanzado/evals/evals.json +55 -0
- package/habilidades/typescript-avanzado/recursos/patrones-y-ejemplos-completos.md +298 -0
- package/habilidades/typescript-diagnosticos/SKILL.md +513 -0
- package/habilidades/ux-diseno/SKILL.md +116 -0
- package/habilidades/ux-diseno/evals/evals.json +43 -0
- package/habilidades/ux-diseno/recursos/patrones-ux-referencia.md +214 -0
- package/habilidades/validacion-ci-sistema/SKILL.md +136 -0
- package/habilidades/validacion-ci-sistema/recursos/validadores-completos.md +369 -0
- package/habilidades/validacion-ci-sistema/scripts/validar-sistema.sh +286 -0
- package/habilidades/verificacion-evidencia/SKILL.md +160 -0
- package/habilidades/verificar-trabajo/SKILL.md +303 -0
- package/habilidades/verificar-trabajo/recursos/plantilla-verificacion.md +60 -0
- package/habilidades/wiki-conocimiento/SKILL.md +276 -0
- package/habilidades/wireframes-flujos/SKILL.md +212 -0
- package/habilidades/wireframes-flujos/recursos/referencia-completa.md +192 -0
- package/habilidades/workflow-claude-code/SKILL.md +260 -0
- package/habilidades/workflow-claude-code/recursos/referencia-completa.md +109 -0
- package/hooks/_run-hook.sh +57 -0
- package/hooks/actualizar-perfil-usuario.js +364 -0
- package/hooks/agente-lifecycle.js +71 -0
- package/hooks/aiisms-detector.js +173 -0
- package/hooks/audit-trail.js +204 -0
- package/hooks/auto-background.js +97 -0
- package/hooks/auto-consolidacion.js +178 -0
- package/hooks/auto-evolucion.js +666 -0
- package/hooks/auto-restaurar-settings.js +360 -0
- package/hooks/calidad-pre-commit.js +929 -0
- package/hooks/calidad-typescript.js +511 -0
- package/hooks/captura-feedback-usuario.js +148 -0
- package/hooks/check-update.js +211 -0
- package/hooks/clasificador-mensajes.js +271 -0
- package/hooks/degradacion-instintos.js +272 -0
- package/hooks/escaneo-secretos.js +389 -0
- package/hooks/extraccion-aprendizajes.js +763 -0
- package/hooks/grafo-contexto.js +129 -0
- package/hooks/graph-update.js +67 -0
- package/hooks/guardrail-modelo.js +247 -0
- package/hooks/inbox-aviso.js +75 -0
- package/hooks/inyeccion-contexto.js +246 -0
- package/hooks/lib/abort-registry.js +214 -0
- package/hooks/lib/agent-backend.js +210 -0
- package/hooks/lib/agent-comms.js +263 -0
- package/hooks/lib/agent-issue-codes.js +284 -0
- package/hooks/lib/agent-matcher.js +189 -0
- package/hooks/lib/async-hook-registry.js +252 -0
- package/hooks/lib/atomic-write.js +130 -0
- package/hooks/lib/auto-consolidator.js +335 -0
- package/hooks/lib/canary-skills.js +187 -0
- package/hooks/lib/consolidation-lock.js +291 -0
- package/hooks/lib/context-builder.js +430 -0
- package/hooks/lib/context-compressor.js +657 -0
- package/hooks/lib/convergence-detector.js +105 -0
- package/hooks/lib/delegation-tracker.js +198 -0
- package/hooks/lib/detectar-package-manager.js +423 -0
- package/hooks/lib/edit-accumulator.js +171 -0
- package/hooks/lib/error-classifier.js +308 -0
- package/hooks/lib/event-bus.js +112 -0
- package/hooks/lib/evolution-tracker.js +442 -0
- package/hooks/lib/execution-state.js +316 -0
- package/hooks/lib/fingerprint-id.js +135 -0
- package/hooks/lib/gateway-notify.js +116 -0
- package/hooks/lib/graph-security.js +75 -0
- package/hooks/lib/guardrail-metrics.js +202 -0
- package/hooks/lib/hook-circuit-breaker.js +206 -0
- package/hooks/lib/loop-detector.js +267 -0
- package/hooks/lib/mcp-health.js +184 -0
- package/hooks/lib/mcp-pool.js +436 -0
- package/hooks/lib/memory-search.js +506 -0
- package/hooks/lib/merkle-audit.js +96 -0
- package/hooks/lib/model-router.js +222 -0
- package/hooks/lib/normalize-error.js +324 -0
- package/hooks/lib/normalize-input.js +65 -0
- package/hooks/lib/nudge-tracker.js +306 -0
- package/hooks/lib/otlp-exporter.js +365 -0
- package/hooks/lib/performance-marks.js +239 -0
- package/hooks/lib/privacy-filter.js +128 -0
- package/hooks/lib/prompt-injection-scanner.js +209 -0
- package/hooks/lib/provenance-tracker.js +183 -0
- package/hooks/lib/rate-limit-tracker.js +253 -0
- package/hooks/lib/reflect-classifier.js +164 -0
- package/hooks/lib/resource-quota.js +122 -0
- package/hooks/lib/retry-jitter.js +165 -0
- package/hooks/lib/risk-engine.js +368 -0
- package/hooks/lib/run-log.js +408 -0
- package/hooks/lib/session-fts.js +379 -0
- package/hooks/lib/session-store.js +293 -0
- package/hooks/lib/singleton-guard.js +159 -0
- package/hooks/lib/skill-auditor.js +588 -0
- package/hooks/lib/sync-status.js +228 -0
- package/hooks/lib/taint-tracker.js +107 -0
- package/hooks/lib/task-service.js +295 -0
- package/hooks/lib/tech-skills-map.js +146 -0
- package/hooks/lib/telegram-cliente.js +159 -0
- package/hooks/lib/telegram-config.js +170 -0
- package/hooks/lib/token-budget.js +156 -0
- package/hooks/lib/token-estimator.js +420 -0
- package/hooks/lib/toon-compressor.js +245 -0
- package/hooks/lib/usage-model.js +183 -0
- package/hooks/lib/variable-resolver.js +230 -0
- package/hooks/linea-estado.js +324 -0
- package/hooks/metricas-evolucion.js +209 -0
- package/hooks/monitor-contexto.js +325 -0
- package/hooks/notificacion-sesion-stop.js +198 -0
- package/hooks/notificacion-telegram-notification.js +4 -0
- package/hooks/notificacion-telegram-subagent.js +4 -0
- package/hooks/notificacion-telegram.js +267 -0
- package/hooks/preservar-estado-pre-compact.js +150 -0
- package/hooks/proteccion-rutas.js +366 -0
- package/hooks/registro-turnos.js +209 -0
- package/hooks/resumen-sesion.js +249 -0
- package/hooks/risk-scoring.js +323 -0
- package/hooks/rotar-audit-auto.js +122 -0
- package/hooks/sugerir-regenerar-inventario.js +170 -0
- package/hooks/telemetria-agentes.js +167 -0
- package/hooks/tracking-costos.js +688 -0
- package/instintos/global.yaml +8 -0
- package/instintos/perfil-usuario.yaml +53 -0
- package/instintos/prompt-appendices.yaml +57 -0
- package/instintos/proyecto.yaml +372 -0
- package/manifiestos/gateway-config.json +77 -0
- package/manifiestos/handoff-context.json +223 -0
- package/manifiestos/hook-profiles.json +44 -0
- package/manifiestos/hooks-config.json +360 -0
- package/manifiestos/modulos.json +1173 -0
- package/manifiestos/perfiles.json +404 -0
- package/package.json +86 -0
- package/plantillas/ESTADO.md +109 -0
- package/plantillas/HOJA-RUTA.md +143 -0
- package/plantillas/PROYECTO.md +122 -0
- package/plantillas/REQUISITOS.md +132 -0
- package/plantillas/auditor-veto-template.md +105 -0
- package/plantillas/github-workflows/README.md +47 -0
- package/plantillas/github-workflows/release-please.yml +44 -0
- package/plantillas/github-workflows/swl-ci.yml +107 -0
- package/plantillas/github-workflows/swl-security.yml +51 -0
- package/plantillas/mcp-mineru.json +13 -0
- package/plantillas/research/ARQUITECTURA.md +220 -0
- package/plantillas/research/FUNCIONALIDADES.md +175 -0
- package/plantillas/research/RESUMEN.md +165 -0
- package/plantillas/research/STACK.md +233 -0
- package/plantillas/research/TRAMPAS.md +299 -0
- package/plantillas/skill-evals-template.json +44 -0
- package/plugin.json +343 -0
- package/reglas/accesibilidad.md +269 -0
- package/reglas/api-diseno.md +400 -0
- package/reglas/arquitectura.md +352 -0
- package/reglas/brevedad-output.md +124 -0
- package/reglas/cloud-infra.md +247 -0
- package/reglas/docs.md +245 -0
- package/reglas/estilo-codigo.md +201 -0
- package/reglas/git-workflow.md +245 -0
- package/reglas/gobernanza.md +271 -0
- package/reglas/harness-claude-code.md +213 -0
- package/reglas/hooks.md +186 -0
- package/reglas/lenguajes/csharp/estilo-codigo.md +231 -0
- package/reglas/lenguajes/csharp/hooks.md +281 -0
- package/reglas/lenguajes/csharp/patrones.md +226 -0
- package/reglas/lenguajes/csharp/seguridad.md +258 -0
- package/reglas/lenguajes/csharp/testing.md +176 -0
- package/reglas/lenguajes/go/estilo-codigo.md +195 -0
- package/reglas/lenguajes/go/hooks.md +249 -0
- package/reglas/lenguajes/go/patrones.md +249 -0
- package/reglas/lenguajes/go/seguridad.md +225 -0
- package/reglas/lenguajes/go/testing.md +272 -0
- package/reglas/lenguajes/java/estilo-codigo.md +217 -0
- package/reglas/lenguajes/java/hooks.md +251 -0
- package/reglas/lenguajes/java/patrones.md +226 -0
- package/reglas/lenguajes/java/seguridad.md +233 -0
- package/reglas/lenguajes/java/testing.md +238 -0
- package/reglas/lenguajes/kotlin/estilo-codigo.md +208 -0
- package/reglas/lenguajes/kotlin/hooks.md +245 -0
- package/reglas/lenguajes/kotlin/patrones.md +201 -0
- package/reglas/lenguajes/kotlin/seguridad.md +202 -0
- package/reglas/lenguajes/kotlin/testing.md +236 -0
- package/reglas/lenguajes/nextjs/estilo-codigo.md +175 -0
- package/reglas/lenguajes/nextjs/hooks.md +186 -0
- package/reglas/lenguajes/nextjs/patrones.md +225 -0
- package/reglas/lenguajes/nextjs/seguridad.md +216 -0
- package/reglas/lenguajes/nextjs/testing.md +193 -0
- package/reglas/lenguajes/php/estilo-codigo.md +228 -0
- package/reglas/lenguajes/php/hooks.md +165 -0
- package/reglas/lenguajes/php/patrones.md +233 -0
- package/reglas/lenguajes/php/seguridad.md +186 -0
- package/reglas/lenguajes/php/testing.md +205 -0
- package/reglas/lenguajes/rust/estilo-codigo.md +207 -0
- package/reglas/lenguajes/rust/hooks.md +240 -0
- package/reglas/lenguajes/rust/patrones.md +250 -0
- package/reglas/lenguajes/rust/seguridad.md +221 -0
- package/reglas/lenguajes/rust/testing.md +194 -0
- package/reglas/lenguajes/swift/estilo-codigo.md +238 -0
- package/reglas/lenguajes/swift/hooks.md +257 -0
- package/reglas/lenguajes/swift/patrones.md +235 -0
- package/reglas/lenguajes/swift/seguridad.md +248 -0
- package/reglas/lenguajes/swift/testing.md +242 -0
- package/reglas/markitdown.md +60 -0
- package/reglas/memoria-consolidada.md +209 -0
- package/reglas/patrones.md +225 -0
- package/reglas/performance.md +195 -0
- package/reglas/pruebas.md +159 -0
- package/reglas/seguridad-agentes.md +351 -0
- package/reglas/seguridad.md +151 -0
- package/reglas/skills-estandar.md +373 -0
- package/reglas/testing.md +193 -0
- package/schemas/agent-contract.json +176 -0
- package/schemas/agent-frontmatter.schema.json +149 -0
- package/schemas/agent-message.schema.json +53 -0
- package/schemas/agent-output-implementacion.schema.json +85 -0
- package/schemas/agent-output-planificacion.schema.json +113 -0
- package/schemas/agent-output-review.schema.json +78 -0
- package/schemas/diary-entry.schema.json +80 -0
- package/schemas/hook-profiles.schema.json +39 -0
- package/schemas/hooks-config.schema.json +74 -0
- package/schemas/instinct.schema.json +115 -0
- package/schemas/modulos.schema.json +29 -0
- package/schemas/perfiles.schema.json +28 -0
- package/schemas/plugin.schema.json +64 -0
- package/schemas/skill-evals.schema.json +95 -0
- package/schemas/skill-frontmatter.schema.json +170 -0
- package/scripts/actualizar.js +145 -0
- package/scripts/audit-skills.sh +78 -0
- package/scripts/auditar-agentes-gaps.js +149 -0
- package/scripts/auditar-cobertura-frameworks.js +241 -0
- package/scripts/auditar-skills-gaps.js +206 -0
- package/scripts/bootstrap-instintos.js +259 -0
- package/scripts/check-update.js +109 -0
- package/scripts/comandos/agents.js +105 -0
- package/scripts/comandos/info.js +108 -0
- package/scripts/comandos/install-asistido.js +186 -0
- package/scripts/comandos/skills.js +211 -0
- package/scripts/configurar-branch-protection.js +418 -0
- package/scripts/daemon-swl.py +388 -0
- package/scripts/desinstalar.js +130 -0
- package/scripts/doctor.js +559 -0
- package/scripts/field-report.js +199 -0
- package/scripts/generar-inventario.js +317 -0
- package/scripts/inbox-tmux-inject.js +161 -0
- package/scripts/inferir-herramientas-permitidas.js +586 -0
- package/scripts/inicializar.js +133 -0
- package/scripts/instalador.js +1031 -0
- package/scripts/instalar-git-hook.js +122 -0
- package/scripts/lib/agp-frontmatter.js +222 -0
- package/scripts/lib/append-con-marcadores.js +199 -0
- package/scripts/lib/artefactos-python.js +43 -0
- package/scripts/lib/audit-query.js +221 -0
- package/scripts/lib/autostart-linux.js +347 -0
- package/scripts/lib/autostart-macos.js +360 -0
- package/scripts/lib/autostart-windows.js +307 -0
- package/scripts/lib/budget-enforcer.js +252 -0
- package/scripts/lib/claude-sessions.js +285 -0
- package/scripts/lib/configurar-ci.js +380 -0
- package/scripts/lib/console-span-exporter.js +92 -0
- package/scripts/lib/contadores-inventario.js +217 -0
- package/scripts/lib/dashboard-widgets.js +290 -0
- package/scripts/lib/detectar-runtime.js +279 -0
- package/scripts/lib/detectar-stack.js +187 -0
- package/scripts/lib/diary-entry.js +234 -0
- package/scripts/lib/drift-detector.js +545 -0
- package/scripts/lib/estado.js +124 -0
- package/scripts/lib/gestor-componentes.js +243 -0
- package/scripts/lib/gitignore-manifest.js +305 -0
- package/scripts/lib/graph-analyze.py +556 -0
- package/scripts/lib/graph-builder.py +485 -0
- package/scripts/lib/graph-cluster.py +259 -0
- package/scripts/lib/health-row.js +168 -0
- package/scripts/lib/hooks-settings.js +789 -0
- package/scripts/lib/manifiestos.js +138 -0
- package/scripts/lib/mc-client.js +137 -0
- package/scripts/lib/notificaciones-telegram.js +1107 -0
- package/scripts/lib/npm-version.js +261 -0
- package/scripts/lib/paquetes-conocidos.js +50 -0
- package/scripts/lib/preservar-usuario.js +586 -0
- package/scripts/lib/prompt-builder.js +264 -0
- package/scripts/lib/resolver-externo.js +332 -0
- package/scripts/lib/schedule-parser.js +305 -0
- package/scripts/lib/scoring-instintos.js +240 -0
- package/scripts/lib/seguridad.js +160 -0
- package/scripts/lib/selector-interactivo.js +152 -0
- package/scripts/lib/semantic-search.js +242 -0
- package/scripts/lib/skill-discovery.js +234 -0
- package/scripts/lib/skill-metrics.js +246 -0
- package/scripts/lib/skill-normalizer.js +112 -0
- package/scripts/lib/skills-hub.js +340 -0
- package/scripts/lib/span-schema.js +134 -0
- package/scripts/lib/tool-cost-analyzer.js +255 -0
- package/scripts/lib/tracing-processor-interface.js +286 -0
- package/scripts/lib/transformadores/base.js +80 -0
- package/scripts/lib/transformadores/claude.js +124 -0
- package/scripts/lib/transformadores/codex.js +115 -0
- package/scripts/lib/transformadores/copilot.js +106 -0
- package/scripts/lib/transformadores/gemini.js +74 -0
- package/scripts/lib/transformadores/index.js +35 -0
- package/scripts/lib/transformadores/opencode.js +75 -0
- package/scripts/lib/ui.js +259 -0
- package/scripts/limpiar-artefactos-python.js +131 -0
- package/scripts/mcp-orchestrator.py +386 -0
- package/scripts/mcp-pool-manager.py +352 -0
- package/scripts/mcp-telemetry.py +378 -0
- package/scripts/poblar-evolvable.js +226 -0
- package/scripts/publicar.js +287 -0
- package/scripts/reflect-skills.js +403 -0
- package/scripts/rotar-audit-logs.js +185 -0
- package/scripts/run-skill-evals.js +242 -0
- package/scripts/smoke-test.js +374 -0
- package/scripts/token-analysis.py +471 -0
- package/scripts/validar-manifest.js +195 -0
- package/scripts/validar-memoria.js +321 -0
- package/scripts/validar-tests-aislamiento.js +184 -0
- package/scripts/validar-tokens-test.js +208 -0
- package/scripts/validar.js +147 -0
- package/scripts/validate-markdown.py +339 -0
- package/scripts/validate-skills.py +385 -0
- package/scripts/vendor/claude-usage/README.md +116 -0
- package/scripts/vendor/claude-usage/cli.py +334 -0
- package/scripts/vendor/claude-usage/dashboard.py +795 -0
- package/scripts/vendor/claude-usage/scanner.py +467 -0
- package/scripts/vendor/markitdown/cli.py +194 -0
- package/scripts/verificar-evolucion.js +289 -0
- package/scripts/verificar-release.js +494 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: evaluacion-agentes
|
|
3
|
+
description: >
|
|
4
|
+
Framework de evaluación de agentes SWL con métricas pass@k y tracking de fiabilidad.
|
|
5
|
+
Cargar cuando se necesite evaluar la efectividad de un agente, auditar su rendimiento
|
|
6
|
+
histórico, diagnosticar agentes con baja fiabilidad o integrar métricas en swl:salud.
|
|
7
|
+
version: "1.0.0"
|
|
8
|
+
herramientasPermitidas: [Read, Grep]
|
|
9
|
+
exclusiones:
|
|
10
|
+
- "No cargar para evaluar la calidad de un skill (SKILL.md) — ese es el trabajo de `autoresearch`; este skill mide agentes (frontmatter + instrucciones + historial de ejecución), no skills aislados."
|
|
11
|
+
- "No cargar para evaluar si un artefacto del plan cumple criterios de aceptación — eso es `verificar-trabajo`; este skill genera métricas pass@k, no verifica slices."
|
|
12
|
+
- "No cargar cuando se quiera hacer una revisión puntual de código producido por un agente — usar `revisor-codigo-swl` o `checklist-calidad`; este skill requiere historial de múltiples ejecuciones para ser significativo."
|
|
13
|
+
- "No cargar si el agente tiene menos de 5 ejecuciones registradas — el cálculo de pass@k con n < 5 no es estadísticamente válido y llevaría a acciones incorrectas."
|
|
14
|
+
evolvable: true # default para skill estandar
|
|
15
|
+
---
|
|
16
|
+
# Evaluación de Agentes SWL
|
|
17
|
+
|
|
18
|
+
Framework para medir, registrar y mejorar la fiabilidad de los agentes del sistema SWL
|
|
19
|
+
usando la métrica pass@k, estándar en benchmarks de modelos de lenguaje.
|
|
20
|
+
|
|
21
|
+
## Cuándo cargar
|
|
22
|
+
|
|
23
|
+
- Se evalúa la efectividad de un agente tras una sesión de trabajo
|
|
24
|
+
- Se audita el rendimiento histórico de agentes en `.planning/EVALUACION.md`
|
|
25
|
+
- Un agente produce resultados inesperados con frecuencia y se necesitan datos
|
|
26
|
+
- Se ejecuta `swl:salud` con la opción de incluir métricas de agentes
|
|
27
|
+
- Se decide si un agente necesita evolución mediante `swl:evolucionar`
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Métrica pass@k — Concepto
|
|
32
|
+
|
|
33
|
+
**pass@k** mide la probabilidad de que un agente produzca al menos una solución
|
|
34
|
+
correcta en k intentos sobre el mismo problema.
|
|
35
|
+
|
|
36
|
+
| Variante | Significado |
|
|
37
|
+
|----------|-------------|
|
|
38
|
+
| pass@1 | Éxito en el primer intento sin reintento |
|
|
39
|
+
| pass@3 | Éxito si se dan hasta 3 oportunidades |
|
|
40
|
+
| pass@5 | Éxito si se dan hasta 5 oportunidades |
|
|
41
|
+
|
|
42
|
+
**Interpretación práctica para SWL**:
|
|
43
|
+
- **pass@1 alto** → el agente produce output correcto en la primera ejecución.
|
|
44
|
+
Indica instrucciones claras y bien calibradas.
|
|
45
|
+
- **pass@1 bajo pero pass@3 alto** → el agente necesita guidance pero puede
|
|
46
|
+
autocorregirse. Candidato a mejora de instrucciones en su SKILL.md.
|
|
47
|
+
- **pass@3 bajo** → el agente falla sistemáticamente. Requiere evolución urgente.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Fórmula de cálculo
|
|
52
|
+
|
|
53
|
+
La fórmula estadística exacta para estimar pass@k a partir de n ejecuciones con c correctas:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
pass@k = 1 - ( C(n-c, k) / C(n, k) )
|
|
57
|
+
|
|
58
|
+
donde:
|
|
59
|
+
n = número total de ejecuciones registradas
|
|
60
|
+
c = número de ejecuciones con resultado correcto
|
|
61
|
+
k = número de intentos evaluados (1, 3 o 5)
|
|
62
|
+
C(a, b) = combinatorio "a sobre b" = a! / (b! * (a-b)!)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Ejemplo concreto** — agente con 10 ejecuciones, 7 correctas, evaluando pass@1:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
pass@1 = 1 - C(10-7, 1) / C(10, 1)
|
|
69
|
+
= 1 - C(3, 1) / C(10, 1)
|
|
70
|
+
= 1 - 3/10
|
|
71
|
+
= 0.70 → 70%
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Cuando n < 5**: no calcular pass@k — la muestra es insuficiente para ser
|
|
75
|
+
representativa. Registrar como "datos insuficientes (n=N)".
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Criterios de éxito por ejecución
|
|
80
|
+
|
|
81
|
+
Una ejecución se registra como **correcta** si cumple TODOS los criterios aplicables:
|
|
82
|
+
|
|
83
|
+
| Criterio | Aplica a | Cómo verificar |
|
|
84
|
+
|----------|----------|----------------|
|
|
85
|
+
| Build pasa sin errores | Agentes implementadores | `npm run build` / `pytest` sin errores |
|
|
86
|
+
| Tests pasan | Agentes implementadores y QA | suite de tests verde |
|
|
87
|
+
| Review aprueba | Agentes revisores | revisor-codigo-swl da score >= 9.0 |
|
|
88
|
+
| Output tiene estructura esperada | Todos los agentes | frontmatter completo, secciones requeridas |
|
|
89
|
+
| Sin placeholders pendientes | Todos los agentes | grep -cE '\[(PENDIENTE|TBD)\]' output == 0 |
|
|
90
|
+
| Entregable referenciado en ESTADO.md | Agentes de documentación | ESTADO.md actualizado |
|
|
91
|
+
|
|
92
|
+
Si un criterio no aplica al tipo de agente, se omite de la evaluación.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Objetivos por tipo de agente
|
|
97
|
+
|
|
98
|
+
| Tipo de agente | pass@1 objetivo | pass@3 objetivo | Acción si no se cumple |
|
|
99
|
+
|----------------|-----------------|-----------------|----------------------|
|
|
100
|
+
| Implementadores (backend, frontend) | >= 70% | >= 90% | Revisar instrucciones de implementación |
|
|
101
|
+
| Revisores (código, seguridad) | >= 85% | >= 95% | Revisar criterios de evaluación del agente |
|
|
102
|
+
| Build resolvers | >= 80% | >= 95% | Agregar ejemplos de errores frecuentes |
|
|
103
|
+
| Planificadores (planificador-swl) | >= 75% | >= 92% | Revisar formato de PLAN.md |
|
|
104
|
+
| Documentadores | >= 80% | >= 95% | Revisar templates en recursos/ |
|
|
105
|
+
| Orquestadores | >= 65% | >= 85% | Revisar lógica de delegación |
|
|
106
|
+
|
|
107
|
+
**Umbral de alerta**: pass@1 < 60% en cualquier tipo → el agente necesita mejora
|
|
108
|
+
urgente antes de la próxima sesión de producción.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Formato de registro en EVALUACION.md
|
|
113
|
+
|
|
114
|
+
Cada evaluación se registra en `.planning/EVALUACION.md`. Si el archivo no existe,
|
|
115
|
+
crearlo al registrar la primera evaluación.
|
|
116
|
+
|
|
117
|
+
### Estructura del archivo
|
|
118
|
+
|
|
119
|
+
```markdown
|
|
120
|
+
# EVALUACION.md — Métricas de agentes SWL
|
|
121
|
+
|
|
122
|
+
Última actualización: YYYY-MM-DD
|
|
123
|
+
|
|
124
|
+
## Resumen ejecutivo
|
|
125
|
+
|
|
126
|
+
| Agente | Ejecuciones (n) | Correctas (c) | pass@1 | pass@3 | Estado |
|
|
127
|
+
|--------|-----------------|---------------|--------|--------|--------|
|
|
128
|
+
| planificador-swl | 12 | 9 | 75% | 92% | OK |
|
|
129
|
+
| backend-python-swl | 8 | 5 | 63% | 88% | REVISAR |
|
|
130
|
+
| revisor-codigo-swl | 15 | 13 | 87% | 100% | OK |
|
|
131
|
+
|
|
132
|
+
## Detalle por agente
|
|
133
|
+
|
|
134
|
+
### planificador-swl
|
|
135
|
+
|
|
136
|
+
- **n total**: 12 ejecuciones
|
|
137
|
+
- **c correctas**: 9
|
|
138
|
+
- **pass@1**: 75% (objetivo: >= 75%) — CUMPLE
|
|
139
|
+
- **pass@3**: 92% (objetivo: >= 92%) — CUMPLE
|
|
140
|
+
- **Errores frecuentes**: slices sin criterio de éxito definido (2 casos)
|
|
141
|
+
- **Última evaluación**: 2026-03-25
|
|
142
|
+
|
|
143
|
+
#### Historial reciente (últimas 5)
|
|
144
|
+
|
|
145
|
+
| Fecha | Resultado | Notas |
|
|
146
|
+
|-------|-----------|-------|
|
|
147
|
+
| 2026-03-25 | correcto | — |
|
|
148
|
+
| 2026-03-20 | incorrecto | faltó slice de migración |
|
|
149
|
+
| 2026-03-15 | correcto | — |
|
|
150
|
+
| 2026-03-10 | correcto | — |
|
|
151
|
+
| 2026-03-05 | correcto | — |
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Reglas de registro
|
|
155
|
+
|
|
156
|
+
- Registrar cada ejecución al finalizar la sesión, no acumular varias sin registrar.
|
|
157
|
+
- El campo "Notas" debe explicar el motivo del fallo si el resultado fue incorrecto.
|
|
158
|
+
Un registro sin notas en fallo es inútil para mejorar el agente.
|
|
159
|
+
- Recalcular pass@1 y pass@3 cada vez que se agrega un registro nuevo.
|
|
160
|
+
- Si n aumenta pero c no (fallo), actualizar los porcentajes.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Proceso de evaluación — paso a paso
|
|
165
|
+
|
|
166
|
+
1. **Identificar el agente evaluado** y localizar su entrada en EVALUACION.md.
|
|
167
|
+
Si no existe, crear la sección con n=0, c=0.
|
|
168
|
+
|
|
169
|
+
2. **Determinar si la ejecución fue correcta** aplicando los criterios de la tabla
|
|
170
|
+
de criterios de éxito. Documentar cuáles criterios se verificaron.
|
|
171
|
+
|
|
172
|
+
3. **Registrar en el historial** con fecha, resultado y notas si hubo fallo.
|
|
173
|
+
|
|
174
|
+
4. **Incrementar n**. Si fue correcto, incrementar también c.
|
|
175
|
+
|
|
176
|
+
5. **Recalcular pass@1 y pass@3** usando la fórmula. Si n < 5, registrar
|
|
177
|
+
"datos insuficientes" en lugar del porcentaje.
|
|
178
|
+
|
|
179
|
+
6. **Comparar contra objetivo** de la tabla de objetivos por tipo.
|
|
180
|
+
Si pass@1 < 60%, anotar "ALERTA" en el campo Estado.
|
|
181
|
+
|
|
182
|
+
7. **Si Estado = ALERTA o REVISAR**, abrir un issue o nota en ESTADO.md para
|
|
183
|
+
que `swl:evolucionar` lo procese en la siguiente sesión.
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Integración con swl:salud
|
|
188
|
+
|
|
189
|
+
El comando `swl:salud` puede incluir un resumen de métricas de agentes como
|
|
190
|
+
Paso 6b del diagnóstico. El formato esperado en SALUD.md es:
|
|
191
|
+
|
|
192
|
+
```markdown
|
|
193
|
+
## Métricas de agentes (pass@1)
|
|
194
|
+
|
|
195
|
+
| Agente | pass@1 | pass@3 | Estado |
|
|
196
|
+
|--------|--------|--------|--------|
|
|
197
|
+
| planificador-swl | 75% | 92% | OK |
|
|
198
|
+
| backend-python-swl | 63% | 88% | REVISAR |
|
|
199
|
+
|
|
200
|
+
Agentes en alerta (pass@1 < 60%): ninguno
|
|
201
|
+
Agentes con datos insuficientes (n < 5): 3
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Si `.planning/EVALUACION.md` no existe, `swl:salud` reporta:
|
|
205
|
+
"Métricas de agentes: sin datos — ejecutar evaluacion-agentes para iniciar tracking."
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Cuándo un agente necesita mejora
|
|
210
|
+
|
|
211
|
+
Un agente necesita mejora cuando ocurre cualquiera de estas condiciones:
|
|
212
|
+
|
|
213
|
+
- **pass@1 < 60%** sostenido durante 5 o más ejecuciones consecutivas
|
|
214
|
+
- **El mismo tipo de fallo** aparece en 3 o más registros del historial
|
|
215
|
+
- **pass@3 < 80%** en cualquier tipo de agente
|
|
216
|
+
- Un fallo causó un incidente en producción (independiente del porcentaje)
|
|
217
|
+
|
|
218
|
+
**Acción**: Invocar `swl:evolucionar` con el nombre del agente y los errores
|
|
219
|
+
frecuentes del historial como contexto. El agente de evolución revisará las
|
|
220
|
+
instrucciones y propondrá cambios específicos.
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Evaluación conductual de skills — patrón de 3 brazos
|
|
225
|
+
|
|
226
|
+
pass@k mide la fiabilidad de agentes. Pero ¿cómo medir si un **skill** realmente
|
|
227
|
+
cambia el comportamiento del modelo, o si el mismo resultado se obtendría con
|
|
228
|
+
cualquier instrucción genérica?
|
|
229
|
+
|
|
230
|
+
### El problema de la conflación
|
|
231
|
+
|
|
232
|
+
Si se compara "modelo con skill" vs "modelo sin nada", toda mejora se atribuye
|
|
233
|
+
al skill — incluso si una instrucción mínima como "sé conciso" lograría lo mismo.
|
|
234
|
+
Esto infla el valor percibido de skills que solo repiten conocimiento general.
|
|
235
|
+
|
|
236
|
+
### Harness de evaluación de 3 brazos
|
|
237
|
+
|
|
238
|
+
| Brazo | System prompt | Propósito |
|
|
239
|
+
|-------|--------------|-----------|
|
|
240
|
+
| **baseline** | Ninguno | Medir capacidad base del modelo |
|
|
241
|
+
| **control** | Instrucción genérica del dominio (ej: "Escribe código Python limpio y testeado") | Medir el efecto de cualquier instrucción mínima |
|
|
242
|
+
| **tratamiento** | Instrucción genérica + contenido del skill | Medir el delta real del skill |
|
|
243
|
+
|
|
244
|
+
**La métrica que importa**: tratamiento vs control (no tratamiento vs baseline).
|
|
245
|
+
Si el skill no mejora sobre el control genérico, su contenido no aporta valor
|
|
246
|
+
diferencial — el modelo ya sabía hacerlo con una instrucción mínima.
|
|
247
|
+
|
|
248
|
+
### Cómo aplicar
|
|
249
|
+
|
|
250
|
+
1. Definir 5-10 prompts representativos del dominio del skill
|
|
251
|
+
2. Ejecutar cada prompt en los 3 brazos (misma temperatura, mismo modelo)
|
|
252
|
+
3. Evaluar las respuestas con criterios binarios (correcto/incorrecto) o escala
|
|
253
|
+
4. Comparar: ¿el brazo tratamiento supera consistentemente al control?
|
|
254
|
+
|
|
255
|
+
**Cuándo usar**: Al decidir si un skill candidato justifica su incorporación al
|
|
256
|
+
sistema, o al auditar si un skill existente aporta valor real. No es necesario
|
|
257
|
+
para cada evaluación rutinaria — es una técnica de diagnóstico profundo.
|
|
258
|
+
|
|
259
|
+
**Resultado esperado**: Si tratamiento > control en >= 60% de los prompts,
|
|
260
|
+
el skill aporta valor. Si no, su contenido es redundante con el conocimiento
|
|
261
|
+
base del modelo y debe reescribirse con foco en gotchas y decisiones no obvias.
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Taxonomía de brechas — por qué fallan los agentes
|
|
266
|
+
|
|
267
|
+
Cuando un agente falla (pass@1 = incorrecto), la causa raíz no siempre es "el agente
|
|
268
|
+
está mal". Clasificar el tipo de brecha antes de proponer correcciones evita aplicar
|
|
269
|
+
la solución incorrecta (ej. reescribir un skill cuando el problema era falta de herramienta).
|
|
270
|
+
|
|
271
|
+
| Tipo de brecha | Síntoma típico | Acción correctiva |
|
|
272
|
+
|----------------|---------------|-------------------|
|
|
273
|
+
| **Skill faltante** | El agente improvisa donde debería seguir un patrón establecido | Crear o enriquecer el skill del dominio |
|
|
274
|
+
| **Herramienta faltante** | El agente describe lo que haría pero no puede ejecutarlo | Agregar MCP tool, script en `scripts/` o acceso a herramienta |
|
|
275
|
+
| **Permiso faltante** | El agente intenta una acción y recibe denegación | Ajustar permisos en `allowedTools` o configuración de sandbox |
|
|
276
|
+
| **Memoria faltante** | El agente re-pregunta decisiones ya tomadas en sesiones anteriores | Persistir en ESTADO.md, DECISIONS.md o memory del sistema |
|
|
277
|
+
| **Mala descomposición** | El agente produce un resultado parcial o mezcla responsabilidades | Revisar la delegación en el orquestador o el PLAN.md |
|
|
278
|
+
| **Verificación insuficiente** | El agente entrega resultado incorrecto pero confiado | Agregar criterios de éxito explícitos o harness de validación |
|
|
279
|
+
| **Autonomía insegura** | El agente toma decisiones irreversibles sin confirmación | Agregar checkpoint humano o reducir `nivelRiesgo` |
|
|
280
|
+
| **Modelo inadecuado** | El agente produce output superficial para la complejidad de la tarea | Escalar tier del modelo (haiku→sonnet→opus) según tabla Model-Tier |
|
|
281
|
+
| **Sobrecarga de contexto** | El agente olvida instrucciones tempranas o se contradice | Compactar contexto, usar `/swl:compactar`, reducir archivos cargados |
|
|
282
|
+
|
|
283
|
+
**Proceso**: Al registrar un fallo en el historial de EVALUACION.md, anotar el tipo
|
|
284
|
+
de brecha en la columna "Notas". Cuando un tipo acumula 3+ ocurrencias, la acción
|
|
285
|
+
correctiva correspondiente se convierte en prioridad para `/swl:evolucionar`.
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## Anti-patrones en evaluación
|
|
290
|
+
|
|
291
|
+
- **Registrar sin verificar**: marcar como correcto sin correr los criterios
|
|
292
|
+
de éxito. Contamina las métricas y oculta problemas reales.
|
|
293
|
+
- **No registrar fallos**: solo registrar éxitos infla artificialmente pass@1.
|
|
294
|
+
Todos los intentos se registran, independiente del resultado.
|
|
295
|
+
- **Evaluar con n < 5**: un porcentaje con 3 ejecuciones no es estadísticamente
|
|
296
|
+
representativo. Reportar como "datos insuficientes".
|
|
297
|
+
- **Comparar entre tipos**: un revisor con pass@1 = 80% y un implementador con
|
|
298
|
+
pass@1 = 80% no son equivalentes. Los objetivos por tipo existen por una razón.
|
|
299
|
+
- **Atribuir mejoras sin grupo control**: medir skill vs baseline conflaciona el
|
|
300
|
+
efecto del skill con el efecto de dar cualquier instrucción. Usar 3 brazos.
|
|
301
|
+
|
|
302
|
+
## Cuándo NO cargar
|
|
303
|
+
|
|
304
|
+
- Se quiere mejorar un SKILL.md específico — eso es `autoresearch`, que trabaja sobre el texto del skill, no sobre métricas de ejecución de agente.
|
|
305
|
+
- Se quiere verificar si un artefacto del plan cumple criterios de aceptación — eso es `verificar-trabajo`; este skill opera sobre historial de múltiples corridas, no sobre un entregable puntual.
|
|
306
|
+
- El agente en cuestión tiene menos de 5 ejecuciones registradas en EVALUACION.md — el pass@k sin datos suficientes produce porcentajes que llevan a acciones incorrectas.
|
|
307
|
+
- Se hace revisión puntual de la calidad del código de un agente — cargar `checklist-calidad` o invocar `revisor-codigo-swl`; este skill no evalúa artefactos individuales.
|
|
308
|
+
|
|
309
|
+
## Gotchas / Errores comunes no obvios
|
|
310
|
+
|
|
311
|
+
- **pass@3 calculado como promedio de 3 corridas en lugar de con la fórmula binomial**: el resultado aparece como 67% cuando la fórmula correcta `1 - C(n-c, k)/C(n, k)` daría 92%. Causa: usar `c/n` directamente en lugar de aplicar la fórmula pass@k estándar. Solución: usar siempre `pass@k = 1 - C(n-c, k) / C(n, k)`; para los valores típicos (n=12, k=3), la diferencia entre la fórmula correcta y el promedio simple es mayor al 20%.
|
|
312
|
+
- **Brecha de tipo "skill faltante" tratada como "modelo inadecuado"**: el equipo escala a Opus porque el agente improvisa, cuando el problema real es que no existe un skill para ese dominio. Causa: no diagnosticar el tipo de brecha antes de actuar. Solución: antes de escalar modelo, verificar en la taxonomía de brechas si el agente tiene acceso a un skill del dominio — si no existe, crearlo es más efectivo y económico que escalar de Sonnet a Opus.
|
|
313
|
+
- **Evaluación con los mismos 3 prompts en cada sesión**: el pass@1 llega al 100% pero el agente falla en producción con prompts diferentes. Causa: el conjunto de evaluación no es representativo del uso real. Solución: rotar el conjunto de prompts cada 30 días usando casos de uso reales capturados en `.planning/sessions/`; un conjunto estático que siempre pasa deja de ser informativo.
|
|
314
|
+
- **Sesión del harness de 3 brazos comparando baseline vs tratamiento (sin control)**: la mejora del skill se atribuye al contenido del skill cuando parte de la mejora viene de tener cualquier instrucción. Causa: omitir el brazo "control" (instrucción genérica) del harness. Solución: el brazo control es obligatorio — sin él no se puede saber si el contenido del skill supera una instrucción mínima de una línea.
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: event-driven
|
|
3
|
+
description: Arquitectura event-driven. Message brokers RabbitMQ y Kafka, event sourcing, CQRS, pub/sub, event schemas, idempotency, dead letter queues, retry strategies, eventual consistency. Con ejemplos Python.
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
herramientasPermitidas: [Read, Grep]
|
|
6
|
+
evolvable: true # default para skill estandar
|
|
7
|
+
exclusiones:
|
|
8
|
+
- "No cargar para pipelines de datos ETL con Kafka como transporte de datos masivos — para ingeniería de datos cargar `datos-etl`."
|
|
9
|
+
- "No cargar para microservicios sin mensajería (REST, gRPC sincrónico entre servicios) — para microservicios síncronos cargar `microservicios`."
|
|
10
|
+
- "No cargar para colas de tareas simples (Celery, Bull, RQ) sin patrones de evento — las colas de tareas son un subconjunto; cargar el skill del framework correspondiente."
|
|
11
|
+
- "No cargar para websockets y notificaciones push en tiempo real al cliente — para realtime client-side cargar el skill del framework frontend."
|
|
12
|
+
---
|
|
13
|
+
# Arquitectura Orientada a Eventos
|
|
14
|
+
|
|
15
|
+
Los sistemas event-driven desacoplan productores de consumidores, permitiendo escalar
|
|
16
|
+
componentes independientemente y resilir ante fallos.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Cuándo NO cargar
|
|
21
|
+
|
|
22
|
+
- El uso de Kafka/RabbitMQ es para ingesta masiva de datos ETL, no para eventos de negocio: cargar `datos-etl`.
|
|
23
|
+
- Los microservicios se comunican de forma síncrona (REST, gRPC) sin mensajería: cargar `microservicios`.
|
|
24
|
+
- La cola es de tareas background simples (Celery, Bull, RQ) sin esquemas de evento ni idempotencia: cargar el skill del framework.
|
|
25
|
+
- La funcionalidad es de notificaciones push al cliente via WebSockets: cargar el skill del framework frontend.
|
|
26
|
+
|
|
27
|
+
## Cuándo Usar Event-Driven
|
|
28
|
+
|
|
29
|
+
**USAR cuando**:
|
|
30
|
+
- Múltiples consumidores reaccionan al mismo evento
|
|
31
|
+
- El productor no necesita respuesta inmediata
|
|
32
|
+
- Necesitas escalar productores y consumidores independientemente
|
|
33
|
+
- Necesitas auditoría completa de cambios (event log = audit log)
|
|
34
|
+
|
|
35
|
+
**NO USAR cuando**:
|
|
36
|
+
- Necesitas respuesta síncrona inmediata para el usuario
|
|
37
|
+
- El flujo es simple y lineal (no hay múltiples consumidores)
|
|
38
|
+
- La consistencia eventual no es aceptable para el dominio
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Reglas Obligatorias
|
|
43
|
+
|
|
44
|
+
1. **Schemas de eventos tipados** — SIEMPRE definir con Pydantic. Son el contrato entre servicios.
|
|
45
|
+
2. **Versioning en schemas** — campo `version: "1.0"`. NUNCA romper compatibilidad hacia atrás.
|
|
46
|
+
3. **Idempotency en todos los handlers** — verificar antes de procesar, marcar después.
|
|
47
|
+
4. **Dead Letter Queue** — OBLIGATORIA para cada cola. Mensajes que fallan van a DLQ.
|
|
48
|
+
5. **Retry con backoff exponencial + jitter** — evitar thundering herd.
|
|
49
|
+
6. **Correlation ID** — propagar en todos los eventos para trazabilidad.
|
|
50
|
+
7. **Transactional Outbox** — para garantía de publicación atómica con BD.
|
|
51
|
+
8. **Consumer group names** — descriptivos y estables (no dinámicos).
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## RabbitMQ vs Kafka — Cuándo Usar Cuál
|
|
56
|
+
|
|
57
|
+
| Criterio | RabbitMQ | Kafka |
|
|
58
|
+
|----------|----------|-------|
|
|
59
|
+
| Patrón principal | Pub/Sub, work queues | Streaming, event log |
|
|
60
|
+
| Orden de mensajes | Por cola | Por partition |
|
|
61
|
+
| Retención | Hasta consumir | Configurable (días/ilimitado) |
|
|
62
|
+
| Escala | Miles de msgs/seg | Millones de msgs/seg |
|
|
63
|
+
| Complejidad operativa | Menor | Mayor |
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Patrón de Evento Base
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
from pydantic import BaseModel
|
|
71
|
+
from datetime import datetime, timezone
|
|
72
|
+
import uuid
|
|
73
|
+
|
|
74
|
+
class EventoBase(BaseModel):
|
|
75
|
+
id: str = ""
|
|
76
|
+
timestamp: datetime = None
|
|
77
|
+
version: str = "1.0"
|
|
78
|
+
correlation_id: str = ""
|
|
79
|
+
origen: str
|
|
80
|
+
|
|
81
|
+
def model_post_init(self, *args):
|
|
82
|
+
if not self.id:
|
|
83
|
+
self.id = str(uuid.uuid4())
|
|
84
|
+
if not self.timestamp:
|
|
85
|
+
self.timestamp = datetime.now(timezone.utc)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Idempotency — Patrón Esencial
|
|
91
|
+
|
|
92
|
+
```python
|
|
93
|
+
class HandlerConIdempotencia:
|
|
94
|
+
async def manejar(self, evento) -> None:
|
|
95
|
+
consumer_id = "mi_handler"
|
|
96
|
+
# Verificar ANTES de procesar
|
|
97
|
+
if await self._idempotencia.ya_procesado(evento.id, consumer_id):
|
|
98
|
+
return
|
|
99
|
+
# Procesar
|
|
100
|
+
await self._procesar(evento)
|
|
101
|
+
# Marcar DESPUÉS del procesamiento exitoso
|
|
102
|
+
await self._idempotencia.marcar_procesado(evento.id, consumer_id)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Transactional Outbox — Publicación Garantizada
|
|
108
|
+
|
|
109
|
+
Problema: publicar evento Y hacer commit en BD de forma atómica.
|
|
110
|
+
Solución: escribir evento a tabla "outbox" en misma transacción, worker publica al broker.
|
|
111
|
+
|
|
112
|
+
```python
|
|
113
|
+
# Mismo commit = garantía de consistencia
|
|
114
|
+
empleado = Empleado(**comando.model_dump())
|
|
115
|
+
db.add(empleado)
|
|
116
|
+
evento_outbox = EventoOutbox(tipo="empleado.creado", payload={...})
|
|
117
|
+
db.add(evento_outbox)
|
|
118
|
+
await db.commit() # Atómico
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Eventual Consistency — Manejo en UI
|
|
124
|
+
|
|
125
|
+
- Responder con `202 Accepted` + endpoint de polling para verificar estado.
|
|
126
|
+
- El frontend consulta periódicamente hasta que el recurso esté disponible.
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Checklist de Sistema Event-Driven
|
|
131
|
+
|
|
132
|
+
- [ ] Schemas de eventos definidos con Pydantic (tipado fuerte)
|
|
133
|
+
- [ ] Versioning en schemas (campo `version`)
|
|
134
|
+
- [ ] Idempotency en todos los handlers
|
|
135
|
+
- [ ] Dead Letter Queue para cada cola
|
|
136
|
+
- [ ] Retry con backoff exponencial y jitter
|
|
137
|
+
- [ ] Correlation ID propagado
|
|
138
|
+
- [ ] Transactional Outbox para garantía de publicación
|
|
139
|
+
- [ ] Monitoring de DLQ con alertas
|
|
140
|
+
- [ ] Tests de integración con broker real
|
|
141
|
+
- [ ] Schemas backward-compatible (cambios aditivos)
|
|
142
|
+
|
|
143
|
+
Para implementaciones completas de RabbitMQ, Kafka, CQRS, Outbox y más, ver [recursos/implementaciones-completas.md](recursos/implementaciones-completas.md).
|
|
144
|
+
|
|
145
|
+
## Gotchas / Errores comunes no obvios
|
|
146
|
+
|
|
147
|
+
**El handler de idempotencia verifica el `evento.id` pero el mismo evento puede llegar con IDs diferentes desde distintas fuentes**: si el mismo evento lógico se publica dos veces (por reintentos del Outbox o doble procesamiento del productor), y cada publicación genera un UUID diferente, la verificación `ya_procesado(evento.id)` no detecta el duplicado. Causa: la idempotencia basada en ID del evento asume que el productor genera el mismo ID para el mismo evento lógico. Fix: para eventos donde la duplicación puede ocurrir en el productor, usar un ID de negocio determinista como clave de idempotencia: `f"pedido-{pedido_id}-pagado"` en lugar del UUID del evento. El UUID es correcto para los reintentos de entrega del broker, no para prevenir duplicación lógica.
|
|
148
|
+
|
|
149
|
+
**El Transactional Outbox garantiza que el evento se publica, pero no garantiza el orden de publicación**: si dos operaciones de negocio ocurren en orden A→B pero el worker del Outbox publica B antes que A (por diferencias de timing entre transacciones), los consumidores procesan B antes que A y el estado del sistema queda inconsistente. Causa: el Outbox garantiza publicación eventual, no orden de publicación entre eventos de diferentes transacciones. Fix: para flujos donde el orden importa, incluir un campo `numero_secuencia` o `timestamp` en el evento y que los consumidores validen el orden antes de procesar. Alternativamente, usar particiones de Kafka con la misma clave para el mismo agregado, garantizando orden dentro del agregado.
|
|
150
|
+
|
|
151
|
+
**`correlation_id` se pierde al cruzar una cola de mensajes asíncrona (Kafka, RabbitMQ)**: el `correlation_id` se propaga correctamente en llamadas HTTP (vía header `X-Correlation-ID`), pero cuando un servicio publica a una cola, el handler del consumidor crea un nuevo contexto de logging sin extraer el `correlation_id` del mensaje. Causa: a diferencia de HTTP donde los middlewares extraen headers automáticamente, los consumidores de Kafka/RabbitMQ requieren código explícito para extraer y bindear el `correlation_id`. Fix: definir un patrón estándar donde todos los handlers de mensajes extraen el campo `correlation_id` del evento antes del primer log: `log = logger.bind(correlation_id=evento.correlation_id)` y usan ese logger vinculado durante todo el procesamiento.
|
|
152
|
+
|
|
153
|
+
**La Dead Letter Queue se llena silenciosamente y nadie la monitorea hasta que hay un incidente**: los mensajes en DLQ representan operaciones de negocio fallidas (pedidos no procesados, pagos no registrados), pero la DLQ se configura como "red de seguridad" y luego se olvida. Causa: la DLQ previene pérdida de mensajes pero no resuelve el problema subyacente. Sin alertas, los mensajes se acumulan indefinidamente. Fix: configurar alertas en Prometheus/Grafana para `dlq_message_count > 0` con severidad ALTA. Establecer un proceso de revisión de DLQ como parte del runbook de incidentes: inspeccionar el error, corregir la causa raíz, y reprocesar los mensajes desde la DLQ una vez que el sistema está sano.
|