đŸ—ïž Audit Architecture

Ce qui ne va pas dans le code — par module, pas par dĂ©veloppeur

1041 commits · 40 modules · 20/04/2026

← Retour à l'index
19
Modules critiques
10
Cascades de fix
22
Sources de dette
2
Zones Ă  friction
75h
Temps perdu (friction)
+6698h
Dette nette totale

🧠 Synthùse Architecturale (IA)

Sur 3 modules analysĂ©s, 0 ont des problĂšmes d'architecture, 0 des problĂšmes de pratiques dĂ©veloppeur, et 3 un mĂ©lange des deux. 3 module(s) nĂ©cessitent une action immĂ©diate (prioritĂ© critique) et 0 sont en prioritĂ© haute. 22 module(s) crĂ©ent de la dette technique sans jamais la rĂ©duire — c'est un problĂšme structurel, pas individuel. 2 module(s) ont une friction architecturale significative (temps rĂ©el > 1.5x temps estimĂ©).

đŸ”„ Hotspots Architecture — Modules qui souffrent le plus

Score de souffrance = (10 - qualité) + complexité + (dette/10) + (concerns/5). Plus c'est haut, plus le module est à l'agonie.

ModuleCommitsQualitéComplexitéDette netteConcernsSouffranceTop problÚmes
dashboard 371 4.1/10 4.1/10 +2127.9h 23543 4922.3 Magic numbers 100/-100 sans constante CENTS_TO_EURO Incohérence i18n dropZoneActive singulier vs dropZone plurie
apps/backend 256 4.1/10 4.3/10 +1724h 15158 3204.9 Magic numbers 100/-100 sans constante CENTS_TO_EURO Sécurité JWT affaiblie : jsonwebtoken ^9.0.2 non verrouillé,
other 128 3.1/10 2.6/10 +335.3h 7680 1571.5 VERSIONNEMENT NON-SEMVER: v04.03.2025-001 ne distingue pas l TESTS NÉGATIFS ABSENTS (1h dette) : Pas de test null/Boolean
backend 103 3.8/10 4.8/10 +1079.5h 6659 1440.9 Aucun test automatisĂ© pour les nouveaux champs de prĂ©fĂ©rence ZÉRO fichier de test sur 7 fichiers modifiĂ©s avec opĂ©rations
file-server 62 3.7/10 4.5/10 +499.3h 4285 908.3 res.status(200) implicite - comportement fragile si middlewa Sécurité JWT affaiblie : jsonwebtoken ^9.0.2 non verrouillé,
copro 33 3.9/10 4.2/10 +248.3h 2038 433.5 Fonction privĂ©e _createTicket non testable en isolation sans ÉLEVÉ : Absence de tests aux limites temporelles (J-5 exact,
cron 24 3.9/10 4.5/10 +202.9h 1490 319.4 ZÉRO fichier de test sur 7 fichiers modifiĂ©s avec opĂ©rations utils.js : ParamĂštre 'mode' sans validation ni enum - valeur
root 5 3.8/10 5/10 +65.4h 368 81.4 SÉCURITÉ NON TESTÉE : clientSecret loggĂ© en clair via writeT Aucune fonctionnalitĂ© mĂ©tier rĂ©elle livrĂ©e - seules des rout
docker-compose.bory-staging.yml 5 4.7/10 3.1/10 +16.2h 352 72.3 Aucun test de cohĂ©rence config entre docker-compose.bory-sta RISQUE CRITIQUE - Saut 7.1→8.3 sur staging sans analyse des
docker-compose.install.yml 4 3.1/10 4.9/10 +43h 297 65.7 handler.ts shouldReport() : instanceof HTTPError exclut TOUT CRITIQUE - Perte de données potentielle : Aucun test automat
docker-compose.yml 4 3.1/10 4.9/10 +43h 297 65.7 handler.ts shouldReport() : instanceof HTTPError exclut TOUT CRITIQUE - Perte de données potentielle : Aucun test automat
collab 6 3.1/10 2.6/10 +12.7h 292 61.6 Incohérence de formatage entre les fichiers : '250MO' sans e Erreurs typographiques existantes non corrigées : 'depasser'
workflows 4 5/10 4.5/10 +65.8h 266 59.8 Aucune fonctionnalité métier réelle livrée - seules des rout Suppression de l'ancien backend sans migration visible de la
docker-compose.bory-production.yml 4 4.7/10 3.4/10 +18.6h 279 58 CRITIQUE SÉCURITAIRE: JWT_ENABLED=false en production expose Saut de version 7.1→8.3 non documentĂ©: absence d'analyse des
package.json 3 3.7/10 6.3/10 +54.6h 220 52.1 SÉCURITÉ NON TESTÉE : clientSecret loggĂ© en clair via writeT Risque RGPD critique : clientSecret loggĂ© en clair dans writ
dasboard 2 3/10 4.3/10 +15.7h 145 32.5 CRITIQUE : Aucun diff visible - impossible de vérifier si le Hotfix déployé sans preuve de couverture de tests - risque d
upload 2 0.6/10 1.3/10 +2.2h 133 31.2 Aucun diff visible - impossible de vérifier si les changemen Les messages d'erreur 'plus clairs' nécessitent validation u
docker-compose.dev.yml 2 4.7/10 3.6/10 +6.3h 144 29.7 RISQUE CRITIQUE - Saut 7.1→8.3 sur staging sans analyse des INSUFFISANCE DE TESTS - 'VĂ©rifier le bon fonctionnement' ne
settings.json 2 5.8/10 4.1/10 +4.5h 114 23.3 SÉCURITÉ CRITIQUE : La suppression de authorized_keys doit ĂȘ Scripts deploy.sh et deploy-dev.sh rĂ©fĂ©rencent le projet 'Ig

🔄 Cascades de Fix — Les devs reviennent encore et encore

Quand un module a 3+ commits en 7 jours, c'est pas le dev qui est lent — c'est le code qui rĂ©siste.

dashboard 11 cascade(s) — 371 commits, avg 1.1 jours entre commits
87 commits entre le 20/02/2025 et 24/03/2025 · 3 auteur(s) · avg 0.4 jours entre commits
56 commits entre le 03/04/2025 et 12/05/2025 · 5 auteur(s) · avg 0.7 jours entre commits
21 commits entre le 21/05/2025 et 18/06/2025 · 5 auteur(s) · avg 1.4 jours entre commits
3 commits entre le 03/07/2025 et 03/07/2025 · 2 auteur(s) · avg 0 jours entre commits
10 commits entre le 11/07/2025 et 17/07/2025 · 3 auteur(s) · avg 0.7 jours entre commits
14 commits entre le 25/07/2025 et 07/08/2025 · 3 auteur(s) · avg 1 jours entre commits
9 commits entre le 25/08/2025 et 01/09/2025 · 2 auteur(s) · avg 0.9 jours entre commits
12 commits entre le 10/09/2025 et 25/09/2025 · 4 auteur(s) · avg 1.4 jours entre commits
79 commits entre le 06/10/2025 et 19/12/2025 · 3 auteur(s) · avg 0.9 jours entre commits
54 commits entre le 05/01/2026 et 20/02/2026 · 3 auteur(s) · avg 0.9 jours entre commits
25 commits entre le 11/03/2026 et 02/04/2026 · 2 auteur(s) · avg 0.9 jours entre commits
Magic numbers 100/-100 sans constante CENTS_TO_EURO IncohĂ©rence i18n dropZoneActive singulier vs dropZone pluriel - correction 15min ERREUR GRAMMATICALE : 'Taille total' → 'Taille totale' dans fr.json - accord fĂ©m JSDoc obsolĂšte (@param fileName) induira en erreur tout dĂ©veloppeur Ă©crivant des RequĂȘte GraphQL modifiĂ©e sans test d'intĂ©gration validant le champ creator
other 11 cascade(s) — 128 commits, avg 3.1 jours entre commits
40 commits entre le 20/02/2025 et 13/03/2025 · 4 auteur(s) · avg 0.5 jours entre commits
18 commits entre le 04/04/2025 et 18/04/2025 · 4 auteur(s) · avg 0.8 jours entre commits
4 commits entre le 06/06/2025 et 11/06/2025 · 2 auteur(s) · avg 1.7 jours entre commits
3 commits entre le 15/07/2025 et 18/07/2025 · 3 auteur(s) · avg 1.4 jours entre commits
9 commits entre le 01/08/2025 et 08/08/2025 · 1 auteur(s) · avg 0.9 jours entre commits
4 commits entre le 08/10/2025 et 10/10/2025 · 2 auteur(s) · avg 0.6 jours entre commits
18 commits entre le 17/10/2025 et 13/11/2025 · 2 auteur(s) · avg 1.6 jours entre commits
3 commits entre le 01/12/2025 et 03/12/2025 · 1 auteur(s) · avg 0.9 jours entre commits
10 commits entre le 07/01/2026 et 14/01/2026 · 1 auteur(s) · avg 0.8 jours entre commits
8 commits entre le 26/01/2026 et 05/02/2026 · 2 auteur(s) · avg 1.5 jours entre commits
4 commits entre le 16/02/2026 et 03/03/2026 · 2 auteur(s) · avg 5 jours entre commits
VERSIONNEMENT NON-SEMVER: v04.03.2025-001 ne distingue pas les breaking changes TESTS NÉGATIFS ABSENTS (1h dette) : Pas de test null/Boolean vs String → NullPoi BLOQUANT : Filtre tayoObjectActive dupliquĂ© dans beaver/controllers/sync/index.j Risque de rĂ©gression non Ă©valuable: sans visibilitĂ© sur le contenu fusionnĂ© ni t TRAÇABILITÉ NULLE : impossible d'associer ce merge Ă  des rapports de test, mĂ©tri
backend 9 cascade(s) — 103 commits, avg 3.8 jours entre commits
19 commits entre le 20/02/2025 et 19/03/2025 · 4 auteur(s) · avg 1.5 jours entre commits
16 commits entre le 03/04/2025 et 18/04/2025 · 4 auteur(s) · avg 1 jours entre commits
4 commits entre le 02/05/2025 et 12/05/2025 · 2 auteur(s) · avg 3.3 jours entre commits
5 commits entre le 25/07/2025 et 04/08/2025 · 2 auteur(s) · avg 2.5 jours entre commits
8 commits entre le 17/09/2025 et 25/09/2025 · 4 auteur(s) · avg 1.1 jours entre commits
9 commits entre le 06/10/2025 et 17/10/2025 · 2 auteur(s) · avg 1.4 jours entre commits
3 commits entre le 28/10/2025 et 07/11/2025 · 2 auteur(s) · avg 5 jours entre commits
15 commits entre le 17/11/2025 et 19/12/2025 · 2 auteur(s) · avg 2.3 jours entre commits
13 commits entre le 07/01/2026 et 28/01/2026 · 2 auteur(s) · avg 1.7 jours entre commits
Aucun test automatisĂ© pour les nouveaux champs de prĂ©fĂ©rence de notification ZÉRO fichier de test sur 7 fichiers modifiĂ©s avec opĂ©rations de suppression dest utils.js : ParamĂštre 'mode' sans validation ni enum - valeur invalide (typo 'del utils.js : BATCH_SIZE=100 nombre magique sans tests aux limites - 5 cas critique validateDistributionKeySchema.ts modifiĂ© sans tests de rĂ©gression pour vĂ©rifier
apps/backend 8 cascade(s) — 256 commits, avg 1.4 jours entre commits
10 commits entre le 07/05/2025 et 20/05/2025 · 3 auteur(s) · avg 1.4 jours entre commits
12 commits entre le 28/05/2025 et 25/06/2025 · 4 auteur(s) · avg 2.5 jours entre commits
55 commits entre le 10/07/2025 et 08/08/2025 · 5 auteur(s) · avg 0.5 jours entre commits
17 commits entre le 21/08/2025 et 09/09/2025 · 4 auteur(s) · avg 1.2 jours entre commits
6 commits entre le 17/09/2025 et 25/09/2025 · 4 auteur(s) · avg 1.6 jours entre commits
77 commits entre le 06/10/2025 et 19/12/2025 · 3 auteur(s) · avg 1 jours entre commits
27 commits entre le 05/01/2026 et 05/02/2026 · 3 auteur(s) · avg 1.2 jours entre commits
50 commits entre le 12/02/2026 et 02/04/2026 · 2 auteur(s) · avg 1 jours entre commits
Magic numbers 100/-100 sans constante CENTS_TO_EURO SĂ©curitĂ© JWT affaiblie : jsonwebtoken ^9.0.2 non verrouillĂ©, sous-dĂ©pendances de Traitement indiffĂ©renciĂ© inappropriĂ© : API externe (Infomaniak), CMS (Strapi) et Type AgStrapiResponse dupliquĂ© contrĂŽleur:lignes18-55/gĂ©nĂ©rateur:lignes25-90 → v Champs Propriete string→string|null sans fallback dans gĂ©nĂ©rateur PDF → risque a
file-server 6 cascade(s) — 62 commits, avg 6.8 jours entre commits
11 commits entre le 20/02/2025 et 27/02/2025 · 3 auteur(s) · avg 0.7 jours entre commits
3 commits entre le 19/03/2025 et 19/03/2025 · 2 auteur(s) · avg 0.2 jours entre commits
14 commits entre le 03/04/2025 et 07/05/2025 · 4 auteur(s) · avg 2.6 jours entre commits
3 commits entre le 23/05/2025 et 28/05/2025 · 2 auteur(s) · avg 2.6 jours entre commits
14 commits entre le 06/06/2025 et 23/06/2025 · 4 auteur(s) · avg 1.3 jours entre commits
3 commits entre le 01/04/2026 et 03/04/2026 · 2 auteur(s) · avg 1 jours entre commits
res.status(200) implicite - comportement fragile si middleware Express modifiĂ© SĂ©curitĂ© JWT affaiblie : jsonwebtoken ^9.0.2 non verrouillĂ©, sous-dĂ©pendances de SÉCURITÉ NON TESTÉE : clientSecret loggĂ© en clair via writeToLog() - aucun test Commentaire dupliquĂ© '// Download file and store it in a tmp folder' dans le blo Bug 'file' vs 'files' non dĂ©tectĂ© en amont : L'incohĂ©rence entre l'Ă©tat initial
cron 4 cascade(s) — 24 commits, avg 11.4 jours entre commits
4 commits entre le 20/02/2025 et 27/02/2025 · 2 auteur(s) · avg 2.3 jours entre commits
6 commits entre le 06/03/2025 et 13/03/2025 · 1 auteur(s) · avg 1.4 jours entre commits
4 commits entre le 31/03/2025 et 04/04/2025 · 2 auteur(s) · avg 1.3 jours entre commits
4 commits entre le 28/10/2025 et 30/10/2025 · 1 auteur(s) · avg 0.6 jours entre commits
ZÉRO fichier de test sur 7 fichiers modifiĂ©s avec opĂ©rations de suppression dest utils.js : ParamĂštre 'mode' sans validation ni enum - valeur invalide (typo 'del utils.js : BATCH_SIZE=100 nombre magique sans tests aux limites - 5 cas critique Absence de stratĂ©gie de migration pour les donnĂ©es Strapi historiques oĂč tayoUse Absence totale de tests automatisĂ©s - seule vĂ©rification manuelle mentionnĂ©e, ri
copro 2 cascade(s) — 33 commits, avg 12.8 jours entre commits
5 commits entre le 27/02/2025 et 27/02/2025 · 3 auteur(s) · avg 0.1 jours entre commits
7 commits entre le 11/03/2026 et 20/03/2026 · 1 auteur(s) · avg 1.5 jours entre commits
Fonction privĂ©e _createTicket non testable en isolation sans refactor d'accessib ÉLEVÉ : Absence de tests aux limites temporelles (J-5 exact, J-4, J-6, 23h59) - ZĂ©ro test automatisĂ© sur 8 fichiers modifiĂ©s incluant une correction de logique CRITIQUE : describe.skip dans 02.test.js rĂ©duit la couverture existante - anti-p CRITIQUE : NewRouteGuard.jsx ajoute 3 branches dĂ©cisionnelles (auth, 2FA, CGU) s
docker-compose.bory-staging.yml 1 cascade(s) — 5 commits, avg 22.3 jours entre commits
3 commits entre le 07/03/2025 et 07/03/2025 · 1 auteur(s) · avg 0 jours entre commits
Aucun test de cohĂ©rence config entre docker-compose.bory-staging.yml et docker-c RISQUE CRITIQUE - Saut 7.1→8.3 sur staging sans analyse des release notes docume INSUFFISANCE DE TESTS - 'VĂ©rifier le bon fonctionnement' ne couvre pas : compati ABSENCE DE PLAN DE ROLLBACK - En cas de problĂšme, les documents modifiĂ©s en 8.3 DIVERGENCE DE CONFIGURATION - JWT_ENABLED=false en dev mais probablement activĂ©
docker-compose.install.yml 1 cascade(s) — 4 commits, avg 0.4 jours entre commits
4 commits entre le 16/07/2025 et 17/07/2025 · 1 auteur(s) · avg 0.4 jours entre commits
handler.ts shouldReport() : instanceof HTTPError exclut TOUTES les HTTPError (4x CRITIQUE - Perte de donnĂ©es potentielle : Aucun test automatisĂ© pour callback_co CRITIQUE - Migration manquante : Changement de clĂ© document (onlyOfficeKey → kdr SÉCURITÉ - RĂ©gression d'authentification : L'ancien callback incluait ?token=${t ROBUSTESSE - Erreurs silencieuses : Les fallbacks (process.env.NEXT_PUBLIC_DOC_S
docker-compose.yml 1 cascade(s) — 4 commits, avg 0.4 jours entre commits
4 commits entre le 16/07/2025 et 17/07/2025 · 1 auteur(s) · avg 0.4 jours entre commits
handler.ts shouldReport() : instanceof HTTPError exclut TOUTES les HTTPError (4x CRITIQUE - Perte de donnĂ©es potentielle : Aucun test automatisĂ© pour callback_co CRITIQUE - Migration manquante : Changement de clĂ© document (onlyOfficeKey → kdr SÉCURITÉ - RĂ©gression d'authentification : L'ancien callback incluait ?token=${t ROBUSTESSE - Erreurs silencieuses : Les fallbacks (process.env.NEXT_PUBLIC_DOC_S

💾 Dette Technique — Sources vs Sinks

Sources = modules qui crĂ©ent de la dette sans jamais la rĂ©duire. Sinks = modules oĂč les devs nettoient activement. Si un module est Source, c'est l'archi le problĂšme.

🔮 Sources de dette (architecture problĂ©matique)
ModuleCommitsDette crééeDette réduiteDette netteRatioConcerns dette
dasboard Source 2 +16.1h 0.4h +15.7h 36.7x Un bug de déduplication touche la logique de rendu des colle PROCESSUS : Hotfix mergé sans revue architecturale complÚte
api Source 1 +10.7h 0.4h +10.2h 24.2x COUPLAGE TEMPOREL CACHÉ : Le code du rĂ©gulateur ne semble pa Couplage temporel non rĂ©solu architecturalement : la correct
collab Source 6 +13.4h 0.7h +12.7h 19.6x Erreurs typographiques existantes non corrigées : 'depasser' Duplication de 3 fichiers locale quasi-identiques sans facto
package.json Source 3 +58.6h 4.1h +54.6h 14.3x Chaßnage optionnel profond (ppe?.data?.attributes?.regie?.da Rapport valeur/dette défavorable : 5h valeur métier créée vs
root Source 5 +70.4h 5h +65.4h 14.1x Aucun test fonctionnel ou d'intégration n'existe - dette cri Absence de tests automatisés reconnue mais assumée comme det
docker-compose.clb.yml Source 1 +29.5h 3h +26.5h 10x Absence de tests automatisés (1.5/10) : seule vérification m syncProperty.ts à 266 lignes avec 5 responsabilités (orchest
docker-compose.default.yml Source 1 +29.5h 3h +26.5h 10x Absence de tests automatisés (1.5/10) : seule vérification m syncProperty.ts à 266 lignes avec 5 responsabilités (orchest
docker-compose.import.yml Source 1 +29.5h 3h +26.5h 10x Absence de tests automatisés (1.5/10) : seule vérification m syncProperty.ts à 266 lignes avec 5 responsabilités (orchest
other Source 128 +373.7h 38.4h +335.3h 9.7x TESTS NÉGATIFS ABSENTS (1h dette) : Pas de test null/Boolean ÉCART TEMPS 200% NON EXPLIQUÉ : 1.5h rĂ©el vs 0.5h idĂ©al pour
cron Source 24 +231h 28h +202.9h 8.2x Absence de stratégie de migration pour les données Strapi hi Dette technique de 10h : gestion d'erreur transactionnelle (
apps/backend Source 256 +1996.6h 272.6h +1724h 7.3x handler.ts shouldReport() : instanceof HTTPError exclut TOUT Absence de typage TypeScript pour onlyOfficeKey - risque de
dashboard Source 371 +2478h 350h +2127.9h 7.1x JSDoc obsolÚte (@param fileName) induira en erreur tout déve handler.ts shouldReport() : instanceof HTTPError exclut TOUT
backend Source 103 +1262.4h 182.9h +1079.5h 6.9x Dette technique de 10h : gestion d'erreur transactionnelle ( Violation DRY : 4 noms catégories hardcodés en double - refa
copro Source 33 +292.2h 43.9h +248.3h 6.7x Fonction privée _createTicket non testable en isolation sans CRITIQUE : describe.skip dans 02.test.js réduit la couvertur
file-server Source 62 +588.7h 89.5h +499.3h 6.6x COUPLAGE IMPLICITE : La validation 'files' dans step1.tsx dé Commentaire obsolÚte step1.tsx ligne ~107 : "'file' is requi
🟱 Sinks de dette (les devs nettoient)
ModuleCommitsDette crééeDette réduiteDette netteRatioConcerns dette
docker-compose.bory-staging-auto.yml Sink 1 11.3h 12.3h -1h 0.9x CRITIQUE - apt-key dĂ©prĂ©ciĂ© dans les anciens file-server/Doc MODÉRÉ - 4 TODO dans dashboard/Dockerfile.dev non adressĂ©s :
docker-compose.deployment.yml Sink 1 11.3h 12.3h -1h 0.9x CRITIQUE - apt-key dĂ©prĂ©ciĂ© dans les anciens file-server/Doc MODÉRÉ - 4 TODO dans dashboard/Dockerfile.dev non adressĂ©s :

⚡ Friction Architecture — Modules oĂč le code rĂ©siste

Quand temps rĂ©el / temps idĂ©al > 1.5x, c'est pas le dev qui est lent — c'est le code qui rĂ©siste. Ratio > 2x = architecture problĂ©matique.

ModuleCommitsFrictionHors budgetTemps perduQualitéComplexitéConcerns friction
dashboard->developpement 1 1.8x 1/1 1.1h 1.8/10 2.2/10 HOTFIX = DÉFAILLANCE PROCESSUS : Un bug de requĂȘte en produc TICKET #2619 NON ACCESSIBLE : Impossible de vĂ©rifier si la c
upload 2 1.54x 1/2 1h 0.6/10 1.3/10 La refactorisation sans spécifications métier documentées ri Approche de test uniquement manuelle - aucun test automatisé
other 128 1.22x 43/128 21.6h 3.1/10 2.6/10 VERSIONNEMENT NON-SEMVER: v04.03.2025-001 ne distingue pas l TESTS NÉGATIFS ABSENTS (1h dette) : Pas de test null/Boolean
docker-compose.clb.yml 1 1.06x 0/1 0h 3.8/10 6.3/10 Champs dupliqués contradictoires dans Propriete (propriete.d Absence totale de tests automatisés (1/10) pour une intégrat
docker-compose.default.yml 1 1.06x 0/1 0h 3.8/10 6.3/10 Champs dupliqués contradictoires dans Propriete (propriete.d Absence totale de tests automatisés (1/10) pour une intégrat
docker-compose.import.yml 1 1.06x 0/1 0h 3.8/10 6.3/10 Champs dupliqués contradictoires dans Propriete (propriete.d Absence totale de tests automatisés (1/10) pour une intégrat
package.json 3 1x 0/3 0h 3.7/10 6.3/10 Risque RGPD critique : clientSecret loggé en clair dans writ Aucun test automatisé pour le nouveau flux importLogId en am
collab 6 0.9x 2/6 2h 3.1/10 2.6/10 Erreurs typographiques existantes non corrigées : 'depasser' TestCoverage critique (3/10) : approche déclarée couvre 2 sc
workflows 4 0.9x 0/4 0h 5/10 4.5/10 Suppression de l'ancien backend sans migration visible de la Le middleware strapi_auth_middleware gĂšre l'authentification
root 5 0.84x 0/5 0h 3.8/10 5/10 Suppression de l'ancien backend sans migration visible de la Le middleware strapi_auth_middleware gĂšre l'authentification
copro 33 0.78x 0/33 0h 3.9/10 4.2/10 CRITIQUE : describe.skip dans 02.test.js réduit la couvertur CRITIQUE : NewRouteGuard.jsx ajoute 3 branches décisionnelle
backend 103 0.76x 1/103 3h 3.8/10 4.8/10 ZÉRO fichier de test sur 7 fichiers modifiĂ©s avec opĂ©rations validateDistributionKeySchema.ts modifiĂ© sans tests de rĂ©gre
settings.json 2 0.75x 0/2 0h 5.8/10 4.1/10 Suppression de tests/db/healthcheck.sh (script MariaDB 31 li Aucune preuve dans ce commit d'une migration vers un nouveau
docker-compose.bory-staging-auto.yml 1 0.75x 0/1 0h 5.5/10 4.5/10 Risque critique sur file-server : le Dockerfile.dev supprimé docker-compose.deployment.yml entiÚrement supprimé (143 lign
docker-compose.deployment.yml 1 0.75x 0/1 0h 5.5/10 4.5/10 Risque critique sur file-server : le Dockerfile.dev supprimé docker-compose.deployment.yml entiÚrement supprimé (143 lign
file-server 62 0.74x 3/62 9.2h 3.7/10 4.5/10 res.status(200) implicite - comportement fragile si middlewa Absence de tests automatisés avec cette correction : Aucun t
dashboard 371 0.73x 15/371 17.5h 4.1/10 4.1/10 VIOLATION SRP MAJEURE : getDocumentsList gĂšre 5 responsabili COUPLAGE DIRECT : L'import de Regie dans l'action serveur co
api 1 0.7x 0/1 0h 1.6/10 4.3/10 RISQUE DE CONFORMITÉ FISCALE : Les acomptes provisionnels so LACUNES DE TESTS DE RÉGRESSION : L'absence de tests de bout
apps/backend 256 0.69x 15/256 12.4h 4.1/10 4.3/10 Type AgStrapiResponse dupliquĂ© contrĂŽleur:lignes18-55/gĂ©nĂ©ra Champs Propriete string→string|null sans fallback dans gĂ©nĂ©r
docker-compose.bory-staging.yml 5 0.68x 1/5 0.1h 4.7/10 3.1/10 RISQUE CRITIQUE - Saut 7.1→8.3 sur staging sans analyse des INSUFFISANCE DE TESTS - 'VĂ©rifier le bon fonctionnement' ne

💡 ROI Refactor — Ce qui aurait dĂ» ĂȘtre refactorĂ© plus tĂŽt

Pour chaque module: le point de bascule oĂč la dette est devenue problĂ©matique, combien de commits ont Ă©tĂ© coincĂ©s aprĂšs, et combien de temps aurait Ă©tĂ© Ă©conomisĂ© par un refactor fait au bon moment.

other
Point de bascule: 20/02/2025 — Quality: 2.1/10 (release: v20.02.2025-staging)
9.1x
ROI Refactor
127 commits coincés
38.7h perdus
4.2h refactor estimé
38.7h gagnés / 4.2h investis
ProblÚmes récurrents qu'un refactor éliminerait:
VERSIONNEMENT NON-SEMVER: v04.03.2025-001 ne distingue pas les breaking changes TESTS NÉGATIFS ABSENTS (1h dette) : Pas de test null/Boolean vs String → NullPoi BLOQUANT : Filtre tayoObjectActive dupliquĂ© dans beaver/controllers/sync/index.j Risque de rĂ©gression non Ă©valuable: sans visibilitĂ© sur le contenu fusionnĂ© ni t TRAÇABILITÉ NULLE : impossible d'associer ce merge Ă  des rapports de test, mĂ©tri
dashboard
Point de bascule: 20/02/2025 — Quality: 3.0/10 ([Feature] adding multiple document in tickets)
9x
ROI Refactor
368 commits coincés
79h perdus
8.8h refactor estimé
79h gagnés / 8.8h investis
ProblÚmes récurrents qu'un refactor éliminerait:
Magic numbers 100/-100 sans constante CENTS_TO_EURO IncohĂ©rence i18n dropZoneActive singulier vs dropZone pluriel - correction 15min ERREUR GRAMMATICALE : 'Taille total' → 'Taille totale' dans fr.json - accord fĂ©m JSDoc obsolĂšte (@param fileName) induira en erreur tout dĂ©veloppeur Ă©crivant des RequĂȘte GraphQL modifiĂ©e sans test d'intĂ©gration validant le champ creator
apps/backend
Point de bascule: 04/04/2025 — Net debt: 17.5h (feat: setup adonis.js (#2577))
6.4x
ROI Refactor
253 commits coincés
64.1h perdus
10.1h refactor estimé
64.1h gagnés / 10.1h investis
ProblÚmes récurrents qu'un refactor éliminerait:
Magic numbers 100/-100 sans constante CENTS_TO_EURO SĂ©curitĂ© JWT affaiblie : jsonwebtoken ^9.0.2 non verrouillĂ©, sous-dĂ©pendances de Traitement indiffĂ©renciĂ© inappropriĂ© : API externe (Infomaniak), CMS (Strapi) et Type AgStrapiResponse dupliquĂ© contrĂŽleur:lignes18-55/gĂ©nĂ©rateur:lignes25-90 → v Champs Propriete string→string|null sans fallback dans gĂ©nĂ©rateur PDF → risque a
backend
Point de bascule: 20/02/2025 — Net debt: 13.0h (feat(backend): auto create accountings data when regie is created (#2496))
3.4x
ROI Refactor
103 commits coincés
49.2h perdus
14.7h refactor estimé
49.2h gagnés / 14.7h investis
ProblÚmes récurrents qu'un refactor éliminerait:
Aucun test automatisĂ© pour les nouveaux champs de prĂ©fĂ©rence de notification ZÉRO fichier de test sur 7 fichiers modifiĂ©s avec opĂ©rations de suppression dest utils.js : ParamĂštre 'mode' sans validation ni enum - valeur invalide (typo 'del utils.js : BATCH_SIZE=100 nombre magique sans tests aux limites - 5 cas critique validateDistributionKeySchema.ts modifiĂ© sans tests de rĂ©gression pour vĂ©rifier
file-server
Point de bascule: 20/02/2025 — Net debt: 13.0h (feat(backend): auto create accountings data when regie is created (#2496))
2.3x
ROI Refactor
61 commits coincés
26.9h perdus
11.9h refactor estimé
26.9h gagnés / 11.9h investis
ProblÚmes récurrents qu'un refactor éliminerait:
res.status(200) implicite - comportement fragile si middleware Express modifiĂ© SĂ©curitĂ© JWT affaiblie : jsonwebtoken ^9.0.2 non verrouillĂ©, sous-dĂ©pendances de SÉCURITÉ NON TESTÉE : clientSecret loggĂ© en clair via writeToLog() - aucun test Commentaire dupliquĂ© '// Download file and store it in a tmp folder' dans le blo Absence totale de tests automatisĂ©s - seule vĂ©rification manuelle mentionnĂ©e, ri
copro
Point de bascule: 27/02/2025 — Net debt: 28.4h (feat(dashboard/backend): generate tax certificate (#2465))
1.2x
ROI Refactor
33 commits coincés
12.8h perdus
11h refactor estimé
12.8h gagnés / 11h investis
ProblÚmes récurrents qu'un refactor éliminerait:
Fonction privĂ©e _createTicket non testable en isolation sans refactor d'accessib ÉLEVÉ : Absence de tests aux limites temporelles (J-5 exact, J-4, J-6, 23h59) - ZĂ©ro test automatisĂ© sur 8 fichiers modifiĂ©s incluant une correction de logique CRITIQUE : describe.skip dans 02.test.js rĂ©duit la couverture existante - anti-p CRITIQUE : NewRouteGuard.jsx ajoute 3 branches dĂ©cisionnelles (auth, 2FA, CGU) s
cron
Point de bascule: 20/02/2025 — Net debt: 13.0h (feat(backend): auto create accountings data when regie is created (#2496))
1.1x
ROI Refactor
24 commits coincés
12.8h perdus
11.9h refactor estimé
12.8h gagnés / 11.9h investis
ProblÚmes récurrents qu'un refactor éliminerait:
ZÉRO fichier de test sur 7 fichiers modifiĂ©s avec opĂ©rations de suppression dest utils.js : ParamĂštre 'mode' sans validation ni enum - valeur invalide (typo 'del utils.js : BATCH_SIZE=100 nombre magique sans tests aux limites - 5 cas critique Absence de stratĂ©gie de migration pour les donnĂ©es Strapi historiques oĂč tayoUse Absence totale de tests automatisĂ©s - seule vĂ©rification manuelle mentionnĂ©e, ri
collab
Point de bascule: 26/01/2026 — Quality: 0.0/10 (hotfix(collab): increase document file size limit (#3159))
0.6x
ROI Refactor
6 commits coincés
2h perdus
3.5h refactor estimé
2h gagnés / 3.5h investis
ProblÚmes récurrents qu'un refactor éliminerait:
Incohérence de formatage entre les fichiers : '250MO' sans espace dans advance-p Erreurs typographiques existantes non corrigées : 'depasser' (manque accent aigu Aucune visibilité sur les modifications backend correspondantes - les validation L'augmentation x10 de la limite totale pourrait avoir des impacts infrastructure Le changement de libellé 'Partager' vers 'Suivant' modifie la compréhension util
root
Point de bascule: 04/04/2025 — Net debt: 17.5h (feat: setup adonis.js (#2577))
0.3x
ROI Refactor
5 commits coincés
4.3h perdus
16.6h refactor estimé
4.3h gagnés / 16.6h investis
ProblÚmes récurrents qu'un refactor éliminerait:
SÉCURITÉ NON TESTÉE : clientSecret loggĂ© en clair via writeToLog() - aucun test Aucune fonctionnalitĂ© mĂ©tier rĂ©elle livrĂ©e - seules des routes de test existent, Suppression de l'ancien backend sans migration visible de la logique mĂ©tier - ri Fichiers .keep dans controllers, presenters, services indiquant une structure in Absence quasi-totale de tests - seul un fichier bootstrap.ts visible, aucune cou
workflows
Point de bascule: 04/04/2025 — Net debt: 17.5h (feat: setup adonis.js (#2577))
0.2x
ROI Refactor
4 commits coincés
3.8h perdus
23.5h refactor estimé
3.8h gagnés / 23.5h investis
ProblÚmes récurrents qu'un refactor éliminerait:
Aucune fonctionnalité métier réelle livrée - seules des routes de test existent, Suppression de l'ancien backend sans migration visible de la logique métier - ri Fichiers .keep dans controllers, presenters, services indiquant une structure in Absence quasi-totale de tests - seul un fichier bootstrap.ts visible, aucune cou Le middleware StrapiAuth n'a pas de tests et son comportement d'authentification

🧠 Diagnostic Architectural (IA)

Pour chaque module critique: pourquoi il va mal, si c'est l'architecture ou les devs, et quoi faire.

dashboard Mixte

Le module dashboard souffre d'un cercle vicieux oĂč chaque modification crĂ©e plus de dette qu'elle n'en rĂ©sout (ratio 7.1x), alimentĂ© par des violations SRP majeures et un couplage direct qui contourne la couche service. Les 368 commits bloquĂ©s aprĂšs le tipping point et les 11 cascades de correctifs montrent que l'architecture monolithique et le manque de tests empĂȘchent toute Ă©volution sans rĂ©gression, tandis que les pratiques dĂ©veloppeur (magic numbers, fuites de donnĂ©es, JSDoc obsolĂšte) aggravent la situation.

critical
Preuves:
  • VIOLATION SRP MAJEURE : getDocumentsList gĂšre 5 responsabilitĂ©s (auth + userId + rĂ©gie + ppeIds + requĂȘte) au lieu de 1-2, augmentant le risque de rĂ©gression
  • COUPLAGE DIRECT : L'import de Regie dans l'action serveur contourne la couche service, rĂ©duisant la testabilitĂ© et augmentant le couplage inter-couches
  • form.tsx 516 lignes monolithique mĂ©langeant useFieldArray, Zod transforms, rendu conditionnel - dĂ©composition TreasuryAssetsSection/TreasuryLiabilitiesSection planifiĂ©e, +3h dette refactor
  • handler.ts shouldReport() : instanceof HTTPError exclut TOUTES les HTTPError (4xx/5xx inclus) du monitoring Sentry - impact transversal sur toutes les intĂ©grations API
  • console.log('document', document) dans .map() - fuite de donnĂ©es sensibles (kdriveId, filepath) dans DevTools + exĂ©cution sur chaque render pour chaque document
🔧 Refactor suggĂ©rĂ©: Extraire une couche service dĂ©diĂ©e (dashboardService.ts) pour dĂ©coupler getDocumentsList en 5 fonctions Ă  responsabilitĂ© unique (authenticateRequest, resolveUserId, resolveRegie, resolvePpeIds, fetchDocuments), et dĂ©composer form.tsx en 3 sous-composants (TreasuryAssetsSection, TreasuryLiabilitiesSection, TreasuryFormProvider). Supprimer immĂ©diatement le console.log fuyant kdriveId/filepath et corriger shouldReport() pour ne exclure que les 4xx client errors du monitoring Sentry, pas les 5xx.
⏱ Effort: 2-3 sprints (service layer extraction + form decomposition = ~40h, shouldReport fix + console.log removal = ~3h, tests de rĂ©gression manquants = ~16h)
📈 Impact: RĂ©duction du ratio de crĂ©ation de dette de 7.1x vers ~3x, diminution des cascades de correctifs de 11 Ă  3-4, amĂ©lioration de la qualitĂ© code de 4.1/10 vers 6.5/10, Ă©limination de la fuite de donnĂ©es sensibles, restauration du monitoring Sentry sur les erreurs 5xx, et rĂ©duction des commits bloquĂ©s de 368 Ă  moins de 100.
apps/backend Mixte

Ce module est pris dans une spirale de dette irrĂ©versible : avec un ratio de crĂ©ation de dette de 7.3x et 253/256 commits bloquĂ©s aprĂšs le tipping point, il ne rĂ©duit jamais sa dette. La cause profonde est un cercle vicieux entre dĂ©fauts architecturaux (violation DRY sur AgStrapiResponse, formulaire monolithique 516 lignes, traitement indiffĂ©renciĂ© des APIs aux profils radicalement diffĂ©rents) et pratiques dĂ©veloppeur dĂ©faillantes (zĂ©ro test automatisĂ©, absence de typage TypeScript sur les clĂ©s critiques, dĂ©pendances non verrouillĂ©es). L'absence totale de tests rend tout refactor risquĂ©, ce qui empĂȘche de rĂ©duire la dette existante.

critical
Preuves:
  • Type AgStrapiResponse dupliquĂ© contrĂŽleur:lignes18-55/gĂ©nĂ©rateur:lignes25-90 → violation DRY rendant tests fragiles et maintenance double
  • Aucun test fonctionnel ou d'intĂ©gration n'existe - dette critique pour valider les intĂ©grations Strapi, Redis et Sentry
  • handler.ts shouldReport() : instanceof HTTPError exclut TOUTES les HTTPError (4xx/5xx inclus) du monitoring Sentry - impact transversal sur toutes les intĂ©grations API
  • Traitement indiffĂ©renciĂ© inappropriĂ© : API externe (Infomaniak), CMS (Strapi) et API interne (Adonis) ont des profils de charge et exigences de latence radicalement diffĂ©rents
  • Champs Propriete string→string|null sans fallback dans gĂ©nĂ©rateur PDF → risque affichage littĂ©ral 'null' dans document lĂ©gal envoyĂ© aux copropriĂ©taires
🔧 Refactor suggĂ©rĂ©: Extraire le type AgStrapiResponse vers un module partagĂ© (ex: `app/types/strapi.ts`), l'importer dans le contrĂŽleur et le gĂ©nĂ©rateur PDF pour Ă©liminer la duplication, puis corriger handler.ts shouldReport() pour ne filtrer que les 4xx client errors (pas les 5xx) afin de restaurer la visibilitĂ© Sentry sur les pannes serveur. Ces deux corrections transversales cassent le cycle oĂč chaque modification crĂ©e de la dette dans plusieurs fichiers simultanĂ©ment et oĂč les erreurs de production restent invisibles.
⏱ Effort: 1 sprint (1 semaine pour extraction du type partagĂ© + correction shouldReport + tests d'intĂ©gration minimaux Strapi/Sentry)
📈 Impact: RĂ©duction du ratio de crĂ©ation de dette de 7.3x vers ~4x Ă  court terme, Ă©limination de la maintenance double sur AgStrapiResponse (-2h par modification touchant Strapi), restauration de la visibilitĂ© Sentry sur les erreurs 5xx transversales, et fondation pour ajouter des tests d'intĂ©gration qui permettront de rĂ©duire la dette nette (actuellement 0h rĂ©duites pour 1996h créées). Le suffering score devrait baisser de ~15-20% une fois les tests d'intĂ©gration en place.
other Mixte

Ce module est en Ă©tat de dĂ©gradation avancĂ©e car il cumule des lacunes structurelles (aucune infrastructure de test, artefacts de conflits de fusion non rĂ©solus) et des pratiques de dĂ©veloppement dĂ©faillantes (versionnement non-SEMVER, commits non descriptifs, traçabilitĂ© nulle). Avec 127/128 commits bloquĂ©s aprĂšs le tipping point et un ratio de crĂ©ation de dette de 9.7x, le module ne rĂ©duit jamais sa dette — chaque merge apporte de nouveaux problĂšmes sans validation automatisĂ©e, crĂ©ant un cycle de cascades de correctifs (11 bursts) et de rĂ©gressions silencieuses.

critical
Preuves:
  • BLOQUANT : Filtre tayoObjectActive dupliquĂ© dans beaver/controllers/sync/index.js - artefact de conflit de fusion non rĂ©solu
  • CRITIQUE - 0 test d'intĂ©gration pour valider la fusion de branches, risque de conflits silencieux et rĂ©gressions non dĂ©tectĂ©es
  • ÉCART TEMPS 200% NON EXPLIQUÉ : 1.5h rĂ©el vs 0.5h idĂ©al pourrait indiquer des rĂ©solutions de conflits manuelles rĂ©currentes (signal de dette d'intĂ©gration inter-branches)
  • VERSIONNEMENT NON-SEMVER: v04.03.2025-001 ne distingue pas les breaking changes des patchs mineurs - les Ă©quipes support et utilisateurs ne peuvent pas anticiper l'impact fonctionnel de la mise Ă  jour
  • TRAÇABILITÉ NULLE : impossible d'associer ce merge Ă  des rapports de test, mĂ©triques de couverture, ou preuves de validation automatisĂ©e
🔧 Refactor suggĂ©rĂ©: Supprimer immĂ©diatement le filtre tayoObjectActive dupliquĂ© dans beaver/controllers/sync/index.js (artefact de conflit de fusion), puis instaurer un pipeline CI minimum avec : (1) une suite de tests d'intĂ©gration validant les merges inter-branches, (2) des tests nĂ©gatifs couvrant les cas null/Boolean vs String pour prĂ©venir les NullPointerException/ClassCastException, et (3) un hook pre-merge vĂ©rifiant l'absence de code dupliquĂ© (dĂ©tection de conflits non rĂ©solus). En parallĂšle, adopter le versionnement SEMVER et le format Conventional Commits pour restaurer la traçabilitĂ©.
⏱ Effort: 2 sprints (1 sprint pour rĂ©solution du code dupliquĂ© + infrastructure de tests d'intĂ©gration, 1 sprint pour SEMVER + Conventional Commits + hook CI)
📈 Impact: RĂ©duction du ratio dette créée/rĂ©duite de 9.7x vers ~3x, diminution des fix cascades (actuellement 11 bursts) de 50%+, rĂ©duction du friction ratio de 1.22x vers ~1.05x, et Ă©limination des 21.6h perdues par friction. Le refactor ROI de 9.1x indique que chaque heure investie dans la dette de test et traçabilitĂ© sauvera ~9h de rĂ©solution de conflits et rĂ©gressions. La qualitĂ© moyenne devrait remonter de 3.1/10 vers 5-6/10.

GĂ©nĂ©rĂ© par CodeWave le 20/04/2026 — 1041 commits · 40 modules