@yonathan124/zentry 1.0.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.
@@ -0,0 +1,1232 @@
1
+ export const STACKS={
2
+ "njs-supa":{label:"Next.js + Supabase",tag:"Next·Supabase",db:"Supabase (PostgreSQL+RLS)",auth:"Supabase Auth",adapt:null,
3
+ sec:["RLS activé sur toutes les tables (auth.uid()=user_id)","SERVICE_ROLE_KEY : serveur uniquement","Politiques SELECT/INSERT/UPDATE/DELETE séparées","NEXT_PUBLIC_ sans données sensibles"],
4
+ perf:["Server Components pour les données statiques","Supabase realtime : désabonner dans useEffect cleanup","Edge Functions pour la logique proche des données","select() avec colonnes explicites, jamais *"],
5
+ rules:"## SUPABASE\n- SERVICE_ROLE_KEY : serveur UNIQUEMENT\n- auth.uid() dans TOUTES les politiques RLS\n- rpc() pour transactions multi-tables\n- .single() au lieu de .limit(1) pour assertions"},
6
+ "njs-prisma":{label:"Next.js + Prisma",tag:"Next·Prisma",db:"PostgreSQL via Prisma",auth:"NextAuth.js / Lucia",
7
+ adapt:"• RLS → where:{userId:session.user.id} sur chaque requête\n• auth.uid() → session.user.id (getServerSession)\n• rawQuery interdit avec variables interpolées\n• findUnique au lieu de findFirst pour les assertions",
8
+ sec:["Chaque requête filtrée par userId de session","findMany({}) interdit sans filtre","rawQuery interdit avec interpolation","select explicite, no include profond"],
9
+ perf:["Prisma.$transaction pour opérations multiples","select:{} pour limiter les colonnes retournées","Pagination obligatoire avec take+skip ou cursor","Index dans schema.prisma sur colonnes filtrées"],
10
+ rules:"## PRISMA\n- TOUJOURS : where:{userId:session.user.id}\n- select:{} explicite sur chaque query\n- $transaction pour les opérations atomiques"},
11
+ "node-express":{label:"Node.js / Express",tag:"Node·Express",db:"PostgreSQL (pg/knex)",auth:"JWT / Passport.js",
12
+ adapt:"• helmet→cors→rateLimit→authJwt→routes (ordre obligatoire)\n• req.user.id depuis JWT vérifié, jamais req.body\n• SQL : paramètres positionnels $1,$2 uniquement",
13
+ sec:["Ordre middleware : helmet→cors→rateLimit→authJwt→routes","JWT_SECRET en env, longueur ≥ 32 chars","SQL $1,$2 positionnels","res.json(error) interdit"],
14
+ perf:["Connection pooling pg.Pool avec max adapté","Async/await partout, pas de callbacks","Compression middleware pour les réponses > 1kb","Cache Redis pour les données fréquentes"],
15
+ rules:"## NODE/EXPRESS\n- Ordre : helmet→cors→rateLimit→verifyJWT→routes\n- Connection pool configuré\n- Jamais de blocking I/O dans le thread principal"},
16
+ "django":{label:"Django + PostgreSQL",tag:"Django·DRF",db:"PostgreSQL via Django ORM",auth:"Django Auth/DRF",
17
+ adapt:"• queryset.filter(user=request.user) sur tout\n• CSRF middleware actif partout\n• raw() interdit avec variables\n• select_related/prefetch_related pour éviter N+1",
18
+ sec:["queryset.filter(user=request.user) partout","CSRF actif","ORM uniquement","SECRET_KEY en env"],
19
+ perf:["select_related() pour FK, prefetch_related() pour M2M","only()/defer() pour limiter les colonnes","Cache avec django.core.cache","Pagination avec DRF PageNumberPagination"],
20
+ rules:"## DJANGO\n- TOUJOURS : queryset.filter(user=request.user)\n- select_related/prefetch_related pour éviter N+1\n- only() pour limiter les colonnes retournées"},
21
+ "fastapi":{label:"FastAPI + PostgreSQL",tag:"FastAPI·SQLAlchemy",db:"PostgreSQL via SQLAlchemy",auth:"JWT/OAuth2",
22
+ adapt:"• Depends(get_current_user) EN PREMIER sur toutes routes\n• Pydantic BaseModel strict sur tous inputs\n• CORS origins explicites, jamais wildcard *\n• async def sur toutes les routes I/O-bound",
23
+ sec:["Depends(get_current_user) en premier","Pydantic strict","CORS origins explicites","SQL paramètres SQLAlchemy"],
24
+ perf:["async def sur routes I/O-bound","Connection pool asyncpg avec pool_size adapté","Pydantic response_model pour filtrer les champs","Background tasks pour opérations longues"],
25
+ rules:"## FASTAPI\n- Toute route protégée : Depends(get_current_user) EN PREMIER\n- async def sur toutes les routes qui font I/O\n- response_model sur chaque endpoint"},
26
+ "react-native":{label:"React Native + Expo",tag:"RN·Expo",db:"Supabase/Firebase",auth:"Supabase Auth",
27
+ adapt:"• localStorage → Expo SecureStore uniquement\n• AsyncStorage pour tokens = INTERDIT\n• Certificate pinning sur endpoints critiques\n• Code push : valider côté serveur les versions autorisées",
28
+ sec:["Expo SecureStore pour tokens","Clés API hors bundle","Security Rules testées","Certificate pinning"],
29
+ perf:["FlatList avec getItemLayout pour les grandes listes","React.memo sur les composants de liste","Hermes engine activé","expo-image au lieu de Image pour le cache"],
30
+ rules:"## REACT NATIVE\n- Expo SecureStore UNIQUEMENT pour tokens\n- FlatList obligatoire pour listes > 20 items\n- Hermes activé en production"},
31
+ "laravel":{label:"Laravel + MySQL/PG",tag:"Laravel·Eloquent",db:"MySQL/PostgreSQL Eloquent",auth:"Sanctum/Passport",
32
+ adapt:"• Policy Laravel + where('user_id',auth()->id())\n• $fillable explicite sur chaque Model\n• CSRF sur routes POST web\n• Eager loading with() pour éviter N+1",
33
+ sec:["authorize() en premier","where('user_id',auth()->id())","$fillable explicite","CSRF sur POST/PUT/DELETE"],
34
+ perf:["with() pour eager loading","chunk() pour traitement de grands datasets","Cache::remember pour données fréquentes","DB::listen pour détecter les N+1 en dev"],
35
+ rules:"## LARAVEL\n- authorize() EN PREMIER dans chaque action\n- with() pour eager loading\n- chunk() pour > 1000 records"},
36
+ "nuxt":{label:"Nuxt + Supabase",tag:"Nuxt·Supabase",db:"Supabase (PostgreSQL+RLS)",auth:"nuxt-auth-utils",adapt:null,
37
+ sec:["RLS Supabase activé","event.context.user vérifié en premier","Composables client-only","NUXT_PUBLIC_ sans données sensibles"],
38
+ perf:["useFetch avec lazy:true pour non-critique","useAsyncData avec transform pour minimiser les données","Nitro prerender pour pages statiques","Composants Suspense pour SSR partiel"],
39
+ rules:"## NUXT\n- Server routes : event.context.user AVANT toute logique\n- useFetch avec getCachedData pour déduplication\n- RLS Supabase requis même avec auth Nuxt"},
40
+ };
41
+
42
+ // ─── PHASE GROUPS ──────────────────────────────────────────────
43
+ export const GROUPS=[
44
+ {id:"discovery",label:"Découverte",color:"#6B5CF6",phases:["p0","p05"]},
45
+ {id:"security", label:"Sécurité", color:"#E5534B",phases:["p1","p2","p_cfg"]},
46
+ {id:"quality", label:"Qualité", color:"#1E7FD8",phases:["p3","p4","p5","p6"]},
47
+ {id:"advanced", label:"Avancé", color:"#0D9373",phases:["p_tests","p_deps","p_obs","p_a11y","p_integ","p_biz"]},
48
+ {id:"data", label:"Données", color:"#C47D0E",phases:["p7","p8","p85"]},
49
+ {id:"redteam", label:"Red Team", color:"#E5534B",phases:["p9a","p9b","p9c"]},
50
+ {id:"dast", label:"DAST & Fuzz", color:"#9333EA",phases:["p_dast_infra","p_dast_api"]},
51
+ {id:"closure", label:"Clôture", color:"#1A7F4B",phases:["p10","p11"]},
52
+ ];
53
+
54
+ // ─── PHASES (22) ──────────────────────────────────────────────
55
+ export const PHASES=[
56
+ // ── DISCOVERY ───────────────────────────────────────────────
57
+ {id:"p0",n:"0",icon:"🗺",label:"Découverte & Contexte Métier",color:"#6B5CF6",tag:"DISCOVERY",group:"discovery",
58
+ deps:[],
59
+ what:"Cartographie complète : stack, données sensibles, rôles, flux critiques, métriques de charge. Ce contexte enrichit automatiquement toutes les phases suivantes.",
60
+ how:"Copie le prompt → colle dans Antigravity avec le contexte du projet → récupère le tableau de blocs + contexte métier complet → reviens remplir et cocher.",
61
+ prompt:`Tu es un Lead Security Architect & Solutions Expert. Cartographie ce projet AVANT tout audit.
62
+
63
+ SECTION A — TECHNIQUE
64
+ 1. Stack complète (framework+version, BDD+ORM, auth, payment, storage, CDN, cache)
65
+ 2. Architecture globale (monolithe / microservices / serverless / hybride ?)
66
+ 3. Environnements (dev/staging/prod) et différences entre eux
67
+ 4. Points d'intégration externes (APIs tierces, webhooks, OAuth providers, messaging)
68
+
69
+ SECTION B — LOGIQUE MÉTIER (CRITIQUE — enrichit toutes les phases)
70
+ 1. Acteurs : qui utilise le système ? (rôles, permissions, types d'utilisateurs)
71
+ 2. Flux critiques : inscription, paiement, traitement de données, envoi de communication
72
+ 3. Données sensibles : PII, financières, audio, médicales, contrats — où stockées, comment protégées
73
+ 4. Règles métier INVARIANTES (celles qui ne doivent JAMAIS être violées, même en cas d'erreur)
74
+ 5. Métriques de charge : utilisateurs actifs quotidiens, pics simultanés, SLA cible, géographie
75
+
76
+ SECTION C — CONFORMITÉS À DÉDUIRE
77
+ RGPD si données EU/Afrique · PCI-DSS si paiement carte · HIPAA si médical · SOC2 si SaaS B2B
78
+
79
+ SECTION D — PLAN D'AUDIT (sortie obligatoire)
80
+ Tableau Markdown :
81
+ | Bloc | Fichiers (max 5) | Criticité | Phase principale | Règles métier concernées | Dépendances |
82
+
83
+ RÈGLE : Aucun audit maintenant. Signal GO BLOC [N] pour démarrer.`,
84
+ checks:["Stack technique complète identifiée","Rôles et flux critiques documentés","Données sensibles listées et classifiées","Règles métier invariantes notées","Métriques de charge documentées","Conformités déduites automatiquement","Blocs d'audit créés (max 5 fichiers/bloc)"]},
85
+
86
+ {id:"p05",n:"0.5",icon:"📁",label:"Génération des Sessions d'Audit",color:"#6B5CF6",tag:"GENERATION",group:"discovery",
87
+ deps:["p0"],
88
+ what:"L'IA crée audit-sessions/ avec un .md prêt par bloc, contexte métier injecté, et les dépendances entre blocs documentées.",
89
+ how:"Copie le prompt → colle dans Antigravity → l'IA crée les fichiers → vérifie audit-sessions/README.md → cocher.",
90
+ prompt:`La cartographie et le contexte métier sont dans AUDIT_MASTER_TRACKER.md. Génère les sessions.
91
+
92
+ 1. Crée audit-sessions/ à la racine
93
+ 2. Pour chaque bloc du tracker, crée bloc-XX.md :
94
+ - En-tête : nom, criticité, phase, fichiers exacts, règles métier pertinentes
95
+ - Contexte métier injecté : flux critiques, rôles, données sensibles du bloc
96
+ - Prompt d'audit COMPLET avec fichiers déjà insérés et contexte préfixé
97
+ - Règles anti-faux-positifs : "Signale UNIQUEMENT ce que tu as VU dans le code"
98
+ - Format obligatoire (✅/🟡/🔴 avec ligne + correctif)
99
+ - Dépendances : "Lire d'abord bloc-XX.md si applicable"
100
+ - Instruction finale : "Après audit → mets à jour AUDIT_MASTER_TRACKER.md"
101
+ 3. Crée audit-sessions/README.md :
102
+ - Ordre d'exécution recommandé avec justification
103
+ - Carte des dépendances entre blocs
104
+ - Estimation de durée totale
105
+ 4. Crée audit-sessions/FINDINGS_REGISTER.md :
106
+ - Template pour centraliser tous les findings cross-phases
107
+ 5. Mets à jour AUDIT_MASTER_TRACKER.md : "Prompt généré" + "Contexte métier injecté"
108
+
109
+ N'exécute pas les audits. Crée les fichiers.`,
110
+ checks:["audit-sessions/ créé","Un bloc-XX.md par bloc avec prompt + contexte métier","Dépendances entre blocs documentées","README.md avec ordre + durée estimée","FINDINGS_REGISTER.md créé","Tracker mis à jour"]},
111
+
112
+ // ── SECURITY ────────────────────────────────────────────────
113
+ {id:"p1",n:"1",icon:"🔐",label:"Sécurité & Authentification",color:"#E5534B",tag:"SECURITY",group:"security",
114
+ deps:["p0"],
115
+ what:"Audit exhaustif des secrets, contrôle d'accès BDD, validation des inputs, authentification et autorisation. Module par module, zéro tolérance pour les faux positifs.",
116
+ how:"Remplis Bloc + Fichiers → le prompt inclut automatiquement les règles métier de Phase 0 → Copie → colle dans Antigravity.",
117
+ prompt:`Tu es un Expert Cybersécurité Senior spécialisé sur cette stack. BLOC [N].
118
+
119
+ PÉRIMÈTRE : [colle ici les 3-5 fichiers]
120
+
121
+ PROTOCOLE — DANS CET ORDRE STRICT :
122
+
123
+ 1. SECRETS & ENVIRONMENT
124
+ Cherche : strings ressemblant à tokens (sk-, pk-, AIza, ghp_, ey...), clés AWS/GCP/Azure, JWT_SECRET hardcodé
125
+ Cherche : .env dans .gitignore ? .env.local dans le repo ? Variables d'env dans le code client ?
126
+ → COMMANDE DE VÉRIFICATION : git log --all -S "sk-ant\|pk_live\|AIza" --source (à suggérer à l'utilisateur)
127
+
128
+ 2. CONTRÔLE D'ACCÈS AUX DONNÉES
129
+ Pour chaque requête BDD identifiée : l'identifiant utilisateur est-il filtré (WHERE user_id = session.user.id) ?
130
+ Peut-on changer un ID dans la requête et accéder aux données d'un autre ? (IDOR)
131
+ Les 4 opérations CRUD sont-elles toutes protégées, pas seulement READ ?
132
+ Les ressources de niveau admin sont-elles vérifiées avec role === 'admin' côté serveur ?
133
+
134
+ 3. VALIDATION DES INPUTS
135
+ Chaque champ de formulaire a-t-il un schéma Zod/Yup/Pydantic en amont de la BDD ?
136
+ Les IDs dans les requêtes viennent-ils de la SESSION ou du body/params ?
137
+ Les types sont-ils validés (nombre négatif possible pour un prix ? email malformé accepté ?)
138
+ .strict() sur les schémas Zod pour rejeter les champs inconnus ?
139
+
140
+ 4. AUTHENTIFICATION & AUTORISATION
141
+ Ordre dans chaque handler : session vérifiée → rôle vérifié → logique → réponse ?
142
+ Middleware auth actif sur 100% des routes privées (pas seulement les routes listées) ?
143
+ Les tokens JWT sont-ils vérifiés avec la bonne clé et l'algorithme HS256/RS256 explicitement ?
144
+ Les sessions expirent-elles ? Révocation de session possible ?
145
+
146
+ 5. INJECTIONS & XSS
147
+ Concaténation de string dans des requêtes SQL/NoSQL (même partielle) ?
148
+ dangerouslySetInnerHTML / v-html / innerHTML sans DOMPurify ?
149
+ eval(), new Function(), setTimeout(string) avec données utilisateur ?
150
+ Path traversal possible (../../etc/passwd via des chemins de fichiers) ?
151
+
152
+ FORMAT : ✅ [fichier] — SÉCURISÉ : [ce qui a été vérifié]
153
+ 🔴 [fichier] — [CRITIQUE|HAUTE|MOYENNE|BASSE] : [ligne précise + impact + correctif immédiat]
154
+ RÈGLE ABSOLUE : Ne signale que ce VU dans le code. Incertain → "À VÉRIFIER MANUELLEMENT : [raison]"`,
155
+ checks:["Aucun secret hardcodé (clé, token, password, private key)","IDOR impossible : données filtrées par session sur les 4 opérations CRUD","Schéma de validation sur chaque input externe","Session vérifiée EN PREMIER dans chaque handler","100% des routes privées protégées côté serveur","Pas d'injection SQL/XSS/eval identifiée","JWT vérifié avec algorithme explicite"]},
156
+
157
+ {id:"p2",n:"2",icon:"🔌",label:"API & Backend Logic",color:"#E5534B",tag:"API",group:"security",
158
+ deps:["p1"],
159
+ what:"Audit des endpoints, flux de données bout-en-bout, idempotence, logique métier et gestion d'erreurs. Trace chaque requête de l'entrée à la BDD.",
160
+ how:"Remplis Bloc + Fichiers → Copie → colle dans Antigravity. Contexte des findings p1 injecté automatiquement.",
161
+ prompt:`Tu es un Expert Backend & API Security. BLOC [N].
162
+
163
+ PÉRIMÈTRE : [colle ici les 3-5 fichiers]
164
+
165
+ PROTOCOLE — TRACE CHAQUE FLUX BOUT EN BOUT :
166
+
167
+ 1. ORDRE DE TRAITEMENT (obligatoire dans cet ordre)
168
+ auth vérifiée → schéma validé → autorisations → logique métier → BDD → réponse
169
+ Toute déviation de cet ordre est une vulnérabilité architecturale.
170
+
171
+ 2. TRACE DU FLUX DONNÉES
172
+ Pour chaque endpoint : Input → [validation] → [transformation] → [BDD] → [filtrage] → Output
173
+ Les champs retournés au client sont-ils le minimum nécessaire ? (pas de password_hash, pas de token interne)
174
+ Les objets imbriqués ne révèlent-ils pas des données d'autres utilisateurs ?
175
+
176
+ 3. IDEMPOTENCE & LOGIQUE MÉTIER
177
+ Paiements : nonce/idempotency key pour prévenir la double facturation ?
178
+ Webhooks : signature vérifiée (Stripe-Signature, X-Hub-Signature) AVANT tout traitement ?
179
+ Suppressions : vérifie-t-on que l'utilisateur est bien propriétaire avant DELETE ?
180
+ Actions critiques (envoi email, SMS, notification) : une seule exécution garantie ?
181
+ Les règles métier invariantes (Phase 0) sont-elles respectées dans tous les cas d'erreur ?
182
+
183
+ 4. RATE LIMITING & PROTECTION
184
+ Rate limiting sur les routes sensibles (login, password reset, envoi de message) ?
185
+ CORS configuré avec une liste blanche d'origines (pas * en production) ?
186
+ Request body size limité (pas de 1GB payload possible) ?
187
+
188
+ 5. GESTION DES ERREURS
189
+ try/catch sur CHAQUE opération I/O (BDD, API externe, file system) ?
190
+ Les stack traces et noms de tables BDD ne remontent-ils jamais au client ?
191
+ Les erreurs sont-elles loggées côté serveur avec un identifiant de corrélation ?
192
+ Les codes d'erreur HTTP sont-ils sémantiquement corrects (401 vs 403, 404 vs 403) ?
193
+
194
+ FORMAT : ✅ [endpoint] — OK : [flux vérifié]
195
+ 🔴 [endpoint] — [niveau] : [ligne + impact + correctif]`,
196
+ checks:["Ordre auth→validation→logique respecté dans chaque handler","Flux client→BDD tracé : données minimales retournées","Webhooks vérifient signature avant traitement","Paiements/actions critiques idempotentes","Rate limiting sur routes sensibles","CORS avec liste blanche","Erreurs sanitisées (pas d'info système au client)","Règles métier invariantes respectées y compris sur les erreurs"]},
197
+
198
+ {id:"p_cfg",n:"2.5",icon:"⚙",label:"Configuration & Hardening",color:"#E5534B",tag:"CONFIG",group:"security",
199
+ deps:["p1"],
200
+ what:"Audit profond de la configuration : headers HTTP, CORS, CSP, cookies, CSRF, session management et configuration des bibliothèques tierces.",
201
+ how:"Remplis Bloc + Fichiers (next.config.js, middleware, headers, cookie config) → Copie → colle dans Antigravity.",
202
+ prompt:`Tu es un Expert en Configuration Sécurité. BLOC [N].
203
+
204
+ PÉRIMÈTRE : [colle ici les fichiers de configuration : next.config.js, middleware.ts, server config, nginx/caddy config, cookie settings]
205
+
206
+ PROTOCOLE CONFIGURATION & HARDENING :
207
+
208
+ 1. HEADERS HTTP DE SÉCURITÉ (chacun a un rôle précis)
209
+ Content-Security-Policy : présente et efficace (pas default-src *) ?
210
+ → Valide que script-src ne contient pas unsafe-inline ou unsafe-eval
211
+ → Valide que connect-src liste explicitement les domaines externes
212
+ Strict-Transport-Security : max-age ≥ 31536000, includeSubDomains, preload ?
213
+ X-Frame-Options : DENY ou SAMEORIGIN ?
214
+ X-Content-Type-Options : nosniff présent ?
215
+ Referrer-Policy : no-referrer-out-downgrade-when-cross-origin ou plus strict ?
216
+ Permissions-Policy : caméra/micro/géolocalisation restreints si non utilisés ?
217
+
218
+ 2. GESTION DES COOKIES
219
+ Session cookie : HttpOnly=true, Secure=true, SameSite=Strict ou Lax ?
220
+ Les cookies tiers sont-ils limités au nécessaire ?
221
+ Domain et Path explicites pour éviter la propagation ?
222
+ Expiration raisonnable (pas de session permanente sur des données sensibles) ?
223
+
224
+ 3. PROTECTION CSRF
225
+ Tokens CSRF sur toutes les mutations (POST/PUT/DELETE) ?
226
+ SameSite=Strict sur le cookie de session ?
227
+ Origin header validé côté serveur ?
228
+
229
+ 4. SESSION MANAGEMENT
230
+ Sessions expirées après inactivité (idle timeout) ?
231
+ Session ID régénéré après authentification (session fixation) ?
232
+ Invalidation de session possible côté serveur (pas seulement supprimer le cookie côté client) ?
233
+ Limite du nombre de sessions actives par utilisateur ?
234
+
235
+ 5. CONFIGURATION DES DÉPENDANCES
236
+ TLS/SSL : version minimale TLS 1.2, ciphers forts uniquement ?
237
+ CORS : origines explicites, methods explicites, credentials:true seulement si nécessaire ?
238
+ Les bibliothèques d'auth sont-elles correctement configurées (pas de modes débug en prod) ?
239
+
240
+ FORMAT : ✅ [config] — DURCIE : [résumé]
241
+ 🔴 [config] — [CRITIQUE|HAUTE|MOYENNE] : [paramètre + valeur actuelle + valeur correcte + impact]`,
242
+ checks:["CSP présente et restrictive (pas de unsafe-inline/eval)","HSTS max-age ≥ 31536000 avec preload","Cookies : HttpOnly + Secure + SameSite=Strict","CSRF protection sur toutes les mutations","Sessions : expiration + idle timeout + invalidation serveur","TLS 1.2+ uniquement","CORS : origines et méthodes explicites"]},
243
+
244
+ // ── QUALITY ─────────────────────────────────────────────────
245
+ {id:"p3",n:"3",icon:"🖥",label:"Frontend & Accessibilité",color:"#1E7FD8",tag:"FRONTEND",group:"quality",
246
+ deps:["p1"],
247
+ what:"Audit des composants, états async, hydratation SSR, accessibilité WCAG 2.2 et performances UI (Core Web Vitals).",
248
+ how:"Remplis Bloc + Fichiers → Copie → colle dans Antigravity.",
249
+ prompt:`Tu es un Expert Frontend Senior & Accessibility Specialist. BLOC [N].
250
+
251
+ PÉRIMÈTRE : [colle ici les 3-5 fichiers]
252
+
253
+ PROTOCOLE FRONTEND COMPLET :
254
+
255
+ 1. SÉCURITÉ CÔTÉ CLIENT
256
+ Tokens, clés, données de session dans localStorage/sessionStorage ? (HttpOnly cookies uniquement)
257
+ dangerouslySetInnerHTML / v-html / innerHTML sans sanitisation DOMPurify explicite ?
258
+ Les données d'un utilisateur n'affichent-elles pas des infos d'un autre par erreur ?
259
+ XSS via les paramètres URL affichés directement dans le DOM ?
260
+
261
+ 2. ÉTATS ASYNC & ROBUSTESSE UX
262
+ Chaque fetch/mutation a-t-il : état loading visible + état d'erreur clair + état vide géré ?
263
+ Formulaires désactivés (disabled) pendant la soumission ? (pas de double-envoi)
264
+ Retry automatique avec backoff exponentiel sur les erreurs réseau transitoires ?
265
+ Optimistic updates avec rollback en cas d'erreur serveur ?
266
+ Skeleton screens plutôt que spinners pour le contenu prévisible ?
267
+
268
+ 3. RENDU & HYDRATATION
269
+ Hydration Mismatches (différences server/client au premier rendu) ?
270
+ 'use client' au niveau le plus bas possible dans l'arbre de composants ?
271
+ Dynamic import() sur les composants > 30kb ou chargés conditionnellement ?
272
+ Les données sensibles ne sont-elles pas exposées dans le HTML SSR (window.__INITIAL_DATA__) ?
273
+ Streaming Suspense pour les données lentes ?
274
+
275
+ 4. ACCESSIBILITÉ WCAG 2.2
276
+ Images : alt pertinent (pas "image" ou vide — décrire le CONTENU et le CONTEXTE) ?
277
+ Formulaires : labels explicitement associés (htmlFor, aria-labelledby, aria-label) ?
278
+ Navigation clavier : focus visible et logique, piège modal géré (FocusTrap) ?
279
+ Contraste : texte normal ≥ 4.5:1, texte large ≥ 3:1 (vérifier les couleurs exactes) ?
280
+ ARIA roles corrects (pas aria-label sur un div générique sans role) ?
281
+ Annonces aux screen readers pour les états dynamiques (aria-live) ?
282
+ Cibles de touch ≥ 44×44px sur mobile ?
283
+
284
+ 5. PERFORMANCES UI (Core Web Vitals)
285
+ Images avec width+height explicites pour éviter le CLS ?
286
+ Image LCP avec fetchpriority="high" et preload link ?
287
+ Polices : font-display: swap, preconnect sur le provider ?
288
+ Handlers d'événements coûteux debounced/throttled ?
289
+ Pas de layout thrashing (lecture+écriture DOM alternés dans une boucle) ?
290
+
291
+ FORMAT : ✅ [composant] — VALIDÉ : [résumé]
292
+ 🟡 [composant] — [HAUTE|MOYENNE|BASSE] : [description + solution]
293
+ 🔴 [composant] — CRITIQUE : [description + correctif]`,
294
+ checks:["Aucun token/secret en localStorage","Loading + error + empty state sur chaque opération async","Formulaires désactivés pendant soumission","Pas de Hydration Mismatch","dynamic import sur composants > 30kb","Alt text pertinent et contextuel sur toutes les images","Labels associés sur tous les champs de formulaire","Contraste ≥ 4.5:1 sur le texte normal","Focus visible et navigation clavier fonctionnelle","Images LCP avec fetchpriority=high"]},
295
+
296
+ {id:"p4",n:"4",icon:"⚡",label:"Performance & Scalabilité",color:"#1E7FD8",tag:"PERFORMANCE",group:"quality",
297
+ deps:["p0"],hasPerf:true,
298
+ what:"Audit adapté aux métriques métier réelles. Quantifie l'impact à la charge cible, pas des généralités.",
299
+ how:"Remplis les métriques métier + Bloc + Fichiers → le prompt adapte les seuils à ta charge cible → Copie → colle dans Antigravity.",
300
+ prompt:`Tu es un Expert Performance & Scalabilité. BLOC [N].
301
+
302
+ MÉTRIQUES MÉTIER [auto-injectées depuis les champs] :
303
+ Utilisateurs actifs : [UAD] · Pics simultanés : [PEAK] · SLA : [SLA] · Géographie : [GEO]
304
+
305
+ PÉRIMÈTRE : [colle ici les 3-5 fichiers]
306
+
307
+ PROTOCOLE PERFORMANCE — QUANTIFIE PAR RAPPORT À LA CHARGE RÉELLE :
308
+
309
+ 1. REQUÊTES BDD (impact critique à l'échelle)
310
+ Requête dans une boucle (N+1) ? → À [PEAK] utilisateurs simultanés, combien de requêtes/seconde ?
311
+ SELECT * alors que 2-3 colonnes suffisent ? → Impact mémoire à [UAD] requêtes/jour ?
312
+ Index manquants sur colonnes filtrées ? → Vérifier avec EXPLAIN ANALYZE sur les requêtes fréquentes
313
+ Pagination sur toutes les listes ? → Sans pagination, quelle est la taille maximale du jeu de données ?
314
+ Jointures non optimisées ? → Suggérer les index composites manquants
315
+ Transactions trop longues qui bloquent la BDD ?
316
+
317
+ 2. BUNDLE & IMPORTS
318
+ Import de bibliothèque entière pour une fonction ? (lodash, moment, etc.)
319
+ → Calculer la taille ajoutée : lodash = +70kb gzippé
320
+ Bibliothèques non tree-shakeable importées entièrement ?
321
+ Polyfills inutiles pour les navigateurs cibles ?
322
+ Code mort inclus dans le bundle ?
323
+ → Recommander bundle-analyzer : npx @next/bundle-analyzer
324
+
325
+ 3. STRATÉGIE DE CACHE (critique pour SLA [SLA])
326
+ Données statiques sans cache ? → TTL recommandé selon la fréquence de mise à jour
327
+ Cache invalidé trop souvent (every request) ?
328
+ CDN configuré pour les assets statiques ?
329
+ Calculs coûteux répétés sans memoization ?
330
+ Rate limits des APIs tierces pris en compte dans la stratégie de cache ?
331
+
332
+ 4. RENDERING & CORE WEB VITALS
333
+ LCP : élément principal avec priority/fetchpriority="high" ?
334
+ CLS : dimensions réservées pour images et éléments dynamiques ?
335
+ INP : handlers d'événements synchrones sur le thread principal > 50ms ?
336
+ Stratégie ISR/SSG/SSR adaptée à la fréquence de mise à jour des données ?
337
+ Streaming pour les sections lentes ?
338
+
339
+ 5. SCALABILITÉ SOUS [PEAK] UTILISATEURS SIMULTANÉS
340
+ Connection pool BDD : max_connections adapté au nombre d'instances ?
341
+ Opérations longues bloquantes ? (déplacer en background job)
342
+ State applicatif partagé entre instances ? (Redis/Upstash au lieu de mémoire locale)
343
+ Goulots d'étranglement évidents dans l'architecture ? (single point of failure)
344
+
345
+ FORMAT : ✅ [module] — OPTIMISÉ : [résumé + contexte de charge]
346
+ 🟡 [module] — OPTIMISATION [impact estimé à [PEAK] simultanés] : [description + solution]
347
+ 🔴 [module] — BLOQUANT À SCALE : [impact à [UAD] req/jour + correctif]`,
348
+ checks:["Pas de N+1 (requête en boucle)","SELECT avec colonnes explicites","Index BDD sur colonnes filtrées (EXPLAIN ANALYZE suggéré)","Pagination sur toutes les listes","Connection pool configuré","Pas d'import de bibliothèque entière inutile","Cache configuré sur données statiques","Stratégie rendering adaptée","Images LCP prioritaires","Pas de blocking I/O sur le thread principal"]},
349
+
350
+ {id:"p5",n:"5",icon:"🧩",label:"Architecture & Modularité",color:"#1E7FD8",tag:"ARCHITECTURE",group:"quality",
351
+ deps:["p0"],
352
+ what:"Audit de la séparation des responsabilités, typage TypeScript, réutilisabilité, dette technique et testabilité du code.",
353
+ how:"Remplis Bloc + Fichiers → Copie → colle dans Antigravity.",
354
+ prompt:`Tu es un Expert Architecture Logicielle & Clean Code. BLOC [N].
355
+
356
+ PÉRIMÈTRE : [colle ici les 3-5 fichiers]
357
+
358
+ PROTOCOLE ARCHITECTURE :
359
+
360
+ 1. SÉPARATION DES RESPONSABILITÉS (SRP)
361
+ Chaque fichier/module fait-il UNE seule chose ? (ex: un component qui fetch ET affiche ET gère le formulaire = trop)
362
+ La logique métier est-elle dans des services/hooks séparés du rendu ?
363
+ Les règles métier invariantes (Phase 0) sont-elles dans une couche dédiée et testée séparément ?
364
+ Les dépendances vont-elles dans la bonne direction ? (UI → business logic → data access)
365
+
366
+ 2. TYPAGE TYPESCRIPT (lance mentalement tsc --noEmit)
367
+ any non justifié par un commentaire "// RAISON : ..." ?
368
+ Types qui reflètent les règles métier ? (ex: type Price = number & {readonly __brand: 'Price'} pour les prix)
369
+ Interfaces vs types : cohérence dans le projet ?
370
+ Les types génériques sont-ils contraints (T extends ...) quand nécessaire ?
371
+ as casting non justifié (contourne le compilateur) ?
372
+ unknown au lieu de any quand le type n'est pas connu ?
373
+
374
+ 3. RÉUTILISABILITÉ & DRY
375
+ Logique identique dans ≥ 2 endroits → candidat à l'extraction ?
376
+ Composants UI qui pourraient être paramétrables plutôt que dupliqués ?
377
+ Les constantes métier (statuts, codes d'erreur, limites) sont-elles centralisées ?
378
+ Les utilitaires purs (formatage, calculs) sont-ils dans des fichiers dédiés et testables ?
379
+
380
+ 4. DETTE TECHNIQUE QUANTIFIÉE
381
+ TODO sans date + issue tracker → risque de ne jamais être traité
382
+ Fonctions > 50 lignes → identifier et proposer le découpage
383
+ Dépendances obsolètes → npm outdated (suggérer la commande)
384
+ Code commenté ou mort → le signaler pour suppression
385
+ Couplage fort (import circulaire, God Object) ?
386
+
387
+ 5. TESTABILITÉ
388
+ La logique métier est-elle isolable ? (pas de fetch dans les business rules)
389
+ Les effets de bord sont-ils explicites et injectables ?
390
+ Les fonctions pures sont-elles identifiables (même input → même output) ?
391
+ Les dépendances externes sont-elles mockables ?
392
+
393
+ FORMAT : ✅ [module] — PROPRE : [résumé]
394
+ 🟡 [module] — DETTE [HAUTE|MOYENNE|BASSE] : [description + refactoring suggéré]
395
+ 🔴 [module] — CRITIQUE : [description + impact maintenabilité + correctif]`,
396
+ checks:["SRP : chaque module fait une chose","Logique métier dans une couche séparée","tsc --noEmit sans erreur","Pas de any non justifié","Constantes métier centralisées","Pas de code mort","Fonctions > 50 lignes identifiées et découpées","Logique métier isolable pour les tests"]},
397
+
398
+ {id:"p6",n:"6",icon:"🎯",label:"Edge Cases & Résilience",color:"#1E7FD8",tag:"EDGE CASES",group:"quality",
399
+ deps:["p2","p5"],
400
+ what:"Audit systématique des cas limites, valeurs extrêmes, pannes réseau et comportements imprévus. 90% des bugs en production viennent d'ici.",
401
+ how:"Remplis Bloc + Fichiers → Copie → colle dans Antigravity.",
402
+ prompt:`Tu es un Expert en Qualité Logicielle et Test de Résilience. BLOC [N].
403
+
404
+ PÉRIMÈTRE : [colle ici les 3-5 fichiers]
405
+
406
+ PROTOCOLE EDGE CASES — PENSE COMME UN UTILISATEUR MALCHANCEUX ET UN ATTACKER CRÉATIF :
407
+
408
+ 1. NULL, UNDEFINED & ÉTATS VIDES
409
+ Optional chaining utilisé systématiquement sur les objets optionnels ?
410
+ array.map(), .filter(), .reduce() sur un tableau potentiellement vide ?
411
+ Valeur par défaut sur tous les paramètres optionnels ?
412
+ Accès à des propriétés imbriquées sans vérification (obj.a.b.c) ?
413
+ JSON.parse() sans try/catch sur des données externes ?
414
+
415
+ 2. VALEURS LIMITES (BOUNDARY CONDITIONS)
416
+ Nombre : 0, négatif, Infinity, NaN, très grand (overflow int64 ?)
417
+ String : vide "", 1 caractère, 10 000 caractères, caractères spéciaux (<>"'&), emojis 🎉, RTL (عربي)
418
+ Date : passé lointain (1900), futur lointain (2099), timezone différent de l'utilisateur, DST changements
419
+ Fichier : taille 0 octets, taille maximale dépassée, mauvais MIME type, nom avec espaces/accents/../
420
+ URL : query params encodés, fragments (#), URLs très longues, Unicode dans les paths
421
+
422
+ 3. CONCURRENCE & RACE CONDITIONS
423
+ Deux requêtes en parallèle sur la même ressource (ex: double-clic sur "Confirmer") ?
424
+ Mutation puis lecture immédiate avant que la BDD ne soit à jour ?
425
+ Cache qui retourne une valeur obsolète pendant une opération critique ?
426
+ Expiration de session EN COURS d'une opération longue (> 30 secondes) ?
427
+ Optimistic update qui entre en conflit avec une modification serveur concurrente ?
428
+
429
+ 4. PANNES RÉSEAU & SERVICES TIERS
430
+ API externe indisponible : timeout défini ? Message d'erreur utilisateur clair ?
431
+ Retry exponentiel avec jitter (pas de retry storm) ?
432
+ Circuit breaker pour les services tiers critiques ?
433
+ Que se passe-t-il si Stripe/PayPal est down pendant un paiement en cours ?
434
+ Webhook non livré : idempotence du traitement si relivré ?
435
+ Mobile Afrique : que se passe-t-il avec une connexion 2G/coupée en milieu d'opération ?
436
+
437
+ 5. DONNÉES CORROMPUES & SCHÉMA INATTENDU
438
+ Que se passe-t-il si la BDD retourne null sur un champ NON_NULL attendu ?
439
+ Si un webhook externe change son format de payload ?
440
+ Si un fichier importé (CSV, Excel) a des colonnes inversées ou manquantes ?
441
+ Si un utilisateur contourne le front-end et envoie directement des payloads malformés ?
442
+
443
+ 6. RÈGLES MÉTIER AUX FRONTIÈRES (basé sur Phase 0)
444
+ Les invariants métier tiennent-ils pour les valeurs limites ?
445
+ (0 agents, 0 appels, paiement de 0€, fichier audio de 0 secondes, etc.)
446
+
447
+ FORMAT : ✅ [module] — RÉSILIENT : [cas testés]
448
+ 🟡 [module] — CAS LIMITE NON GÉRÉ [HAUTE|MOYENNE] : [scénario précis → impact → solution]
449
+ 🔴 [module] — CRASH EN PRODUCTION : [scénario → impact métier → correctif immédiat]`,
450
+ checks:["null/undefined géré sur tous les champs critiques","Tableaux vides gérés (affichage + calculs)","Valeurs limites : 0, négatif, très grand, chaîne vide","Race conditions protégées sur actions critiques","Timeout défini sur tous les appels d'API externe","Retry avec backoff exponentiel + jitter","Règles métier invariantes respectées aux valeurs limites","Session expirée gérée en cours d'opération longue"]},
451
+
452
+ // ── ADVANCED ────────────────────────────────────────────────
453
+ {id:"p_tests",n:"7",icon:"🧪",label:"Tests & Couverture",color:"#0D9373",tag:"TESTS",group:"advanced",
454
+ deps:["p5","p6"],
455
+ what:"Audit de la stratégie de tests existante et génération des tests manquants pour la logique métier critique. Un projet sans tests est un projet qui régresse.",
456
+ how:"Remplis Bloc + Fichiers (tests existants + code source) → Copie → colle dans Antigravity.",
457
+ prompt:`Tu es un Expert en Test Engineering & Quality Assurance. BLOC [N].
458
+
459
+ PÉRIMÈTRE : [colle ici les fichiers de test ET le code source correspondant]
460
+
461
+ PROTOCOLE AUDIT TESTS — IDENTIFIER CE QUI MANQUE ET GÉNÉRER :
462
+
463
+ 1. INVENTAIRE DES TESTS EXISTANTS
464
+ Tests unitaires : couverture des fonctions de logique métier ?
465
+ Tests d'intégration : les flux API critiques sont-ils testés end-to-end ?
466
+ Tests E2E : les parcours utilisateur critiques (inscription, paiement, flux principal) ?
467
+ Tests de performance : seuils de charge validés ?
468
+ Calcule une couverture approximative (% de la logique métier critique couverte)
469
+
470
+ 2. TESTS CRITIQUES MANQUANTS (GÉNÈRE-LES)
471
+ Pour chaque fonction de logique métier non testée, génère le test :
472
+ \`\`\`typescript
473
+ describe('[nomFonction]', () => {
474
+ it('should [comportement attendu] when [condition]', () => {
475
+ // Arrange
476
+ const input = [valeur représentative];
477
+ // Act
478
+ const result = maFonction(input);
479
+ // Assert
480
+ expect(result).toEqual([valeur attendue]);
481
+ });
482
+
483
+ it('should handle [edge case]', () => {
484
+ expect(() => maFonction(null)).toThrow('[message d erreur attendu]');
485
+ });
486
+ });
487
+ \`\`\`
488
+
489
+ 3. TESTS DES RÈGLES MÉTIER INVARIANTES (basé sur Phase 0)
490
+ Pour chaque règle métier qui ne doit JAMAIS être violée, génère un test qui valide cette invariante.
491
+ Ces tests doivent être dans un fichier séparé business-rules.test.ts
492
+
493
+ 4. MOCKING & ISOLATION
494
+ Les appels BDD sont-ils mockés dans les tests unitaires (sinon ce sont des tests d'intégration) ?
495
+ Les services externes (email, SMS, paiement) sont-ils mockés ?
496
+ Les tests sont-ils déterministes (pas de Date.now() ou Math.random() sans mock) ?
497
+
498
+ 5. TESTS DE RÉGRESSION
499
+ Pour chaque bug critique corrigé, y a-t-il un test de non-régression ?
500
+ Les tests couvrent-ils les edge cases identifiés en Phase 6 ?
501
+
502
+ FORMAT : ✅ [module] — BIEN TESTÉ : [couverture résumée]
503
+ 🟡 [module] — TESTS MANQUANTS [impact] : [liste + tests générés]
504
+ 🔴 [module] — LOGIQUE MÉTIER NON TESTÉE : [tests critiques générés]`,
505
+ checks:["Logique métier critique couverte par des tests unitaires","Flux API critiques couverts par des tests d'intégration","Règles métier invariantes testées dans un fichier dédié","Edge cases Phase 6 couverts par des tests","Tests déterministes (mocks sur Date/Random/API)","Tests de non-régression sur les bugs passés","Couverture ≥ 80% sur la logique métier (pas le boilerplate)"]},
506
+
507
+ {id:"p_deps",n:"8",icon:"📦",label:"Dépendances & Supply Chain",color:"#0D9373",tag:"DEPS",group:"advanced",
508
+ deps:["p8"],
509
+ what:"Audit complet des dépendances : vulnérabilités CVE, licences incompatibles, alternatives légères, risque d'abandon et sécurité de la supply chain.",
510
+ how:"Remplis Bloc + Fichiers (package.json, yarn.lock, Gemfile, requirements.txt) → Copie → colle dans Antigravity.",
511
+ prompt:`Tu es un Expert en Supply Chain Security & Dependency Management. BLOC [N].
512
+
513
+ PÉRIMÈTRE : [colle ici package.json, lockfile (package-lock.json ou yarn.lock), et tout fichier de dépendances]
514
+
515
+ PROTOCOLE AUDIT DÉPENDANCES :
516
+
517
+ 1. SÉCURITÉ (CVE)
518
+ npm audit --json → lister les CVE critiques et hautes avec leur impact réel
519
+ Pour chaque CVE critique : est-il réellement exploitable dans ce contexte ? (CVSS contextuel)
520
+ Dépendances transitives avec CVE connues ?
521
+ → Commandes à suggérer : npm audit fix --force (avec précautions)
522
+
523
+ 2. LICENCES (risque légal)
524
+ Licences incompatibles avec le modèle commercial ?
525
+ GPL/AGPL dans un projet commercial non open-source → risque légal
526
+ → Licence requise pour chaque dépendance critique (MIT, Apache 2.0, BSD = safe ; GPL = attention)
527
+
528
+ 3. TAILLE & ALTERNATIVES LÉGÈRES
529
+ Dépendances > 50kb gzippé qui pourraient être remplacées ?
530
+ moment.js (67kb) → dayjs (7kb) ou date-fns (tree-shakeable)
531
+ lodash (entire) → lodash-es (tree-shakeable) ou fonctions natives
532
+ axios → fetch natif si pas de besoin spécifique d'axios
533
+ left-pad ou tiny-utility-packages pouvant être réécrites en 5 lignes ?
534
+
535
+ 4. RISQUE D'ABANDON
536
+ Dépendances sans release depuis > 2 ans ?
537
+ Mainteneurs uniques (bus factor = 1) ?
538
+ Issues critiques ouvertes sans réponse depuis > 6 mois ?
539
+ Forks populaires qui ont remplacé le package original ?
540
+
541
+ 5. SÉCURITÉ SUPPLY CHAIN
542
+ Typosquatting : des dépendances avec des noms proches de packages populaires ?
543
+ Scripts postinstall qui exécutent du code (potentiel malware) ?
544
+ Lockfile versionné ? (sans lockfile, npm install peut installer des versions différentes)
545
+ Dépendances qui ont accès aux variables d'env au build time ?
546
+
547
+ FORMAT : ✅ [dépendance] — SÛRE : [version + licence + statut maintenance]
548
+ 🟡 [dépendance] — ATTENTION [CVE|LICENCE|TAILLE|ABANDON] : [détail + alternative recommandée]
549
+ 🔴 [dépendance] — CRITIQUE : [CVE exploitable ou licence incompatible + action immédiate]`,
550
+ checks:["npm audit : pas de CVE critique non justifié","Licences compatibles avec le modèle commercial","Pas de dépendance > 100kb sans alternative légère étudiée","Dépendances maintenues activement (< 2 ans sans release)","Lockfile versionné (yarn.lock ou package-lock.json)","Pas de typosquatting détecté","Scripts postinstall identifiés et audités"]},
551
+
552
+ {id:"p_obs",n:"9",icon:"📊",label:"Observabilité & Monitoring",color:"#0D9373",tag:"OBSERVABILITY",group:"advanced",
553
+ deps:["p8"],
554
+ what:"Audit de la visibilité en production : logs structurés, métriques, alertes, tracing et gestion des incidents. Un bug qu'on ne voit pas en production est pire qu'un bug connu.",
555
+ how:"Remplis Bloc + Fichiers (Sentry config, logger, monitoring config, dashboards) → Copie → colle dans Antigravity.",
556
+ prompt:`Tu es un Expert en Observabilité & Site Reliability Engineering. BLOC [N].
557
+
558
+ PÉRIMÈTRE : [colle ici les fichiers de config monitoring, logger, Sentry/Datadog/etc., alerting rules]
559
+
560
+ PROTOCOLE OBSERVABILITÉ :
561
+
562
+ 1. LOGS STRUCTURÉS
563
+ Les logs sont-ils structurés (JSON) avec des champs standardisés (level, timestamp, requestId, userId) ?
564
+ Les logs contiennent-ils des données sensibles ? (passwords, tokens, PII dans les logs = violation RGPD)
565
+ Un requestId unique tracé à travers toute la requête (headers → BDD → réponse) ?
566
+ Les niveaux de log sont-ils corrects ? (debug en dev, warn/error en prod)
567
+ Les erreurs non capturées (unhandledRejection, uncaughtException) sont-elles loggées ?
568
+ Volumétrie : les logs ne vont-ils pas saturer le stockage à [UAD] req/jour ?
569
+
570
+ 2. MÉTRIQUES BUSINESS & TECHNIQUES
571
+ Les métriques clés du domaine métier sont-elles trackées ? (ex: appels audités/jour, taux de succès)
572
+ Métriques techniques : p95/p99 latence, taux d'erreur 4xx/5xx, connexions BDD actives ?
573
+ Golden signals : Latency, Traffic, Errors, Saturation (RED/USE) ?
574
+ Les SLA définis en Phase 0 sont-ils mesurés automatiquement ?
575
+
576
+ 3. ALERTES (ne pas subir, anticiper)
577
+ Alerte sur erreur rate > seuil (ex: > 1% de 5xx) ?
578
+ Alerte sur latence p95 > SLA cible ?
579
+ Alerte sur saturation BDD (connexions, disk, CPU) ?
580
+ Dead Man's Switch : alerte si le système est SILENCIEUX (pas de requêtes = problème) ?
581
+ Les alertes sont-elles actionnables ? (pas d'alert fatigue avec des faux positifs)
582
+ Rotation d'astreinte définie pour les alertes critiques ?
583
+
584
+ 4. ERROR TRACKING
585
+ Erreurs capturées avec contexte (user, stack trace, breadcrumbs) ?
586
+ Taux d'erreur par endpoint trackés séparément ?
587
+ Erreurs groupées intelligemment (pas un ticket par occurrence) ?
588
+ Release tracking pour corréler erreurs et déploiements ?
589
+
590
+ 5. TRACING DISTRIBUÉ (si microservices ou services multiples)
591
+ Trace ID propagé entre services ?
592
+ Temps passé dans chaque service visible ?
593
+ Goulots d'étranglement identifiables par trace ?
594
+
595
+ FORMAT : ✅ [composant] — OBSERVABLE : [résumé]
596
+ 🟡 [composant] — ANGLE MORT [impact] : [ce qui manque + solution]
597
+ 🔴 [composant] — NON OBSERVABLE EN PRODUCTION : [risque + mise en place urgente]`,
598
+ checks:["Logs structurés (JSON) sans données sensibles","RequestId tracé bout-en-bout","Métriques métier clés trackées","Alertes sur : error rate, latence p95, saturation BDD","Dead Man's Switch configuré","Error tracking avec contexte (user + stack)","SLA définis en Phase 0 mesurés automatiquement","Rotation d'astreinte définie pour les alertes critiques"]},
599
+
600
+ {id:"p_a11y",n:"9.5",icon:"♿",label:"Accessibilité Avancée",color:"#0D9373",tag:"A11Y",group:"advanced",
601
+ deps:["p3"],
602
+ what:"Audit d'accessibilité WCAG 2.2 complet avec tests concrets pour les technologies d'assistance. L'accessibilité est un droit, pas une option.",
603
+ how:"Remplis Bloc + Fichiers (composants, pages, styles) → Copie → colle dans Antigravity. Idéalement : coller aussi les résultats d'axe-core ou Lighthouse.",
604
+ prompt:`Tu es un Expert en Accessibilité Web (WCAG 2.2, ARIA, AT). BLOC [N].
605
+
606
+ PÉRIMÈTRE : [colle ici les fichiers de composants et pages, et idéalement les résultats de : npx axe-core-cli http://localhost:3000 ou Lighthouse accessibility report]
607
+
608
+ PROTOCOLE ACCESSIBILITÉ WCAG 2.2 COMPLET :
609
+
610
+ 1. STRUCTURE SÉMANTIQUE (WCAG 1.3)
611
+ Hiérarchie des titres : h1 unique par page, h2-h6 logiquement imbriqués (pas de saut) ?
612
+ Landmarks ARIA : main, nav, header, footer, aside, section avec aria-label ?
613
+ Listes sémantiques : les menus de navigation sont-ils des <ul>/<ol> ?
614
+ Les tableaux ont-ils des <caption>, <th scope="col/row"> ?
615
+ Les boutons sont-ils des <button> ou des <a href> avec le rôle approprié ?
616
+ Les icônes purement décoratives ont-elles aria-hidden="true" ?
617
+
618
+ 2. ALTERNATIVES TEXTUELLES (WCAG 1.1)
619
+ Images informatives : alt décrivant le contenu ET le contexte ?
620
+ Images complexes (graphiques, diagrammes) : description longue (longdesc ou aria-describedby) ?
621
+ Icônes de boutons sans texte : aria-label descriptif ?
622
+ PDF, vidéos, audio : alternatives textuelles ou transcriptions ?
623
+
624
+ 3. NAVIGATION AU CLAVIER (WCAG 2.1)
625
+ Tous les éléments interactifs atteignables via Tab ?
626
+ Ordre de focus logique (suit l'ordre visuel) ?
627
+ Focus visible : outline visible avec ratio de contraste ≥ 3:1 ?
628
+ Modales : focus piégé dans la modale, retour au déclencheur à la fermeture ?
629
+ Menus déroulants : navigables aux flèches ?
630
+ Drag & drop : alternative au clavier ?
631
+ Raccourcis clavier documentés et sans conflits (Escape, Entrée, Espace) ?
632
+
633
+ 4. CONTRASTE & COULEURS (WCAG 1.4)
634
+ Texte normal (< 18pt) : ratio ≥ 4.5:1 ?
635
+ Texte large (≥ 18pt ou ≥ 14pt gras) : ratio ≥ 3:1 ?
636
+ Composants UI (bordures de champ, icônes actives) : ratio ≥ 3:1 ?
637
+ L'information n'est pas transmise UNIQUEMENT par la couleur (erreurs rouges avec icône ?) ?
638
+
639
+ 5. FORMULAIRES & ERREURS (WCAG 3.3)
640
+ Chaque champ a un label associé (pas juste un placeholder) ?
641
+ Les messages d'erreur identifient le champ concerné et expliquent le problème ?
642
+ Les champs obligatoires sont marqués (aria-required="true") ?
643
+ Validation : les erreurs sont-elles annoncées aux screen readers (aria-live="assertive") ?
644
+
645
+ 6. CONTENU DYNAMIQUE (WCAG 4.1)
646
+ Les mises à jour dynamiques sont-elles annoncées via aria-live ?
647
+ Les chargements sont-ils indiqués (aria-busy="true") ?
648
+ Les composants personnalisés ont-ils le bon rôle ARIA et les bons états (aria-expanded, aria-checked) ?
649
+
650
+ FORMAT : ✅ [composant] — ACCESSIBLE : [résumé]
651
+ 🟡 [composant] — WCAG [critère] — [HAUTE|MOYENNE] : [description + solution concrète]
652
+ 🔴 [composant] — BARRIÈRE D'ACCÈS CRITIQUE : [description + correctif]`,
653
+ checks:["Hiérarchie h1-h6 logique et unique","Landmarks ARIA sur toutes les sections","Alt text pertinent sur toutes les images non-décoratives","Navigation clavier complète sur tous les éléments interactifs","Focus visible avec contraste ≥ 3:1","Contraste texte ≥ 4.5:1 (normal) / 3:1 (large)","Modales avec FocusTrap et retour au déclencheur","Erreurs formulaire avec aria-live=assertive","Pas d'info transmise par couleur seule","Composants ARIA avec états corrects (expanded, checked)"]},
654
+
655
+ {id:"p_integ",n:"10",icon:"🔗",label:"Intégrations Tierces",color:"#0D9373",tag:"INTEGRATIONS",group:"advanced",
656
+ deps:["p2","p_cfg"],
657
+ what:"Audit des intégrations externes : APIs tierces, OAuth/SSO, webhooks entrants/sortants, services email/SMS, stockage cloud. Chaque intégration est une surface d'attaque.",
658
+ how:"Remplis Bloc + Fichiers (code d'intégration, config OAuth, webhook handlers) → Copie → colle dans Antigravity.",
659
+ prompt:`Tu es un Expert en Sécurité des Intégrations & API Tierce. BLOC [N].
660
+
661
+ PÉRIMÈTRE : [colle ici les fichiers d'intégration : handlers OAuth, webhook receivers, API clients, email/SMS service config]
662
+
663
+ PROTOCOLE INTÉGRATIONS TIERCES :
664
+
665
+ 1. OAUTH & SSO
666
+ State parameter présent et validé (prévient CSRF sur le flow OAuth) ?
667
+ PKCE implémenté pour les flows publics (SPA, mobile) ?
668
+ Tokens stockés côté serveur (HttpOnly cookie) et non dans localStorage ?
669
+ Scopes demandés : minimum nécessaire (principle of least privilege) ?
670
+ Token refresh sécurisé et rotation du refresh token ?
671
+ Validation de l'audience (aud claim) dans les tokens JWT reçus ?
672
+
673
+ 2. WEBHOOKS ENTRANTS (Stripe, GitHub, Twilio, etc.)
674
+ Signature vérifiée AVANT tout traitement ?
675
+ Idempotence : deux livraisons du même webhook ne créent pas de doublon ?
676
+ Queue/buffer pour les pics de webhooks (pas de traitement synchrone bloquant) ?
677
+ Réponse 200 rapide + traitement asynchrone pour les webhooks longs ?
678
+ Replay d'attaque prévenu (timestamp vérifié, tolérance ≤ 5 minutes) ?
679
+
680
+ 3. APIs EXTERNES CONSOMMÉES
681
+ Clés API en variables d'env (jamais hardcodées) ?
682
+ Timeout défini sur chaque appel externe (pas de hang infini) ?
683
+ Circuit breaker : que se passe-t-il si l'API externe est down > 5 minutes ?
684
+ Gestion des rate limits de l'API tierce (retry avec backoff, file d'attente) ?
685
+ Données sensibles loggées dans les logs d'API tiers (attention aux SDK qui loggent tout) ?
686
+
687
+ 4. EMAIL & SMS
688
+ Templates email : injection possible dans les champs utilisateur ?
689
+ Rate limiting sur l'envoi (pas de spam bombing via l'API email) ?
690
+ Bounces et unsubscribes traités (impact délivrabilité) ?
691
+ SPF, DKIM, DMARC configurés pour le domaine d'envoi ?
692
+ SMS : vérification du numéro avant envoi, pas de SMS bombing ?
693
+
694
+ 5. STOCKAGE CLOUD (S3, GCS, Azure Blob)
695
+ Buckets privés par défaut (pas de public read) ?
696
+ URLs signées avec expiration courte pour les fichiers sensibles ?
697
+ ACL par objet ou politique de bucket (pas d'accès croisé entre utilisateurs) ?
698
+ Upload direct : validation du type MIME côté serveur (pas seulement l'extension) ?
699
+ Scan antivirus sur les fichiers uploadés ?
700
+
701
+ FORMAT : ✅ [intégration] — SÉCURISÉE : [résumé]
702
+ 🔴 [intégration] — [CRITIQUE|HAUTE|MOYENNE] : [description + vecteur d'attaque + correctif]`,
703
+ checks:["OAuth : state + PKCE + scopes minimum","Webhooks : signature vérifiée avant traitement","Webhooks : idempotents","APIs tierces : timeout + circuit breaker définis","Clés API tierces en variables d'env","Templates email : pas d'injection possible","SPF/DKIM/DMARC configurés","Buckets cloud privés avec URLs signées","Upload : type MIME validé côté serveur"]},
704
+
705
+ {id:"p_biz",n:"10.5",icon:"📋",label:"Tests Logique Métier",color:"#0D9373",tag:"BUSINESS LOGIC",group:"advanced",
706
+ deps:["p0","p2","p6"],
707
+ what:"Audit des invariants métier et des workflows complexes. Vérifie que le code reflète fidèlement les règles du domaine, même dans les cas extrêmes.",
708
+ how:"Copie le prompt → colle dans Antigravity avec le code des domaines métier → valide chaque règle avec l'IA.",
709
+ prompt:`Tu es un Expert en Domain-Driven Design et Logique Métier. BLOC [N].
710
+
711
+ CONTEXTE MÉTIER COMPLET (issu de Phase 0) : [règles métier invariantes]
712
+ PÉRIMÈTRE : [colle ici les fichiers de logique métier, services, domain models]
713
+
714
+ PROTOCOLE TESTS LOGIQUE MÉTIER — VALIDE CHAQUE RÈGLE DU DOMAINE :
715
+
716
+ 1. INVARIANTS MÉTIER (règles qui ne doivent JAMAIS être violées)
717
+ Pour chaque règle invariante identifiée en Phase 0, valide qu'elle est :
718
+ a. Implémentée dans le code (pas seulement dans l'UI)
719
+ b. Protégée même si l'UI est contournée (appel API direct)
720
+ c. Testée unitairement dans un fichier de tests dédié
721
+ d. Documentée dans le code avec un commentaire expliquant POURQUOI
722
+
723
+ 2. TRANSITIONS D'ÉTAT (State Machine)
724
+ Les objets du domaine ont-ils des états définis ?
725
+ Les transitions d'état sont-elles explicites et validées ?
726
+ (ex: un appel peut passer de EN_COURS → TERMINÉ mais pas de TERMINÉ → EN_COURS)
727
+ Un état invalide est-il impossible à atteindre (type safety + validation) ?
728
+
729
+ 3. RÈGLES DE GESTION COMPLEXES
730
+ Les calculs critiques (prix, commissions, scores, quotas) sont-ils corrects ?
731
+ Vérifie les calculs avec des exemples concrets tirés des cas d'usage métier
732
+ Les arrondis sont-ils gérés correctement ? (bancaire : half-even, pas half-up)
733
+ Les devises multiples sont-elles gérées sans erreur de conversion ?
734
+
735
+ 4. WORKFLOWS & SAGA
736
+ Les processus multi-étapes (ex: audit complet) sont-ils résilients ?
737
+ Que se passe-t-il si l'étape 3 échoue après que les étapes 1 et 2 ont réussi ?
738
+ Compensation transactions pour les workflows distribués ?
739
+ Les deadlines métier (ex: "audit doit être terminé en X jours") sont-elles trackées ?
740
+
741
+ 5. COHÉRENCE DES DONNÉES MÉTIER
742
+ Les données de référence (statuts, types, catégories) sont-elles cohérentes entre les modules ?
743
+ Les totaux et agrégats sont-ils recalculés ou maintenus à jour ?
744
+ Les données sont-elles cohérentes entre le cache et la BDD ?
745
+
746
+ FORMAT : ✅ [règle métier] — RESPECTÉE : [comment elle est implémentée + testée]
747
+ 🟡 [règle métier] — PARTIELLEMENT IMPLÉMENTÉE : [ce qui manque + risque métier]
748
+ 🔴 [règle métier] — VIOLÉE OU NON IMPLÉMENTÉE : [impact métier + correctif]`,
749
+ checks:["Toutes les règles invariantes Phase 0 implémentées côté serveur","Machine à états explicite pour les objets du domaine","Calculs critiques vérifiés avec des exemples concrets","Arrondis et devises gérés correctement","Workflows résilients (compensation en cas d'échec partiel)","Règles métier testées unitairement dans un fichier dédié","Transitions d'état invalides impossibles par construction"]},
750
+
751
+ // ── DATA ─────────────────────────────────────────────────────
752
+ {id:"p7",n:"11",icon:"🗄",label:"Données & Migrations",color:"#C47D0E",tag:"DATA",group:"data",
753
+ deps:["p0","p1"],
754
+ what:"Audit du schéma BDD, migrations, intégrité des données, PII et stratégie de disaster recovery.",
755
+ how:"Remplis Bloc + Fichiers (migrations, schema, models) → Copie → colle dans Antigravity.",
756
+ prompt:`Tu es un Expert en Conception de Base de Données & Data Engineering. BLOC [N].
757
+
758
+ PÉRIMÈTRE : [colle ici les fichiers de migration, schéma (schema.sql, prisma.schema, models.py, migrations/), seeds]
759
+
760
+ PROTOCOLE DONNÉES :
761
+
762
+ 1. INTÉGRITÉ DU SCHÉMA
763
+ FK : ON DELETE approprié selon le domaine métier ?
764
+ CASCADE : utilise-t-on vraiment la suppression en cascade ? (souvent trop agressif)
765
+ SET NULL : la colonne est-elle nullable ? (cohérence)
766
+ RESTRICT : comportement voulu si une référence existe encore ?
767
+ NOT NULL : les colonnes critiques pour la logique métier sont-elles contraintes ?
768
+ UNIQUE : les identifiants métier (email, référence commande) sont-ils uniques ?
769
+ CHECK constraints : les valeurs sont-elles contraintes au niveau BDD ? (prix ≥ 0, statut IN (...))
770
+ Types corrects : DECIMAL pour les montants (pas FLOAT), TIMESTAMPTZ pour les dates (pas TIMESTAMP)
771
+ Index : colonnes utilisées dans WHERE, ORDER BY, JOIN — index manquants identifiés ?
772
+ Index composites : ordre des colonnes optimisé pour les requêtes fréquentes ?
773
+
774
+ 2. MIGRATIONS
775
+ Chaque migration a-t-elle une down migration testée ?
776
+ Les migrations sur grandes tables utilisent-elles des techniques non-bloquantes ?
777
+ (ADD COLUMN DEFAULT NULL → backfill séparé → ADD NOT NULL)
778
+ L'ordre des migrations est-il idempotent ? (peut-on rejouer depuis zéro ?)
779
+ Les migrations destructives (DROP) ont-elles un plan de rollback ?
780
+
781
+ 3. DONNÉES SENSIBLES & RGPD
782
+ Mots de passe : bcrypt avec cost ≥ 12 ou argon2id ?
783
+ PII : chiffrées au repos si nécessaire (numéros de téléphone, données médicales) ?
784
+ Droit à l'oubli : mécanisme de suppression/anonymisation implémenté ?
785
+ Rétention des données : les données sont-elles supprimées après la période légale ?
786
+ Logs BDD ne contiennent pas de PII (pg_audit, slow query logs) ?
787
+
788
+ 4. DISASTER RECOVERY
789
+ RPO (Recovery Point Objective) : fréquence des backups adaptée ? (toutes les heures pour des données critiques)
790
+ RTO (Recovery Time Objective) : procédure de restauration testée et chronométrée ?
791
+ Backups : stockés dans une région géographique différente ?
792
+ Point-in-time recovery disponible ?
793
+ Test de restauration effectué dans les 90 derniers jours ?
794
+
795
+ FORMAT : ✅ CONFORME : [résumé]
796
+ 🟡 AMÉLIORATION : [description + impact + solution]
797
+ 🔴 RISQUE INTÉGRITÉ : [description + impact métier + correctif obligatoire]`,
798
+ checks:["FK avec ON DELETE adapté au domaine métier","NOT NULL et CHECK constraints sur colonnes critiques","Types corrects (DECIMAL pour montants, TIMESTAMPTZ pour dates)","Index sur colonnes filtrées/triées (EXPLAIN ANALYZE suggéré)","Migrations réversibles et non-bloquantes sur grandes tables","Mots de passe : bcrypt cost ≥ 12 ou argon2id","PII chiffrées au repos selon conformités","Mécanisme de droit à l'oubli RGPD implémenté","RPO/RTO définis et testés"]},
799
+
800
+ {id:"p8",n:"12",icon:"🖥️",label:"Infra, CI/CD & DevSecOps",color:"#C47D0E",tag:"INFRA",group:"data",
801
+ deps:["p_cfg"],
802
+ what:"Audit de l'infrastructure, pipeline CI/CD, variables d'env, headers HTTP et pratiques DevSecOps.",
803
+ how:"Remplis Bloc + Fichiers (.env.example, Dockerfile, workflows/, nginx config) → Copie → colle dans Antigravity.",
804
+ prompt:`Tu es un Expert DevSecOps & Infrastructure Security. BLOC [N].
805
+
806
+ PÉRIMÈTRE : [colle ici .env.example, Dockerfile, .github/workflows/*.yml, docker-compose.yml, nginx.conf, package.json]
807
+
808
+ PROTOCOLE DEVSECOPS :
809
+
810
+ 1. VARIABLES D'ENVIRONNEMENT
811
+ .env.example à jour avec TOUTES les variables + description de chacune ?
812
+ Différenciation obligatoire dev/staging/prod (jamais les mêmes secrets) ?
813
+ Secrets dans les variables d'env du pipeline (GitHub Secrets) — pas dans les YAML ?
814
+ Rotation des secrets planifiée (pas les mêmes depuis > 1 an) ?
815
+ Variables non utilisées à nettoyer ?
816
+
817
+ 2. PIPELINE CI/CD (Shift Left Security)
818
+ SAST (analyse statique) avant merge ? (Semgrep, CodeQL)
819
+ DAST (analyse dynamique) sur staging avant prod ? (OWASP ZAP)
820
+ Scan de secrets dans le code (Gitleaks) en pre-commit et CI ?
821
+ Tests de sécurité automatisés (npm audit, snyk) bloquants si CVE critique ?
822
+ Image Docker scannée (Trivy, Snyk Container) avant déploiement ?
823
+ Branche production protégée : PR obligatoire + review + tests verts ?
824
+ Déploiement bleu/vert ou canary pour les réductions de risque ?
825
+
826
+ 3. DOCKERFILE & IMAGES
827
+ Image de base officielle et version fixée (pas :latest) ?
828
+ Utilisateur non-root dans le container (USER appuser) ?
829
+ Image multi-stage pour réduire la surface d'attaque ?
830
+ Variables sensibles non incluses dans le Dockerfile (ARG vs ENV) ?
831
+ .dockerignore présent et complet (pas de node_modules, .env, .git dans l'image) ?
832
+
833
+ 4. HEADERS HTTP (rappel du p_cfg + vérification finale)
834
+ Content-Security-Policy effectivement délivrée en production ?
835
+ HSTS avec preload soumis à la preload list des navigateurs ?
836
+ Tous les headers vérifiés avec securityheaders.com ?
837
+
838
+ 5. MONITORING & INCIDENT RESPONSE
839
+ Runbook pour les incidents critiques (procédure step-by-step) ?
840
+ Post-mortem template défini ?
841
+ Canaux d'alerte testés régulièrement (PagerDuty, Slack, email) ?
842
+ SLA de réponse aux incidents défini (P1 < 15min, P2 < 1h) ?
843
+
844
+ FORMAT : ✅ CONFORME : [résumé]
845
+ 🟡 AMÉLIORATION : [description + risque + solution]
846
+ 🔴 CRITIQUE : [description + impact + correctif]`,
847
+ checks:["Toutes variables d'env dans .env.example avec description","Secrets dans pipeline secrets (jamais dans les YAML)","Scan de secrets (Gitleaks) en pre-commit et CI","Tests de sécurité bloquants si CVE critique","Image Docker : non-root + version fixée + multi-stage","Branche production protégée (PR + review + tests)","Headers HTTP vérifiés avec securityheaders.com","Runbook incidents et SLA de réponse définis"]},
848
+
849
+ {id:"p85",n:"12.5",icon:"📚",label:"Documentation Profonde",color:"#C47D0E",tag:"DOCS",group:"data",
850
+ deps:["p5"],
851
+ what:"Audit de la documentation + génération des JSDoc/docstrings manquants pour chaque fonction. L'IA génère la documentation réelle, pas juste les recommandations.",
852
+ how:"Remplis Bloc + Fichiers (code source + docs existantes) → Copie → colle dans Antigravity → récupère la documentation générée.",
853
+ prompt:`Tu es un Expert en Documentation Technique & Knowledge Engineering. BLOC [N].
854
+
855
+ PÉRIMÈTRE : [colle ici le code source + README.md + tout fichier de documentation existant]
856
+
857
+ PROTOCOLE DOCUMENTATION EN DEUX NIVEAUX :
858
+
859
+ NIVEAU 1 — DOCUMENTATION PROJET
860
+ 1. README FONCTIONNEL (test du "30 minutes rule")
861
+ Un développeur junior peut-il lancer le projet en < 30 minutes sans aide ?
862
+ Prérequis : versions exactes (Node 20.x, Python 3.11, Postgres 15) ?
863
+ Commandes step-by-step : clone → install → env → seed → run → test ?
864
+ Dépannage : erreurs communes et solutions ?
865
+
866
+ 2. ARCHITECTURE DECISION RECORDS (ADR)
867
+ Les choix techniques importants sont-ils documentés avec le CONTEXTE et le RAISONNEMENT ?
868
+ (ex: "Pourquoi Supabase et pas Firebase ?" → les ADR documentent la décision)
869
+
870
+ NIVEAU 2 — DOCUMENTATION DU CODE (GÉNÈRE LA DOCUMENTATION MANQUANTE)
871
+ Pour chaque fonction/module sans documentation complète, génère :
872
+
873
+ \`\`\`typescript
874
+ /**
875
+ * [Ce que fait la fonction en 1 phrase active : "Calcule", "Vérifie", "Transforme"...]
876
+ *
877
+ * Contexte métier : [Dans quel flux cette fonction s'insère, pourquoi elle existe,
878
+ * quelles règles métier elle implémente — critique pour comprendre le code dans 6 mois]
879
+ *
880
+ * @param {Type} nomParam - [Description précise + unité si applicable + valeurs invalides]
881
+ * @param {Type} [optionnel] - [Description + valeur par défaut + quand l'omettre]
882
+ *
883
+ * @returns {Type} [Description de ce qui est retourné + cas null/undefined]
884
+ *
885
+ * @throws {ErrorType} [Dans quelles conditions + message d'erreur attendu]
886
+ *
887
+ * @example
888
+ * // [Exemple concret avec vraies valeurs métier — pas de "foo" ou "bar"]
889
+ * const score = calculateAuditScore({ phases: completedPhases, findings: criticalFindings });
890
+ * // → { score: 87, grade: 'B', recommendation: 'Corriger 2 findings critiques' }
891
+ *
892
+ * @see [Lien vers la règle métier, le ticket, ou le document de spec si disponible]
893
+ */
894
+ \`\`\`
895
+
896
+ Pour chaque fichier/module sans commentaire d'en-tête :
897
+ \`\`\`typescript
898
+ /**
899
+ * [Nom du Module] — [Responsabilité en 1 ligne]
900
+ *
901
+ * Ce module [fait X] et [ne fait PAS Y].
902
+ * Point d'entrée : [fonction principale]
903
+ * Dépendances clés : [autres modules dont il dépend + pourquoi]
904
+ *
905
+ * ⚠️ Points d'attention :
906
+ * - [Piège ou contrainte importante à connaître]
907
+ * - [Comportement non intuitif à documenter]
908
+ *
909
+ * @module [NomModule]
910
+ */
911
+ \`\`\`
912
+
913
+ FORMAT : ✅ [fichier] — DOCUMENTÉ : [résumé]
914
+ 🟡 [fichier] — DOCUMENTATION MANQUANTE : [liste des fonctions + documentation générée ci-dessous]
915
+ 🔴 [fichier] — CRITIQUE NON DOCUMENTÉ : [logique complexe sans doc = bombe à retardement]`,
916
+ checks:["README : lancement en < 30min sans aide","ADR pour les choix techniques majeurs","Chaque fonction complexe a un JSDoc avec contexte métier","Chaque module a un commentaire d'en-tête avec responsabilité","Paramètres optionnels documentés avec valeur par défaut","Exemples concrets avec vraies valeurs métier","Points d'attention documentés (pièges, comportements non intuitifs)"]},
917
+
918
+ // ── RED TEAM ─────────────────────────────────────────────────
919
+ {id:"p9a",n:"13",icon:"👁",label:"Red Team — Reconnaissance",color:"#E5534B",tag:"RED·RECON",group:"redteam",
920
+ deps:["p1","p2","p_cfg"],
921
+ what:"Phase 1/3 du Red Team. Cartographie exhaustive de la surface d'attaque SANS exploitation. Le résultat alimente directement Phase 9b.",
922
+ how:"Copie le prompt → colle dans Antigravity avec maximum de contexte → récupère le plan d'attaque → commence p9b.",
923
+ prompt:`Tu changes de posture. Tu es un Hacker Éthique Senior (OSCP + Bug Bounty Top 5%). Phase RECONNAISSANCE.
924
+
925
+ CONTEXTE DISPONIBLE (issu des phases précédentes) :
926
+ - Findings sécurité (p1/p2/p_cfg) : [auto-injecté]
927
+ - Architecture (p5) : [auto-injecté]
928
+ - Données sensibles (p0) : [auto-injecté]
929
+
930
+ PHASE RECONNAISSANCE — CARTOGRAPHIE SANS EXPLOITATION :
931
+
932
+ 1. SURFACE D'ATTAQUE EXTERNE (sans auth)
933
+ Quels endpoints répondent sans token ?
934
+ Les messages d'erreur révèlent-ils des versions, noms de technos, structure BDD ?
935
+ Les headers de réponse exposent-ils des infos (X-Powered-By, Server, X-Framework) ?
936
+ Les endpoints sont-ils enumérables ? (robots.txt, sitemap.xml, /.well-known/)
937
+ Les assets JS/CSS du bundle contiennent-ils des endpoints hardcodés ?
938
+ Les paramètres GET sont-ils dans les logs serveur (potentiel leak de tokens) ?
939
+
940
+ 2. SURFACE D'ATTAQUE AUTHENTIFIÉE
941
+ Avec un compte user standard, quels endpoints admin répondent en 403 vs 404 ?
942
+ (La différence révèle l'existence d'endpoints admin)
943
+ Les IDs de ressources sont-ils séquentiels (prévisibles) ou UUIDs ?
944
+ Les paramètres de pagination (page=1&limit=100) ont-ils des limites ?
945
+ Les filtres de recherche permettent-ils un bruteforce des données ?
946
+
947
+ 3. VECTEURS D'ATTAQUE IDENTIFIÉS (pas exploités, juste cartographiés)
948
+ Pour chaque vecteur, évalue : Exploitabilité × Impact × Probabilité de détection
949
+ 🔴 HAUTE PROBABILITÉ (exploitable avec compétences basiques) :
950
+ 🟡 PROBABILITÉ MODÉRÉE (nécessite des conditions spécifiques) :
951
+ ⚪ FAIBLE PROBABILITÉ (très difficile ou impact limité) :
952
+
953
+ 4. PLAN D'ATTAQUE POUR p9b (priorité décroissante)
954
+ Établis l'ordre des blocs à attaquer avec la justification :
955
+ | Priorité | Bloc | Vecteur principal | Raison |
956
+
957
+ FORMAT FINAL :
958
+ 📊 SURFACE D'ATTAQUE
959
+ Endpoints publics : [N] | Paramètres prévisibles : [liste] | Infos exposées : [liste]
960
+ 🎯 PLAN D'ATTAQUE p9b (ordre prioritaire) :
961
+ 1. [bloc+vecteur le plus prometteur]
962
+ 2. ...`,
963
+ checks:["Endpoints publics exhaustivement cartographiés","Headers de réponse révélateurs identifiés","Différence 403/404 sur endpoints admin notée","Prévisibilité des IDs analysée","Vecteurs listés par exploitabilité × impact","Plan d'attaque p9b établi avec priorités"]},
964
+
965
+ {id:"p9b",n:"14",icon:"⚔️",label:"Red Team — Attaque par Module",color:"#E5534B",tag:"RED·ATTACK",group:"redteam",
966
+ deps:["p9a"],
967
+ what:"Phase 2/3 du Red Team. Exploitation module par module avec le même système de blocs. Chaque tentative est documentée honnêtement (protégé ou exploitable).",
968
+ how:"Utilise le plan de p9a → Remplis Bloc + Fichiers → Copie → colle dans Antigravity. Répète pour chaque bloc identifié.",
969
+ prompt:`EXPLOITATION MODULE PAR MODULE — BLOC [N] (issu du plan p9a)
970
+
971
+ Tu es un Hacker Éthique Senior. Tu exploites le BLOC [N] identifié lors de la reconnaissance.
972
+
973
+ CONTEXTE D'ATTAQUE :
974
+ - Vecteurs identifiés en p9a pour ce bloc : [colle les vecteurs correspondants]
975
+ - Findings de sécurité (p1) pour ce bloc : [colle si disponibles]
976
+ PÉRIMÈTRE : [colle ici les 3-5 fichiers du bloc]
977
+
978
+ OBJECTIFS D'ATTAQUE (ordre de valeur décroissant) :
979
+ 1. BOLA/IDOR : accéder aux données d'autres utilisateurs en changeant un ID
980
+ 2. Privilege Escalation : user → admin → super-admin
981
+ 3. CSRF / Session Fixation : agir en tant qu'un autre utilisateur
982
+ 4. Exfiltration : récupérer des données en masse (BDD dump, fichiers sensibles)
983
+ 5. Business Logic Bypass : contourner les règles métier (paiement 0€, quota illimité)
984
+ 6. DoS ciblé : planter ce module spécifiquement
985
+
986
+ POUR CHAQUE TEST, DOCUMENTE HONNÊTEMENT :
987
+
988
+ 🔴 TEST [N] — [Nom de l'attaque]
989
+ Fichier ciblé : [fichier:ligne ou endpoint]
990
+ Payload : [exactement ce que tu enverrais — curl, JSON body, modifié dans l'URL]
991
+
992
+ SI EXPLOITABLE :
993
+ → Impact réel : [ce que l'attaquant obtient concrètement]
994
+ → Preuve d'exploitation : [comment démontrer sans ambiguïté]
995
+ → Criticité : CRITIQUE / HAUTE
996
+
997
+ SI PROTÉGÉ :
998
+ → Défense en place : [ce qui bloque précisément]
999
+ → Conclusion : PROTÉGÉ ✅
1000
+
1001
+ TESTS OBLIGATOIRES :
1002
+ □ IDOR : [GET/PUT/DELETE] /api/resource/{ID_AUTRE_USER} → données d'un autre ?
1003
+ □ Mass Assignment : { "role": "admin", "isAdmin": true } dans le body → accepté ?
1004
+ □ Paramètre pollution : dupliquer des paramètres GET (?user_id=1&user_id=2) → lequel gagne ?
1005
+ □ JWT : modifier le payload sans resigner → accepté ?
1006
+ □ Path traversal : ../../../etc/passwd dans un champ fichier → réponse ?
1007
+ □ Méthodes HTTP non autorisées : PUT/DELETE sur des endpoints GET-only → réponse ?
1008
+ □ Business logic : valeur négative, 0, très grande → comportement ?
1009
+
1010
+ RÈGLE D'OR : Honnêteté absolue. "Protégé" honnête > faux positif.`,
1011
+ checks:["IDOR testé sur toutes les ressources du bloc","Mass Assignment testé avec champs privilégiés","JWT manipulation tentée","Path traversal tenté","Méthodes HTTP inattendues testées","Business logic bypass tenté avec valeurs limites","Chaque tentative documentée avec payload concrète","'Protégé' justifié techniquement (pas juste 'semble OK')"]},
1012
+
1013
+ {id:"p9c",n:"15",icon:"💥",label:"Red Team — Attaques Chaînées & Verdict",color:"#E5534B",tag:"RED·CHAIN",group:"redteam",
1014
+ deps:["p9a","p9b"],
1015
+ what:"Phase 3/3 du Red Team. Combine les findings de tous les blocs pour des attaques multi-étapes, puis donne un verdict global honnête.",
1016
+ how:"Copie le prompt → colle dans Antigravity avec tous les findings p9a et p9b → récupère le verdict de posture sécurité.",
1017
+ prompt:`PHASE FINALE RED TEAM — ATTAQUES CHAÎNÉES & VERDICT POSTURE GLOBALE
1018
+
1019
+ Tu as terminé la reconnaissance (p9a) et l'exploitation par module (p9b).
1020
+
1021
+ DONNÉES DISPONIBLES :
1022
+ - Findings p9a : [colle ici]
1023
+ - Findings p9b (tous blocs) : [colle ici]
1024
+
1025
+ SECTION 1 — ATTAQUES CHAÎNÉES
1026
+ Combine les findings pour des attaques multi-étapes plus sophistiquées :
1027
+
1028
+ Pour chaque chaîne possible :
1029
+ 🔗 CHAÎNE [N] : [Nom de l'attaque composée]
1030
+ Étape 1 : [Exploiter finding A → obtenir X]
1031
+ Étape 2 : [Utiliser X pour exploiter finding B → obtenir Y]
1032
+ Étape 3 : [Résultat final de la chaîne]
1033
+ Impact total : [Ce que l'attaquant détient au bout de la chaîne]
1034
+ Difficulté : BASIQUE / INTERMÉDIAIRE / AVANCÉ
1035
+ Criticité : CRITIQUE / HAUTE
1036
+
1037
+ Si aucune chaîne n'est possible : explique pourquoi (défense en profondeur réelle).
1038
+
1039
+ SECTION 2 — POST-EXPLOITATION (compte lambda)
1040
+ Avec le plus haut niveau d'accès obtenu :
1041
+ - Quel est le rayon de blast maximal ?
1042
+ - Y a-t-il des informations permettant un pivot (social engineering, credential stuffing) ?
1043
+ - Les données visibles permettent-elles d'attaquer d'autres utilisateurs ?
1044
+
1045
+ SECTION 3 — VERDICT POSTURE SÉCURITÉ GLOBALE
1046
+ Choisis exactement un des quatre niveaux :
1047
+
1048
+ 🔴 NIVEAU CRITIQUE — NE PAS DÉPLOYER :
1049
+ [Findings exploitables + plan de remédiation prioritisé]
1050
+
1051
+ 🟠 NIVEAU ÉLEVÉ — DÉPLOIEMENT RISQUÉ :
1052
+ [Findings à corriger avant toute mise en production]
1053
+
1054
+ 🟡 NIVEAU MODÉRÉ — DÉPLOIEMENT AVEC SURVEILLANCE :
1055
+ [Findings à corriger dans les 30 jours + mesures compensatoires]
1056
+
1057
+ 🟢 POSTURE SÉCURISÉE :
1058
+ [Justification technique que chaque vecteur principal a été testé et résisté]
1059
+ [Liste des protections qui ont fonctionné]
1060
+
1061
+ HONNÊTETÉ ABSOLUE : "Tout sécurisé" honnête + justifications = meilleur résultat.`,
1062
+ checks:["Toutes les combinaisons de findings analysées pour chaînes","Post-exploitation avec compte lambda évalué","Chaque vecteur p9a confirmé testé ou justifié non-applicable","Verdict global en 4 niveaux (pas de zone grise)","Plan de remédiation prioritisé si failles","Protections qui ont fonctionné documentées"]},
1063
+ // ── DAST & FUZZING ──────────────────────────────────────────
1064
+ {id:"p_dast_infra",n:"15.1",icon:"🌩",label:"DAST — Infra & Load Test",color:"#9333EA",tag:"DAST·INFRA",group:"dast",
1065
+ deps:["p_cfg","p8"],
1066
+ what:"Tests de pénétration dynamiques sur l'infrastructure : Rate Limiting réel, Slowloris, stress tests et scan de ports.",
1067
+ how:"Utilise le Fuzzer intégré ou un outil externe (Artillery/k6). Copie les résultats ici.",
1068
+ prompt:`Tu es un Ingénieur Sécurité DAST (Dynamic Application Security Testing). BLOC [N].
1069
+
1070
+ OBJECTIF : Analyser les résultats d'un test de charge / fuzzing infrastructure.
1071
+
1072
+ RÉSULTATS DE TEST À ANALYSER :
1073
+ [Colle ici les résultats de l'API /api/zentry/fuzz type rate_limit ou d'un outil comme k6/Artillery]
1074
+
1075
+ PROTOCOLE DAST INFRASTRUCTURE :
1076
+
1077
+ 1. RATE LIMITING & THROTTLING
1078
+ Le Rate Limiter bloque-t-il vraiment au seuil défini ?
1079
+ Le code HTTP 429 est-il retourné correctement ?
1080
+ Les headers Retry-After sont-ils présents ?
1081
+
1082
+ 2. STRESS TEST & RÉSILIENCE
1083
+ Comportement sous forte charge : l'application crash-t-elle ?
1084
+ La base de données gère-t-elle le pool de connexions (pas d'erreur "Too many connections") ?
1085
+ La latence p99 reste-t-elle acceptable ?
1086
+
1087
+ 3. ATTAQUES VOLUMÉTRIQUES
1088
+ Résistance aux attaques Slowloris (timeout configuré sur le reverse proxy) ?
1089
+ Payload massif rejeté (Payload Too Large 413) ?
1090
+
1091
+ FORMAT FINAL :
1092
+ ✅ RÉSILIENCE CONFIRMÉE : [Explications]
1093
+ 🟡 VULNÉRABILITÉ INFRA [Critère] : [Détail et correctif - ex: Configurer un reverse proxy]
1094
+ 🔴 CRASH DÉTECTÉ : [Action corrective urgente]`,
1095
+ checks:["Rate Limit bloque à 429","Payload massif bloqué à 413","Pas de crash serveur sous forte charge","Pas de crash BDD lié aux pools de connexion","Résistance confirmée aux requêtes lentes"]},
1096
+
1097
+ {id:"p_dast_api",n:"15.2",icon:"🕷",label:"DAST — Fuzzing API",color:"#9333EA",tag:"DAST·API",group:"dast",
1098
+ deps:["p2","p6"],
1099
+ what:"Fuzzing dynamique des endpoints API pour découvrir des failles imprévues, des crashs liés aux inputs inattendus, et vérifier le comportement d'erreur.",
1100
+ how:"Exécute le Fuzzer sur l'API cible. Copie les résultats ici.",
1101
+ prompt:`Tu es un Ingénieur Sécurité DAST (Dynamic Application Security Testing). BLOC [N].
1102
+
1103
+ OBJECTIF : Analyser les résultats du Fuzzing sur les endpoints API.
1104
+
1105
+ RÉSULTATS DU FUZZER À ANALYSER :
1106
+ [Colle ici les résultats de l'API /api/zentry/fuzz type fuzzing sur un endpoint spécifique]
1107
+
1108
+ PROTOCOLE DAST API :
1109
+
1110
+ 1. GESTION DES INPUTS INATTENDUS (FUZZING)
1111
+ Des payloads SQLi/XSS basiques ont-ils causé une erreur 500 au lieu de 400 ?
1112
+ Des types de données erronés ont-ils planté le parseur (ex: array au lieu de string) ?
1113
+ Des payloads vides ont-ils été rejetés proprement ?
1114
+
1115
+ 2. FUITE D'INFORMATIONS
1116
+ Les erreurs 500 renvoient-elles des stack traces (ex: lignes de code, requêtes SQL) ?
1117
+ Les erreurs de validation renvoient-elles trop d'informations sur la structure interne ?
1118
+
1119
+ 3. ROBUSTESSE DES ENDPOINTS
1120
+ Y a-t-il eu un contournement inattendu d'authentification ?
1121
+ Un endpoint public a-t-il été découvert par bruteforce de paramètres ?
1122
+
1123
+ FORMAT FINAL :
1124
+ ✅ API ROBUSTE : [Explications]
1125
+ 🟡 COMPORTEMENT INATTENDU [Critère] : [Détail et correctif]
1126
+ 🔴 VULNÉRABILITÉ DAST CONFIRMÉE : [Action corrective urgente, ex: Injection réussie ou Crash 500]`,
1127
+ checks:["Aucune erreur 500 sur inputs malformés (attendu 400)","Aucune stack trace leakée","Payloads injectés rejetés proprement","Validation stricte des types de données confirmée"]},
1128
+
1129
+ // ── CLOSURE ─────────────────────────────────────────────────
1130
+ {id:"p10",n:"16",icon:"✅",label:"Validation Finale",color:"#1A7F4B",tag:"FINAL",group:"closure",
1131
+ deps:["p9c","p_tests"],
1132
+ what:"L'Auditeur Principal certifie que tout est correct et corrigé. Verdict impitoyablement honnête en 3 niveaux.",
1133
+ how:"Copie le prompt → colle dans Antigravity avec les rapports de toutes les phases → récupère le verdict final.",
1134
+ prompt:`Tu es l'Auditeur Principal chargé de la VALIDATION FINALE avant déploiement en production.
1135
+
1136
+ MISSION : Certifier que le travail est complet, honnête et que TOUTES les corrections ont été appliquées.
1137
+
1138
+ COLLE ICI les résultats des phases précédentes pour l'analyse :
1139
+
1140
+ CHECKLIST DE COMPLÉTUDE (répondre : VÉRIFIÉ / NON APPLICABLE [raison] / MANQUANT) :
1141
+ □ Secrets : aucune clé en clair dans le code ou l'historique Git
1142
+ □ IDOR : impossible d'accéder aux données d'un autre utilisateur
1143
+ □ Auth : session vérifiée EN PREMIER dans CHAQUE handler serveur
1144
+ □ Inputs : TOUS les inputs validés par schéma
1145
+ □ Config : headers HTTP durcis (CSP, HSTS, SameSite)
1146
+ □ Edge cases : null/undefined gérés sur les champs critiques
1147
+ □ Tests : logique métier critique testée unitairement
1148
+ □ Red Team : verdict p9c = MODÉRÉ ou SÉCURISÉ (pas CRITIQUE/ÉLEVÉ)
1149
+ □ Dépendances : pas de CVE critique non résolu
1150
+ □ Bundle : pas de dépendance inutile > 100kb
1151
+ □ TypeScript : tsc --noEmit sans erreur
1152
+ □ Env : toutes variables dans .env.example avec description
1153
+ □ Docs : fonctions complexes documentées avec contexte métier
1154
+ □ Migrations : toutes réversibles + types corrects (DECIMAL, TIMESTAMPTZ)
1155
+ □ Monitoring : erreurs trackées avec contexte, alertes configurées
1156
+
1157
+ VÉRIFICATION DES CORRECTIONS
1158
+ Pour chaque finding CRITIQUE et HAUTE signalé toutes phases confondues :
1159
+ - Correction appliquée ? [VÉRIFIÉ / NON CORRIGÉ]
1160
+ - Correction sans nouveau problème introduit ? [OUI / NON]
1161
+
1162
+ VERDICT FINAL — IMPITOYABLEMENT HONNÊTE — exactement l'un des trois :
1163
+
1164
+ 🟢 PRÊT POUR LA PRODUCTION
1165
+ [Checklist complète → tous VÉRIFIÉ ou N/A justifié]
1166
+ [Red Team = SÉCURISÉ]
1167
+ [Points forts à conserver]
1168
+
1169
+ 🟡 PRÊT AVEC RÉSERVES — ACTIONS DANS LES 7 JOURS
1170
+ [Liste précise de ce qui manque + responsable + date limite]
1171
+ [Mesures compensatoires pendant la période de correction]
1172
+
1173
+ 🔴 NON PRÊT — BLOQUANT
1174
+ [Liste des correctifs obligatoires avec ordre de priorité]
1175
+ [Estimation du temps de correction]
1176
+ [Prochaine revue prévue]
1177
+
1178
+ INTERDIT ABSOLU : "Il serait judicieux de surveiller" si le code est correct.
1179
+ INTERDIT ABSOLU : Verdict vert si un item est "MANQUANT" ou "NON CORRIGÉ".`,
1180
+ checks:["Checklist complète remplie (VÉRIFIÉ ou N/A justifié)","Aucun finding CRITIQUE ou HAUTE non corrigé","Red Team : verdict MODÉRÉ ou SÉCURISÉ","TypeScript : tsc --noEmit sans erreur","Monitoring : alertes configurées et testées","Verdict final tranché (3 niveaux, pas de zone grise)","Plan de remédiation si réserves"]},
1181
+
1182
+ {id:"p11",n:"17",icon:"🤖",label:"Automatisation & Pérennité",color:"#1A7F4B",tag:"AUTOMATION",group:"closure",
1183
+ deps:["p10"],
1184
+ what:"Met en place les gardes permanents : hooks Git, règles IA, pipeline CI/CD complet et watch mode adaptatif. Ce que tu fais ici protège tous tes futurs commits.",
1185
+ how:"Copie le prompt → colle dans Antigravity → l'IA crée tous les fichiers de config → vérifie et commite → cocher.",
1186
+ prompt:`Tu es un Expert DevSecOps & Developer Experience. Automatise la sécurité pour les futures modifications.
1187
+
1188
+ CONTEXTE : Stack ${"{sp.label}"}, ${"{project.name}"}, IDE : ${"{project.ide}"}
1189
+
1190
+ LIVRAISONS ATTENDUES (crée ces fichiers) :
1191
+
1192
+ 1. FICHIER DE RÈGLES IA PERMANENTES (${"{ideFilename}"}) :
1193
+ Inclure obligatoirement :
1194
+ - Auth vérifiée EN PREMIER dans chaque handler serveur
1195
+ - Edge cases vérifiés (null, vide, valeur limite) sur toute nouvelle fonction
1196
+ - Schéma de validation sur chaque input externe
1197
+ - Clés API jamais hardcodées, jamais dans les logs
1198
+ - "AUDIT BLOC XX" → lire audit-sessions/bloc-XX.md et exécuter
1199
+ - "INCREMENTAL AUDIT" → git diff --name-only main..HEAD puis auditer
1200
+ - "RED TEAM BLOC XX" → exécuter le prompt p9b sur ce bloc
1201
+ - "EDGE CASES [fonction]" → générer les tests edge cases pour cette fonction
1202
+ - Alerter si une feature viole une règle métier invariante
1203
+ - JSDoc généré automatiquement si fonction > 10 lignes sans documentation
1204
+
1205
+ 2. .githooks/pre-commit :
1206
+ #!/bin/sh
1207
+ gitleaks protect --staged && npx tsc --noEmit --silent
1208
+
1209
+ 3. .githooks/pre-push :
1210
+ #!/bin/sh
1211
+ npm test -- --passWithNoTests && npm run lint
1212
+
1213
+ 4. COMMANDE D'INSTALLATION DES HOOKS :
1214
+ git config core.hooksPath .githooks
1215
+
1216
+ 5. .github/workflows/zentry.yml :
1217
+ - Triggers : PR vers main/master/production
1218
+ - Jobs : lint → typecheck → test → snyk → semgrep → gitleaks → zentry-gate → deploy
1219
+ - zentry-gate : node -e "const r=require('./audit.json');if(r.cicdStatus==='FAIL')process.exit(1)"
1220
+ - PR comment automatique avec le score et les findings
1221
+
1222
+ 6. PROCÉDURE D'AUDIT INCRÉMENTAL (INCREMENTAL_AUDIT.md) :
1223
+ Avant chaque PR :
1224
+ a. git diff --name-only main..HEAD > changed_files.txt
1225
+ b. Pour chaque fichier → "AUDIT BLOC XX" dans l'IDE
1226
+ c. Si nouveau fichier → créer bloc-XX.md dans audit-sessions/
1227
+ d. Mettre à jour AUDIT_MASTER_TRACKER.md
1228
+ e. Exporter audit.json et commiter avant de merger
1229
+
1230
+ Génère tous ces fichiers avec le contenu complet.`,
1231
+ checks:["Fichier de règles IA créé avec tous les protocoles","Hooks pre-commit (gitleaks + tsc) installés","Hooks pre-push (test + lint) installés","GitHub Action complète (lint→typecheck→test→security→gate→deploy)","Gate CI/CD bloquant si cicdStatus=FAIL","PR comment automatique configuré","INCREMENTAL_AUDIT.md créé et validé"]},
1232
+ ];