Communitygithub.com

lguidolin/resiliencia-y-seguridad-en-despliegues

Úsalo al planificar un despliegue, diseñar una reversión, responder a un incidente o redactar una autopsia. Palabras clave: seguridad en despliegues, reversión, artefacto inmutable, entrega progresiva, canary, radio de explosión, respuesta a incidentes, autopsia sin culpa, presupuesto de errores.

¿Qué es resiliencia-y-seguridad-en-despliegues?

Esta habilidad está diseñada para ayudar a desarrolladores y agentes de IA a gestionar despliegues de manera segura, responder a incidentes y aprender de los fallos. Se centra en tres áreas principales: seguridad en despliegues (artefactos inmutables, exposiciones progresivas, reversiones verificadas), respuesta a incidentes (clasificación por gravedad, autopsias sin culpa, presupuesto de errores) y coordinación entre cambios de infraestructura y aplicación mediante el patrón expandir/contraer. Es útil para equipos que despliegan software en producción, especialmente en proyectos con usuarios reales, independientemente de la plataforma (contenedores, sitios estáticos, plataformas gestionadas). La habilidad promueve que cada despliegue sea reversible, que las reversiones se prueben antes de un cambio riesgoso y que los incidentes se traten como oportunidades de aprendizaje sistémico. Funciona mejor cuando se combina con habilidades complementarias como `zero-downtime-migrations` y `recording-decisions`, y su implementación concreta puede variar según la pila tecnológica (Kubernetes, serverless, etc.).

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/lguidolin/agent-skills/tree/main/skills/resilience-and-deploy-safety

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Resiliencia y Seguridad en Despliegues

Resumen

Las cosas se romperán. La postura no es "prevenir todo fallo" sino fallar poco, recuperarse rápido y aprender cada vez. La fiabilidad no es la ausencia de fallos; es el radio de explosión acotado y el tiempo de recuperación corto cuando el fallo llega.

Seguridad en Despliegues — Cada Despliegue Reversible y Expuesto Progresivamente

  • El artefacto es inmutable y se promociona, no se reconstruye. Una imagen, construida una vez en CI e identificada por su digest de contenido, se mueve vista previo → staging → producción sin cambios. Reconstruir por entorno significa desplegar algo que nunca probaste.
  • Las etiquetas son punteros mutables; el digest es la identidad. Una etiqueta puede sobrescribirse y apuntar silenciosamente a otro lugar. Un digest de contenido no puede. Cada entorno registra el digest que validó, y producción ejecuta solo un digest que un entorno inferior validó — así, "lo exacto que probamos" es una propiedad que el pipeline impone, no una disciplina que alguien deba recordar.
  • Una decisión humana precede a producción. Para un mantenedor único esto es una pausa deliberada y un registro de auditoría, no una separación de funciones. Di cuál es; no lo sobredimensiones.
  • La versión en ejecución se inyecta en tiempo de despliegue, nunca se hornea en la imagen. Una versión horneada como argumento de construcción fuerza una reconstrucción para marcar un lanzamiento, y la reconstrucción es exactamente lo que la promoción existe para evitar.
  • Cuando la infraestructura vive en su propio repositorio, coordínala mediante expandir/contraer. La infraestructura se expande primero (aditiva, compatible hacia atrás), la aplicación consume la nueva capacidad en un despliegue posterior, y la infraestructura se contrae solo cuando ningún artefacto en vivo depende de la forma anterior — la misma disciplina que un cambio de esquema (ver zero-downtime-migrations). El invariante: nunca envíes un artefacto de aplicación que requiera un cambio de infraestructura aún no activo. Cumpliendo esto, cada repositorio es independientemente reversible, lo que hace que la reversión sea manejable cuando ambos están desincronizados.
  • Avanzar solo cuando puedas retroceder. Existe una ruta de reversión y se prueba antes de que se envíe un cambio riesgoso. "¿Cómo deshacemos esto?" se responde en el plan, no durante el incidente.
  • Reversión es redesplegar el digest previamente bueno. Ese digest todavía está en el registro y sigue siendo inmutable, por lo que revertir es promoción inversa — nunca una reconstrucción, y nunca una reconstrucción "como era".
  • Exposición progresiva. Las nuevas versiones llegan a los usuarios gradualmente (despliegue controlado por salud, canario donde sea compatible), por lo que un lanzamiento malo daña a una fracción, no a todos.
  • Los cambios de esquema están desacoplados de los despliegues de código y siguen expandir/contraer (ver zero-downtime-migrations). Un despliegue nunca debe requerir una migración destructiva simultánea.
  • Una lista de verificación previa al despliegue controla producción: observabilidad en su lugar, reversión verificada, migraciones seguras para expansión, SLOs no rotos.

Respuesta a Incidentes — El Fracaso es una Entrada de Aprendizaje

  • Clasifica por gravedad y responde proporcionalmente; ten un camino conocido para involucrar a las personas adecuadas.
  • Autopsias sin culpa para cada incidente visible para el usuario. Cronología escrita, causas contribuyentes (sistémicas, no personales), elementos de acción concretos. La pregunta es "¿qué parte del sistema permitió que esto sucediera?", nunca "¿quién la cagó?".
  • Los elementos de acción se rastrean, no se olvidan — fluyen hacia el documento de Consideraciones Futuras (ver recording-decisions) y se convierten en trabajo real.
  • El presupuesto de errores gobierna. Cuando se agota la fiabilidad, el trabajo de fiabilidad supera a las funciones hasta que el presupuesto se recupera.

Referencia Rápida

Antes de un despliegue riesgosoConfirmar
ArtefactoConstruido una vez en CI; promocionado por digest; el mismo que staging validó
PuertaUna decisión humana registrada antes de producción
ReversiónLa ruta existe y está probada
ExposiciónGradual/canario, no todo a la vez
EsquemaSeguro para expansión, desacoplado del despliegue de código
Observabilidad¿Puedes ver si algo va mal?

Cuándo escalar esto

Los proyectos locales o previos al lanzamiento escriben estas reglas ahora, se activan en los primeros usuarios reales. Las propiedades son portátiles — construir una vez, promocionar lo probado, decidir antes de producción, poder revertir — pero los mecanismos no lo son: una promoción por digest tiene sentido en un host de contenedores y es en gran medida irrelevante para un sitio estático, y una plataforma gestionada puede proporcionar entornos de vista previa y reversión instantánea de forma gratuita. Nombra el mecanismo en la habilidad de entrega del proyecto; mantén la propiedad aquí. Mecanismos de pila (sondas de k8s, canary, entornos por PR): cloud-delivery-aks.

Razonamiento completo: Artículo XII de la constitución, empaquetado en engineering-constitution/references/engineering-constitution.md.

Individual skills in this repo

This repo contains 18 individual skills — each has its own dedicated page.

lguidolin/change-hygiene-and-code-craft

Use when writing or refactoring code, structuring a commit or PR, or deciding whether to abstract duplication. Symptoms — mixing reorg with logic changes, a PR doing several things at once, a file growing large, the second copy of similar code, or unsure whether to DRY something up.

lguidolin/cloud-delivery-aks

Use when deploying to Kubernetes or Azure Kubernetes Service (AKS), configuring cloud secrets, setting up progressive rollout/canary, per-PR ephemeral environments, or k8s health probes. Keywords — Kubernetes, AKS, Key Vault, Argo Rollouts, Flagger, canary, blue-green, liveness, readiness, PodDisruptionBudget, HPA, rollback, GHCR.

lguidolin/commit-history-rewrite

Use when an existing repository has messy commit history that needs to conform to conventional commits before adopting release-please, or when intermediate WIP/fixup/merge commits need to be cleaned up.

lguidolin/conventional-commits-and-releases

Use when committing, writing a commit message, opening a PR that will be squash-merged, or configuring automated versioning/changelogs. Keywords — conventional commits, release-please, semver, feat/fix/chore, breaking change, changelog.

lguidolin/defense-in-depth-security

Use when handling untrusted input, secrets, authentication/authorization, or dependencies — or threat-modeling a new surface. Keywords — STRIDE, threat model, least privilege, secrets management, supply chain, dependency scanning, input validation, audit log, defense in depth.

lguidolin/designing-before-building

Use when starting a feature, fixing a non-trivial bug, or about to write implementation code — before any code exists. Symptoms you need this: "this is simple, I'll just code it", reaching for the editor before a design is approved, or an idea that hasn't been turned into a spec and plan.

lguidolin/engineering-constitution

Use when starting work in a project that follows the engineering constitution, orienting to its rules, or deciding which engineering practice applies to a task — spec writing, commits, testing, security, deploys, database, or UI work.

lguidolin/graphql-contract-testing

Use when writing a GraphQL query/mutation that the UI and a test will share, or building route/schema contract or smoke tests. Symptoms — copying a query into a test, a test asserting on query text, schema change that didn't break the UI build, or RLS/permission drift. Keywords — graphql-codegen, typed document, contract test, route smoke test.

lguidolin/init-repo-CI

Use when setting up a new repository with conventional commits, release-please, and CI automation, or when retrofitting an existing repository that lacks automated versioning and PR validation workflows.

lguidolin/interface-craft-and-accessibility

Use when building or styling UI — components, layouts, forms, design tokens — or making accessibility decisions. Keywords — a11y, WCAG, keyboard navigation, focus state, contrast, design system, minimalist UI, component reuse, ARIA, semantic HTML.

lguidolin/merge-gates-and-automation

Use when setting up or changing CI, pre-push hooks, or a task runner, or deciding what must pass before merge. Symptoms — tempted to put authoritative checks only in a local hook, skip CI, bypass with --no-verify, or unsure what gates a merge vs. runs locally.

lguidolin/observability-and-slos

Use when adding logging, metrics, tracing, health checks, SLOs, or alerting — or when building a service surface that needs to be operable and debuggable. Keywords — structured logs, OpenTelemetry, correlation id, RED metrics, liveness, readiness, SLI, SLO, error budget, alerting.

lguidolin/performance-and-scale

Use when working on hot paths, list endpoints, pagination, data-access in loops, or public interfaces/schemas. Symptoms — unbounded queries, N+1 access, no latency budget, optimizing without measuring, or changing an interface many consumers depend on. Keywords — pagination, N+1, Hyrum's Law, performance budget, bundle size.

lguidolin/postgres-postgraphile-rls-and-sql

Use when writing PostgreSQL, PostGraphile config, Row-Level Security policies, SQL schema files, or working on the Browser→App→PostGraphile→Postgres data path. Keywords — RLS, SECURITY DEFINER, search_path, pgSettings, grants, roles, GraphQL depth limit, query cost, statement_timeout, SQL file organization.

lguidolin/recording-decisions

Use when a design or architecture decision has been made and needs to be captured — writing a decision record or ADR, updating a decision index, noting a deferred idea, or superseding a past decision. Keywords — ADR, decision record, rationale, rejected alternatives, dependency index.

lguidolin/ship-it

Use when the user wants to ship work — push, PR, archive decision records, merge, and clean up. Handles the full lifecycle from committing final changes through post-merge cleanup including converting specs/plans to compact decision records.

lguidolin/tests-as-a-control

Use when writing or modifying tests, when a test breaks during a refactor, or when testing permission/role rules. Symptoms — tempted to edit a test to make it pass, testing only the happy path, a deny-test that started passing, flaky tests, or unsure what to assert.

lguidolin/zero-downtime-migrations

Use when changing a database schema where data must survive the change — adding/removing/renaming columns, constraints, indexes, or backfilling. Symptoms — a destructive migration bundled with a code deploy, a NOT NULL column with a backfill, a table-locking UPDATE, or a rename. Keywords — expand/contract, parallel change, backfill, NOT VALID, CREATE INDEX CONCURRENTLY, graphile-migrate.

Skills relacionados