@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,333 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sre-patrones
|
|
3
|
+
description: >
|
|
4
|
+
Patrones SRE: definición de SLO/SLI, cálculo de error budgets, diseño de
|
|
5
|
+
alertas accionables, runbooks de incidentes y post-mortems blameless.
|
|
6
|
+
Cargar cuando se definan objetivos de confiabilidad, se diseñen alertas
|
|
7
|
+
que minimicen ruido, se escriba un runbook, se conduzca un post-mortem
|
|
8
|
+
o se planifique la estrategia de on-call.
|
|
9
|
+
version: "1.0.0"
|
|
10
|
+
herramientasPermitidas: [Read, Bash]
|
|
11
|
+
evolvable: true # default para skill estandar
|
|
12
|
+
exclusiones:
|
|
13
|
+
- "No cargar para instrumentación de código con Prometheus, OpenTelemetry o logging estructurado — para instrumentación cargar `monitoring-alertas`."
|
|
14
|
+
- "No cargar para configuración de dashboards Grafana o reglas de alerting en YAML — para dashboards y alert rules cargar `monitoring-alertas`."
|
|
15
|
+
- "No cargar para análisis de vulnerabilidades de seguridad o threat modeling — para modelado de amenazas cargar `threat-model-lite`."
|
|
16
|
+
- "No cargar para diseño de arquitectura de microservicios resilientes (circuit breakers, bulkheads) — para patrones de resiliencia de arquitectura cargar el skill de arquitectura correspondiente al stack."
|
|
17
|
+
---
|
|
18
|
+
# Patrones SRE — Guía de Confiabilidad
|
|
19
|
+
|
|
20
|
+
## Cuándo NO cargar
|
|
21
|
+
|
|
22
|
+
- La tarea es instrumentar código con Prometheus u OpenTelemetry: cargar `monitoring-alertas`.
|
|
23
|
+
- La tarea es configurar dashboards Grafana o alert rules en YAML: cargar `monitoring-alertas`.
|
|
24
|
+
- La tarea es threat modeling o análisis de vulnerabilidades: cargar `threat-model-lite`.
|
|
25
|
+
- La tarea es diseñar circuit breakers o bulkheads en código: usar el skill del stack correspondiente.
|
|
26
|
+
|
|
27
|
+
## 1. Jerarquía de confiabilidad
|
|
28
|
+
|
|
29
|
+
La confiabilidad de un sistema se expresa en tres capas anidadas:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
SLA (Service Level Agreement) — Contrato con el cliente (ej: 99.9% uptime)
|
|
33
|
+
└─ SLO (Service Level Objective) — Objetivo interno (ej: 99.95% — margen sobre SLA)
|
|
34
|
+
└─ SLI (Service Level Indicator) — Métrica real (ej: % requests exitosos en 28 días)
|
|
35
|
+
└─ Error Budget — Cuánto podemos fallar: 100% - SLO = presupuesto de error
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Regla clave: el SLO **siempre** debe ser más estricto que el SLA. La diferencia
|
|
39
|
+
es el margen de seguridad antes de violar el contrato con el cliente.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 2. Definición de SLI por tipo de servicio
|
|
44
|
+
|
|
45
|
+
Los SLIs deben ser medibles con queries reales, no con afirmaciones vagas.
|
|
46
|
+
|
|
47
|
+
```yaml
|
|
48
|
+
# SLIs para API HTTP
|
|
49
|
+
slis:
|
|
50
|
+
disponibilidad:
|
|
51
|
+
formula: "successful_requests / total_requests * 100"
|
|
52
|
+
ventana: "28 días rolling"
|
|
53
|
+
umbral_bueno: "response_code < 500 AND latency < 1000ms"
|
|
54
|
+
query_prometheus: |
|
|
55
|
+
sum(rate(http_requests_total{code!~"5.."}[28d]))
|
|
56
|
+
/ sum(rate(http_requests_total[28d])) * 100
|
|
57
|
+
|
|
58
|
+
latencia:
|
|
59
|
+
formula: "p99 de latencia de response"
|
|
60
|
+
ventana: "1 hora rolling"
|
|
61
|
+
umbral_bueno: "p99 < 500ms"
|
|
62
|
+
query_prometheus: |
|
|
63
|
+
histogram_quantile(0.99,
|
|
64
|
+
sum(rate(http_request_duration_seconds_bucket[1h])) by (le)
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
saturacion:
|
|
68
|
+
formula: "uso_cpu_promedio últimas 4 horas"
|
|
69
|
+
umbral_alerta: "> 80%"
|
|
70
|
+
umbral_critico: "> 95%"
|
|
71
|
+
query_prometheus: |
|
|
72
|
+
100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[4h])) * 100)
|
|
73
|
+
|
|
74
|
+
# SLIs para pipeline de datos
|
|
75
|
+
slis_pipeline:
|
|
76
|
+
frescura:
|
|
77
|
+
formula: "time_since_last_successful_run"
|
|
78
|
+
umbral_bueno: "< 1 hora"
|
|
79
|
+
query_prometheus: |
|
|
80
|
+
time() - pipeline_last_success_timestamp_seconds
|
|
81
|
+
|
|
82
|
+
completitud:
|
|
83
|
+
formula: "registros_procesados / registros_esperados"
|
|
84
|
+
umbral_bueno: "> 99%"
|
|
85
|
+
query_prometheus: |
|
|
86
|
+
pipeline_records_processed_total
|
|
87
|
+
/ pipeline_records_expected_total * 100
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 3. Error budget y política de burn rate
|
|
93
|
+
|
|
94
|
+
### Cálculo de error budget
|
|
95
|
+
|
|
96
|
+
```python
|
|
97
|
+
def calcular_error_budget(slo_porcentaje: float, ventana_dias: int = 28) -> dict:
|
|
98
|
+
"""Calcula el error budget para un SLO dado."""
|
|
99
|
+
uptime_permitido = 1 - (slo_porcentaje / 100)
|
|
100
|
+
minutos_totales = ventana_dias * 24 * 60
|
|
101
|
+
minutos_downtime = minutos_totales * uptime_permitido
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
"slo": f"{slo_porcentaje}%",
|
|
105
|
+
"ventana": f"{ventana_dias} días",
|
|
106
|
+
"downtime_permitido_min": round(minutos_downtime, 1),
|
|
107
|
+
"downtime_permitido_horas": round(minutos_downtime / 60, 2),
|
|
108
|
+
"requests_fallidos_permitidos": f"{uptime_permitido * 100:.3f}% del total",
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
# Ejemplos comunes:
|
|
112
|
+
# 99.0% → 403.2 min / 6.72 h por mes
|
|
113
|
+
# 99.5% → 201.6 min / 3.36 h por mes
|
|
114
|
+
# 99.9% → 43.8 min / 0.73 h por mes
|
|
115
|
+
# 99.95% → 21.9 min / 0.37 h por mes
|
|
116
|
+
# 99.99% → 4.38 min por mes
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Política de consumo de error budget
|
|
120
|
+
|
|
121
|
+
| Estado del budget | Acción |
|
|
122
|
+
|-------------------|--------|
|
|
123
|
+
| > 50% disponible | Operación normal, todos los deploys habilitados |
|
|
124
|
+
| 20%–50% disponible | Solo deploys con feature flag y rollback en < 5 min |
|
|
125
|
+
| < 20% disponible | Solo hotfixes críticos, congelar deploys regulares |
|
|
126
|
+
| 0% agotado | Modo emergencia: post-mortem obligatorio, solo incidente activo |
|
|
127
|
+
|
|
128
|
+
La regla del 20% aplica al porcentaje **restante** en la ventana actual de 28
|
|
129
|
+
días. No se calcula sobre el budget anual acumulado.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## 4. Alertas accionables (no ruidosas)
|
|
134
|
+
|
|
135
|
+
Las alertas basadas en burn rate son superiores a los thresholds estáticos
|
|
136
|
+
porque detectan tanto incidentes rápidos como degradaciones lentas.
|
|
137
|
+
|
|
138
|
+
```yaml
|
|
139
|
+
# Alerta de burn rate alto — P1, requiere atención en 1 hora
|
|
140
|
+
# Lógica: consumimos el budget 14x más rápido de lo sostenible
|
|
141
|
+
- alert: ErrorBudgetBurnRateAlto
|
|
142
|
+
expr: |
|
|
143
|
+
(
|
|
144
|
+
sum(rate(http_requests_total{code=~"5.."}[1h])) /
|
|
145
|
+
sum(rate(http_requests_total[1h]))
|
|
146
|
+
) > (14 * (1 - 0.999))
|
|
147
|
+
for: 5m
|
|
148
|
+
labels:
|
|
149
|
+
severity: critical
|
|
150
|
+
annotations:
|
|
151
|
+
summary: "Error budget consumiéndose 14x más rápido — revisar en 1 hora"
|
|
152
|
+
runbook: "https://wiki/runbooks/error-budget-burn"
|
|
153
|
+
accion: "Ver logs de errores 5xx en los últimos 30 minutos"
|
|
154
|
+
|
|
155
|
+
# Alerta de burn rate moderado — P2, investigar en el día
|
|
156
|
+
# Lógica: consumimos el budget 6x más rápido, se agotará en ~5 días
|
|
157
|
+
- alert: ErrorBudgetBurnRateModerado
|
|
158
|
+
expr: |
|
|
159
|
+
(
|
|
160
|
+
sum(rate(http_requests_total{code=~"5.."}[6h])) /
|
|
161
|
+
sum(rate(http_requests_total[6h]))
|
|
162
|
+
) > (6 * (1 - 0.999))
|
|
163
|
+
for: 30m
|
|
164
|
+
labels:
|
|
165
|
+
severity: warning
|
|
166
|
+
annotations:
|
|
167
|
+
summary: "Error budget consumiéndose 6x más rápido — investigar hoy"
|
|
168
|
+
runbook: "https://wiki/runbooks/error-budget-burn"
|
|
169
|
+
accion: "Revisar tendencia de errores en el dashboard de SLO"
|
|
170
|
+
|
|
171
|
+
# Alerta de budget bajo — recordatorio de política
|
|
172
|
+
- alert: ErrorBudgetBajo
|
|
173
|
+
expr: |
|
|
174
|
+
(error_budget_remaining_ratio) < 0.20
|
|
175
|
+
for: 0m
|
|
176
|
+
labels:
|
|
177
|
+
severity: warning
|
|
178
|
+
annotations:
|
|
179
|
+
summary: "Error budget < 20% — activar política de deploys conservadores"
|
|
180
|
+
runbook: "https://wiki/runbooks/error-budget-policy"
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Tabla de multiplicadores de burn rate
|
|
184
|
+
|
|
185
|
+
| Severidad | Multiplicador | Se agota en | `for` recomendado |
|
|
186
|
+
|-----------|--------------|-------------|-------------------|
|
|
187
|
+
| Critical (P1) | 14.4x | ~2 días | 5m |
|
|
188
|
+
| Warning (P2) | 6x | ~5 días | 30m |
|
|
189
|
+
| Info (P3) | 3x | ~9 días | 1h |
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## 5. Runbook template
|
|
194
|
+
|
|
195
|
+
```markdown
|
|
196
|
+
# Runbook: [Nombre del Incidente/Alerta]
|
|
197
|
+
|
|
198
|
+
## Cuando activar
|
|
199
|
+
- Alerta: [nombre exacto de la alerta en Prometheus/Datadog]
|
|
200
|
+
- Severidad: [P1/P2/P3]
|
|
201
|
+
- SLO afectado: [disponibilidad/latencia/etc]
|
|
202
|
+
|
|
203
|
+
## Diagnóstico rápido (primeros 5 minutos)
|
|
204
|
+
1. `kubectl get pods -n produccion` — ¿hay pods en CrashLoopBackOff?
|
|
205
|
+
2. Revisar dashboard: [URL del dashboard]
|
|
206
|
+
3. Últimos deploys: `kubectl rollout history deployment/mi-api`
|
|
207
|
+
|
|
208
|
+
## Acciones de mitigación
|
|
209
|
+
### Si hay pods fallando:
|
|
210
|
+
```bash
|
|
211
|
+
kubectl rollout undo deployment/mi-api
|
|
212
|
+
kubectl rollout status deployment/mi-api
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Si es problema de base de datos:
|
|
216
|
+
1. Verificar conexiones activas: [query SQL]
|
|
217
|
+
2. Revisar slow queries: [URL de logs]
|
|
218
|
+
|
|
219
|
+
## Escalación
|
|
220
|
+
- P1 (SLO breach): escalar a Tech Lead inmediatamente
|
|
221
|
+
- P2 (burn rate alto): escalar si no se resuelve en 30 min
|
|
222
|
+
- Contacto de escalación: [nombre] — [medio]
|
|
223
|
+
|
|
224
|
+
## Post-mortem
|
|
225
|
+
- Abrir ticket en [sistema] con template de post-mortem
|
|
226
|
+
- Conducir revisión en las 48 horas siguientes
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## 6. Post-mortem blameless
|
|
232
|
+
|
|
233
|
+
```markdown
|
|
234
|
+
# Post-mortem: [Título del Incidente]
|
|
235
|
+
**Fecha**: [fecha] **Duración**: [N horas M minutos] **Severidad**: P[N]
|
|
236
|
+
|
|
237
|
+
## Impacto
|
|
238
|
+
- Usuarios afectados: [N usuarios / % del total]
|
|
239
|
+
- SLO consumido: [X% del error budget mensual]
|
|
240
|
+
- Ingresos en riesgo: [estimado si aplica]
|
|
241
|
+
|
|
242
|
+
## Causa raíz
|
|
243
|
+
[Descripción técnica objetiva — SIN mencionar nombres de personas.
|
|
244
|
+
Ejemplo correcto: "el proceso de deploy no tenía validación de health check
|
|
245
|
+
antes de enrutar tráfico al nuevo pod."
|
|
246
|
+
Ejemplo incorrecto: "Juan olvidó activar el health check."]
|
|
247
|
+
|
|
248
|
+
## Timeline
|
|
249
|
+
| Hora | Evento |
|
|
250
|
+
|------|--------|
|
|
251
|
+
| 14:32 | Primera alerta disparada |
|
|
252
|
+
| 14:38 | Ingeniero de guardia detecta el incidente |
|
|
253
|
+
| 15:10 | Causa raíz identificada |
|
|
254
|
+
| 15:25 | Mitigación aplicada, SLO recuperado |
|
|
255
|
+
| 16:00 | Servicio estable, incidente cerrado |
|
|
256
|
+
|
|
257
|
+
## Qué funcionó bien
|
|
258
|
+
- Las alertas dispararon dentro del SLO de detección
|
|
259
|
+
- El runbook tenía la solución correcta documentada
|
|
260
|
+
|
|
261
|
+
## Qué no funcionó
|
|
262
|
+
- El deploy no tenía feature flag para rollback rápido
|
|
263
|
+
- No había alerta de degradación antes del incidente completo
|
|
264
|
+
|
|
265
|
+
## Acciones correctivas
|
|
266
|
+
| Acción | Responsable | Fecha límite | Prioridad |
|
|
267
|
+
|--------|-------------|--------------|-----------|
|
|
268
|
+
| Agregar feature flag a todos los deploys del módulo de pago | [equipo] | [fecha] | P1 |
|
|
269
|
+
| Mejorar el runbook con el nuevo comando de diagnóstico | [equipo] | [fecha] | P2 |
|
|
270
|
+
| Agregar alerta de latencia p95 como señal temprana | [equipo] | [fecha] | P2 |
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## 7. MUST DO / MUST NOT DO
|
|
276
|
+
|
|
277
|
+
### MUST DO
|
|
278
|
+
|
|
279
|
+
- Alertas basadas en SLO burn rate, no en thresholds estáticos de CPU/memoria.
|
|
280
|
+
- Escribir el runbook **antes** de configurar la alerta. Si no hay acción documentada, la alerta genera ruido sin valor.
|
|
281
|
+
- Conducir post-mortems blameless dentro de 48 horas del cierre del incidente.
|
|
282
|
+
- Aplicar la política de error budget: no deploy cuando budget < 20% del período.
|
|
283
|
+
- Usar ventana rolling de 28 días para SLOs — evita el "reset" de inicio de mes.
|
|
284
|
+
- Definir el SLO siempre más estricto que el SLA para tener margen de seguridad.
|
|
285
|
+
- Tener primario y secundario de on-call para cada servicio crítico.
|
|
286
|
+
|
|
287
|
+
### MUST NOT DO
|
|
288
|
+
|
|
289
|
+
- NUNCA culpar a personas en post-mortems — ni directa ni implícitamente.
|
|
290
|
+
- NUNCA poner el SLA igual o más alto que el SLO interno.
|
|
291
|
+
- NUNCA configurar una alerta sin su runbook correspondiente.
|
|
292
|
+
- NUNCA ignorar cuando el error budget spend supera el 50% en la primera semana del período.
|
|
293
|
+
- NUNCA hacer chaos engineering sin tener el SLO baseline medido y el budget > 50%.
|
|
294
|
+
- NUNCA usar latencia promedio en alertas — usar p99. El promedio oculta percentiles altos.
|
|
295
|
+
- NUNCA dejar acciones correctivas de post-mortem sin responsable y fecha límite.
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## 8. Tabla de referencias
|
|
300
|
+
|
|
301
|
+
| Tema | Archivo |
|
|
302
|
+
|------|---------|
|
|
303
|
+
| Chaos engineering: steady state, herramientas, safety | [recursos/chaos-engineering.md](recursos/chaos-engineering.md) |
|
|
304
|
+
| On-call: rotación, escalación, fatiga de alertas | [recursos/oncall-design.md](recursos/oncall-design.md) |
|
|
305
|
+
| Alertas Prometheus con runbook completo | `Skill("monitoring-alertas")` |
|
|
306
|
+
| Implementación de métricas en código | `Skill("observabilidad-swl")` |
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## Checklist de revisión SRE
|
|
311
|
+
|
|
312
|
+
- [ ] SLIs definidos como queries verificables (no descripciones vagas).
|
|
313
|
+
- [ ] SLO más estricto que el SLA en al menos 0.05%.
|
|
314
|
+
- [ ] Error budget calculado y documentado junto al SLO.
|
|
315
|
+
- [ ] Política de error budget documentada y conocida por el equipo.
|
|
316
|
+
- [ ] Cada alerta tiene runbook con diagnóstico y mitigación.
|
|
317
|
+
- [ ] Alertas basadas en burn rate, no en thresholds estáticos.
|
|
318
|
+
- [ ] Post-mortem redactado sin nombres de culpables.
|
|
319
|
+
- [ ] Acciones correctivas con responsable y fecha límite asignados.
|
|
320
|
+
- [ ] On-call con primario y secundario para cada servicio P1.
|
|
321
|
+
- [ ] Chaos engineering solo cuando budget > 50% y en staging primero.
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## Gotchas / Errores comunes no obvios
|
|
326
|
+
|
|
327
|
+
**Un SLO de 99.9% en ventana rolling de 28 días permite 40.3 minutos de downtime, pero si el equipo usa ventana de mes calendario reinicia el contador cada 1 de mes, creando un incentivo perverso para hacer deploys riesgosos los primeros días del mes cuando el budget está lleno**: con ventana de mes calendario, un incidente de 35 minutos el día 28 consume el 87% del budget, pero el mismo incidente el día 2 consume el mismo 87% pero con 26 días para recuperarse. Causa: el mes calendario crea un "reset" artificial que desconecta el budget del riesgo real acumulado. Fix: usar siempre ventana rolling de 28 días. La ventana rolling refleja el riesgo real que los usuarios experimentan en los últimos 28 días, independientemente de cuándo empieza el mes.
|
|
328
|
+
|
|
329
|
+
**Las alertas de burn rate multiples ventanas (1h + 6h) producen falsos positivos en sistemas con carga diurna/nocturna porque el burn rate de la ventana corta (1h) dispara fuera de horario aunque el presupuesto mensual esté intacto**: un sistema con 10x más tráfico en horario laboral tiene naturalmente más errores absolutos en esas horas; si el SLI se define como "errores / total requests", el burn rate de 1h puede dispararse a las 9am sin que sea un incidente real. Causa: las alertas de burn rate asumen una tasa de requests aproximadamente uniforme; con carga variable, la misma tasa de errores genera diferentes burn rates. Fix: definir el SLI como proporción de errores (no absolutos) y verificar que el denominador (total requests) no sea cercano a cero en ventanas cortas fuera de horario, o añadir un mínimo de volumen de requests como precondición de la alerta.
|
|
330
|
+
|
|
331
|
+
**Los post-mortems blameless fallan en práctica cuando el "sistema" responsabilizado es en realidad una sola persona que tomó una decisión, creando frustración en el equipo porque todos saben quién fue pero no se puede decir**: la redacción "el deploy fue realizado sin validar el rollback" es técnicamente blameless pero todos saben que fue una persona específica. La persona en cuestión se siente expuesta pero sin poder defenderse, y el equipo siente que el proceso es hipócrita. Causa: blameless no significa ignorar la agencia humana — significa identificar los fallos del sistema que hicieron posible el error humano. Fix: reformular desde "qué fallo en el sistema que permitió que esta decisión se tomara": "no existía un checklist de deploy que incluyera verificación de rollback" o "el proceso de deploy no requería aprobación de un segundo ingeniero". La acción correctiva ataca el sistema, no la persona.
|
|
332
|
+
|
|
333
|
+
**El error budget policy de "no deploy cuando budget < 20%" bloquea hotfixes críticos de seguridad porque se aplica sin distinción al tipo de cambio**: un equipo que agotó el 85% del budget por un incidente de infraestructura no puede deployar un parche de seguridad CVE crítico porque la política lo bloquea automáticamente. Causa: la política de error budget fue diseñada para frenar deploys de features riesgosas, no hotfixes de seguridad. Fix: la política debe tener excepciones explícitas: (1) hotfixes de seguridad CVE con severidad CVSS ≥ 8 siempre se pueden deployar con aprobación del Tech Lead, (2) rollbacks de un cambio reciente que causó el budget burn siempre se permiten, (3) deploys de configuración sin cambios de código tienen presupuesto separado.
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# Chaos Engineering — Guía de Confiabilidad Proactiva
|
|
2
|
+
|
|
3
|
+
El chaos engineering es la disciplina de experimentar en un sistema con el
|
|
4
|
+
objetivo de descubrir debilidades antes de que se manifiesten en incidentes
|
|
5
|
+
reales. No es romper cosas al azar — es ciencia aplicada con hipótesis,
|
|
6
|
+
métricas y criterios de parada.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Principios fundamentales
|
|
11
|
+
|
|
12
|
+
### 1. Steady State Hypothesis (hipótesis de estado estable)
|
|
13
|
+
|
|
14
|
+
Antes de inyectar fallo, debes definir cómo se ve el sistema funcionando
|
|
15
|
+
correctamente. Sin esta definición, no puedes saber si el experimento causó
|
|
16
|
+
un problema o si el problema ya existía.
|
|
17
|
+
|
|
18
|
+
```yaml
|
|
19
|
+
# Ejemplo de steady state hypothesis
|
|
20
|
+
steady_state:
|
|
21
|
+
nombre: "API de pedidos en operación normal"
|
|
22
|
+
metricas:
|
|
23
|
+
- nombre: disponibilidad
|
|
24
|
+
query: "sum(rate(http_requests_total{code!~'5..'}[5m])) / sum(rate(http_requests_total[5m]))"
|
|
25
|
+
umbral_minimo: 0.999 # 99.9%
|
|
26
|
+
- nombre: latencia_p99
|
|
27
|
+
query: "histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))"
|
|
28
|
+
umbral_maximo: 0.5 # 500ms
|
|
29
|
+
- nombre: tasa_pedidos_por_minuto
|
|
30
|
+
query: "rate(pedidos_creados_total[5m]) * 60"
|
|
31
|
+
umbral_minimo: 50 # al menos 50 pedidos/min en horario laboral
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Si cualquiera de estas métricas no está en el umbral esperado **antes** de
|
|
35
|
+
empezar, cancelar el experimento. El sistema no está en estado estable.
|
|
36
|
+
|
|
37
|
+
### 2. Gradualidad: staging antes que producción
|
|
38
|
+
|
|
39
|
+
El path correcto es siempre progresivo:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
Desarrollo → Staging con tráfico simulado → Producción en horas valle
|
|
43
|
+
→ Producción en horario completo → Chaos continuo automatizado
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Nunca saltar pasos. Un experimento en producción sin haberlo ejecutado primero
|
|
47
|
+
en staging es un incidente disfrazado de experimento.
|
|
48
|
+
|
|
49
|
+
### 3. Radio de explosión mínimo (blast radius)
|
|
50
|
+
|
|
51
|
+
Empieza con el experimento de menor impacto posible. Si quieres probar resiliencia
|
|
52
|
+
ante fallo de base de datos, comienza con una instancia de réplica, no con el
|
|
53
|
+
primario.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Herramientas por capa del sistema
|
|
58
|
+
|
|
59
|
+
### Kubernetes / contenedores
|
|
60
|
+
|
|
61
|
+
| Herramienta | Uso | Instalación |
|
|
62
|
+
|-------------|-----|-------------|
|
|
63
|
+
| **Chaos Monkey** (Netflix) | Terminar instancias aleatoriamente | `brew install chaos-monkey` |
|
|
64
|
+
| **Litmus** | Experimentos nativos en K8s (pods, nodos, red) | `kubectl apply -f litmus-operator.yaml` |
|
|
65
|
+
| **Chaos Mesh** | Chaos nativo K8s con UI web | `helm install chaos-mesh chaos-mesh/chaos-mesh` |
|
|
66
|
+
|
|
67
|
+
```yaml
|
|
68
|
+
# Litmus: experimento de fallo de pod
|
|
69
|
+
apiVersion: litmuschaos.io/v1alpha1
|
|
70
|
+
kind: ChaosEngine
|
|
71
|
+
metadata:
|
|
72
|
+
name: pod-delete-experiment
|
|
73
|
+
spec:
|
|
74
|
+
appinfo:
|
|
75
|
+
appns: produccion
|
|
76
|
+
applabel: "app=api-pedidos"
|
|
77
|
+
experiments:
|
|
78
|
+
- name: pod-delete
|
|
79
|
+
spec:
|
|
80
|
+
components:
|
|
81
|
+
env:
|
|
82
|
+
- name: TOTAL_CHAOS_DURATION
|
|
83
|
+
value: "60" # 60 segundos de caos
|
|
84
|
+
- name: CHAOS_INTERVAL
|
|
85
|
+
value: "10" # eliminar pod cada 10 segundos
|
|
86
|
+
- name: FORCE
|
|
87
|
+
value: "false" # graceful shutdown, no kill -9
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Red / latencia
|
|
91
|
+
|
|
92
|
+
| Herramienta | Uso | Instalación |
|
|
93
|
+
|-------------|-----|-------------|
|
|
94
|
+
| **Toxiproxy** (Shopify) | Simular latencia, pérdida de paquetes, corte de conexión | `go install github.com/Shopify/toxiproxy/v2/cmd/toxiproxy-server@latest` |
|
|
95
|
+
| **tc (Linux traffic control)** | Control de red a nivel de kernel | Incluido en Linux |
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# Toxiproxy: agregar latencia de 100ms al 10% de las conexiones a la BD
|
|
99
|
+
toxiproxy-cli toxic add mi-postgres \
|
|
100
|
+
--type latency \
|
|
101
|
+
--attribute latency=100 \
|
|
102
|
+
--attribute jitter=50 \
|
|
103
|
+
--toxicity 0.10 # afectar 10% de las conexiones
|
|
104
|
+
|
|
105
|
+
# Limpiar después del experimento
|
|
106
|
+
toxiproxy-cli toxic remove mi-postgres --toxicName latency_downstream
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Recursos del sistema
|
|
110
|
+
|
|
111
|
+
| Herramienta | Uso |
|
|
112
|
+
|-------------|-----|
|
|
113
|
+
| **Gremlin** | Platform SaaS completa: CPU, memoria, disco, red, proceso |
|
|
114
|
+
| **stress-ng** | Stress testing de CPU y memoria (open source) |
|
|
115
|
+
| `dd` + `fallocate` | Simular disco lleno |
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
# stress-ng: consumir 80% de CPU por 60 segundos
|
|
119
|
+
stress-ng --cpu 4 --cpu-load 80 --timeout 60s
|
|
120
|
+
|
|
121
|
+
# Simular disco casi lleno (dejar solo 100MB libres)
|
|
122
|
+
fallocate -l $(df / | tail -1 | awk '{print $4 - 100000}')k /tmp/disco-lleno.tmp
|
|
123
|
+
# Limpiar inmediatamente después
|
|
124
|
+
rm /tmp/disco-lleno.tmp
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Experimentos básicos por tipo
|
|
130
|
+
|
|
131
|
+
### Experimento 1: Fallo de pod/instancia
|
|
132
|
+
|
|
133
|
+
**Hipótesis**: el servicio sigue disponible cuando un pod falla porque Kubernetes
|
|
134
|
+
lo reinicia y el load balancer redirige el tráfico.
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
# Verificar steady state
|
|
138
|
+
kubectl top pods -n produccion
|
|
139
|
+
|
|
140
|
+
# Inyectar fallo
|
|
141
|
+
kubectl delete pod <nombre-pod> -n produccion
|
|
142
|
+
|
|
143
|
+
# Observar recuperación
|
|
144
|
+
kubectl get pods -n produccion -w
|
|
145
|
+
|
|
146
|
+
# Verificar que el SLO no se violó
|
|
147
|
+
# (revisar en Grafana: disponibilidad durante los 2 minutos del experimento)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**Criterio de parada**: si la disponibilidad cae por debajo del SLO, detener
|
|
151
|
+
y analizar antes de continuar.
|
|
152
|
+
|
|
153
|
+
### Experimento 2: Latencia de red hacia dependencias
|
|
154
|
+
|
|
155
|
+
**Hipótesis**: el servicio degrada graciosamente cuando la base de datos tiene
|
|
156
|
+
latencia alta, sin causar errores 5xx.
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
# Configurar toxiproxy frente a PostgreSQL
|
|
160
|
+
toxiproxy-cli create mi-postgres --listen 0.0.0.0:5433 --upstream postgres:5432
|
|
161
|
+
|
|
162
|
+
# Inyectar 300ms de latencia
|
|
163
|
+
toxiproxy-cli toxic add mi-postgres --type latency --attribute latency=300
|
|
164
|
+
|
|
165
|
+
# Observar comportamiento (debe ver latencia en p99 del servicio, no errores)
|
|
166
|
+
# Medir: ¿el circuit breaker se activa? ¿los timeouts de conexión están bien configurados?
|
|
167
|
+
|
|
168
|
+
# Limpiar
|
|
169
|
+
toxiproxy-cli toxic remove mi-postgres --toxicName latency_downstream
|
|
170
|
+
toxiproxy-cli delete mi-postgres
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Experimento 3: Agotamiento de recursos
|
|
174
|
+
|
|
175
|
+
**Hipótesis**: el sistema tiene circuit breakers en el pool de conexiones de BD
|
|
176
|
+
que previenen cascada de fallos cuando las conexiones se agotan.
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
# Saturar el pool de conexiones (con una herramienta de pruebas de carga)
|
|
180
|
+
pgbench -c 100 -j 10 -T 60 postgresql://user@localhost/db
|
|
181
|
+
|
|
182
|
+
# Observar: ¿el servicio retorna 503 en lugar de colgar?
|
|
183
|
+
# ¿Las métricas de saturación alertaron antes de que se violara el SLO?
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Safety: reglas de parada automática
|
|
189
|
+
|
|
190
|
+
Todo experimento de chaos **DEBE** tener un kill switch claro:
|
|
191
|
+
|
|
192
|
+
```yaml
|
|
193
|
+
# Criterios de parada automática (Litmus ChaosEngine)
|
|
194
|
+
spec:
|
|
195
|
+
jobCleanUpPolicy: retain
|
|
196
|
+
components:
|
|
197
|
+
# Detener si disponibilidad < 99.5% durante el experimento
|
|
198
|
+
statusCheckURLs:
|
|
199
|
+
- "http://api-pedidos/health/ready"
|
|
200
|
+
# Revertir automáticamente después de N segundos
|
|
201
|
+
experimentTimeout: 300 # 5 minutos máximo
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Checklist de safety antes de ejecutar
|
|
205
|
+
|
|
206
|
+
- [ ] Steady state definido con queries y umbrales.
|
|
207
|
+
- [ ] Error budget > 50% disponible.
|
|
208
|
+
- [ ] El experimento se ejecutó primero en staging.
|
|
209
|
+
- [ ] Kill switch configurado y probado.
|
|
210
|
+
- [ ] Primario y secundario de on-call disponibles.
|
|
211
|
+
- [ ] Runbooks actualizados para los tipos de fallo que se inyectarán.
|
|
212
|
+
- [ ] Ventana de mantenimiento comunicada a stakeholders (para producción).
|
|
213
|
+
- [ ] Experimento programado fuera del período de mayor tráfico.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Cuándo NO hacer chaos engineering
|
|
218
|
+
|
|
219
|
+
Detener y no ejecutar si:
|
|
220
|
+
|
|
221
|
+
- El error budget está por debajo del 50% del período actual.
|
|
222
|
+
- Hay un incidente activo o abierto en el servicio objetivo.
|
|
223
|
+
- El equipo no tiene runbooks para los tipos de fallo que se van a inyectar.
|
|
224
|
+
- El servicio no tiene métricas de SLI funcionando correctamente.
|
|
225
|
+
- Es la primera semana después de un deploy mayor o una migración de base de datos.
|
|
226
|
+
- No hay un ingeniero responsable disponible durante todo el experimento.
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Madurez del programa de chaos
|
|
231
|
+
|
|
232
|
+
| Nivel | Descripción | Prerequisito |
|
|
233
|
+
|-------|-------------|-------------|
|
|
234
|
+
| 0 | Sin chaos engineering | — |
|
|
235
|
+
| 1 | Experimentos manuales en staging | SLOs definidos y medidos |
|
|
236
|
+
| 2 | Experimentos manuales en producción (horario laboral) | Nivel 1 + runbooks completos |
|
|
237
|
+
| 3 | Chaos automatizado programado (staging) | Nivel 2 + CI integrado |
|
|
238
|
+
| 4 | Chaos continuo en producción (GameDays regulares) | Nivel 3 + cultura SRE madura |
|
|
239
|
+
|
|
240
|
+
La mayoría de los equipos operan bien en Nivel 2. No existe ninguna razón para
|
|
241
|
+
apresurarse a Nivel 4.
|