Communitygithub.com

lguidolin/performance-and-scale

À utiliser pour les chemins chauds, les points de terminaison de listes, la pagination, l'accès aux données dans les boucles, ou les interfaces/schémas publics. Symptômes : requêtes non bornées, accès N+1, absence de budget de latence, optimisation sans mesure, ou modification d'une interface dont dépendent de nombreux consommateurs. Mots-clés : pagination, N+1, loi de Hyrum, budget de performance, taille de bundle.

Qu'est-ce que performance-and-scale ?

Cette compétence guide les développeurs dans la conception et l'optimisation de systèmes capables de passer à l'échelle, en mettant l'accent sur la mesure, la budgétisation et le respect des contrats implicites. Elle est utile pour les chemins chauds, les points de terminaison de listes, les boucles d'accès aux données et les interfaces publiques. Les plateformes supportées incluent GraphQL, DataLoader, et les processus CI. Le fonctionnement repose sur des principes clés : définir des budgets de performance (latence, taille de bundle), mesurer avant d'optimiser via des profils et plans de requêtes, paginer par défaut toutes les listes non bornées, et éviter les motifs N+1 par le batching ou les jointures. La loi de Hyrum est un avertissement central : tout comportement observable d'une interface devient un contrat. Par conséquent, les modifications d'API doivent se faire par ajout/dépréciation, jamais par modification silencieuse. La vérification est assurée en CI pour les contraintes mécanisables (taille de bundle, coût de requête), et par relecture humaine pour la pagination et les N+1, avec une mention directe vers la constitution d'ingénierie.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/lguidolin/agent-skills/tree/main/skills/performance-and-scale

Demander à votre IA préférée

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

Documentation

Performance et Passage à l'Échelle

Vue d'Ensemble

La performance est une fonctionnalité avec un budget. Mesurez-la, bornez-la, et respectez que les comportements d'aujourd'hui deviennent les contrats de demain. Les systèmes tombent rarement au débit pour lequel vous les avez conçus — ils tombent sur la requête que vous n'avez pas indexée et la liste que vous n'avez pas paginée.

Les Principes

  • Définissez des budgets et mesurez-les. Cibles de latence (liées aux SLO de observability-and-slos) et budgets clients (ex. taille de bundle). Une régression au-delà du budget est un bug.
  • Mesurez avant d'optimiser. Trouvez le vrai goulot d'étranglement avec des données — profils, plans de requête, traces — avant de modifier le code. Pas d'optimisation spéculative.
  • Paginer par défaut. Toute liste susceptible de croître est paginée avec une taille de page plafonnée. Les ensembles de résultats non bornés sont un risque de latence et de déni de service.
  • Méfiez-vous des motifs d'accès N+1. Les données récupérées en boucle sont la cause la plus fréquente de défaillance de passage à l'échelle ; faites du traitement par lots ou des jointures à la place. (Sur cette pile : utilisez le look-ahead/DataLoader de la couche GraphQL plutôt qu'une résolution par ligne.)
  • La loi de Hyrum est réelle : tout comportement observable d'une interface devient un contrat dont quelqu'un dépend dès qu'elle a assez de consommateurs — y compris des comportements que vous n'avez jamais intentionnellement créés (ordre, nullabilité, formes d'erreur, timing). Traitez les interfaces publiques (l'API/schéma en particulier) comme des contrats : ajoutez et dépréciez, ne modifiez pas en silence. Les tests de contrat de graphql-contract-testing figent les comportements que vous avez choisis ; la discipline protège ceux que vous n'avez pas choisis.

Référence Rapide

SymptômeCorrection
Requête dans une boucleTraitement par lots ou jointure ; utiliser le look-ahead
Point de terminaison de liste sans limiteAjouter une pagination plafonnée
"Laissez-moi optimiser ça" sans mesureProfiler d'abord ; trouver le vrai goulot
Modifier le type/nullabilité/ordre d'un champC'est un changement de contrat — ajouter le nouveau, déprécier l'ancien
Pas d'objectif de latence ou de taille de bundleDéfinir un budget ; traiter les régressions comme des bugs

Application : budgets vérifiés en CI là où c'est mécanisable (limites de taille de bundle, limites de coût de requête) ; la pagination et l'évitement des N+1 relèvent du jugement du relecteur, appuyé par des tests de charge et une revue des plans de requête.

Raisonnement complet : Article XI de la constitution, disponible dans 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/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 associés