Communitygithub.com

lguidolin/validación-puertas-y-automatización

Úsalo al configurar o modificar CI, ganchos pre-push o un gestor de tareas, o al decidir qué debe aprobarse antes de fusionar. Síntomas: intentar poner comprobaciones autoritativas solo en un gancho local, saltarse CI, usar --no-verify, o no tener claro qué verifica antes de fusionar y qué se ejecuta localmente.

¿Qué es validación-puertas-y-automatización?

Este skill proporciona pautas claras para diseñar la tubería de verificación de un proyecto, estableciendo que **CI es la fuente de verdad** y los ganchos locales son espejos de conveniencia. Define reglas para tareas, modos de aplicación (`enforced` vs `advisory`), y jerarquización de comprobaciones para mantener la velocidad. Ayuda a evitar racionalizaciones comunes como mover verificaciones autoritativas a ganchos evadibles o construir imágenes fuera de CI. Soporta cualquier plataforma con CI e integra conceptos de la constitución de ingeniería del repositorio.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/lguidolin/agent-skills/tree/main/skills/merge-gates-and-automation

Preguntar en tu IA favorita

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

Documentación

Puerta de verificación y automatización

Resumen

Dónde vive la verificación y qué la hace real. CI es la fuente de verdad; el gancho local es un espejo de conveniencia. Una regla que no es aplicada por una puerta ineludible es una sugerencia (Principio 7) — así que cuando la plataforma no puede proporcionar esa puerta, el proyecto declara el modo advisory y lleva la regla deliberadamente, en lugar de asumir la maquinaria que no tiene.

Las reglas

  • Un único gestor de tareas es la entrada canónica a toda operación cotidiana — test, build, dev, deploy son recetas con nombre. Un procedimiento que solo existe en la cabeza de alguien no ocurre de forma confiable y no se puede delegar a un agente.
  • CI es la fuente de verdad — autoritativo, compartido e ineludible siempre que la plataforma lo permita. Lint, verificación de tipos, comprobaciones de contratos, pruebas, escaneos de seguridad, validación de commits: todo se ejecuta aquí y debe aprobarse antes de fusionar en modo enforced. Lo que dice CI es lo que cuenta. En modo advisory las mismas comprobaciones se ejecutan y reportan; la puerta es la disciplina, y eso nunca es motivo para hacer menos comprobaciones.
  • El gancho pre-push es un espejo de presubmit, no un muro. Ejecuta las mismas comprobaciones rápidas localmente para que probablemente pases CI antes de subir. Es explícitamente evadible (--no-verify) y solo se ejecuta donde esté instalada la cadena de herramientas. Su trabajo es velocidad y retroalimentación temprana, no aplicación. El gancho nunca puerta; CI puerta donde la plataforma lo permita.
  • Mantén CI rápido jerarquizando, no eliminando comprobaciones. Cuando el conjunto completo supera lo razonable para cada PR, divide presubmit (subconjunto rápido, bloquea PR) de postsubmit (conjunto completo, después de fusionar, bloquea promoción) — nunca muevas comprobaciones autoritativas de vuelta al gancho evadible.
  • Las imágenes de contenedor se construyen en CI, identificadas por digest de contenido y publicadas con una atestación de proveniencia. Mantenlo asequible con capas de registro en caché o un ejecutown autogestionado — nunca moviendo la construcción a un portátil, donde la proveniencia del artefacto no puede ser verificada por nadie más.
  • Declara el modo de aplicación. enforced — CI bloquea la fusión mediante protección de rama; lo que dice CI es lo que cuenta. advisory — CI se ejecuta y reporta, y la puerta es la disciplina, porque la protección de rama no está disponible (un repositorio privado en un plan gratuito). Advisory es legítimo; reclamar aplicación que no tienes no lo es. Indica el modo en el primer registro de decisión del proyecto, y qué lo movería a modo enforced.

La tensión nombrada

Un presubmit local evadible es rápido pero no aplicable; CI autoritativo es aplicable pero más lento. Resuelve dando a cada uno un mandato diferente — el gancho optimiza el bucle interno, CI la corrección del registro — y haciendo que CI, no el gancho, sea lo que bloquea una fusión.

Racionalizaciones comunes

ExcusaRealidad
"El gancho pre-push ejecuta las pruebas, así que CI puede ser mínimo"El gancho es evadible y depende de la cadena de herramientas. No puede ser la fuente de verdad. CI debe volver a ejecutar todo.
"Solo usaré --no-verify esta vez"Bien — porque CI igual lo detectará. Exactamente por eso CI, no el gancho, es la puerta.
"CI es lento, movamos las pruebas al gancho"Jerarquiza CI (presubmit/postsubmit); nunca traslades comprobaciones autoritativas a una puerta evadible.
"Las builds de CI son lentas, construiré la imagen localmente"Un artefacto construido en un portátil lleva una proveniencia que nadie más puede verificar. Soluciona la latencia con un caché de capas o un ejecutown autogestionado.
"La protección de rama cuesta dinero, así que las reglas no aplican"Las reglas aplican; la aplicación difiere. Declara modo advisory y mantén la disciplina, o haz el repositorio público y obtén protección gratis.

Banderas rojas — DETENTE

  • Comprobaciones autoritativas que existen solo en un gancho local
  • CI que no vuelve a ejecutar lo que ejecutó el gancho
  • Una fusión permitida mientras CI está rojo
  • Una imagen construida en cualquier lugar excepto CI, o promovida por tag en lugar de por digest
  • Un proyecto que actúa como si CI puerta la fusión cuando no existe protección de rama

Razonamiento completo: Artículo VIII de la constitución, incluido en engineering-constitution/references/engineering-constitution.md. Detalles de deploy/k8s: cloud-delivery-aks.

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/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/resilience-and-deploy-safety

Use when planning a deploy, designing a rollback, or responding to an incident or writing a postmortem. Keywords — deploy safety, rollback, immutable artifact, progressive delivery, canary, blast radius, incident response, blameless postmortem, error budget.

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