Communitygithub.com

lguidolin/postgres-postgraphile-rls-and-sql

Úsalo al escribir PostgreSQL, configuración de PostGraphile, políticas de seguridad a nivel de filas (RLS), archivos SQL o al trabajar en la ruta de datos Navegador→App→PostGraphile→Postgres. Palabras clave: RLS, SECURITY DEFINER, search_path, pgSettings, grants, roles, límite de profundidad en GraphQL, costo de consulta, statement_timeout, organización de archivos SQL.

¿Qué es postgres-postgraphile-rls-and-sql?

Este skill define el mecanismo de capa de datos para stacks que usan PostgreSQL, PostGraphile y RLS, estableciendo una **única ruta de datos legal**: Navegador → Servidor de aplicación → PostGraphile → PostgreSQL. Su objetivo es implementar **defensa en profundidad**, donde RLS actúa como el muro final de seguridad, y cualquier error en capas superiores no puede filtrar datos de otros inquilinos. Es compatible con plataformas como Claude Code, Cursor y Codex, y se basa en un conjunto de reglas estrictas: los roles modelan estados de sesión reales, las funciones `SECURITY DEFINER` deben establecer `search_path` en su definición, y los valores ausentes se representan con `NULL` en lugar de cadenas vacías. Además, aborda la seguridad a nivel de GraphQL mediante límites de profundidad, análisis de costo/complejidad, y `statement_timeout` para roles de aplicación. El skill también prescribe un estilo SQL organizado con un objeto por archivo, estructura de directorios que refleja la base de datos, e inclusión ordenada por dependencias, con comentarios inline usando `COMMENT ON`.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/lguidolin/agent-skills/tree/main/skills/postgres-postgraphile-rls-and-sql

Preguntar en tu IA favorita

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

Documentación

Postgres, PostGraphile, RLS y SQL

Resumen

Mecanismo de capa de datos para este stack. Implementa defensa en profundidad (RLS como muro final) y la única ruta de datos legal. Específico del stack: no aplica a proyectos sin PostGraphile/Postgres.

La Ruta de Datos

Navegador → Servidor de aplicación → PostGraphile → PostgreSQL. Exactamente una ruta legal.

  • El navegador nunca habla directamente con GraphQL/BD; la aplicación nunca consulta la BD directamente para datos de aplicación.
  • La aplicación pasa contexto de sesión solo como cabeceras (id de usuario, pista de organización) — sin lógica de autorización en la aplicación; el contexto se valida aguas abajo, no se confía en él.
  • Una sola ruta = un solo lugar para imponer contexto de autenticación, validación y RLS. Los canales laterales son los agujeros que eluden la imposición.

Reglas de Seguridad

  • RLS es la capa de imposición final. Las comprobaciones a nivel de aplicación son de UX; la base de datos es el muro. Incluso un error en las capas superiores no puede filtrar filas de otro inquilino.
  • Los roles modelan estados de sesión reales — no-autenticado, autenticado-sin-organización, autenticado-con-organización, un rol solo de conexión, un rol solo de migraciones. Los roles significan algo.
  • El rol de conexión privilegiado nunca ejecuta consultas de aplicación. Las consultas de aplicación se ejecutan bajo un rol restringido y sujeto a RLS.
  • Las funciones SECURITY DEFINER establecen search_path en línea en su definición — cada vez, sin excepciones.
  • La ausencia es NULL, nunca una cadena vacía. Los centinelas de cadena vacía están prohibidos; omite el valor cuando esté ausente.
  • GraphQL es una superficie de Denegación de Servicio (DoS) — delimítalo. Impón límites de profundidad de consulta y análisis de costo/complejidad; rechaza consultas que excedan el presupuesto. Limita el tamaño de paginación. Establece un statement_timeout de BD para roles de aplicación. Desactiva la introspección en producción a menos que sea deliberadamente necesario.

Estilo SQL

  • Un objeto por archivo — cada tabla, función, política, concesión en su propio archivo.
  • Organizado por schema/tipo_objeto/nombre — el directorio refleja la organización de la base de datos.
  • El orden de inclusión es el orden de dependencias; el manifiesto de inclusión es la tabla de contenidos.
  • Documenta en línea. COMMENT ON vive en el mismo archivo que el objeto — qué y por qué.
  • Alias descriptivos (singular del nombre de la tabla, no letras sueltas); sigue los modismos de Postgres (getters current_*).
  • Los tipos y roles orientados al usuario son datos, no restricciones codificadas — tablas de búsqueda con clave/etiqueta/descripción, validadas por FK, extensibles sin cambios de esquema.

Referencia Rápida

ReglaComprobación
Nueva función SECURITY DEFINER¿search_path establecido en línea?
Nueva tabla con datos de inquilino¿Política RLS + pruebas de denegación (ver graphql-contract-testing)?
Valor ausente¿NULL, no ''?
Nueva superficie GraphQL¿Límite de profundidad/costo y límite de paginación?
Nuevo objeto¿Archivo propio, inclusión ordenada por dependencias, COMMENT ON en línea?

Razonamiento completo: Artículos XIII, XIV, XVIII de la constitución, empaquetados en engineering-constitution/references/engineering-constitution.md. Migraciones: zero-downtime-migrations. Pruebas de contrato: graphql-contract-testing.

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/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