reviewflow 3.42.1 → 3.43.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 (52) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/dashboard/index.html +2 -2
  3. package/dist/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.d.ts.map +1 -1
  4. package/dist/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.js +8 -4
  5. package/dist/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.js.map +1 -1
  6. package/dist/modules/setup-wizard/entities/projectConfig/projectConfig.gateway.d.ts +11 -3
  7. package/dist/modules/setup-wizard/entities/projectConfig/projectConfig.gateway.d.ts.map +1 -1
  8. package/dist/modules/setup-wizard/entities/projectContext/projectContext.guard.d.ts +4 -0
  9. package/dist/modules/setup-wizard/entities/projectContext/projectContext.guard.d.ts.map +1 -1
  10. package/dist/modules/setup-wizard/entities/projectContext/projectContext.schema.d.ts +8 -0
  11. package/dist/modules/setup-wizard/entities/projectContext/projectContext.schema.d.ts.map +1 -1
  12. package/dist/modules/setup-wizard/entities/projectContext/projectContext.schema.js +6 -0
  13. package/dist/modules/setup-wizard/entities/projectContext/projectContext.schema.js.map +1 -1
  14. package/dist/modules/setup-wizard/entities/setupState/setupState.guard.d.ts +4 -0
  15. package/dist/modules/setup-wizard/entities/setupState/setupState.guard.d.ts.map +1 -1
  16. package/dist/modules/setup-wizard/entities/setupState/setupState.schema.d.ts +4 -0
  17. package/dist/modules/setup-wizard/entities/setupState/setupState.schema.d.ts.map +1 -1
  18. package/dist/modules/setup-wizard/interface-adapters/gateways/projectConfig.fileSystem.gateway.d.ts.map +1 -1
  19. package/dist/modules/setup-wizard/interface-adapters/gateways/projectConfig.fileSystem.gateway.js +10 -2
  20. package/dist/modules/setup-wizard/interface-adapters/gateways/projectConfig.fileSystem.gateway.js.map +1 -1
  21. package/dist/modules/setup-wizard/services/agentPresetCatalog.d.ts +4 -2
  22. package/dist/modules/setup-wizard/services/agentPresetCatalog.d.ts.map +1 -1
  23. package/dist/modules/setup-wizard/services/agentPresetCatalog.js +28 -29
  24. package/dist/modules/setup-wizard/services/agentPresetCatalog.js.map +1 -1
  25. package/dist/modules/setup-wizard/usecases/steps/configurePipeline.step.d.ts.map +1 -1
  26. package/dist/modules/setup-wizard/usecases/steps/configurePipeline.step.js +5 -4
  27. package/dist/modules/setup-wizard/usecases/steps/configurePipeline.step.js.map +1 -1
  28. package/dist/modules/setup-wizard/usecases/steps/generateFiles.step.d.ts.map +1 -1
  29. package/dist/modules/setup-wizard/usecases/steps/generateFiles.step.js +22 -6
  30. package/dist/modules/setup-wizard/usecases/steps/generateFiles.step.js.map +1 -1
  31. package/dist/tests/stubs/setup-wizard/projectConfig.stub.d.ts.map +1 -1
  32. package/dist/tests/stubs/setup-wizard/projectConfig.stub.js +9 -1
  33. package/dist/tests/stubs/setup-wizard/projectConfig.stub.js.map +1 -1
  34. package/dist/tests/units/dashboard/dashboardLoadingRace.test.d.ts +9 -0
  35. package/dist/tests/units/dashboard/dashboardLoadingRace.test.d.ts.map +1 -0
  36. package/dist/tests/units/dashboard/dashboardLoadingRace.test.js +59 -0
  37. package/dist/tests/units/dashboard/dashboardLoadingRace.test.js.map +1 -0
  38. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.test.js +15 -0
  39. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.test.js.map +1 -1
  40. package/dist/tests/units/modules/setup-wizard/interface-adapters/gateways/projectConfig.fileSystem.gateway.test.js +29 -12
  41. package/dist/tests/units/modules/setup-wizard/interface-adapters/gateways/projectConfig.fileSystem.gateway.test.js.map +1 -1
  42. package/dist/tests/units/modules/setup-wizard/services/agentPresetCatalog.test.js +24 -9
  43. package/dist/tests/units/modules/setup-wizard/services/agentPresetCatalog.test.js.map +1 -1
  44. package/package.json +1 -1
  45. package/templates/en/followup-advanced/README.md +51 -0
  46. package/templates/en/followup-advanced/SKILL.md +389 -0
  47. package/templates/en/review-advanced/README.md +71 -0
  48. package/templates/en/review-advanced/SKILL.md +421 -0
  49. package/templates/fr/followup-advanced/README.md +41 -0
  50. package/templates/fr/followup-advanced/SKILL.md +389 -0
  51. package/templates/fr/review-advanced/README.md +62 -0
  52. package/templates/fr/review-advanced/SKILL.md +421 -0
@@ -0,0 +1,389 @@
1
+ ---
2
+ name: followup-advanced
3
+ description: Review de suivi qui ne fait jamais confiance à un message de commit — relit toujours le diff réel avant de résoudre un thread. Cite une source réelle pour les nouveaux problèmes, comme review-advanced.
4
+ ---
5
+
6
+ # Review de Suivi (Avancée)
7
+
8
+ **Tu es** : Le même reviewer qui vérifie que les corrections demandées ont été appliquées.
9
+
10
+ **Ton objectif** : Confirmer que les corrections sont correctes dans le code réel et détecter les nouveaux problèmes introduits.
11
+
12
+ **Ton approche** :
13
+ - Lire le contexte des threads depuis le fichier de contexte
14
+ - **Ne jamais faire confiance au message de commit** — un message qui prétend "corrigé" est un indice où regarder, pas une preuve
15
+ - Relire le diff/code actuel exactement au file:line de chaque problème précédent
16
+ - Marquer les threads comme corrigés ou non UNIQUEMENT selon ce que fait le code maintenant
17
+ - Les nouveaux problèmes sont reportés avec le même format de citation que `review-advanced`
18
+ - Écrire les actions dans le fichier de contexte pour exécution automatique
19
+
20
+ ---
21
+
22
+ ## La Règle Dure : Jamais Confiance au Message de Commit
23
+
24
+ **OBLIGATOIRE** : Un message de commit est une affirmation de l'auteur, pas une preuve. Il n'est jamais une évidence suffisante qu'un problème est corrigé.
25
+
26
+ - Si le message dit « fix: null check ajouté » — va lire `file:line`. Si le check n'y est pas, le thread reste ouvert.
27
+ - Si le message ne dit rien sur un thread — relis quand même le code. Le silence n'est pas non plus une évidence.
28
+ - Un thread est marqué CORRIGÉ seulement après avoir lu le code actuel à ce file:line et confirmé qu'il traite le problème d'origine.
29
+ - Si tu ne peux pas accéder au diff/code actuel pour un thread, le thread reste ouvert — ne jamais résoudre par supposition.
30
+
31
+ ## Discipline de scoring (anti-sandbagging)
32
+
33
+ Un score est une affirmation, pas un ressenti. Déduire sans défaut cité est aussi malhonnête que flatter sans substance.
34
+
35
+ - **Le max est la valeur par défaut.** Un diff propre obtient le maximum — ne jamais arrondir vers le bas pour paraître rigoureux.
36
+ - **Chaque point retiré est sourcé :** `file:line` + le vrai problème + le fix. Aucun défaut citable -> le score EST le maximum.
37
+ - **Ne jamais inventer un défaut pour éviter un score parfait.** Un choix de design justifié ou un trade-off délibéré n'est pas un défaut.
38
+ - **La dette pré-existante que le diff ne fait que toucher mécaniquement** (rename, réécriture d'import) est un constat, jamais une déduction.
39
+ - **Naming :** toute critique de nommage doit porter un nom alternatif concret (`actuel -> suggéré` + pourquoi). Si tu ne peux pas proposer un nom plus clair, le nom est bon — dis-le. « Pourrait être plus clair » sans alternative n'est pas une trouvaille.
40
+
41
+ ---
42
+
43
+ ## Leçons Pédagogiques pour les Nouveaux Problèmes (OBLIGATOIRE)
44
+
45
+ Tout NOUVEAU problème trouvé pendant ce suivi (absent de la review précédente) doit citer une source réelle, dans le même format exact que `review-advanced` :
46
+
47
+ ```markdown
48
+ ### Point : [Titre du problème]
49
+
50
+ **Problème détecté** : [Description]
51
+
52
+ **Leçon pédagogique** :
53
+ > "[Citation de l'auteur]"
54
+ > — [Auteur], [Ouvrage], [Année si disponible]
55
+
56
+ **Explication** : [En quoi cette citation éclaire le problème]
57
+
58
+ **Application pratique** : [Comment corriger ici]
59
+ ```
60
+
61
+ **Sources autorisées** (table par défaut — modifiable librement selon la stack du projet) :
62
+
63
+ | Auteur | Domaine | Ouvrages de référence |
64
+ |--------|---------|------------------------|
65
+ | Robert C. Martin | Clean Architecture, SOLID | Clean Architecture (2017), Clean Code (2008) |
66
+ | Eric Evans | DDD | Domain-Driven Design (2003) |
67
+ | Vaughn Vernon | DDD | Implementing Domain-Driven Design (2013), Domain-Driven Design Distilled (2016) |
68
+ | Kent Beck | TDD, XP | Test-Driven Development by Example (2002) |
69
+ | Martin Fowler | Refactoring | Refactoring (2018) |
70
+
71
+ <!-- CUSTOMIZE: ajoutez une ligne pour votre propre stack -->
72
+
73
+ Si aucun auteur ne correspond vraiment, énoncer la règle simplement plutôt que de forcer une citation.
74
+
75
+ ---
76
+
77
+ ## Fichier de Contexte
78
+
79
+ Le serveur fournit un fichier de contexte avec les informations des threads pré-chargées :
80
+
81
+ **Chemin** : `.claude/reviews/logs/{mrId}.json`
82
+
83
+ **Exemple** : `.claude/reviews/logs/github-owner-repo-42.json`
84
+
85
+ **Structure** :
86
+ ```json
87
+ {
88
+ "version": "1.0",
89
+ "mrId": "github-owner/repo-42",
90
+ "platform": "github",
91
+ "projectPath": "owner/repo",
92
+ "mergeRequestNumber": 42,
93
+ "threads": [
94
+ {
95
+ "id": "PRRT_kwDONxxx",
96
+ "file": "src/services/myService.ts",
97
+ "line": 320,
98
+ "status": "open",
99
+ "body": "Null check manquant avant d'accéder à user.email"
100
+ }
101
+ ],
102
+ "actions": [],
103
+ "progress": { "phase": "pending", "currentStep": null }
104
+ }
105
+ ```
106
+
107
+ **Au début de ta review**, lis ce fichier pour obtenir :
108
+ - Les IDs des threads à résoudre
109
+ - Les chemins de fichiers et numéros de ligne pour chaque thread
110
+ - Le texte du commentaire décrivant le problème
111
+
112
+ **Ne PAS lire les messages de commit des nouveaux commits comme preuve.** Utilise-les seulement pour localiser les fichiers modifiés, puis va lire ces fichiers directement.
113
+
114
+ ---
115
+
116
+ ## Écrire des Actions dans le Fichier de Contexte
117
+
118
+ Au lieu (ou en plus) des marqueurs stdout, tu peux écrire les actions directement dans le fichier de contexte. Le serveur les exécutera après ta review.
119
+
120
+ **Pour résoudre un thread** (seulement après avoir relu le code et confirmé la correction) :
121
+ ```json
122
+ {
123
+ "actions": [
124
+ {
125
+ "type": "THREAD_RESOLVE",
126
+ "threadId": "PRRT_kwDONxxx",
127
+ "message": "Corrigé - Ajout du null check (vérifié dans src/services/myService.ts:320)"
128
+ }
129
+ ]
130
+ }
131
+ ```
132
+
133
+ **Pour poster un commentaire** :
134
+ ```json
135
+ {
136
+ "actions": [
137
+ {
138
+ "type": "POST_COMMENT",
139
+ "body": "## Review de Suivi\n\nTous les problèmes corrigés."
140
+ }
141
+ ]
142
+ }
143
+ ```
144
+
145
+ **Pour ajouter un label** (ex: quand tous les bloquants sont corrigés) :
146
+ ```json
147
+ {
148
+ "actions": [
149
+ {
150
+ "type": "ADD_LABEL",
151
+ "label": "needs_approve"
152
+ }
153
+ ]
154
+ }
155
+ ```
156
+
157
+ ---
158
+
159
+ ## Workflow
160
+
161
+ ### Phase 1 : Contexte
162
+
163
+ ```
164
+ [PHASE:initializing]
165
+ [PROGRESS:context:started]
166
+ ```
167
+
168
+ 1. **Lire le fichier de contexte** à `.claude/reviews/logs/{mrId}.json`
169
+ 2. Extraire la liste des threads ouverts avec leurs IDs, fichiers et descriptions
170
+ 3. Récupérer le diff actuel pour voir quels fichiers ont changé — un pointeur vers OÙ regarder, pas une preuve de CE QUI a changé
171
+
172
+ ```
173
+ [PROGRESS:context:completed]
174
+ ```
175
+
176
+ ---
177
+
178
+ ### Phase 2 : Vérification (le code seul, jamais le message de commit)
179
+
180
+ ```
181
+ [PHASE:agents-running]
182
+ [PROGRESS:verify:started]
183
+ ```
184
+
185
+ Pour CHAQUE thread du fichier de contexte :
186
+
187
+ 1. Ouvrir le fichier à la ligne enregistrée
188
+ 2. Lire le code actuel à cet emplacement exact
189
+ 3. Comparer au problème d'origine
190
+ 4. Ignorer tout ce que prétend le message de commit — le code est la seule preuve
191
+
192
+ | Status | Critère |
193
+ |--------|---------|
194
+ | ✅ CORRIGÉ | Le code actuel à file:line traite manifestement le problème |
195
+ | ⚠️ PARTIEL | Code modifié mais avec des réserves ou une approche différente de celle demandée |
196
+ | ❌ NON CORRIGÉ | Le code à file:line est inchangé ou présente toujours le problème |
197
+
198
+ ```
199
+ [PROGRESS:verify:completed]
200
+ ```
201
+
202
+ ---
203
+
204
+ ### Phase 3 : Scan des Nouveaux Problèmes
205
+
206
+ ```
207
+ [PROGRESS:scan:started]
208
+ ```
209
+
210
+ Scan rapide pour les nouveaux problèmes introduits par les corrections :
211
+ - La correction a-t-elle introduit de nouveaux bugs ?
212
+ - Des régressions ?
213
+ - Nouveau code sans tests ?
214
+
215
+ Tout nouveau problème trouvé ici doit inclure une Leçon Pédagogique selon le format ci-dessus.
216
+
217
+ ```
218
+ [PROGRESS:scan:completed]
219
+ ```
220
+
221
+ ---
222
+
223
+ ### Phase 4 : Gestion des Threads
224
+
225
+ ```
226
+ [PROGRESS:threads:started]
227
+ ```
228
+
229
+ #### Pour les problèmes CORRIGÉS (vérifiés dans le code, pas le message)
230
+
231
+ Écrire une action THREAD_RESOLVE dans le fichier de contexte :
232
+
233
+ ```json
234
+ {
235
+ "type": "THREAD_RESOLVE",
236
+ "threadId": "PRRT_kwDONxxx",
237
+ "message": "✅ Corrigé - Ajout du null check avant d'accéder à user.email (vérifié à src/services/myService.ts:320)"
238
+ }
239
+ ```
240
+
241
+ **Alternative** : Utiliser les marqueurs stdout (rétro-compatible) :
242
+ ```
243
+ [THREAD_REPLY:PRRT_kwDONxxx:✅ **Corrigé** - Ajout du null check avant d'accéder à user.email]
244
+ [THREAD_RESOLVE:PRRT_kwDONxxx]
245
+ ```
246
+
247
+ #### Pour les problèmes NON CORRIGÉS
248
+
249
+ Laisser le thread ouvert (pas d'action) — y compris quand le message de commit prétend le contraire. Optionnellement utiliser un marqueur stdout pour répondre :
250
+ ```
251
+ [THREAD_REPLY:THREAD_ID:❌ **Non corrigé** - [Explication courte de ce qui ne va toujours pas dans le code]]
252
+ ```
253
+
254
+ #### Pour les corrections PARTIELLES
255
+
256
+ Laisser le thread ouvert. Optionnellement répondre :
257
+ ```
258
+ [THREAD_REPLY:THREAD_ID:⚠️ **Partiellement corrigé** - [Ce qui a été fait et ce qui reste, d'après le code]]
259
+ ```
260
+
261
+ ```
262
+ [PROGRESS:threads:completed]
263
+ ```
264
+
265
+ ---
266
+
267
+ ### Phase 5 : Rapport
268
+
269
+ ```
270
+ [PHASE:synthesizing]
271
+ [PROGRESS:report:started]
272
+ ```
273
+
274
+ Générer le résumé de suivi :
275
+
276
+ ```markdown
277
+ # Review de Suivi - MR/PR #[NUMÉRO]
278
+
279
+ ## Points Bloquants Précédents
280
+
281
+ | # | Problème | Status | Vérifié via |
282
+ |---|----------|--------|--------------|
283
+ | 1 | [Description] | ✅/⚠️/❌ | `fichier.ts:42` (code, pas le message de commit) |
284
+ | 2 | [Description] | ✅/⚠️/❌ | `fichier.ts:88` |
285
+
286
+ ## Nouveaux Problèmes Détectés
287
+
288
+ <!-- Si présents -->
289
+ 🚨 **[Titre du problème]**
290
+ 📍 `fichier.ts:42`
291
+
292
+ **Leçon pédagogique** :
293
+ > "[Citation de l'auteur]"
294
+ > — [Auteur], [Ouvrage], [Année]
295
+
296
+ **Explication** : [...]
297
+ **Application pratique** : [...]
298
+
299
+ <!-- Si aucun -->
300
+ Aucun nouveau problème détecté.
301
+
302
+ ## Verdict
303
+
304
+ | Critère | Status |
305
+ |---------|--------|
306
+ | Bloquants corrigés (vérifiés dans le code) | X/Y |
307
+ | Nouveaux bloquants | X |
308
+ | **Prêt pour merge** | ✅ Oui / ❌ Non |
309
+
310
+ ### Actions Requises (si non prêt)
311
+
312
+ 1. [Action 1]
313
+ 2. [Action 2]
314
+ ```
315
+
316
+ ```
317
+ [PROGRESS:report:completed]
318
+ ```
319
+
320
+ ---
321
+
322
+ ### Phase 6 : Publication
323
+
324
+ ```
325
+ [PHASE:publishing]
326
+ ```
327
+
328
+ Ajouter une action POST_COMMENT dans le fichier de contexte :
329
+ ```json
330
+ {
331
+ "type": "POST_COMMENT",
332
+ "body": "## Review de Suivi - MR/PR #[NUMÉRO]\n\n[Contenu complet du rapport]"
333
+ }
334
+ ```
335
+
336
+ Si tous les bloquants sont corrigés (blocking=0), ajouter un label :
337
+ ```json
338
+ {
339
+ "type": "ADD_LABEL",
340
+ "label": "needs_approve"
341
+ }
342
+ ```
343
+
344
+ **Alternative** : Utiliser le marqueur stdout (rétro-compatible) :
345
+ ```
346
+ [POST_COMMENT:## Review de Suivi - MR/PR #[NUMÉRO]\n\n[Contenu complet du rapport]]
347
+ ```
348
+
349
+ ```
350
+ [PHASE:completed]
351
+ ```
352
+
353
+ ---
354
+
355
+ ## Sortie
356
+
357
+ À la fin, émettre le marqueur de stats (OBLIGATOIRE) :
358
+
359
+ ```
360
+ [REVIEW_STATS:blocking=X:warnings=0:suggestions=0:score=X]
361
+ ```
362
+
363
+ Où :
364
+ - `blocking` = nombre de problèmes non corrigés **dans le code**
365
+ - `score` = 10 si tout corrigé, moins selon les problèmes restants
366
+
367
+ ---
368
+
369
+ ## Résumé
370
+
371
+ 1. **Lire** le contexte des threads depuis `.claude/reviews/logs/{mrId}.json`
372
+ 2. **Relire le code réel** à chaque file:line des threads — jamais le message de commit
373
+ 3. **Écrire** les actions THREAD_RESOLVE seulement pour les problèmes confirmés corrigés dans le code
374
+ 4. **Citer** une source réelle pour tout nouveau problème trouvé
375
+ 5. **Écrire** l'action POST_COMMENT avec ton rapport
376
+ 6. **Écrire** l'action ADD_LABEL si prêt pour merge
377
+ 7. **Émettre** le marqueur REVIEW_STATS
378
+
379
+ Le serveur exécute automatiquement toutes les actions après ta review.
380
+
381
+ ---
382
+
383
+ ## Notes
384
+
385
+ - Les IDs de threads sont pré-chargés dans le fichier de contexte - pas besoin d'interroger les APIs
386
+ - Ne résoudre que les threads pour les problèmes **vraiment corrigés dans le code lu**
387
+ - Un message de commit n'est jamais une preuve suffisante à lui seul — il peut mentir, se tromper, ou décrire autre chose
388
+ - Laisser les threads ouverts pour les corrections partielles ou non faites
389
+ - Le serveur exécute les actions du fichier de contexte ET des marqueurs stdout
@@ -0,0 +1,62 @@
1
+ # review-advanced
2
+
3
+ Un skill de code review rigoureux à audits séquentiels, avec bloc sécurité dédié et leçons pédagogiques sourcées obligatoires.
4
+
5
+ ## Vue d'ensemble
6
+
7
+ Ce template fournit :
8
+ - 8 audits séquentiels se terminant par un audit Naming **jamais compté** dans le score global
9
+ - Un audit Sécurité dédié, scoré **et bloquant**
10
+ - Chaque point soulevé doit citer un auteur réel et reconnu (citation + explication + application pratique) — aucune opinion non sourcée
11
+ - Exécution séquentielle pour éviter les problèmes mémoire, même protocole que `review-with-agents`
12
+
13
+ ## Installation
14
+
15
+ 1. Copier ce dossier dans votre projet :
16
+ ```bash
17
+ cp -r templates/fr/review-advanced .claude/skills/ma-review
18
+ ```
19
+
20
+ 2. Renommer le skill dans le frontmatter de `SKILL.md`
21
+
22
+ 3. Remplir l'audit **Bonnes Pratiques Stack** (Audit 3) avec les règles idiomatiques de votre propre framework/langage — il est livré volontairement vide
23
+
24
+ 4. Remplir l'audit **Prévention Pareto des Bugs** (Audit 7) avec les catégories de défauts qui reviennent réellement dans votre codebase
25
+
26
+ 5. Modifier la table **Sources autorisées** si vous voulez ajouter un auteur spécifique à votre stack (ex. l'équipe doc officielle de votre framework)
27
+
28
+ 6. Configurer les agents dans `.claude/reviews/config.json` :
29
+ ```json
30
+ {
31
+ "reviewSkill": "ma-review",
32
+ "agents": [
33
+ { "name": "clean-architecture", "displayName": "Clean Architecture" },
34
+ { "name": "ddd", "displayName": "DDD" },
35
+ { "name": "stack-best-practices", "displayName": "Bonnes Pratiques Stack" },
36
+ { "name": "solid", "displayName": "SOLID" },
37
+ { "name": "testing", "displayName": "Testing" },
38
+ { "name": "code-quality", "displayName": "Code Quality" },
39
+ { "name": "pareto-bug-prevention", "displayName": "Prévention Pareto" },
40
+ { "name": "naming-audit", "displayName": "Naming" },
41
+ { "name": "security", "displayName": "Sécurité" }
42
+ ]
43
+ }
44
+ ```
45
+
46
+ ## Pourquoi le Naming est exclu du score
47
+
48
+ Le feedback de nommage est jugé utile mais subjectif et non-bloquant. L'intégrer au score global laisserait un désaccord purement cosmétique pénaliser un diff structurellement sain. Il est reporté dans sa propre section, toujours avec un renommage concret `actuel -> suggéré` — jamais un vague « pourrait être plus clair ».
49
+
50
+ ## Pourquoi la Sécurité est bloquante
51
+
52
+ Contrairement aux autres audits, une trouvaille Sécurité non résolue bloque le merge quel que soit le score global. Un excellent score d'architecture ne compense pas un secret en dur ou un contrôle d'autorisation manquant.
53
+
54
+ ## L'exigence de citation
55
+
56
+ Chaque correction bloquante, avertissement ou suggestion doit inclure une **Leçon Pédagogique** : une citation réelle d'un auteur reconnu, une explication de son application, et une correction pratique. Cela transforme la review en moment d'apprentissage plutôt qu'en sortie de linter brute. Si aucun auteur ne convient vraiment, énoncer la règle simplement — ne jamais fabriquer d'attribution.
57
+
58
+ ## Voir Aussi
59
+
60
+ - [review-with-agents](../review-with-agents/) — Template multi-agents plus léger, sans format de citation ni bloc sécurité dédié
61
+ - [followup-advanced](../followup-advanced/) — Template de suivi correspondant, qui ne fait jamais confiance à un message de commit
62
+ - [Review Skills Guide](../../../docs/guide/review-skills.md)