Communitygithub.com

lguidolin/postgres-postgraphile-rls-and-sql

À utiliser lors de l'écriture de PostgreSQL, de la configuration PostGraphile, des politiques Row-Level Security, des fichiers de schéma SQL, ou lorsque vous travaillez sur le chemin de données Navigateur→App→PostGraphile→Postgres. Mots-clés — RLS, SECURITY DEFINER, search_path, pgSettings, grants, roles, limite de profondeur GraphQL, coût de requête, statement_timeout, organisation des fichiers SQL.

Qu'est-ce que postgres-postgraphile-rls-and-sql ?

Ce skill définit les conventions et les mécanismes de la couche de données d'une stack basée sur PostGraphile et PostgreSQL. Il impose un **chemin de données unique** (Navigateur → Serveur d'application → PostGraphile → PostgreSQL) et applique le principe de **défense en profondeur** où le Row-Level Security (RLS) constitue le dernier rempart infranchissable. Il couvre les règles de sécurité essentielles (utilisation de `SECURITY DEFINER` avec `search_path` explicite, modélisation des rôles correspondant aux états de session, interdiction des chaînes vides au profit de `NULL`) ainsi que la protection contre les dénis de service via des limites de profondeur de requête, d'analyse de coût et de `statement_timeout`. Il impose également un style SQL rigoureux (un objet par fichier, organisation `schéma/type_objet/nom`, commentaires `COMMENT ON` systématiques) et traite les types et rôles comme des données extensibles par clés étrangères plutôt que des contraintes codées en dur.

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Postgres, PostGraphile, RLS et SQL

Aperçu

Mécanisme de la couche de données pour cette stack. Implémente la défense en profondeur (RLS comme dernier rempart) et le chemin de données unique légal. Spécifique à la stack — ne s'applique pas aux projets sans PostGraphile/Postgres.

Le Chemin de Données

Navigateur → Serveur d'application → PostGraphile → PostgreSQL. Exactement un chemin légal.

  • Le navigateur ne communique jamais directement avec GraphQL/la base de données ; le serveur d'application n'interroge jamais la base de données directement pour les données applicatives.
  • Le serveur d'application transmet le contexte de session uniquement comme en-têtes (id utilisateur, indication d'organisation) — aucune logique d'autorisation dans l'application ; le contexte est validé en aval, non considéré comme fiable.
  • Un seul chemin = un seul endroit où imposer le contexte d'authentification, la validation et le RLS. Les canaux secondaires sont les trous qui contournent cette imposition.

Règles de Sécurité

  • Le RLS est la couche d'imposition finale. Les vérifications au niveau applicatif sont de l'UX ; la base de données est le mur. Même un bogue dans les couches supérieures ne peut pas fuiter des lignes d'un autre locataire.
  • Les rôles modélisent des états de session réels — non-connecté, connecté-sans-organisation, connecté-avec-organisation, un rôle de connexion uniquement, un rôle de migration uniquement. Les rôles ont une signification.
  • Le rôle de connexion privilégié n'exécute jamais de requêtes applicatives. Les requêtes applicatives sont exécutées sous un rôle contraint, soumis au RLS.
  • Les fonctions SECURITY DEFINER définissent search_path directement dans leur définition — à chaque fois, sans exception.
  • L'absence est NULL, jamais une chaîne vide. Les sentinelles à chaîne vide sont interdites ; omettre la valeur en cas d'absence.
  • GraphQL est une surface de déni de service — limitez-la. Imposez des limites de profondeur de requête et une analyse de coût/complexité ; rejetez les requêtes hors budget. Limitez la taille de la pagination. Définissez un statement_timeout pour les rôles applicatifs. Désactivez l'introspection en production sauf si délibérément nécessaire.

Style SQL

  • Un objet par fichier — chaque table, fonction, politique, ensemble de privilèges dans son propre fichier.
  • Organisé par schéma/type_objet/nom — le répertoire reflète l'organisation de la base de données.
  • L'ordre d'inclusion suit l'ordre des dépendances ; le manifeste d'inclusion est la table des matières.
  • Documentez en ligne. COMMENT ON vit dans le même fichier que l'objet — quoi et pourquoi.
  • Alias descriptifs (singulier du nom de la table, pas de lettres uniques) ; suivez les idiomes Postgres (current_* getters).
  • Les types et les rôles destinés à l'utilisateur sont des données, pas des contraintes codées en dur — tables de référence avec clé/libellé/description, validées par clé étrangère, extensibles sans changement de schéma.

Référence Rapide

RègleVérification
Nouvelle fonction SECURITY DEFINERsearch_path défini en ligne ?
Nouvelle table avec données de locatairePolitique RLS + tests de refus (voir graphql-contract-testing) ?
Valeur absenteNULL, pas '' ?
Nouvelle surface GraphQLLimite de profondeur/coût et limite de pagination ?
Nouvel objetFichier propre, inclusion triée par dépendance, COMMENT ON en ligne ?

Raisonnement complet : Articles XIII, XIV, XVIII de la constitution, groupés dans engineering-constitution/references/engineering-constitution.md. Migrations : zero-downtime-migrations. Tests de contrat : 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 associés