@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,175 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prevencion-racionalizacion
|
|
3
|
+
description: >
|
|
4
|
+
Patrones para prevenir que los agentes racionalicen atajos, salten procesos o
|
|
5
|
+
inventen excusas para no seguir el workflow. Incluye tabla de excusas comunes,
|
|
6
|
+
red flags de pensamiento y técnicas para construir skills resistentes a la
|
|
7
|
+
racionalización. Cargar al diseñar skills, al detectar agentes saltando procesos,
|
|
8
|
+
o al revisar por qué un agente no siguió un paso obligatorio.
|
|
9
|
+
herramientasPermitidas: [Read, Grep]
|
|
10
|
+
exclusiones:
|
|
11
|
+
- "No cargar para prevenir sobre-ingeniería o cambios fuera del scope — ese es `prevencion-sobreingenieria`; este skill trata racionalización de *omisión* de pasos obligatorios, no de *adición* innecesaria de complejidad."
|
|
12
|
+
- "No cargar para evaluar si un proceso fue seguido correctamente después de un incidente — eso es `verificar-trabajo` o revisión post-mortem; este skill sirve para diseñar skills resistentes a la evasión, no para auditoría post-hoc."
|
|
13
|
+
- "No cargar cuando el agente quiere omitir un paso que no está en la spec — en ese caso aplicar las 4 reglas de desviación del implementador; este skill aplica a pasos obligatorios ya documentados en un proceso."
|
|
14
|
+
- "No cargar si el skill o proceso a proteger aún no tiene los pasos definidos — las cláusulas anti-racionalización requieren un proceso existente sobre el cual construir las reglas 'sin excepciones'."
|
|
15
|
+
evolvable: true # default para skill estandar
|
|
16
|
+
---
|
|
17
|
+
# Prevención de Racionalización en Agentes
|
|
18
|
+
|
|
19
|
+
La racionalización ocurre cuando un agente genera una justificación convincente
|
|
20
|
+
para no seguir un proceso que debería seguir. La justificación suena razonable.
|
|
21
|
+
Puede incluso ser técnicamente correcta en abstracto. Pero en el contexto específico,
|
|
22
|
+
es una excusa para tomar un atajo. El resultado es el mismo que si el proceso
|
|
23
|
+
no existiera: el trabajo queda incompleto o mal hecho.
|
|
24
|
+
|
|
25
|
+
## Cuándo cargar este skill
|
|
26
|
+
|
|
27
|
+
Invoca `Skill("prevencion-racionalizacion")` cuando:
|
|
28
|
+
|
|
29
|
+
- Se diseña un skill nuevo y se quieren incluir cláusulas anti-racionalización
|
|
30
|
+
- Se detecta que un agente saltó un paso obligatorio con una justificación
|
|
31
|
+
- Se hace autoresearch de un skill que los agentes no siguen consistentemente
|
|
32
|
+
- Se revisa por qué un proceso falló en producción y la causa fue un atajo
|
|
33
|
+
- Se escribe la sección "Sin excepciones" de cualquier regla obligatoria
|
|
34
|
+
|
|
35
|
+
## Qué es la racionalización en agentes AI
|
|
36
|
+
|
|
37
|
+
Un agente racionaliza cuando:
|
|
38
|
+
1. Encuentra que seguir el proceso requiere esfuerzo adicional
|
|
39
|
+
2. Genera una razón por la cual ese esfuerzo no es necesario en este caso
|
|
40
|
+
3. Procede sin seguir el proceso, convencido de que la razón es válida
|
|
41
|
+
|
|
42
|
+
La diferencia con una excepción legítima es que la excepción legítima está
|
|
43
|
+
documentada en el proceso mismo. Si no está documentada, es racionalización.
|
|
44
|
+
|
|
45
|
+
## Tabla de excusas comunes
|
|
46
|
+
|
|
47
|
+
| Excusa del agente | Realidad |
|
|
48
|
+
|---|---|
|
|
49
|
+
| "Es demasiado simple para necesitar diseño" | Hasta features simples se benefician de 5 minutos de diseño. La simplicidad percibida es subjetiva. |
|
|
50
|
+
| "Ya sé qué hacer, no necesito preguntar al usuario" | El usuario puede tener contexto crítico que el agente no tiene. Preguntar cuesta menos que reimplementar. |
|
|
51
|
+
| "Los tests no son necesarios para este cambio" | Todo cambio que modifica comportamiento necesita verificación. La excepción está en el proceso, no en el juicio del agente. |
|
|
52
|
+
| "Solo esta vez voy a saltar este paso" | "Solo esta vez" establece precedente. La próxima vez será más fácil justificarlo. |
|
|
53
|
+
| "El espíritu del proceso es lo que importa" | Si se viola la letra del proceso, se viola el espíritu. El proceso tiene la forma que tiene por razones concretas. |
|
|
54
|
+
| "Ya intenté 3 veces, debo cambiar de enfoque radicalmente" | 3 intentos fallidos con el mismo enfoque indican un problema de raíz, no de enfoque. Diagnosticar antes de cambiar. |
|
|
55
|
+
| "Este skill no aplica a mi situación" | Si hay 1% de probabilidad de que aplique, debe invocarse. El costo de invocar es bajo; el costo de no invocar cuando debía puede ser alto. |
|
|
56
|
+
| "El contexto es diferente aquí" | El proceso fue diseñado para contextos variados. Si el contexto genuinamente lo invalida, hay que documentarlo y escalar. |
|
|
57
|
+
| "El usuario no lo va a notar" | El usuario puede no notar ahora. Lo notará cuando el sistema falle de una forma que este paso prevenía. |
|
|
58
|
+
| "Voy a completarlo después" | "Después" no existe en el contexto de un agente. Si no se hace ahora, no se hace. |
|
|
59
|
+
|
|
60
|
+
## Red flags de pensamiento
|
|
61
|
+
|
|
62
|
+
Cuando un agente produce cualquiera de estos patrones de pensamiento, debe detenerse
|
|
63
|
+
y aplicar el proceso completo:
|
|
64
|
+
|
|
65
|
+
- **"No necesito..."** — si existe un proceso para algo, se necesita. Demostrar con
|
|
66
|
+
evidencia del proceso mismo que no aplica, no con razonamiento propio.
|
|
67
|
+
|
|
68
|
+
- **"Esto es obvio..."** — lo obvio para el agente puede no serlo para el usuario
|
|
69
|
+
o para otro agente. Si es obvio, documentarlo cuesta poco. Si no es obvio, documentarlo
|
|
70
|
+
previene errores.
|
|
71
|
+
|
|
72
|
+
- **"Solo voy a..."** — el "solo" minimiza el impacto. Los cambios "solo" tienen
|
|
73
|
+
consecuencias que el agente no anticipó. Hacer el proceso completo.
|
|
74
|
+
|
|
75
|
+
- **"Dado el contexto, puedo saltar..."** — el proceso existe precisamente para
|
|
76
|
+
contextos específicos. Si el contexto justifica una excepción, la excepción debe
|
|
77
|
+
estar en el proceso. Si no está, no es una excepción, es una violación.
|
|
78
|
+
|
|
79
|
+
- **"Ya lo hice antes sin problema..."** — el éxito pasado no garantiza el éxito
|
|
80
|
+
futuro. Cada instancia del proceso es independiente.
|
|
81
|
+
|
|
82
|
+
- **"El agente anterior ya verificó esto..."** — cada agente es responsable de
|
|
83
|
+
verificar lo que afirma. La verificación de otro agente no es evidencia propia.
|
|
84
|
+
|
|
85
|
+
## Principio fundamental
|
|
86
|
+
|
|
87
|
+
> Si hay 1% de probabilidad de que un skill aplique, DEBE invocarse.
|
|
88
|
+
|
|
89
|
+
El costo de invocar un skill innecesario es bajo: unos tokens extra de contexto.
|
|
90
|
+
El costo de no invocar un skill necesario puede ser alto: un bug en producción,
|
|
91
|
+
un requisito no implementado, una vulnerabilidad de seguridad.
|
|
92
|
+
|
|
93
|
+
La racionalización siempre infravalora el costo de no seguir el proceso y sobrevalora
|
|
94
|
+
el costo de seguirlo. Corregir ese sesgo sistemáticamente.
|
|
95
|
+
|
|
96
|
+
## Cómo construir skills resistentes a la racionalización
|
|
97
|
+
|
|
98
|
+
Al diseñar o actualizar un skill, incluir estas secciones explícitas:
|
|
99
|
+
|
|
100
|
+
### 1. Listar excusas específicas del dominio
|
|
101
|
+
|
|
102
|
+
No usar excusas genéricas. Investigar qué atajos específicos toman los agentes
|
|
103
|
+
en este dominio y documentarlos:
|
|
104
|
+
|
|
105
|
+
```markdown
|
|
106
|
+
## Excusas comunes en este dominio — y por qué son incorrectas
|
|
107
|
+
|
|
108
|
+
| Excusa | Por qué es incorrecta |
|
|
109
|
+
|---|---|
|
|
110
|
+
| [excusa específica 1] | [razón concreta] |
|
|
111
|
+
| [excusa específica 2] | [razón concreta] |
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 2. Agregar sección "Sin excepciones" explícita
|
|
115
|
+
|
|
116
|
+
```markdown
|
|
117
|
+
## Sin excepciones
|
|
118
|
+
|
|
119
|
+
Las siguientes reglas no tienen excepciones. Si el agente encuentra una razón
|
|
120
|
+
para no seguirlas, esa razón es racionalización, no una excepción legítima:
|
|
121
|
+
|
|
122
|
+
- [regla 1] — SIEMPRE, incluso si [excusa típica]
|
|
123
|
+
- [regla 2] — SIEMPRE, incluso si [excusa típica]
|
|
124
|
+
|
|
125
|
+
La única excepción legítima es que el proceso mismo la documente explícitamente.
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 3. Incluir red flags de pensamiento específicos
|
|
129
|
+
|
|
130
|
+
```markdown
|
|
131
|
+
## Señales de racionalización en este contexto
|
|
132
|
+
|
|
133
|
+
Detener y reiniciar el proceso si aparece cualquiera de estos pensamientos:
|
|
134
|
+
- "Este endpoint es demasiado simple para necesitar schema Pydantic"
|
|
135
|
+
- "Este test es obvio y no aporta valor"
|
|
136
|
+
- [red flag específico del dominio]
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 4. Documentar el costo de saltarse el proceso
|
|
140
|
+
|
|
141
|
+
Los agentes racionalizan mejor cuando no tienen visibilidad del costo real:
|
|
142
|
+
|
|
143
|
+
```markdown
|
|
144
|
+
## Qué pasa cuando se salta este proceso
|
|
145
|
+
|
|
146
|
+
- [consecuencia concreta 1 de saltarse el proceso]
|
|
147
|
+
- [consecuencia concreta 2]
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Checklist anti-racionalización
|
|
151
|
+
|
|
152
|
+
Al revisar si un agente siguió un proceso:
|
|
153
|
+
|
|
154
|
+
- [ ] El agente invocó todos los skills listados en la spec
|
|
155
|
+
- [ ] El agente ejecutó todos los pasos del protocolo, no solo los convenientes
|
|
156
|
+
- [ ] Si el agente se saltó un paso, la excepción está documentada en el proceso mismo
|
|
157
|
+
- [ ] No hubo "solo esta vez" ni "en este contexto particular"
|
|
158
|
+
- [ ] El agente reportó evidencia, no confianza
|
|
159
|
+
|
|
160
|
+
## Cuándo NO cargar
|
|
161
|
+
|
|
162
|
+
- Se detecta que el agente está agregando abstracciones o código que nadie pidió — eso es sobre-ingeniería, no racionalización; cargar `prevencion-sobreingenieria`.
|
|
163
|
+
- El paso omitido no estaba documentado en el proceso — las cláusulas anti-racionalización protegen pasos explícitos; si el paso falta en la spec, primero definirlo y luego protegerlo.
|
|
164
|
+
- Se quiere auditar si un proceso específico fue ejecutado correctamente tras una sesión — eso es `verificar-trabajo`; este skill diseña skills resistentes a evasión futura, no valida ejecuciones pasadas.
|
|
165
|
+
- La causa del atajo fue un bug en el proceso, no una justificación del agente — en ese caso aplicar la Regla 1 (AUTO-FIX) del implementador; la racionalización requiere que el agente haya generado activamente una excusa.
|
|
166
|
+
|
|
167
|
+
## Gotchas / Errores comunes no obvios
|
|
168
|
+
|
|
169
|
+
- **Cláusula "sin excepciones" tan absoluta que bloquea casos legítimos**: el agente no puede avanzar porque el proceso dice "SIEMPRE invocar X, sin excepción" pero hay un escenario técnico legítimo donde X no está disponible. Causa: las cláusulas anti-racionalización se redactaron sin documentar las excepciones reales del dominio. Solución: el proceso debe incluir las excepciones legítimas explícitamente — toda excepción no documentada es racionalización, pero toda excepción documentada en el proceso sí es válida; redactar las cláusulas como "SIEMPRE, salvo [excepción documentada aquí]".
|
|
170
|
+
- **Red flag "ya lo hice antes sin problema" usado para validar un atajo que efectivamente es correcto**: el agente tiene evidencia empírica real de que el paso puede omitirse en ese contexto específico. Causa: los red flags son señales de alerta, no prohibiciones absolutas. Solución: si el agente tiene evidencia de que un paso es innecesario en un contexto específico, la acción correcta es documentar la excepción en el proceso (Regla 2 AUTO-ADD del implementador), no ignorar el red flag ni proceder silenciosamente.
|
|
171
|
+
- **Tabla de excusas del dominio rellena con excusas genéricas del skill base**: el skill creado tiene como excusa de dominio "este skill no aplica a mi situación" en lugar de una excusa específica del dominio técnico. Causa: copiar la tabla de excusas genéricas sin adaptarla. Solución: las excusas de dominio deben ser observadas de la práctica real — revisar los logs de sesión donde el agente saltó el proceso para extraer las justificaciones reales que usó, no inventarlas a priori.
|
|
172
|
+
- **Usuario reporta "sigue fallando" tras un fix y el agente parcha el síntoma sin investigar causa raíz**: el agente aplica un segundo fix en la misma capa donde aplicó el primero, asumiendo que el primer fix estaba incompleto. En realidad, el bug está en una capa distinta (ej: se normaliza el input del formulario pero el bug real es que la consulta de deduplicación usa una columna cache stale; el tercer usuario reporta duplicados no por error de normalización, sino porque la comparación se hace contra `nombre_normalizado` en BD que fue calculado por una versión anterior de la función). Causa: el modelo mental del agente se ancla en la primera hipótesis — "es el normalizador" — y todos los fixes siguientes intentan mejorar el normalizador en lugar de cuestionar la hipótesis. Solución: cuando el usuario reporta "mismo síntoma tras fix", ejecutar **3 preguntas anti-anclaje** antes de tocar código: (1) ¿qué capa del sistema NO modifiqué en el primer fix?, (2) ¿hay estado persistido entre requests (BD, caché, sesión) que pueda tener valores calculados por la versión anterior del código?, (3) ¿el test que reproduce el bug empezaba con la BD limpia o con datos pre-existentes? Si (3) es "pre-existentes" y el fix no tocó esos datos, el bug probablemente está en la interacción entre el código nuevo y el estado viejo.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
*Skill creado con swl:crear-skill el 2026-03-31. Version 1.0.1 (+ Gotcha meta-aprendizaje 2026-04-20).*
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prevencion-sobreingenieria
|
|
3
|
+
description: >
|
|
4
|
+
Previene sobre-ingeniería y código innecesario en generación asistida por IA.
|
|
5
|
+
Cuatro principios: pensar antes de codificar, simplicidad primero, cambios
|
|
6
|
+
quirúrgicos y ejecución orientada a metas verificables. Cargar antes de
|
|
7
|
+
implementar features, refactorizar código o resolver bugs — especialmente
|
|
8
|
+
cuando el agente tiende a agregar abstracciones especulativas o tocar código
|
|
9
|
+
fuera del alcance solicitado.
|
|
10
|
+
version: "1.1.0"
|
|
11
|
+
evolved: true
|
|
12
|
+
evolved-from: "1.0.0"
|
|
13
|
+
evolved-at: "2026-04-24"
|
|
14
|
+
evolved-by: "aprender"
|
|
15
|
+
evolved-note: "Sección nueva: variables residuales post-refactor son code smell (F841 con ruff)"
|
|
16
|
+
herramientasPermitidas: [Read, Grep]
|
|
17
|
+
toolsRequeridos: Read, Grep, Glob
|
|
18
|
+
exclusiones:
|
|
19
|
+
- "No cargar cuando el agente omite pasos obligatorios del proceso — eso es racionalización, no sobre-ingeniería; cargar `prevencion-racionalizacion`."
|
|
20
|
+
- "No cargar para tasks one-liner obvias (fix de typo, rename de variable, one-shot de una línea) — el propio skill indica que la simplicidad aplica al proceso; añadir análisis de sobre-ingeniería a cambios triviales es en sí mismo sobre-ingeniería."
|
|
21
|
+
- "No cargar para auditar código ya existente en busca de complejidad acumulada — ese análisis es parte de `mapear-codebase` o `revisor-codigo-swl`; este skill guía la implementación en curso, no la auditoría de deuda técnica."
|
|
22
|
+
- "No cargar cuando la abstracción propuesta tiene 3 o más casos de uso concretos ya identificados — el criterio de 3 usos es el umbral del skill para justificar una abstracción; por encima de ese umbral, diseñarla es correcto."
|
|
23
|
+
evolvable: true # default para skill estandar
|
|
24
|
+
---
|
|
25
|
+
# Prevención de sobre-ingeniería
|
|
26
|
+
|
|
27
|
+
Skill derivado de los principios de Andrej Karpathy sobre errores comunes de LLMs
|
|
28
|
+
al generar código, adaptado al ecosistema SWL.
|
|
29
|
+
|
|
30
|
+
## Cuándo cargar
|
|
31
|
+
|
|
32
|
+
- Antes de implementar cualquier feature nueva con `implementador-swl` o `backend-*-swl`
|
|
33
|
+
- Cuando un agente tiende a agregar abstracciones que nadie pidió
|
|
34
|
+
- Al refactorizar código existente (riesgo de "mejorar" código adyacente)
|
|
35
|
+
- Cuando el usuario reporta que el agente "hace demasiado" o "cambia cosas que no debía"
|
|
36
|
+
- En revisiones de código donde se detecta complejidad innecesaria
|
|
37
|
+
|
|
38
|
+
## Principio 1 — Pensar antes de codificar
|
|
39
|
+
|
|
40
|
+
Antes de escribir una sola línea, explicitar supuestos y resolver ambigüedades.
|
|
41
|
+
|
|
42
|
+
### Reglas
|
|
43
|
+
|
|
44
|
+
1. **Explicitar supuestos** — Si hay ambigüedad en la instrucción, preguntar. NUNCA
|
|
45
|
+
asumir silenciosamente qué quiso decir el usuario.
|
|
46
|
+
2. **Presentar interpretaciones** — Si hay múltiples formas válidas de resolver el
|
|
47
|
+
problema, presentarlas brevemente y dejar que el usuario elija.
|
|
48
|
+
3. **Surfacear tradeoffs** — Si la solución tiene consecuencias no obvias (performance,
|
|
49
|
+
complejidad, dependencias nuevas), mencionarlas antes de implementar.
|
|
50
|
+
|
|
51
|
+
### Anti-patrón
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
# MAL — asume scope sin preguntar
|
|
55
|
+
def exportar_usuarios():
|
|
56
|
+
usuarios = db.query(Usuario).all()
|
|
57
|
+
csv = generar_csv(usuarios, campos=TODOS_LOS_CAMPOS)
|
|
58
|
+
enviar_email(admin, csv)
|
|
59
|
+
registrar_log_auditoria("export_usuarios")
|
|
60
|
+
return csv
|
|
61
|
+
# El usuario solo pidió "exportar usuarios" — ¿qué campos? ¿formato?
|
|
62
|
+
# ¿enviar email? ¿log de auditoría? Todo fue asumido.
|
|
63
|
+
|
|
64
|
+
# BIEN — clarifica antes de implementar
|
|
65
|
+
# Antes de implementar: ¿qué campos necesitas en el export?
|
|
66
|
+
# ¿Formato CSV o JSON? ¿Solo usuarios activos o todos?
|
|
67
|
+
# ¿Se requiere notificación o solo el archivo?
|
|
68
|
+
def exportar_usuarios(campos: list[str], solo_activos: bool = True) -> bytes:
|
|
69
|
+
query = db.query(Usuario)
|
|
70
|
+
if solo_activos:
|
|
71
|
+
query = query.filter(Usuario.es_activo == True)
|
|
72
|
+
return generar_csv(query.all(), campos=campos)
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Principio 2 — Simplicidad primero
|
|
76
|
+
|
|
77
|
+
El código más simple que resuelve el problema es el código correcto. Toda
|
|
78
|
+
complejidad adicional requiere justificación explícita.
|
|
79
|
+
|
|
80
|
+
### Reglas
|
|
81
|
+
|
|
82
|
+
1. **Código mínimo viable** — Escribir la solución más corta y clara que cumpla
|
|
83
|
+
el requisito. Si 200 líneas pueden ser 50, reescribir.
|
|
84
|
+
2. **Sin abstracciones especulativas** — No crear interfaces, factories, strategies
|
|
85
|
+
ni patrones de diseño para un solo caso de uso. Tres usos concretos justifican
|
|
86
|
+
una abstracción; menos de tres, no.
|
|
87
|
+
3. **Sin features fantasma** — No agregar configurabilidad, flags, parámetros
|
|
88
|
+
opcionales ni manejo de errores para escenarios que no existen hoy.
|
|
89
|
+
4. **Sin error handling para lo imposible** — No validar que un parámetro interno
|
|
90
|
+
no sea null cuando el tipo lo garantiza. Validar solo en fronteras del sistema.
|
|
91
|
+
|
|
92
|
+
### Anti-patrón
|
|
93
|
+
|
|
94
|
+
```python
|
|
95
|
+
# MAL — Strategy pattern para un solo tipo de descuento
|
|
96
|
+
class DiscountStrategy(ABC):
|
|
97
|
+
@abstractmethod
|
|
98
|
+
def calculate(self, price: Decimal) -> Decimal: ...
|
|
99
|
+
|
|
100
|
+
class PercentageDiscount(DiscountStrategy):
|
|
101
|
+
def __init__(self, pct: Decimal):
|
|
102
|
+
self.pct = pct
|
|
103
|
+
def calculate(self, price: Decimal) -> Decimal:
|
|
104
|
+
return price * self.pct / 100
|
|
105
|
+
|
|
106
|
+
class DiscountFactory:
|
|
107
|
+
_strategies = {"percentage": PercentageDiscount}
|
|
108
|
+
@classmethod
|
|
109
|
+
def create(cls, type: str, **kwargs) -> DiscountStrategy:
|
|
110
|
+
return cls._strategies[type](**kwargs)
|
|
111
|
+
|
|
112
|
+
# BIEN — función directa para un solo caso de uso
|
|
113
|
+
def calcular_descuento(precio: Decimal, porcentaje: Decimal) -> Decimal:
|
|
114
|
+
return precio * porcentaje / 100
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Test de simplicidad
|
|
118
|
+
|
|
119
|
+
Antes de hacer commit, preguntar: *¿un ingeniero senior diría que esto está
|
|
120
|
+
sobre-complicado?* Si la respuesta es "sí" o "tal vez", simplificar.
|
|
121
|
+
|
|
122
|
+
## Principio 3 — Cambios quirúrgicos
|
|
123
|
+
|
|
124
|
+
Solo tocar el código que la tarea requiere. Cada línea cambiada debe trazar
|
|
125
|
+
directamente al requisito del usuario.
|
|
126
|
+
|
|
127
|
+
### Reglas
|
|
128
|
+
|
|
129
|
+
1. **No "mejorar" código adyacente** — Si el usuario pide corregir un bug en la
|
|
130
|
+
función A, no renombrar variables en la función B ni agregar type hints en C.
|
|
131
|
+
2. **No refactorizar de oportunidad** — Si el código existente funciona y no es
|
|
132
|
+
parte del cambio, dejarlo. Aunque "podría ser mejor".
|
|
133
|
+
3. **Respetar estilo existente** — Si el archivo usa comillas simples, usar comillas
|
|
134
|
+
simples. Si usa tabs, usar tabs. Incluso si preferirías otro estilo.
|
|
135
|
+
4. **Solo eliminar lo que tu cambio hizo innecesario** — Si tu cambio hace que un
|
|
136
|
+
import quede sin uso, elimínalo. Pero no eliminar imports que ya estaban sin uso
|
|
137
|
+
antes de tu cambio.
|
|
138
|
+
|
|
139
|
+
### Anti-patrón
|
|
140
|
+
|
|
141
|
+
```python
|
|
142
|
+
# Tarea: "corregir el cálculo de IVA cuando la tasa es 0%"
|
|
143
|
+
|
|
144
|
+
# MAL — corrige el bug Y además "mejora" cosas que no le pidieron
|
|
145
|
+
def calcular_impuestos(
|
|
146
|
+
precio: Decimal, # type hint agregado (no pedido)
|
|
147
|
+
tasa: float,
|
|
148
|
+
) -> Decimal: # return type agregado (no pedido)
|
|
149
|
+
"""Calcula impuestos sobre el precio.""" # docstring agregado (no pedido)
|
|
150
|
+
if tasa == 0:
|
|
151
|
+
return Decimal("0") # ← este es el fix real
|
|
152
|
+
return precio * Decimal(str(tasa)) # refactorizado sin necesidad
|
|
153
|
+
|
|
154
|
+
# BIEN — solo el fix necesario
|
|
155
|
+
def calcular_impuestos(precio, tasa):
|
|
156
|
+
if tasa == 0:
|
|
157
|
+
return Decimal("0") # fix: evitar multiplicación innecesaria con tasa 0
|
|
158
|
+
return precio * Decimal(str(tasa))
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Test quirúrgico
|
|
162
|
+
|
|
163
|
+
Revisar el diff antes del commit: *¿cada línea cambiada es directamente necesaria
|
|
164
|
+
para cumplir lo que el usuario pidió?* Si hay líneas que no pasan este test,
|
|
165
|
+
revertirlas.
|
|
166
|
+
|
|
167
|
+
## Principio 4 — Ejecución orientada a metas
|
|
168
|
+
|
|
169
|
+
Transformar instrucciones vagas en criterios de éxito verificables antes de
|
|
170
|
+
implementar.
|
|
171
|
+
|
|
172
|
+
### Reglas
|
|
173
|
+
|
|
174
|
+
1. **Definir criterio de éxito** — Antes de implementar, declarar qué significa
|
|
175
|
+
"terminado" en términos verificables (tests que pasan, comportamiento observable).
|
|
176
|
+
2. **Plan breve con verificación** — Para tareas multi-paso, declarar los pasos
|
|
177
|
+
y cómo se verifica cada uno.
|
|
178
|
+
3. **Test primero para bugs** — Al corregir un bug, escribir primero el test que
|
|
179
|
+
lo reproduce. Verificar que falla. Luego corregir. Verificar que pasa.
|
|
180
|
+
|
|
181
|
+
### Plantillas de transformación
|
|
182
|
+
|
|
183
|
+
| Instrucción vaga | Meta verificable |
|
|
184
|
+
|---|---|
|
|
185
|
+
| "Agregar validación" | Escribir tests de inputs inválidos → hacerlos pasar |
|
|
186
|
+
| "Corregir el bug" | Escribir test que reproduce el bug → hacerlo pasar |
|
|
187
|
+
| "Refactorizar X" | Tests existentes pasan antes Y después del cambio |
|
|
188
|
+
| "Hacerlo más rápido" | Definir métrica (p95 latencia) + baseline + objetivo |
|
|
189
|
+
| "Mejorar la autenticación" | Definir qué problema específico resolver primero |
|
|
190
|
+
|
|
191
|
+
### Anti-patrón
|
|
192
|
+
|
|
193
|
+
```markdown
|
|
194
|
+
# MAL — plan vago sin verificación
|
|
195
|
+
1. Revisar el sistema de autenticación
|
|
196
|
+
2. Identificar problemas
|
|
197
|
+
3. Implementar mejoras
|
|
198
|
+
4. Probar
|
|
199
|
+
|
|
200
|
+
# BIEN — meta concreta con verificación por paso
|
|
201
|
+
Meta: las sesiones se invalidan al cambiar contraseña.
|
|
202
|
+
1. Test: cambiar contraseña → sesión anterior rechazada (FAIL esperado)
|
|
203
|
+
2. Implementar invalidación de sesiones en cambio de contraseña
|
|
204
|
+
3. Verificar: test anterior PASA
|
|
205
|
+
4. Verificar: login con nueva contraseña funciona (sin regresión)
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Resumen de señales de alerta
|
|
209
|
+
|
|
210
|
+
| Señal | Problema | Acción |
|
|
211
|
+
|---|---|---|
|
|
212
|
+
| Se necesita "y" para describir el cambio | Múltiples cambios en uno | Dividir en commits separados |
|
|
213
|
+
| Clase con 1 solo uso | Abstracción prematura | Reemplazar con función |
|
|
214
|
+
| Parámetro `**kwargs` "por flexibilidad" | Feature fantasma | Parámetros explícitos |
|
|
215
|
+
| `try/except` para error que nunca ocurre | Manejo defensivo excesivo | Eliminar |
|
|
216
|
+
| Se modificaron archivos fuera del scope | Cambio no quirúrgico | Revertir extras |
|
|
217
|
+
| "Aproveché para mejorar…" | Refactor de oportunidad | Commit separado o no hacerlo |
|
|
218
|
+
| `if config.get("feature_x", False)` | Feature flag prematuro | Código directo |
|
|
219
|
+
|
|
220
|
+
## Calibración: cuándo NO aplicar rigor completo
|
|
221
|
+
|
|
222
|
+
Estos principios sesgan hacia cautela sobre velocidad. Para tareas triviales
|
|
223
|
+
(fix de typo, one-liner obvio, rename de variable), usar criterio. No toda línea
|
|
224
|
+
de código requiere análisis profundo. La simplicidad también aplica al proceso.
|
|
225
|
+
|
|
226
|
+
## Cuándo NO cargar
|
|
227
|
+
|
|
228
|
+
- El agente omite un paso obligatorio del proceso con una justificación — eso es racionalización, no sobre-ingeniería; cargar `prevencion-racionalizacion`.
|
|
229
|
+
- La tarea es un fix de typo, rename de variable u otro one-liner obvio — el análisis completo de los 4 principios no compensa; el propio skill reconoce que "la simplicidad también aplica al proceso".
|
|
230
|
+
- El objetivo es identificar complejidad acumulada en código heredado — ese análisis es parte de `mapear-codebase` (Paso 5: deuda técnica) o de una revisión de código; este skill previene sobre-ingeniería durante la implementación, no la audita después.
|
|
231
|
+
- La abstracción ya tiene 3 o más casos de uso concretos identificados — el umbral del skill para justificar una abstracción es 3 usos; si ya se cumplen, diseñar la interfaz es correcto y este skill no agrega restricciones.
|
|
232
|
+
|
|
233
|
+
## Gotchas / Errores comunes no obvios
|
|
234
|
+
|
|
235
|
+
- **Test quirúrgico fallado porque el diff incluye cambios de formato automático del linter**: el agente revisa el diff antes del commit y ve líneas reformateadas por `black` o `prettier` que no estaban en el scope. Causa: el linter se ejecuta sobre archivos tocados y formatea líneas adyacentes al cambio real. Solución: distinguir entre cambios del agente y cambios del formateador automático — si el formateador era parte del flujo pre-commit, las líneas de formato no cuentan como cambios fuera del scope; si no era parte del flujo, revertir el formato y solo incluir el cambio mínimo.
|
|
236
|
+
- **Principio de "no mejorar código adyacente" interpretado como prohibición de agregar type hints al código que se modifica**: el agente corrige un bug pero no actualiza el type hint del parámetro que cambió de tipo. Causa: generalizar la regla de "no tocar lo adyacente" a partes del código que sí deben actualizarse como parte del fix. Solución: la regla aplica a código que no necesita cambiar; un type hint incorrecto *después del cambio* es parte del fix, no una mejora de oportunidad.
|
|
237
|
+
- **Principio 1 (clarificar antes de implementar) aplicado a tareas que ya tienen spec completa**: el agente pregunta por decisiones que ya están documentadas en el PLAN.md aprobado. Causa: no leer la spec antes de preguntar. Solución: el Principio 1 aplica cuando hay ambigüedad real después de leer el PLAN.md, CLAUDE.md y los archivos relevantes — si la respuesta está en los documentos ya leídos, preguntar es sobreingeniería del proceso, no clarificación.
|
|
238
|
+
- **Criterio de 3 usos para abstracciones aplicado a tipos (interfaces/protocolos)**: el agente no crea una interfaz para un tipo que se usa en un solo lugar. Causa: confundir "3 usos para abstracciones de comportamiento" con "3 usos para tipos". Solución: el criterio de 3 usos aplica a factories, strategies, y patrones de comportamiento especulativos; una interfaz TypeScript o un Protocol Python que define un contrato usado una vez puede ser la solución correcta si el tipo es el boundary entre módulos.
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Variables residuales post-refactor son code smell
|
|
243
|
+
|
|
244
|
+
### Regla
|
|
245
|
+
|
|
246
|
+
Variables asignadas pero no usadas (F841 en ruff/flake8) **post-refactor** son
|
|
247
|
+
casi siempre residuos de una versión anterior del código que el refactor no
|
|
248
|
+
limpió. Se parecen a "variables temporales del desarrollador" pero delatan un
|
|
249
|
+
refactor incompleto — la lógica que las usaba se movió o eliminó, pero las
|
|
250
|
+
asignaciones quedaron.
|
|
251
|
+
|
|
252
|
+
### Por qué son peligrosas
|
|
253
|
+
|
|
254
|
+
- **Confunden al próximo lector**: asumirá que la variable se usa más abajo.
|
|
255
|
+
- **Inflan el diff cognitivo** del refactor real.
|
|
256
|
+
- **Ocultan bugs sutiles**: el valor asignado puede tener side effects (llamada
|
|
257
|
+
a función costosa o con efecto en estado) que ya no aporta nada al flujo.
|
|
258
|
+
- **Invalidan la métrica de cobertura**: líneas "cubiertas" por tests que en
|
|
259
|
+
realidad no afectan el resultado.
|
|
260
|
+
|
|
261
|
+
### Patrón operativo
|
|
262
|
+
|
|
263
|
+
Después de **cualquier refactor** que modifique el flujo de una función (extraer
|
|
264
|
+
método, inlinear función, cambiar el shape de un return), correr:
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
ruff check --select=F841 ruta/al/modulo.py
|
|
268
|
+
# o para todo el proyecto
|
|
269
|
+
ruff check --select=F841 .
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Cada F841 detectado post-refactor es candidato 1 de 2:
|
|
273
|
+
|
|
274
|
+
1. **Variable muerta** (caso común post-refactor): eliminarla.
|
|
275
|
+
2. **Variable viva pero mal nombrada** (caso raro): si el valor se usa como
|
|
276
|
+
side effect intencional (ej: evaluar una propiedad para cachear), renombrar
|
|
277
|
+
con prefijo `_` y comentar el propósito.
|
|
278
|
+
|
|
279
|
+
### Anti-patrón típico
|
|
280
|
+
|
|
281
|
+
```python
|
|
282
|
+
# Antes del refactor: había un if que usaba exito_key
|
|
283
|
+
def procesar(data):
|
|
284
|
+
exito, exito_key = intentar(data)
|
|
285
|
+
if exito_key == "via_rapida":
|
|
286
|
+
return procesar_rapido(data)
|
|
287
|
+
return procesar_normal(data, exito_key)
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
# Después de refactor que eliminó la rama "via_rapida"
|
|
291
|
+
def procesar(data):
|
|
292
|
+
exito, exito_key = intentar(data) # ← F841: exito_key asignado, no usado
|
|
293
|
+
return procesar_normal(data) # ← también exito residual
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Patrón canónico
|
|
297
|
+
|
|
298
|
+
```python
|
|
299
|
+
# Post-refactor limpio
|
|
300
|
+
def procesar(data):
|
|
301
|
+
_ = intentar(data) # si el side effect de intentar() importa
|
|
302
|
+
return procesar_normal(data)
|
|
303
|
+
|
|
304
|
+
# o mejor: si ni siquiera el side effect importa
|
|
305
|
+
def procesar(data):
|
|
306
|
+
return procesar_normal(data)
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Reglas
|
|
310
|
+
|
|
311
|
+
- **Gate pre-commit**: agregar `ruff check --select=F841` al pre-commit hook del proyecto. No bloquea en un repo grande donde F841 preexiste, pero sí bloquea en los archivos modificados por el commit actual.
|
|
312
|
+
- **Revisión explícita post-refactor grande**: tras extraer 5+ métodos o mover 5+ bloques, correr `ruff --select=F401,F841` sobre los archivos tocados.
|
|
313
|
+
- **NO silenciar con `# noqa: F841` sin justificación** — la excepción legítima (side effect intencional con nombre `_`) es tan rara que vale la pena documentarla; silenciar sin comentario es ocultar deuda.
|
|
314
|
+
- **Incluir en checklist de PR**: "F841 limpio en archivos tocados" como item explícito.
|
|
315
|
+
|
|
316
|
+
### Aplicabilidad
|
|
317
|
+
|
|
318
|
+
Detectable en:
|
|
319
|
+
|
|
320
|
+
- Python: `ruff --select=F841`, `flake8 --select=F841`.
|
|
321
|
+
- TypeScript/JavaScript: `eslint --rule 'no-unused-vars: error'`.
|
|
322
|
+
- Go: el compilador lo hace obligatorio (`declared but not used`).
|
|
323
|
+
- Rust: warning `unused_variables`, promovido a error con `#![deny(unused_variables)]`.
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: privacy-memoria
|
|
3
|
+
description: >
|
|
4
|
+
Sistema de privacidad para la memoria SWL: tags <private>, filtrado de contenido
|
|
5
|
+
sensible, y mejores prácticas para proteger datos en aprendizajes y sesiones.
|
|
6
|
+
Cargar cuando se trabaje con datos sensibles, se configure el sistema de memoria
|
|
7
|
+
o se implementen componentes que lean/escriban APRENDIZAJES.md o session-store.
|
|
8
|
+
herramientasPermitidas: [Read, Write]
|
|
9
|
+
evolvable: false # bloqueado por lista (skill de seguridad/privacidad)
|
|
10
|
+
nist_csf: [GV.OV-01, PR.DS-01, PR.DS-02, DE.CM-09]
|
|
11
|
+
nist_ai_rmf: [GOVERN-1.2, MAP-4.1, MANAGE-4.1]
|
|
12
|
+
atlas_techniques: [AML.T0048]
|
|
13
|
+
exclusiones:
|
|
14
|
+
- "No cargar para privacidad en esquemas de base de datos (columnas cifradas, tokenización, GDPR en modelos) — para diseño de privacidad en persistencia cargar `postgresql-experto` o `dbml-experto`."
|
|
15
|
+
- "No cargar para cumplimiento regulatorio formal (GDPR, HIPAA, LFPDPPP) — la evaluación regulatoria requiere `threat-model-lite` combinado con asesoría legal externa, no tags de memoria."
|
|
16
|
+
- "No cargar para cifrado en tránsito (TLS, mTLS, cifrado de payloads entre servicios) o gestión de claves — para transporte cifrado y rotación de credenciales cargar `iam-secretos`."
|
|
17
|
+
- "No cargar para escaneo de credenciales hardcodeadas en código fuente — para secretos en source cargar `checklist-seguridad` y el hook `escaneo-secretos`; los tags `<private>` no sustituyen la detección estática."
|
|
18
|
+
---
|
|
19
|
+
# Privacy Tags y Filtrado de Memoria
|
|
20
|
+
|
|
21
|
+
## Cuándo cargar
|
|
22
|
+
|
|
23
|
+
- Implementar o modificar hooks que lean/escriban `APRENDIZAJES.md`
|
|
24
|
+
- Configurar `session-store.js` o `inyeccion-contexto.js`
|
|
25
|
+
- Trabajar con datos que puedan contener PII, credenciales o información confidencial
|
|
26
|
+
- Revisar que aprendizajes capturados no filtren información privada
|
|
27
|
+
|
|
28
|
+
## Cuándo NO cargar
|
|
29
|
+
|
|
30
|
+
- El diseño es de privacidad a nivel de base de datos (columnas cifradas, tokenización, políticas de retención en tablas): cargar `postgresql-experto` o `dbml-experto`. Los tags `<private>` operan sobre la capa de memoria de agentes (APRENDIZAJES.md, session-store), no sobre datos en reposo en BD.
|
|
31
|
+
- La tarea es cumplimiento regulatorio formal (GDPR, HIPAA, LFPDPPP): los tags son un mecanismo de higiene interna, no un control de cumplimiento. Cargar `threat-model-lite` y consultar asesoría legal externa para el marco regulatorio aplicable.
|
|
32
|
+
- La necesidad es cifrado en tránsito o gestión de claves (TLS, rotación de tokens, mTLS entre servicios): cargar `iam-secretos`. Este skill no cubre transporte ni criptografía.
|
|
33
|
+
- La búsqueda es de credenciales hardcodeadas en código fuente: los tags `<private>` no protegen código — cargar `checklist-seguridad` (A02) y confiar en el hook `escaneo-secretos`. Los tags son una capa de conveniencia para aprendizajes, no de seguridad real.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Tags de privacidad disponibles
|
|
38
|
+
|
|
39
|
+
Envuelve contenido sensible en cualquiera de estos tags para excluirlo del
|
|
40
|
+
almacenamiento de aprendizajes y sesiones:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
<private>contenido que no debe persistir</private>
|
|
44
|
+
<secreto>credenciales temporales, tokens de API</secreto>
|
|
45
|
+
<privado>datos personales, PII</privado>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Los tres tags son equivalentes en comportamiento. Usar el que sea más legible
|
|
49
|
+
en el contexto: `<private>` en código predominantemente en inglés, `<secreto>`
|
|
50
|
+
o `<privado>` en contextos en español.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Donde aplica el filtrado
|
|
55
|
+
|
|
56
|
+
El módulo `hooks/lib/privacy-filter.js` expone `filtrarPrivacidad()` y debe
|
|
57
|
+
invocarse en estos puntos del pipeline antes de escribir a disco o memoria:
|
|
58
|
+
|
|
59
|
+
| Componente | Punto de filtrado |
|
|
60
|
+
|-----------|------------------|
|
|
61
|
+
| `extraccion-aprendizajes.js` | Antes de escribir en `APRENDIZAJES.md` |
|
|
62
|
+
| `inyeccion-contexto.js` | Antes de inyectar contexto en nueva sesión |
|
|
63
|
+
| `session-store.js` | Antes de persistir el summary de sesión |
|
|
64
|
+
|
|
65
|
+
Patrón de uso en hooks:
|
|
66
|
+
|
|
67
|
+
```js
|
|
68
|
+
const { filtrarPrivacidad, contieneTagsPrivados } = require('./lib/privacy-filter');
|
|
69
|
+
|
|
70
|
+
// Antes de persistir
|
|
71
|
+
const { textoFiltrado, tagsRemovidos } = filtrarPrivacidad(textoOriginal);
|
|
72
|
+
if (tagsRemovidos > 0) {
|
|
73
|
+
// Opcional: loguear cuántos bloques privados se removieron
|
|
74
|
+
}
|
|
75
|
+
// Usar textoFiltrado en lugar de textoOriginal
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Qué NO cubre este sistema
|
|
81
|
+
|
|
82
|
+
- **Código fuente con credenciales**: usar `escaneo-secretos.js` (hook PreToolUse)
|
|
83
|
+
- **Variables de entorno**: usar `escaneo-secretos.js` con patrones de `.env`
|
|
84
|
+
- **Archivos binarios o imágenes con datos sensibles**: no hay soporte de tags en binarios
|
|
85
|
+
- **Datos sensibles en rutas de archivos**: usar la regla `cloud-infra.md` para secretos en IaC
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Limite de seguridad (ReDoS prevention)
|
|
90
|
+
|
|
91
|
+
El módulo tiene un límite de `MAX_TAGS = 100` tags por texto procesado. Si un
|
|
92
|
+
texto supera ese límite, los tags restantes quedan sin procesar (no se filtran).
|
|
93
|
+
|
|
94
|
+
Este límite previene ataques de denegación de servicio via texto con miles de
|
|
95
|
+
tags anidados o mal formados. Para textos legítimos el límite no debería alcanzarse.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Reglas obligatorias
|
|
100
|
+
|
|
101
|
+
1. **Nunca depender solo de tags para seguridad de secretos reales.** Los tags
|
|
102
|
+
son una capa de conveniencia para aprendizajes; las credenciales de producción
|
|
103
|
+
van en variables de entorno o gestores de secretos.
|
|
104
|
+
|
|
105
|
+
2. **Tags anidados no están soportados.** `<private><secreto>x</secreto></private>`
|
|
106
|
+
puede comportarse de forma inesperada. Usar un solo nivel de tag.
|
|
107
|
+
|
|
108
|
+
3. **Tags malformados se ignoran silenciosamente.** `<private>texto sin cierre`
|
|
109
|
+
no se filtra. Verificar que el tag de cierre existe si el contenido es crítico.
|
|
110
|
+
|
|
111
|
+
4. **El filtrado es case-sensitive en los tags.** `<PRIVATE>` no se filtra.
|
|
112
|
+
Siempre usar minúsculas: `<private>`, `<secreto>`, `<privado>`.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Gotchas / Errores comunes no obvios
|
|
117
|
+
|
|
118
|
+
- **Confiar en tags `<private>` para proteger credenciales reales de producción**: el filtrado se aplica solo en puntos específicos del pipeline de memoria (APRENDIZAJES.md, session-store, inyección de contexto) y no sustituye la gestión de secretos. Causa: los tags son una capa de conveniencia para aprendizajes, no un control de seguridad — un `DATABASE_URL` envuelto en `<secreto>` sigue estando en memoria del proceso y en logs intermedios. Solución: credenciales de producción van en variables de entorno o gestores de secretos (Vault, AWS Secrets Manager); los tags solo marcan contenido transitorio de sesión que no debe persistirse en aprendizajes.
|
|
119
|
+
- **Asumir que el filtrado es automático**: escribir a APRENDIZAJES.md sin invocar `filtrarPrivacidad()` explícitamente deja tags sin procesar en el archivo persistido. Causa: el módulo `hooks/lib/privacy-filter.js` expone la función pero no intercepta escrituras — cada hook debe llamarla explícitamente antes de `fs.writeFileSync` o equivalente. Solución: antes de persistir cualquier texto que pueda contener tags, invocar `const { textoFiltrado } = filtrarPrivacidad(textoOriginal)` y usar `textoFiltrado`; revisar que los hooks listados en la tabla "Donde aplica el filtrado" invocan la función.
|
|
120
|
+
- **Anidar tags esperando filtrado recursivo**: escribir `<private>contexto <secreto>token</secreto> mas contexto</private>` puede comportarse de forma inesperada, dejando el contenido anidado sin filtrar o rompiendo la estructura. Causa: los tags anidados no están soportados en el parser actual; procesar recursivamente expone el riesgo de parsing ambiguo. Solución: usar un solo nivel de tag por bloque; si hace falta marcar varios tipos de sensibilidad, separar en bloques independientes consecutivos.
|
|
121
|
+
- **Usar mayúsculas en los tags**: `<PRIVATE>contenido</PRIVATE>` no se filtra y el contenido se persiste en claro. Causa: el filtrado es case-sensitive por diseño (evita costo de regex case-insensitive sobre textos largos). Solución: siempre minúsculas `<private>`, `<secreto>`, `<privado>`; si el tag debe aparecer en un contexto de plantilla en inglés que exige mayúsculas, cambiar el contexto, no el tag.
|
|
122
|
+
- **Dejar tags malformados sin cierre**: `<private>texto sin cierre` se ignora silenciosamente y el contenido queda visible en el archivo persistido. Causa: el parser exige tag de cierre; contenido con apertura sin cierre se trata como texto literal, no como bloque privado. Solución: verificar siempre el tag de cierre antes de escribir contenido crítico; si se genera texto programáticamente, validar balance de tags antes de enviar a `filtrarPrivacidad()`.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Anti-patrones
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
# MAL: usar tags para ocultar credenciales reales de producción
|
|
130
|
+
DATABASE_URL=<secreto>postgresql://prod:realpassword@host/db</secreto>
|
|
131
|
+
|
|
132
|
+
# MAL: tag anidado
|
|
133
|
+
<private>contexto <secreto>token</secreto> mas contexto</private>
|
|
134
|
+
|
|
135
|
+
# MAL: confiar en el filtrado si el hook no lo invoca explícitamente
|
|
136
|
+
# (el filtrado NO es automático, requiere llamada explícita a filtrarPrivacidad())
|
|
137
|
+
|
|
138
|
+
# BIEN: marcar información de sesión que no debe aprenderse
|
|
139
|
+
Durante la sesión use <private>el token temporal X para la API de staging</private>
|
|
140
|
+
El patrón que aprendí fue: siempre validar el schema antes de persistir.
|
|
141
|
+
```
|