@neikyun/ciel 6.11.2 → 6.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/assets/.claude/agents/ciel-critic.md +71 -12
  2. package/assets/.claude/agents/ciel-explorer.md +59 -18
  3. package/assets/.claude/agents/ciel-improver.md +6 -3
  4. package/assets/.claude/agents/ciel-researcher.md +85 -25
  5. package/assets/.claude/hooks/block-destructive.sh +2 -2
  6. package/assets/.claude/hooks/check-test-first.sh +2 -2
  7. package/assets/.claude/hooks/memory-bootstrap.sh +0 -0
  8. package/assets/.claude/hooks/memory-engine.py +82 -15
  9. package/assets/.claude/hooks/post-tool-write.sh +32 -0
  10. package/assets/.claude/hooks/pre-agent-gate.sh +11 -6
  11. package/assets/.claude/hooks/pre-compact.sh +18 -0
  12. package/assets/.claude/hooks/pre-tool-write.sh +56 -31
  13. package/assets/.claude/hooks/session-start.sh +22 -1
  14. package/assets/.claude/hooks/session-version-check.sh +1 -1
  15. package/assets/.claude/hooks/stop.sh +104 -0
  16. package/assets/.claude/hooks/subagent-stop.sh +54 -0
  17. package/assets/.claude/hooks/track-file.sh +2 -2
  18. package/assets/.claude/hooks/user-prompt-submit.sh +11 -15
  19. package/assets/.claude/settings.json +18 -4
  20. package/assets/AGENTS.md +1 -1
  21. package/assets/CLAUDE.md +103 -175
  22. package/assets/commands/ciel-audit.md +58 -399
  23. package/assets/commands/ciel-create-skill.md +24 -38
  24. package/assets/commands/ciel-eval.md +25 -37
  25. package/assets/commands/ciel-init.md +36 -126
  26. package/assets/commands/ciel-status.md +22 -19
  27. package/assets/commands/ciel-update.md +20 -39
  28. package/assets/platforms/opencode/.opencode/agents/ciel-researcher.md +71 -895
  29. package/assets/platforms/opencode/.opencode/commands/ciel-audit.md +58 -296
  30. package/assets/platforms/opencode/.opencode/commands/ciel-create-skill.md +24 -46
  31. package/assets/platforms/opencode/.opencode/commands/ciel-eval.md +25 -45
  32. package/assets/platforms/opencode/.opencode/commands/ciel-init.md +36 -131
  33. package/assets/platforms/opencode/.opencode/commands/ciel-status.md +22 -24
  34. package/assets/platforms/opencode/.opencode/commands/ciel-update.md +20 -40
  35. package/assets/platforms/opencode/AGENTS.md +4 -4
  36. package/assets/rules/security.md +30 -0
  37. package/assets/rules/testing.md +23 -0
  38. package/assets/skills/agile/SKILL.md +42 -0
  39. package/assets/skills/alerting/SKILL.md +55 -0
  40. package/assets/skills/api-design/SKILL.md +46 -0
  41. package/assets/skills/appsec/SKILL.md +43 -0
  42. package/assets/skills/architecture/SKILL.md +74 -0
  43. package/assets/skills/backend/SKILL.md +41 -0
  44. package/assets/skills/backup-recovery/SKILL.md +42 -0
  45. package/assets/skills/caching/SKILL.md +44 -0
  46. package/assets/skills/cdn/SKILL.md +42 -0
  47. package/assets/skills/chaos/SKILL.md +41 -0
  48. package/assets/skills/cicd-pipeline/SKILL.md +56 -0
  49. package/assets/skills/cloud/SKILL.md +42 -0
  50. package/assets/skills/code-quality/SKILL.md +42 -0
  51. package/assets/skills/code-review/SKILL.md +41 -0
  52. package/assets/skills/communication/SKILL.md +42 -0
  53. package/assets/skills/containers/SKILL.md +42 -0
  54. package/assets/skills/cqrs/SKILL.md +41 -0
  55. package/assets/skills/crypto/SKILL.md +46 -0
  56. package/assets/skills/data-engineering/SKILL.md +42 -0
  57. package/assets/skills/database-design/SKILL.md +46 -0
  58. package/assets/skills/ddd/SKILL.md +45 -0
  59. package/assets/skills/deployment-strategies/SKILL.md +51 -0
  60. package/assets/skills/desktop/SKILL.md +42 -0
  61. package/assets/skills/devsecops/SKILL.md +43 -0
  62. package/assets/skills/event-driven/SKILL.md +46 -0
  63. package/assets/skills/frontend/SKILL.md +41 -0
  64. package/assets/skills/functional/SKILL.md +42 -0
  65. package/assets/skills/high-availability/SKILL.md +42 -0
  66. package/assets/skills/iac/SKILL.md +46 -0
  67. package/assets/skills/logging/SKILL.md +46 -0
  68. package/assets/skills/meta/ciel-improve/SKILL.md +127 -0
  69. package/assets/skills/meta/learnings-capture/SKILL.md +105 -0
  70. package/assets/skills/meta/patch-spec/patch-spec.md +50 -0
  71. package/assets/skills/meta/skill-creator/SKILL.md +115 -0
  72. package/assets/skills/meta/skill-freshness-auditor/SKILL.md +164 -0
  73. package/assets/skills/meta/skill-variant-evaluator/SKILL.md +100 -0
  74. package/assets/skills/meta/skills-first-design-auditor/SKILL.md +192 -0
  75. package/assets/skills/ml-engineering/SKILL.md +42 -0
  76. package/assets/skills/mobile/SKILL.md +42 -0
  77. package/assets/skills/monitoring/SKILL.md +54 -0
  78. package/assets/skills/networking/SKILL.md +42 -0
  79. package/assets/skills/nosql/SKILL.md +41 -0
  80. package/assets/skills/oop-solid/SKILL.md +42 -0
  81. package/assets/skills/performance/SKILL.md +41 -0
  82. package/assets/skills/reactive/SKILL.md +42 -0
  83. package/assets/skills/release-management/SKILL.md +51 -0
  84. package/assets/skills/research/fact-check-claims/SKILL.md +98 -0
  85. package/assets/skills/research/research-forums/SKILL.md +103 -0
  86. package/assets/skills/research/research-github-issues/SKILL.md +103 -0
  87. package/assets/skills/research/research-web-sources/SKILL.md +108 -0
  88. package/assets/skills/research/synthesize-findings/SKILL.md +112 -0
  89. package/assets/skills/research/validate-source-credibility/SKILL.md +103 -0
  90. package/assets/skills/resilience/SKILL.md +41 -0
  91. package/assets/skills/serverless/SKILL.md +42 -0
  92. package/assets/skills/servers/SKILL.md +41 -0
  93. package/assets/skills/sql/SKILL.md +45 -0
  94. package/assets/skills/supply-chain/SKILL.md +41 -0
  95. package/assets/skills/system-design/SKILL.md +91 -0
  96. package/assets/skills/tech-leadership/SKILL.md +46 -0
  97. package/assets/skills/testing/SKILL.md +41 -0
  98. package/assets/skills/tracing/SKILL.md +36 -0
  99. package/assets/skills/utility/branch-cleaner/SKILL.md +195 -0
  100. package/assets/skills/utility/branch-setup/SKILL.md +144 -0
  101. package/assets/skills/utility/changelog-updater/SKILL.md +125 -0
  102. package/assets/skills/utility/commit-writer/SKILL.md +154 -0
  103. package/assets/skills/utility/issue-closer/SKILL.md +106 -0
  104. package/assets/skills/utility/issue-creator/SKILL.md +200 -0
  105. package/assets/skills/utility/pr-merger/SKILL.md +189 -0
  106. package/assets/skills/utility/pr-opener/SKILL.md +180 -0
  107. package/assets/skills/utility/release-publisher/SKILL.md +224 -0
  108. package/assets/skills/workflow/ciel-dev-process/SKILL.md +94 -0
  109. package/assets/skills/workflow/faire-gatekeeper/SKILL.md +3 -1
  110. package/assets/skills/workflow/prouver-verifier/SKILL.md +11 -2
  111. package/dist/cli/check.d.ts.map +1 -1
  112. package/dist/cli/check.js +11 -2
  113. package/dist/cli/check.js.map +1 -1
  114. package/dist/cli/claude.d.ts.map +1 -1
  115. package/dist/cli/claude.js +0 -2
  116. package/dist/cli/claude.js.map +1 -1
  117. package/dist/cli/init.d.ts.map +1 -1
  118. package/dist/cli/init.js +11 -2
  119. package/dist/cli/init.js.map +1 -1
  120. package/dist/cli/opencode.d.ts.map +1 -1
  121. package/dist/cli/opencode.js +2 -1
  122. package/dist/cli/opencode.js.map +1 -1
  123. package/package.json +1 -1
  124. package/assets/commands/ciel-migrate.md +0 -35
  125. package/assets/commands/ciel-refresh.md +0 -91
@@ -0,0 +1,43 @@
1
+ ---
2
+ name: appsec
3
+ description: "Application Security — OWASP Top 10, defense in depth, auth (OAuth2/OIDC), input validation, session security. À charger quand on sécurise une application."
4
+ ---
5
+
6
+ # Application Security
7
+
8
+ **Principe premier :** La sécurité applicative n'est pas une feature — c'est une propriété émergente d'un système où chaque couche suppose que celle d'avant a échoué. Si ton input validation compte sur le WAF, et que ton WAF compte sur le framework, personne ne valide vraiment. La défense en profondeur n'est pas "plusieurs couches" — c'est "chaque couche traite l'input comme hostile, même si une autre couche est censée l'avoir déjà nettoyé". Assume breach à chaque étage.
9
+
10
+ ## Checklist
11
+ - [ ] Toutes les entrées utilisateur sont validées à la frontière — type, longueur, charset, range
12
+ - [ ] Requêtes SQL/NoSQL paramétrées — jamais de concaténation (injection)
13
+ - [ ] Authentification via OAuth2/OIDC avec providers éprouvés — pas d'auth maison
14
+ - [ ] Sessions : HttpOnly, Secure, SameSite=Lax, rotation d'ID après login
15
+ - [ ] CSRF protégé sur toutes les mutations (SameSite + token si nécessaire)
16
+ - [ ] Rate limiting sur TOUS les endpoints sensibles (login, API, upload, reset password)
17
+ - [ ] Headers de sécurité : CSP, HSTS, X-Frame-Options, X-Content-Type-Options
18
+ - [ ] Mots de passe hashés avec argon2id (pas de SHA, pas de MD5)
19
+
20
+ ## Anti-patterns
21
+ ### Auth maison
22
+ **Ce qu'on voit :** `const token = jwt.sign({userId}, SECRET)` — JWT sans expiration, sans refresh, sans blacklist. Le token volé = accès permanent.
23
+ **Pourquoi c'est dangereux :** l'authentification est le problème de sécurité le plus résolu — et le plus mal implémenté. Un JWT mal configuré n'a pas de révocation possible. Si l'attaquant vole un token, il a un accès permanent. Construire son propre système d'auth est la cause #1 des failles critiques.
24
+ **Faire plutôt :** OAuth2/OIDC via un provider éprouvé (Auth0, Clerk, NextAuth, Keycloak). Access token courte durée (15 min), refresh token longue durée (7j) avec rotation. Blacklist côté serveur pour les tokens révoqués.
25
+
26
+ ### Validation "plus tard"
27
+ **Ce qu'on voit :** les données arrivent dans le controller, passent dans le service, arrivent dans la DB sans validation. "Le frontend valide". "L'ORM échappe".
28
+ **Pourquoi c'est dangereux :** le frontend est sous le contrôle de l'attaquant. Un simple `curl` contourne toute validation frontend. L'ORM échappe le SQL mais ne valide pas le type, la longueur, le charset, le business logic. Sans validation à la frontière, la DB reçoit n'importe quoi.
29
+ **Faire plutôt :** validation à l'entrée de l'API (middleware/guard). Schéma (Zod, JSON Schema, Pydantic). Rejeter tout ce qui ne matche PAS le schéma — ne pas essayer de "corriger". Whitelist, pas blacklist.
30
+
31
+ ### Rate limiting absent
32
+ **Ce qu'on voit :** `POST /login` sans rate limiting. Un attaquant brute-force 10 000 mots de passe par seconde.
33
+ **Pourquoi c'est dangereux :** le brute-force est l'attaque la plus simple et la plus efficace. Sans rate limiting, un mot de passe faible tombe en minutes. Le rate limiting n'est pas une feature — c'est la seule défense contre l'énumération.
34
+ **Faire plutôt :** rate limiting sur /login (5 tentatives/min/IP + compte), /api (100 req/s par clé), /reset-password (1 tentative/min/email). Retourner 429 avec `Retry-After`. Bloquer (pas juste ralentir) après N échecs.
35
+
36
+ ## Patterns
37
+ ### Defense in depth
38
+ **Quand :** toute application manipulant des données sensibles.
39
+ **Comment :** WAF → Input validation → Auth → Authorization → SQL paramétré → Output encoding → CSP → Encryption at rest. Chaque couche suppose que les précédentes ont failli. Exemple : même avec du SQL paramétré, valider le type de l'input avant. Même avec HTTPS, marquer les cookies Secure.
40
+
41
+ ### Structured security review (OWASP Top 10)
42
+ **Quand :** à chaque release ou changement majeur.
43
+ **Comment :** passer en revue le Top 10 OWASP pour CHAQUE endpoint critique. Injection, Broken Auth, Sensitive Data Exposure, XXE, Broken Access Control, Security Misconfiguration, XSS, Insecure Deserialization, Vulnerable Components, Insufficient Logging. Pas un audit annuel — une habitude de release.
@@ -0,0 +1,74 @@
1
+ ---
2
+ name: architecture
3
+ description: "Architecture Logicielle — monolithe modulaire, microservices, ports/adapters, ADR, Strangler Fig, trade-offs. A charger quand on definit la structure d'un projet."
4
+ ---
5
+
6
+ # Architecture Logicielle
7
+
8
+ **Principe premier :** L'architecture n'est pas une collection de patterns — c'est la gestion explicite des dependances. La qualite d'une architecture se mesure a une chose : combien de modules dois-je toucher pour faire un changement metier ? Si la reponse est > 3, l'architecture est cassee, peu importe le pattern utilise. Le bon pattern depend du contexte (taille d'equipe, frequence de changement, exigences de scale), pas de la mode.
9
+
10
+ ## Checklist
11
+ - [ ] Le choix d'architecture est justifie par le contexte et documente (ADR)
12
+ - [ ] Les dependances pointent vers le domaine — jamais l'inverse (Domain <> Infrastructure)
13
+ - [ ] Les modules sont nommes par capacite metier (billing, shipping), pas par couche technique (controllers, services, utils)
14
+ - [ ] Chaque module a une interface explicite (contrat) — pas de couplage par import direct interne
15
+ - [ ] Demarrer simple (monolithe modulaire) — extraire en service UNIQUEMENT quand le besoin est prouve
16
+ - [ ] Le diagramme de contexte (C4 niveau 1-2) existe et est visible des nouveaux
17
+
18
+ ## Trade-offs : les 3 architectures
19
+
20
+ ### Monolithe simple vs Monolithe modulaire vs Microservices
21
+
22
+ | | Monolithe simple | Monolithe modulaire | Microservices |
23
+ |--|-----------------|-------------------|--------------|
24
+ | **Structure** | 1 codebase, pas de frontieres internes | 1 codebase, modules separes par domaine (billing/, orders/) | N codebases independantes |
25
+ | **Deploiement** | 1 artefact | 1 artefact | N artefacts |
26
+ | **Avantages** | Simple, rapide a demarrer | Deploiement simple, frontieres claires, peut extraire en service plus tard | Scale independant, equipes autonomes, isolation de pannes |
27
+ | **Desavantages** | Devient vite un "big ball of mud" | Modules peuvent se coupler par import direct si pas discipline | Cout reseau, latence, serialisation, deploiements coordonnes |
28
+ | **Quand choisir** | POC, equipe 1-3, court-terme | Equipe 4-20, projet long-terme | > 5 equipes, besoin de scale independant |
29
+ | **Piege** | "On modularisera plus tard" → jamais fait | Modules deviennent des services deguises (imports croises) | Microservices sans equipes autonomes = pire que monolithe |
30
+
31
+ **Regle :** commencer monolithe modulaire. Extraire en microservice quand : (1) l'equipe est trop grande pour une codebase (> 20), OU (2) un module a besoin de scale independant, OU (3) un module a un cycle de release different.
32
+
33
+ ## Anti-patterns
34
+ ### Microservices comme defaut
35
+ **Ce qu'on voit :** 12 services, 12 repos, 12 pipelines — pour 3 devs et 100 utilisateurs. Un changement simple touche 4 repos.
36
+ **Pourquoi c'est dangereux :** les microservices deplacent la complexite du code vers le reseau. Chaque service ajoute latence, serialisation, gestion d'erreur reseau. Le seuil n'est pas technologique, il est organisationnel : une equipe par service.
37
+ **Faire plutot :** monolithe modulaire. Domaines separes en modules, interfaces explicites, meme codebase. Un commit = un changement. Extraire un service quand l'equipe grandit (> 20) ou qu'un module a besoin de scale independant.
38
+
39
+ ### Architecture en couches videe
40
+ **Ce qu'on voit :** Controller → Service → Repository. Le Service fait 3 lignes : `return this.repository.findById(id)`. Le domaine n'existe pas — c'est un tuyau HTTP→DB.
41
+ **Pourquoi c'est dangereux :** les regles metier sont eparpillees dans les controllers, validateurs, middlewares. Changer une regle oblige a traquer la logique dans 6 fichiers.
42
+ **Faire plutot :** le domaine contient les regles. `order.approve()` verifie le statut, le credit, la dispo. Le service orchestre, le repository persiste, le controller traduit HTTP. Chaque couche a une VRAIE responsabilite.
43
+
44
+ ### Architecture decidee puis figee
45
+ **Ce qu'on voit :** un diagramme dessine il y a 3 ans. L'archi reelle a diverge. Personne ne l'a documente.
46
+ **Pourquoi c'est dangereux :** l'architecture documentee est un mensonge. Les nouveaux devs prennent des decisions sur une base fausse. La derive architecturale s'accelere.
47
+ **Faire plutot :** ADR (Architecture Decision Records) pour les decisions importantes. Diagrammes regeneres (C4 via structurizr ou PlantUML). L'architecture est vivante.
48
+
49
+ ## Patterns
50
+ ### Monolithe modulaire
51
+ **Quand :** debut de projet, equipe < 20, pas de besoin de scale independant.
52
+ **Comment :** modules par domaine (billing/, shipping/, auth/). Chaque module a son propre schema DB logique. Communication inter-module par interfaces explicites.
53
+ - **Avantages :** deploy simple, refactoring facile (un commit), pas de latence reseau
54
+ - **Desavantages :** scale tout-ou-rien, un module peut bloquer le deploiement
55
+ - **Mise en place :** (1) Creer un dossier par domaine (`src/billing/`, `src/shipping/`). (2) Chaque module expose une interface publique (`index.ts` avec exports explicites). (3) Les imports entre modules passent UNIQUEMENT par l'interface publique. (4) Chaque module a ses propres migrations DB. (5) Tester les modules isolement. (6) Si un module devient trop gros → Strangler Fig pour l'extraire.
56
+
57
+ ### Ports & Adapters (Hexagonale)
58
+ **Quand :** le domaine metier doit survivre aux changements d'infrastructure.
59
+ **Comment :** le domaine definit des interfaces (ports : `OrderRepository`, `PaymentGateway`). Les adapters implementent ces interfaces (PostgresAdapter, StripeAdapter). Le domaine ne depend de rien d'externe.
60
+ - **Avantages :** changer de DB ou de payment provider sans toucher le domaine. Testable sans infra.
61
+ - **Desavantages :** couche d'abstraction supplementaire. Plus de fichiers.
62
+ - **Mise en place :** (1) Definir les ports dans le domaine. (2) Implementer les adapters dans un dossier `infrastructure/`. (3) Injecter les adapters au runtime (constructor injection). (4) Tester le domaine avec des adapters in-memory. (5) Tester les vrais adapters en integration.
63
+
64
+ ### Strangler Fig (migration progressive)
65
+ **Quand :** migration d'un legacy vers une nouvelle architecture sans big bang.
66
+ **Comment :** router le trafic progressivement. Nouvelle fonctionnalite → nouveau systeme. Ancienne migree → proxy vers nouveau, puis suppression.
67
+ - **Avantages :** chaque etape est deployable et rollbackable. Zero downtime.
68
+ - **Desavantages :** plus lent qu'un big bang. Cout de maintenance du proxy et des deux systemes en parallele.
69
+ - **Mise en place :** (1) Placer un proxy/API Gateway devant le legacy. (2) Creer le nouveau service avec un sous-ensemble de fonctionnalites. (3) Router par endpoint : `GET /orders` → nouveau, le reste → legacy. (4) Migrer les endpoints un par un, valider chaque migration. (5) Migrer les donnees progressivement (dual-write puis backfill). (6) Quand tout le trafic est sur le nouveau → supprimer le legacy. (7) Supprimer le proxy. Chaque etape = une PR deployable.
70
+
71
+ ### ADR (Architecture Decision Record)
72
+ **Quand :** toute decision architecturale non triviale.
73
+ **Comment :** document leger (1-2 pages) dans `docs/adrs/NNNN-title.md`. Format : Titre, Statut (proposed/accepted/deprecated), Contexte, Decision, Alternatives, Consequences.
74
+ - **Mise en place :** (1) Creer `docs/adrs/`. (2) Template ADR. (3) Chaque decision significative → un ADR. (4) Les ADR sont revus en PR comme du code. (5) Les ADR obsoletes sont marques `deprecated` (pas supprimes — l'historique a de la valeur). Un nouveau membre lit les ADR dans l'ordre pour comprendre l'histoire de l'architecture.
@@ -0,0 +1,41 @@
1
+ ---
2
+ name: backend
3
+ description: "Backend — graceful degradation, connection pooling, idempotency, error handling as contract, health checks. À charger quand on crée ou modifie des services backend."
4
+ ---
5
+
6
+ # Backend
7
+
8
+ **Principe premier :** Le backend n'est pas "la partie qui parle à la base de données" — c'est un composant dans un système distribué qui doit survivre à la défaillance de tout ce qui l'entoure. La DB tombe, le réseau coupe, le client timeout. Un backend bien conçu ne crash pas — il dégrade, il retry, il informe. La métrique n'est pas "uptime" mais "MTTR" — chaque seconde entre la panne et la récupération est du temps utilisateur perdu.
9
+
10
+ ## Checklist
11
+ - [ ] Chaque endpoint a un timeout explicite — pas de requête pendante infinie
12
+ - [ ] Graceful shutdown : SIGTERM → stop accepter → drainer les requêtes (max 30s) → close connexions → exit
13
+ - [ ] Health check exposé : liveness (suis-je vivant ?) ≠ readiness (puis-je servir ?)
14
+ - [ ] Connection pooling sur DB, Redis, et clients HTTP — pas de connexion unique
15
+ - [ ] Les erreurs sont structurées : `{code, message, details}` — jamais de stack trace en prod
16
+ - [ ] Rate limiting en place sur les endpoints publics — pas de "on verra plus tard"
17
+
18
+ ## Anti-patterns
19
+ ### Avaler les erreurs
20
+ **Ce qu'on voit :** `try { await db.query() } catch (e) { console.log(e) }`. Pas de rethrow, pas de fallback. L'erreur est loguée et oubliée.
21
+ **Pourquoi c'est dangereux :** l'appelant reçoit "success" mais rien n'a été fait. Le système continue dans un état incohérent. Les erreurs avalées sont impossibles à debugger — tu ne sais jamais quelles opérations ont réellement échoué.
22
+ **Faire plutôt :** soit gérer l'erreur (retry, fallback, compensation), soit la laisser remonter à un error handler global qui la transforme en réponse structurée. Ne jamais avaler silencieusement.
23
+
24
+ ### Graceful shutdown = process.exit(0)
25
+ **Ce qu'on voit :** `process.on('SIGTERM', () => process.exit(0))` — les 50 requêtes en cours sont coupées net. Le load balancer envoie encore du trafic vers une instance zombie.
26
+ **Pourquoi c'est dangereux :** perte de données, transactions incomplètes, expérience utilisateur dégradée. Le load balancer détecte la panne 30 secondes plus tard — pendant ce temps, toutes les requêtes échouent.
27
+ **Faire plutôt :** SIGTERM → le load balancer retire l'instance (health check fail) → l'instance arrête d'accepter les nouvelles requêtes → attend la fin des requêtes en cours (timeout 30s max) → close les connexions DB/Redis → exit. Kubernetes donne 30s par défaut (terminationGracePeriodSeconds).
28
+
29
+ ### Une connexion DB pour tout le monde
30
+ **Ce qu'on voit :** `const db = new Database(DATABASE_URL)` — un singleton connexion pour toute l'application. 100 requêtes simultanées = 99 en file d'attente.
31
+ **Pourquoi c'est dangereux :** la connexion unique est le bottleneck. Les requêtes s'empilent, la latence explose. Sous charge, l'app devient non-réactive. Une seule requête lente bloque tout le monde.
32
+ **Faire plutôt :** connection pool. min/max configurés selon la charge attendue (min: 2, max: 20). Monitorer les métriques du pool : waiting, idle, active. Si `waiting > 0` régulièrement, augmenter le max ou optimiser les requêtes.
33
+
34
+ ## Patterns
35
+ ### Middleware chain
36
+ **Quand :** logique transversale (auth, logging, rate limiting, CORS).
37
+ **Comment :** chaque middleware fait UNE chose. Ordre canonique : CORS → rate limit → auth → validation → handler → error handler. La requête traverse la chaîne dans l'ordre, l'erreur remonte dans l'ordre inverse.
38
+
39
+ ### Idempotency token
40
+ **Quand :** opérations mutantes (paiement, création de ressource) où le double-submit est dangereux.
41
+ **Comment :** le client génère un `Idempotency-Key: uuid`. Le serveur stocke la clé + le résultat de l'opération dans une transaction. Si la clé est déjà vue → retourner le résultat stocké sans ré-exécuter.
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: backup-recovery
3
+ description: "Backup & Recovery — RPO/RTO, PITR, disaster recovery, multi-region, test de restore. A charger quand on configure les sauvegardes."
4
+ ---
5
+
6
+ # Backup & Recovery
7
+
8
+ **Principe premier :** Une sauvegarde n'est pas une copie de donnees — c'est une police d'assurance, et comme toute assurance, tu ne sais pas si elle marche tant que tu n'as pas fait de sinistre. La question n'est pas "est-ce qu'on a des backups ?" (oui, tout le monde en a) — c'est "a quelle date etait le dernier test de restore ?" Un backup jamais teste n'est pas un backup, c'est un vœu pieux. Les deux metriques qui definissent ta strategie sont le RPO (Recovery Point Objective : combien de donnees tu acceptes de perdre, en temps) et le RTO (Recovery Time Objective : combien de temps pour restaurer le service). Tout le reste — outils, frequence, retention — decoule de ces deux nombres.
9
+
10
+ ## Checklist
11
+ - [ ] RPO (perte de donnees max acceptable) et RTO (temps de restore max acceptable) sont definis et documentes
12
+ - [ ] Les backups sont automatises — pas de "je fais un pg_dump le vendredi soir"
13
+ - [ ] Le restore est teste regulierement (minimum trimestriel) — sans test, pas de backup
14
+ - [ ] Les backups sont stockes dans une region/separee differente de la production (pas dans le meme datacenter)
15
+ - [ ] La retention est definie : journaux 30j, mensuels 12 mois, annuels 7 ans (selon conformite)
16
+ - [ ] Les backups sont chiffres au repos et en transit — une fuite de backup = fuite de toutes les donnees
17
+ - [ ] Le processus de restore est documente et testable par n'importe quel membre de l'equipe
18
+
19
+ ## Anti-patterns
20
+ ### Backup = dump periodique
21
+ **Ce qu'on voit :** `pg_dump` tous les jours a 3h du matin. "On a une sauvegarde." RPO = 24h. Restore = manuel, non teste.
22
+ **Pourquoi c'est dangereux :** un pg_dump quotidien = tu perds jusqu'a 24h de donnees. Le restore prend des heures (charger un dump complet). Pas de PITR (point-in-time recovery) — si la corruption est arrivee a 14h, tu ne peux pas restaurer a 13h59, seulement a 3h du matin.
23
+ **Faire plutot :** WAL archiving continu (PostgreSQL) ou binlog (MySQL) → PITR possible a la seconde pres. Backups complets hebdomadaires + incrementaux quotidiens ou continus. Restore PITR teste automatiquement.
24
+
25
+ ### Backup dans la meme region
26
+ **Ce qu'on voit :** backups dans le meme S3 bucket, meme region, meme compte. "C'est plus simple a gerer."
27
+ **Pourquoi c'est dangereux :** la region tombe (panne AWS, coupure electrique, catastrophe naturelle) → tous les backups sont inaccessibles. Un attaquant compromet le compte → il supprime tout, backups inclus. Le backup co-localise n'est pas un backup — c'est une copie.
28
+ **Faire plutot :** backups cross-region minimum. Idealement cross-cloud pour les donnees critiques. Les backups sont dans un compte separe avec acces minimal. Immutable backups (Object Lock, WORM) : meme l'admin ne peut pas supprimer avant la retention.
29
+
30
+ ### "Le restore a marche en staging il y a 6 mois"
31
+ **Ce qu'on voit :** le test de restore a ete fait une fois, lors de la mise en place. Depuis, le schema a change, les volumes ont triple, l'equipe a tourne.
32
+ **Pourquoi c'est dangereux :** un restore est un processus complexe : restaurer la DB, verifier l'integrite, re-configurer les connexions, re-chauffer les caches, valider les donnees. Chaque changement dans le schema, les dependances, ou l'infrastructure peut casser le restore. Un restore qui echoue le jour du sinistre = pas de restore du tout.
33
+ **Faire plutot :** restore automatise hebdomadaire dans un environnement isole. Tests d'integrite automatiques apres restore. L'alerte part si le restore echoue. Le test de restore fait partie de la sante operationnelle, comme un health check.
34
+
35
+ ## Patterns
36
+ ### Strategie 3-2-1
37
+ **Quand :** toute strategie de backup.
38
+ **Comment :** 3 copies des donnees, sur 2 types de media differents, dont 1 copie hors site (offsite). Exemple : backup local (rapide a restaurer) + backup cloud (region A) + backup cloud (region B, immuable). Une panne ou corruption sur un seul media ne detruit pas tout.
39
+
40
+ ### Point-in-time recovery (PITR)
41
+ **Quand :** base de donnees relationnelle (PostgreSQL, MySQL, SQL Server).
42
+ **Comment :** WAL archiving continu vers un stockage objet. Backup complet hebdomadaire. Restore : charger le dernier backup complet → appliquer les WAL jusqu'au timestamp desire. RPO effectif = secondes (le delai de replication du WAL), pas heures.
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: caching
3
+ description: "Caching — cache-aside/write-through, cache stampede protection, TTL strategy, invalidation as the hard problem. À charger quand on parle de performance ou de mise en cache."
4
+ ---
5
+
6
+ # Caching
7
+
8
+ **Principe premier :** Il y a deux problèmes difficiles en informatique : nommer les choses, l'invalidation de cache, et les off-by-one. Le cache est un mensonge délibéré — tu sers une version potentiellement périmée de la donnée en échange de latence réduite. La seule question qui compte est : "quelle est la péremption acceptable pour CE cas d'usage ?" Si la réponse est 0ms, pas de cache. Si la réponse est "5 minutes, c'est acceptable", tu as un budget d'incohérence. Nommer ce budget explicitement est le design du cache.
9
+
10
+ ## Checklist
11
+ - [ ] La stratégie est choisie selon le pattern d'accès : cache-aside (read-heavy), write-through (read-after-write), write-behind (write-heavy)
12
+ - [ ] Chaque entrée de cache a un TTL explicite et justifié — jamais de cache infini
13
+ - [ ] La protection anti-stampede est en place — 1000 miss simultanés ne déclenchent pas 1000 requêtes DB
14
+ - [ ] Le cache est monitoré : hit rate, miss rate, eviction rate, mémoire utilisée
15
+ - [ ] L'invalidation est événementielle ou par TTL — jamais "pense à vider le cache" en commentaire
16
+
17
+ ## Anti-patterns
18
+ ### Cache infini
19
+ **Ce qu'on voit :** `cache.set('user:' + id, userData)` sans TTL. Le cache ne sera vidé que quand Redis sera plein et fera une éviction arbitraire.
20
+ **Pourquoi c'est dangereux :** l'incohérence grandit avec le temps. L'utilisateur change son email dans la DB, le cache sert l'ancien pendant des jours. Le bug est intermittent (parfois cache hit, parfois miss) — le pire type de bug à debugger.
21
+ **Faire plutôt :** toujours un TTL. Court pour les données dynamiques (1-5 min). Long pour le statique (1-24h). Le TTL est un compromis entre fraîcheur et performance — le choisir consciemment.
22
+
23
+ ### Cache stampede
24
+ **Ce qu'on voit :** une clé chaude expire. 1000 requêtes simultanées arrivent. Toutes font un cache miss → toutes interrogent la DB. La DB reçoit 1000× la même requête.
25
+ **Pourquoi c'est dangereux :** le stampede transforme un cache miss en attaque DDoS auto-infligée. La DB qui allait bien voit soudainement 1000× la charge normale. Pire : elle génère 1000× la même réponse, et 999 réponses sont jetées.
26
+ **Faire plutôt :** probabilistic early recomputation (recalculer avec une probabilité croissante quand le TTL approche). Ou lock distribué temporaire — un seul worker recalcule, les autres attendent le résultat (SETNX).
27
+
28
+ ### Invalidation commentée
29
+ **Ce qu'on voit :** `// PENSE À VIDER LE CACHE QUAND TU MODIFIES CETTE TABLE` — dans un commentaire. Qui n'est pas lu. Par un dev qui ne savait pas. Le cache et la DB divergent silencieusement.
30
+ **Pourquoi c'est dangereux :** l'invalidation manuelle est une machine à bugs intermittents. Chaque écriture est une opportunité d'oubli. Le bug n'apparaît que dans le cas "cache hit après écriture" — difficile à reproduire.
31
+ **Faire plutôt :** invalidation automatique. Événement DB → event bus → cache invalidation. Ou TTL assez court pour que l'incohérence maximale soit acceptable. Jamais de "penser à" dans la conception d'un système.
32
+
33
+ ## Patterns
34
+ ### Cache-aside
35
+ **Quand :** lecture dominante, tolérance à la stale data.
36
+ **Comment :** (1) lire le cache, (2) si hit → retourner, (3) si miss → lire la DB, (4) écrire dans le cache, (5) retourner. L'application est responsable de la cohérence. Simple, mais attention au stampede.
37
+
38
+ ### Write-through
39
+ **Quand :** les données écrites sont presque toujours relues immédiatement.
40
+ **Comment :** écrire dans le cache ET dans la DB dans la même opération. Le cache est toujours chaud pour les lectures récentes. Coût : chaque écriture touche le cache, même si personne ne relit.
41
+
42
+ ### Probabilistic early recomputation
43
+ **Quand :** protéger une clé chaude du stampede.
44
+ **Comment :** avant que le TTL n'expire, le worker vérifie si `random() < 1 / (TTL_remaining_seconds * request_rate)`. Si oui, il recalcule de manière anticipée et met à jour le cache. Statistiquement, un seul worker le fait.
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: cdn
3
+ description: "CDN & Edge — cache geographique, TTL strategies, origin shield, edge computing, cache invalidation. A charger quand on configure un CDN ou optimise la livraison de contenu."
4
+ ---
5
+
6
+ # CDN & Edge
7
+
8
+ **Principe premier :** Un CDN n'est pas un "cache rapide" — c'est un reseau de distribution qui rapproche les donnees de l'utilisateur. La latence n'est pas une question de bande passante, c'est une question de distance (lumiere dans la fibre = ~5ms pour 1000km). Un CDN reduit la distance en placant les donnees dans 200+ points de presence. Mais un CDN est aussi un cache — et tout cache peut servir des donnees stale. La question centrale n'est pas "est-ce que le CDN est rapide ?" mais "quelle fraicheur est acceptable pour quel contenu ?"
9
+
10
+ ## Checklist
11
+ - [ ] Les assets statiques sont servis via CDN (pas depuis le serveur d'origine) avec Cache-Control explicite
12
+ - [ ] Les headers de cache sont differencies par type de contenu : immutable pour versionne, revalidation pour dynamique
13
+ - [ ] L'origin shield est configure — pas de 50 POPs qui frappent l'origine simultanement
14
+ - [ ] L'invalidation est ciblee (chemins specifiques, pas `/*`) et monitorisee
15
+ - [ ] Le TTL est defini selon la fraicheur acceptable : html 5min, assets versionnes 1 an
16
+ - [ ] Les tokens/query strings prives ne cassent pas le cache (strip, normalize, ou ignore)
17
+ - [ ] Le CDN est devant l'application entiere, pas juste les assets (DDoS protection, SSL termination)
18
+
19
+ ## Anti-patterns
20
+ ### Tout en `max-age=0, no-cache`
21
+ **Ce qu'on voit :** l'equipe a ete brulee par du contenu stale. Solution : tout revalider a chaque requete.
22
+ **Pourquoi c'est dangereux :** chaque requete frappe l'origine. Le CDN devient un proxy transparent inutile (cout + latence sans benefice). Le serveur d'origine encaisse 100% du trafic. Le CDN coute de l'argent pour rien.
23
+ **Faire plutot :** differencier par type de contenu. Assets versionnes → `max-age=31536000, immutable`. Pages HTML → `max-age=300, stale-while-revalidate=600`. API responses → `max-age=0, private` (pas de cache CDN pour les donnees privees).
24
+
25
+ ### Cache invalidation = `/*`
26
+ **Ce qu'on voit :** un deployement → invalidation de tout le cache (`/*`). 50000 requetes simultanees vers l'origine.
27
+ **Pourquoi c'est dangereux :** l'invalidation complete cree un "cache stampede" sur l'origine. Le serveur d'origine n'est pas dimensionne pour le trafic total. Chaque deployement = risque d'outage.
28
+ **Faire plutot :** invalider uniquement les chemins modifies. Utiliser des noms de fichiers versionnes (`main.a3f2b1c.js`) → jamais besoin d'invalider. Pour les SPA : invalider `index.html` seulement, le reste est immutable.
29
+
30
+ ### CDN = juste pour les images
31
+ **Ce qu'on voit :** seuls les assets statiques sont sur le CDN. L'API et les pages HTML passent directement au serveur.
32
+ **Pourquoi c'est dangereux :** le CDN offre la terminaison SSL, la protection DDoS, le WAF, l'optimisation d'images, le edge computing. Le mettre uniquement devant `/static/` gaspille sa capacite principale : absorber le trafic malveillant avant qu'il n'atteigne l'origine.
33
+ **Faire plutot :** CDN devant tout le domaine. L'origine est cachee derriere le CDN, pas exposee publiquement. Les regles de cache decident ce qui est servi depuis le edge vs l'origine.
34
+
35
+ ## Patterns
36
+ ### Cache hierarchies (origin shield)
37
+ **Quand :** trafic global avec beaucoup de POPs (200+).
38
+ **Comment :** un POP regional intermediaire (origin shield) consolide les requetes vers l'origine. Au lieu de 200 POPs qui frappent l'origine sur un cache miss, seul l'origin shield la contacte. Reduction de la charge origine de 100-200x.
39
+
40
+ ### Stale-while-revalidate
41
+ **Quand :** contenu qui peut etre legerement stales (pages HTML, reponses API publiques).
42
+ **Comment :** `Cache-Control: max-age=300, stale-while-revalidate=600`. Le CDN sert le contenu stales jusqu'a 15 minutes pendant qu'il revalide en arriere-plan. L'utilisateur ne voit jamais la latence de revalidation. Ideal pour les pages qui changent peu.
@@ -0,0 +1,41 @@
1
+ ---
2
+ name: chaos
3
+ description: "Chaos Engineering — injection de pannes, Game Day, Chaos Monkey, experimentation, hypotheses de resilience. A charger quand on teste la resilience d'un systeme."
4
+ ---
5
+
6
+ # Chaos Engineering
7
+
8
+ **Principe premier :** Le chaos engineering n'est pas "casser des choses en production pour voir ce qui se passe" — c'est une discipline scientifique appliquee aux systemes distribues. Tu formules une hypothese de resilience ("si le service B tombe, le fallback degrade le mode"), tu injectes la panne de maniere controlee, et tu compares le comportement observe a l'hypothese. La valeur n'est pas dans le chaos — elle est dans la decouverte des comportements emergents que personne n'avait prevus. Un systeme sans chaos engineering n'est pas stable — il est non teste. La stabilite reelle se mesure en production, pas en staging.
9
+
10
+ ## Checklist
11
+ - [ ] Une hypothese de resilience est formulee avant chaque experience (pas "on va eteindre cette DB et voir")
12
+ - [ ] Le blast radius est controle : un petit pourcentage de trafic, un seul AZ/service
13
+ - [ ] L'experience a un arret d'urgence (kill switch) actionnable en < 10 secondes
14
+ - [ ] Les metriques sont en place AVANT l'experience (baseline + deviation en temps reel)
15
+ - [ ] Le Game Day est planifie avec un scenario et un runbook
16
+ - [ ] Les decouvertes sont documentees et transforment le systeme (pas "c'etait interessant, on fera mieux")
17
+
18
+ ## Anti-patterns
19
+ ### Chaos en production sans filet
20
+ **Ce qu'on voit :** "on va tester en production vendredi soir." Pas d'hypothese, pas de kill switch, pas de monitoring.
21
+ **Pourquoi c'est dangereux :** le chaos sans controle n'est pas une experience — c'est un incident provoque. Sans hypothese, tu ne sais pas si le comportement est normal ou anormal. Sans kill switch, tu ne peux pas arreter l'hemorragie.
22
+ **Faire plutot :** commencer en staging avec des pannes simples (kill un process, saturer un disque). Monter en puissance progressivement. En production : commencer par 1% de trafic, puis 5%, puis 10%. Toujours avec un kill switch.
23
+
24
+ ### Chaos = Chaos Monkey uniquement
25
+ **Ce qu'on voit :** l'equipe installe Chaos Monkey, kill des instances au hasard, et considere que le chaos engineering est fait.
26
+ **Pourquoi c'est dangereux :** Chaos Monkey teste UNE chose : que ton application survit a la mort d'une instance. Ca ne teste pas la latence reseau, la corruption de donnees, la saturation disque, les pannes DNS, les timeouts de circuit breaker. Le chaos engineering est une discipline large — Chaos Monkey en est un tout petit sous-ensemble.
27
+ **Faire plutot :** varier les injections : latence reseau, perte de paquets, defaillance DNS, saturation CPU/disque, coupure de dependance, corruption de reponse, expiration de certificat. Chaque type de panne revele une classe de vulnerabilites differente.
28
+
29
+ ### Pas de suivi des decouvertes
30
+ **Ce qu'on voit :** le Game Day est fun. Les decouvertes sont notees sur un post-it. Rien n'est corrige.
31
+ **Pourquoi c'est dangereux :** le chaos engineering sans correction est du theatre. Les memes vulnerabilites survivent au Game Day suivant. L'equipe apprend mais le systeme n'apprend pas.
32
+ **Faire plutot :** chaque decouverte = un ticket. Prioriser les corrections avant le prochain Game Day. Re-tester les memes pannes pour verifier que la correction fonctionne. Le chaos engineering est une boucle : injecter → mesurer → corriger → re-tester.
33
+
34
+ ## Patterns
35
+ ### Game Day
36
+ **Quand :** equipe qui n'a jamais teste son systeme en conditions de panne.
37
+ **Comment :** 2h-4h planifiees. 1 scenario defini a l'avance ("la DB primaire est inaccessible"). Roles : un orchestrateur, un observateur, un intervenant. Monitoring temps reel. Debrief immediat apres : qu'est-ce qui a casse ? qu'est-ce qui a tenu ? qu'est-ce qu'on corrige ?
38
+
39
+ ### Steady-state hypothesis
40
+ **Quand :** toute experience de chaos.
41
+ **Comment :** definir l'etat normal AVANT l'injection ("P95 latence < 500ms, taux d'erreur < 1%, pas d'alerte critique"). Injecter la panne. Comparer a l'etat normal. Si l'ecart est inattendu → vulnerabilite. Cette methode donne une definition objective de "le systeme a tenu".
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: cicd-pipeline
3
+ description: "CI/CD — feedback loops, DORA metrics, trunk-based dev, pipeline as constraint theory, matrix builds, OIDC, ephemeral runners. À charger quand on conçoit ou optimise un pipeline CI/CD."
4
+ ---
5
+
6
+ # CI/CD Pipeline
7
+
8
+ **Principe premier :** La CI/CD n'est pas "automatiser les builds". C'est réduire le temps entre un commit et le feedback de production. Chaque minute perdue entre "j'écris" et "je sais si ça marche" est du gaspillage. Les 4 métriques DORA (Lead Time, Deploy Frequency, MTTR, Change Failure Rate) mesurent cette performance. Tout le reste — caching, parallel builds, OIDC — est un moyen, pas une fin.
9
+
10
+ ## Checklist
11
+ - [ ] La pipeline donne du feedback en < 5 min (sinon les devs arrêtent de l'attendre)
12
+ - [ ] Le trunk-based development est la norme — branches ≤ 1 jour, pas de long-lived branches
13
+ - [ ] Les 4 DORA metrics sont mesurées et visibles (dashboard, pas dans un coin)
14
+ - [ ] Les secrets utilisent OIDC — zéro credential long-lived
15
+ - [ ] Les runners sont éphémères — rien ne survit entre deux builds
16
+ - [ ] Concurrency groups — pas deux pipelines en parallèle sur la même branche
17
+ - [ ] Le pipeline bloque sur flaky test detection (> 2% de flaky rate = quarantaine automatique)
18
+ - [ ] L'artefact de build est immutable et signé (hash + signature vérifiés au déploiement)
19
+
20
+ ## Anti-patterns
21
+ ### Branches longue durée
22
+ **Ce qu'on voit :** un dev travaille 2 semaines sur `feature/big-refactor`. Merge conflict de 200 fichiers. Tests jamais lancés ensemble.
23
+ **Pourquoi c'est dangereux :** le "I" de CI, c'est l'intégration. Si le code n'est pas intégré au trunk au moins 1×/jour, ce n'est pas de la CI. Le merge final est un événement traumatique — les bugs apparaissent tous en même temps, impossible de bisecter proprement.
24
+ **Faire plutôt :** trunk-based development. Branches ≤ 1 jour. Feature flags pour cacher le code incomplet. Petits commits fréquents — le diff est la meilleure défense contre les bugs.
25
+
26
+ ### Pipeline vu comme un checklist et non une contrainte
27
+ **Ce qu'on voit :** lint → test → build → deploy, séquentiel. Le pipeline met 20 min et personne ne se demande pourquoi c'est lent.
28
+ **Pourquoi c'est dangereux :** un pipeline lent n'est pas juste chiant — il tue la boucle de feedback. Les devs ne poussent plus, ils accumulent, les PRs grossissent, la CI devient un bottleneck systémique. C'est la théorie des contraintes : le pipeline EST la contrainte.
29
+ **Faire plutôt :** traiter le pipeline comme un système à optimiser. Paralléliser tout ce qui peut l'être. Investir dans le cache. Splitter les tests lents. CI < 5 min — si c'est pas possible, c'est que l'architecture de test a un problème.
30
+
31
+ ### Pipeline non versionné
32
+ **Ce qu'on voit :** le pipeline est configuré dans l'UI GitHub Actions, pas dans `.github/workflows/`. Ou pire : un Jenkins configuré à la main.
33
+ **Pourquoi c'est dangereux :** le pipeline n'est pas reproductible. Si le runner crashe, personne ne sait le reconstruire. Pas de code review sur les changements de pipeline. Le pipeline devient un snowflake.
34
+ **Faire plutôt :** pipeline as code — dans le repo, revu comme du code. Tout changement de pipeline passe par une PR. Le pipeline se teste lui-même (les changements de CI s'exécutent sur la PR qui les propose).
35
+
36
+ ### Flaky tests ignorés
37
+ **Ce qu'on voit :** "ah ce test faille parfois, relance le job". Le pipeline a un taux de succès de 70% et tout le monde rerun jusqu'à ce que ça passe.
38
+ **Pourquoi c'est dangereux :** un test flaky tue la confiance dans le pipeline. Quand le rouge ne veut plus dire "bug", les vrais bugs passent au travers. Les devs développent une tolérance à l'échec — c'est la mort lente de la CI.
39
+ **Faire plutôt :** quarantaine automatique. Un test qui faille > 2% du temps est isolé dans une suite "quarantaine". Le pipeline principal bloque sur vrai rouge. La quarantaine est traitée comme dette technique prioritaire.
40
+
41
+ ## Patterns
42
+ ### OIDC
43
+ **Quand :** tout pipeline qui parle à un cloud provider.
44
+ **Comment :** GitHub Actions → OIDC token → AWS IAM / GCP WIF → credentials temporaires (< 1h). Zéro secret stocké. Rotation automatique. Si le token fuit, il expire avant d'être utilisable.
45
+
46
+ ### Matrix build
47
+ **Quand :** bibliothèque ou outil utilisé sur plusieurs versions/OS.
48
+ **Comment :** `matrix: { node: [18, 20, 22], os: [ubuntu, macos] }`. Chaque combinaison est un job indépendant. Pas de "ça marche sur ma machine" quand la CI couvre 3 OS.
49
+
50
+ ### Concurrency groups
51
+ **Quand :** éviter les interférences entre runs.
52
+ **Comment :** `concurrency: { group: deploy-${{ github.ref }}, cancel-in-progress: true }`. Un seul déploiement à la fois par branche. Le nouveau run annule le précédent. Évite les race conditions de déploiement.
53
+
54
+ ### Flaky test quarantine
55
+ **Quand :** suite de tests avec > 100 tests.
56
+ **Comment :** chaque test a un compteur de flaky (fail suivi de pass sans changement de code). Si > 2% sur 100 runs → déplacé en `quarantine/`. Le pipeline principal ignore cette suite. La quarantaine est revue chaque sprint — chaque test est soit fixé, soit réécrit, soit supprimé.
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: cloud
3
+ description: "Cloud — IAM least privilege comme principe zero, multi-account, cost optimization, auto-scaling, managed services vs DIY. À charger quand on conçoit une architecture cloud."
4
+ ---
5
+
6
+ # Cloud
7
+
8
+ **Principe premier :** Le cloud n'est pas "des serveurs chez Amazon" — c'est un modèle de responsabilité partagée où la sécurité est programmatique. La console AWS/GCP n'est PAS ton interface de gestion — c'est une porte dérobée pour le debugging. Tout doit être Infrastructure as Code. Le principe zéro est IAM least privilege : chaque service, chaque humain, chaque pipeline a EXACTEMENT les permissions nécessaires et rien de plus. Une permission de trop = une surface d'attaque inutile. Le second principe est que le cloud est un abonnement, pas un achat — chaque ressource qui tourne coûte de l'argent, 24/7.
9
+
10
+ ## Checklist
11
+ - [ ] IAM least privilege : chaque rôle/service a les permissions minimales — revu trimestriellement
12
+ - [ ] Infrastructure as Code (Terraform/Pulumi/CloudFormation) — zéro ressource créée à la main
13
+ - [ ] Environnements séparés (comptes/projects différents) — la dev ne touche pas la prod
14
+ - [ ] Données chiffrées au repos (S3 SSE, RDS encryption, EBS encryption) et en transit (TLS)
15
+ - [ ] Auto-scaling configuré avec min/max et métriques pertinentes
16
+ - [ ] Budget alerts à 80% et 100% + cost anomaly detection
17
+ - [ ] Multi-AZ sur toute charge de production — une AZ peut tomber
18
+
19
+ ## Anti-patterns
20
+ ### IAM AdministratorAccess partout
21
+ **Ce qu'on voit :** chaque service, chaque dev, chaque pipeline a `AdministratorAccess` "pour pas être bloqué". Une clé IAM qui fuit = accès root au compte.
22
+ **Pourquoi c'est dangereux :** IAM n'est pas un obstacle — c'est la SEULE chose qui empêche un attaquant (ou un bug) de supprimer toute ton infrastructure. Un `terraform destroy` accidentel avec des droits admin = tout est perdu. Sans IAM strict, le blast radius d'une fuite de credentials est le compte entier.
23
+ **Faire plutôt :** politiques IAM minimales. `s3:GetObject` sur CE bucket, pas `s3:*`. `ec2:Describe*` pour le monitoring, pas `ec2:TerminateInstances`. Policies gérées en Terraform, pas dans la console. Revue trimestrielle avec IAM Access Analyzer.
24
+
25
+ ### Tout dans le même compte
26
+ **Ce qu'on voit :** dev, staging, prod dans le même compte AWS. Le stagiaire teste un script qui supprime toutes les instances.
27
+ **Pourquoi c'est dangereux :** sans isolation de blast radius, un incident en dev peut détruire la production. Les limites de service (1000 instances, 100 DBs) sont partagées. Les coûts sont mélangés — impossible de savoir ce que coûte la prod vs la dev.
28
+ **Faire plutôt :** comptes séparés par environnement. AWS Organizations ou GCP Folders. Accès cross-account pour les besoins légitimes, jamais l'inverse.
29
+
30
+ ### Facture = surprise de fin de mois
31
+ **Ce qu'on voit :** personne ne regarde les coûts cloud. Un dev lance une instance GPU p3.16xlarge pour tester. Facture x10 à la fin du mois.
32
+ **Pourquoi c'est dangereux :** le cloud facture à l'usage, 24/7. Chaque ressource oubliée coûte. Sans monitoring des coûts, tu découvres les problèmes quand la facture arrive — 30 jours trop tard.
33
+ **Faire plutôt :** budget alerts à 80% et 100%. Tags de coût obligatoires (project, team, environment). Revue mensuelle. Instances non utilisées automatiquement arrêtées (Dev/Staging la nuit, week-end).
34
+
35
+ ## Patterns
36
+ ### IAM least privilege
37
+ **Quand :** toute ressource cloud.
38
+ **Comment :** chaque rôle a `Effect: Allow` uniquement sur les actions et ressources nécessaires. Pas de wildcard `Resource: "*"`. Pas de `Action: "*"`. Utiliser des conditions (IP source, MFA, tags). Partir de zéro et ajouter ce qui est nécessaire, pas l'inverse.
39
+
40
+ ### Multi-AZ
41
+ **Quand :** toute charge de production.
42
+ **Comment :** déployer sur au moins 2 zones de disponibilité. Load balancer répartit. RDS Multi-AZ (standby dans une autre AZ, failover automatique). Si une AZ tombe, le service continue. Coût : ~2× l'infra, mais l'alternative c'est le downtime.
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: code-quality
3
+ description: "Code Quality — linting, formatage, analyse statique, dette technique, conventions, complexite cyclomatique. A charger quand on parle de qualite ou standards de code."
4
+ ---
5
+
6
+ # Code Quality
7
+
8
+ **Principe premier :** La qualite du code ne se mesure pas en "proprete" esthetique — elle se mesure en temps de comprehension pour le prochain developpeur. Un code "sale" mais compris en 30 secondes est meilleur qu'un code "propre" qui prend 10 minutes a decoder. Le linter et le formatter existent pour ELIMINER les debats de style, pas pour les multiplier. Si une regle de linting genere des discussions en code review, elle est contre-productive — desactive-la. Le standard de qualite n'est pas la perfection, c'est la consistance : le code doit avoir l'air ecrit par une seule personne, meme si l'equipe a 10 developpeurs.
9
+
10
+ ## Checklist
11
+ - [ ] Le projet a un linter (ESLint, Biome, Ruff, Clippy) avec des regles strictes mais non controversees
12
+ - [ ] Le formatage est automatise (Prettier, dprint, gofmt) — zero debat de style en code review
13
+ - [ ] La complexite cyclomatique est limitee (max 15-20 par fonction) et mesuree dans la CI
14
+ - [ ] Les fichiers sont limits en taille (max 300-500 lignes) — au-dela, splitter
15
+ - [ ] Les commentaires expliquent le POURQUOI, pas le QUOI (le code dit deja QUOI)
16
+ - [ ] Le code mort est supprime, pas commente — git garde l'historique
17
+ - [ ] La duplication est toleree jusqu'a 3 occurrences — abstraire au 4e usage, pas au 2e (Rule of Three)
18
+
19
+ ## Anti-patterns
20
+ ### Linting maximaliste
21
+ **Ce qu'on voit :** 200 regles ESLint activees. `no-console`, `no-param-reassign`, `max-lines-per-function: 20`, `no-else-return`. Chaque commit declenche 15 erreurs qui ne sont PAS des bugs.
22
+ **Pourquoi c'est dangereux :** le linter n'est plus un outil — c'est un obstacle. Les devs le contournent (`eslint-disable` partout), le resultat est pire que pas de linter du tout. La fatigue du linter cree une culture ou les avertissements sont ignores.
23
+ **Faire plutot :** regles qui attrapent des BUGS, pas des preferences : `no-undef`, `no-unused-vars` (erreur, pas warning), `no-unsafe-*`. Formatage automatique, pas manuel. Tout le reste : warning ou off. L'objectif est zero faux positifs, pas un score de linting eleve.
24
+
25
+ ### Refactoring sans filet
26
+ **Ce qu'on voit :** "je refactore cette classe pour la rendre plus propre." 2 semaines plus tard, 40 fichiers modifies, fonctionnalites cassees, aucun test ajoute.
27
+ **Pourquoi c'est dangereux :** le refactoring sans tests n'est pas du refactoring — c'est de la reecriture. Sans filet, chaque changement est un risque. Le "clean code" qui casse la production n'est pas propre — il est dangereux.
28
+ **Faire plutot :** tests AVANT refactoring. Si le code n'a pas de tests, en ecrire (characterization tests). Refactoring en petits pas, commit par commit. Si un test casse, revert immediatement.
29
+
30
+ ### Abstraction prematuree (DRY abuse)
31
+ **Ce qu'on voit :** deux fonctions de 3 lignes qui se ressemblent → abstraction dans une classe mere. La 3e utilisation arrive, difference subtile → `if (specialCase)`. 4e utilisation → 4 parametres de configuration. L'abstraction est devenue plus complexe que le code duplique.
32
+ **Pourquoi c'est dangereux :** le mauvais DRY crée du couplage. Une abstraction prematuree lie ensemble des concepts qui evoluent differemment. Le cout de changer l'abstraction (tous les appels) depasse le cout de la duplication (2-3 endroits).
33
+ **Faire plutot :** Rule of Three : dupliquer jusqu'a 3 fois. A la 3e occurrence, abstraire. L'abstraction a maintenant 3 cas reels pour etre testee. Si la 4e occurrence ne rentre pas, l'abstraction etait prematuree — splitter.
34
+
35
+ ## Patterns
36
+ ### Boy Scout Rule
37
+ **Quand :** maintenance quotidienne.
38
+ **Comment :** "laisse le code plus propre que tu ne l'as trouve." Un petit nettoyage a chaque commit : renommer une variable, extraire une fonction, supprimer du code mort. Pas de refactoring massif — des micro-ameliorations continues.
39
+
40
+ ### Static analysis in CI
41
+ **Quand :** toute PR.
42
+ **Comment :** le linter + l'analyse statique tournent dans la CI. Bloquant sur les regles de securite et de bug. Non-bloquant (annotation dans la PR) pour les suggestions de style. Exemple : `eslint --max-warnings 0` pour les regles d'erreur, `--quiet` pour le reste.
@@ -0,0 +1,41 @@
1
+ ---
2
+ name: code-review
3
+ description: "Code Review — PR hygiene, review checklist, constructive feedback, security review, Boy Scout Rule. À charger quand on fait ou reçoit une revue de code."
4
+ ---
5
+
6
+ # Code Review
7
+
8
+ **Principe premier :** La code review n'est pas un gate de qualité — c'est un outil de partage de connaissance. Le but #1 n'est pas de trouver des bugs (les tests et la CI font ça), c'est de s'assurer que le code est compréhensible par quelqu'un qui ne l'a pas écrit. Un bug trouvé en review est un échec des tests. Une incompréhension en review est un échec du code. La métrique n'est pas "nombre de commentaires" mais "est-ce que je pourrais maintenir ce code sans parler à l'auteur ?"
9
+
10
+ ## Checklist
11
+ - [ ] La PR fait < 400 lignes — sinon, découper
12
+ - [ ] Les tests existent, passent, et couvrent les cas limites
13
+ - [ ] La description explique le POURQUOI, pas le QUOI (le diff montre le quoi)
14
+ - [ ] Les noms sont explicites — pas de `x`, `data`, `tmp`, `result`, `handle()`
15
+ - [ ] Pas de code mort, pas de TODO sans ticket, pas de commentaire qui ment
16
+ - [ ] La sécurité est vérifiée : injection, auth, PII exposé
17
+
18
+ ## Anti-patterns
19
+ ### PR de 2000 lignes
20
+ **Ce qu'on voit :** une PR avec 15 fichiers, 3 fonctionnalités, et une description "Refactoring + nouvelle feature + fix bug".
21
+ **Pourquoi c'est dangereux :** impossible à review correctement. Le cerveau humain ne peut pas traiter 2000 lignes de diff. Les bugs passent. La review dure 2h et personne ne la fait sérieusement. Les grosses PRs sont le symptôme d'un découpage du travail mal fait.
22
+ **Faire plutôt :** PR < 400 lignes. Une fonctionnalité, un fix, un refactoring par PR. Petits merges fréquents. Si le changement est gros → feature flag + PRs incrémentales.
23
+
24
+ ### Feedback sur la personne
25
+ **Ce qu'on voit :** "c'est nul", "refais tout", "pourquoi t'as fait comme ça ?" — ton condescendant.
26
+ **Pourquoi c'est dangereux :** ça ne tue pas que l'humeur — ça tue les futures PRs. L'auteur évite de soumettre, ou soumet en cachette. La qualité baisse par peur du feedback. Le coût est à long terme.
27
+ **Faire plutôt :** "Cette approche a le risque X" (pas "tu as mal fait"). Suggestion, pas ordre : "Est-ce qu'on pourrait... ?". Le feedback cible le code, jamais la personne.
28
+
29
+ ### LGTM reflex
30
+ **Ce qu'on voit :** "LGTM" sur une PR de 500 lignes, 2 minutes après l'ouverture.
31
+ **Pourquoi c'est dangereux :** c'est un non-review. Le reviewer n'a pas lu le code. L'auteur n'apprend rien. Les bugs passent. Pire : ça donne une fausse confiance ("c'est reviewé").
32
+ **Faire plutôt :** si tu n'as pas le temps, ne review pas. Si tu review, passe au moins 15 min et trouve au moins UNE chose (positive ou à améliorer). Une review qui ne produit aucun commentaire n'est pas une review.
33
+
34
+ ## Patterns
35
+ ### PR template
36
+ **Quand :** toute PR.
37
+ **Comment :** template concis : contexte, changements, captures/évidence, points d'attention pour le reviewer. L'auteur remplit. Le reviewer a tout le contexte. 2 minutes de remplissage = 15 minutes gagnées en review.
38
+
39
+ ### Boy Scout Rule
40
+ **Quand :** tout fichier touché.
41
+ **Comment :** laisser le code plus propre qu'on ne l'a trouvé. Renommer une variable confuse. Extraire une fonction de 30 lignes. Ajouter un test manquant. Pas de refactoring massif — juste le petit coup de balai.
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: communication
3
+ description: "Communication Technique — documentation, diagrammes C4, RFC, post-mortem, presentation, spec writing. A charger quand on communique sur un sujet technique."
4
+ ---
5
+
6
+ # Communication Technique
7
+
8
+ **Principe premier :** La communication technique n'est pas "ecrire ce qu'on sait" — c'est faire comprendre ce que l'autre a besoin de savoir. Le plus grand piege de la communication d'expert : la malediction du savoir. Tu sais tellement bien ton sujet que tu ne peux plus imaginer ce que c'est de ne pas le savoir. Resultat : tu sautes des etapes, utilises du jargon, assumes des prerequis — et ton interlocuteur est perdu. La regle d'or : si tu ne peux pas expliquer ton design a un dev qui vient d'arriver, ton design n'est pas pret. Pas parce que le dev est novice — parce que la clarte est un test de comprehension. Si c'est flou dans ta tete, c'est flou sur le papier.
9
+
10
+ ## Checklist
11
+ - [ ] La documentation est dans le repo, versionnee avec le code — pas dans Confluence/Notion qui se perime
12
+ - [ ] Les decisions techniques sont communiquees avec le POURQUOI (contexte, alternatives) — pas juste la solution
13
+ - [ ] Les diagrammes utilisent un standard reconnu (C4, UML sequence, Mermaid) — pas un outil proprietaire
14
+ - [ ] Les specs sont ecrites avant le code, lues par l'equipe, et amendees — pas "le code est la spec"
15
+ - [ ] Les post-mortems sont blameless : ce qui s'est passe, pourquoi, comment eviter que ca se reproduise
16
+ - [ ] La communication est adaptee au public : C4 level 1 pour stakeholders, level 3 pour devs
17
+ - [ ] Les PR descriptions expliquent le contexte et les trade-offs — pas juste "fixes bug"
18
+
19
+ ## Anti-patterns
20
+ ### Documentation dans un outil separe
21
+ **Ce qu'on voit :** specs dans Confluence, designs dans Notion, decisions dans Trello, code dans GitHub. Rien n'est a jour. Personne ne trouve rien.
22
+ **Pourquoi c'est dangereux :** la documentation eloignee du code est de la documentation morte. Elle n'est pas versionnee avec le code qu'elle decrit. Elle n'est pas revue en PR. Elle pourrit independamment. Le nouveau dev lit la spec Confluence de 2023 et code un feature deja deprecie.
23
+ **Faire plutot :** documentation dans le repo, en markdown, a cote du code qu'elle documente. `docs/architecture.md`, `docs/adrs/`, `services/orders/README.md`. La doc se review en PR comme le code. Si le code change, la doc change dans le meme commit.
24
+
25
+ ### Diagramme = oeuvre d'art
26
+ **Ce qu'on voit :** 3 jours passes a faire un diagramme UML parfait dans un outil proprietaire. Le diagramme est beau. Le code change 2 semaines plus tard. Le diagramme n'est plus a jour et ne peut pas etre modifie (outil perdu, licence expiree).
27
+ **Pourquoi c'est dangereux :** un diagramme est un outil de communication, pas un livrable. Passer 3 jours sur un diagramme qui sera obsolet dans 2 semaines est du gaspillage. L'outil proprietaire cree un barrier a la modification → le diagramme pourrit.
28
+ **Faire plutot :** diagrammes en texte (Mermaid, PlantUML, Graphviz). Versionnes dans le repo. Render automatiquement dans la CI. Assez bons pour communiquer, pas parfaits. Si le diagramme prend plus d'1h, c'est qu'il est trop detaille.
29
+
30
+ ### Post-mortem = blame game
31
+ **Ce qu'on voit :** incident → "qui a deploye ca ?" → recherche de coupable → le dev qui a deploye est blame. Prochaine fois, personne n'osera deployer.
32
+ **Pourquoi c'est dangereux :** chercher un coupable garantit que les incidents futurs seront caches, pas corriges. Les gens ne signalent pas les quasi-incidents. La peur remplace l'apprentissage. L'organisation devient fragile parce qu'elle ne corrige pas ses processus.
33
+ **Faire plutot :** post-mortem blameless. L'incident est cause par le SYSTEME, pas par l'individu. "Qu'est-ce qui dans notre processus a permis cette erreur ?" Action concrete sur le processus pour que ca ne se reproduise pas. L'auteur du deploiement participe au post-mortem sans crainte.
34
+
35
+ ## Patterns
36
+ ### C4 Model
37
+ **Quand :** expliquer l'architecture a differents publics.
38
+ **Comment :** 4 niveaux. Level 1 (Context) : le systeme dans son environnement — pour les stakeholders. Level 2 (Containers) : les briques majeures (app, DB, file system) — pour l'equipe tech elargie. Level 3 (Components) : l'interieur de chaque container — pour les devs. Level 4 (Code) : diagramme de classes — seulement si necessaire. Toujours commencer par le niveau 1, toujours avoir un titre et une legende.
39
+
40
+ ### Spec writing
41
+ **Quand :** feature de > 1 semaine.
42
+ **Comment :** ecrire la spec AVANT de coder. Sections : Problema (quoi et pourquoi), Solution proposee (comment), Alternatives considerees, Impact (migration, cout, risques), Plan de test. Review d'equipe avant implementation. La spec peut etre courte (1-2 pages) — le but est l'alignement, pas la perfection.