Apparence
21. Anomalies, incohérences & dette technique de l'existant
Ces points sont la dette héritée de v1 — ils faisaient partie du périmètre existant. La colonne Traitement v2 indique comment la nouvelle stack les résout (✅ résolu par architecture · 🔨 à concevoir/arbitrer pendant l'implémentation).
| # | Constat (v1) | Sévérité | Traitement v2 |
|---|---|---|---|
| D1 | Onboarding sans organisation : un nouvel inscrit sans organizationId est masqué par l'isolation org-scopée, et aucun écran ne le rattache | 🔴 Élevée | 🔨 Écran d'onboarding + rattachement organisation à concevoir (Q3) |
| D2 | RLS incohérente entre tables : etapes/anomalies en USING(true) (non filtrées par organisation) | 🔴 Élevée | ✅ RLS applicative uniforme (rowLevelSecurity + ABAC) sur toutes les collections |
| D3 | Incohérences UI/API sur les permissions (édition module, suppression CRIM, upload preuve) | 🟠 Moyenne | 🔨 Unifier via can() — UI et serveur dérivent de la même table de permissions |
| D4 | Statuts d'anomalie non unifiés : défaut « Nouveau » vs export « Ouverte/Fermée/En cours » | 🟠 Moyenne | 🔨 Union Zod unique de statuts, à trancher (Q12) |
| D5 | Dénormalisations divergentes : propagation fire-and-forget | 🟠 Moyenne | ✅ Triggers convex-helpers atomiques |
| D6 | CRIM sans FK : références orphelines après suppression | 🟡 Faible | ✅ Relations Convex + trigger de nettoyage du cache |
| D7 | Orphelins Storage : suppression métadonnée sans suppression du blob | 🟡 Faible | ✅ Cycle de vie Convex File Storage dans la mutation + action-retrier |
| D8 | db-schema.json obsolète | 🟡 Faible | ✅ schema.ts Convex = source unique typée |
| D9 | Table campaign_tests vestigiale (M2M inutilisée) | 🟡 Faible | ✅ Non reprise en v2 |
| D10 | Logs de debug laissés en production | 🟡 Faible | ✅ Logs/insights dashboard Convex (pas de console.log résiduel) |
| D11 | Colonne dépréciée (tests.campaign_id) encore décrite | 🟡 Faible | ✅ Schéma Convex propre dès le départ |
| D12 | Runs synthétiques non persistés (entrées journal à la volée) | 🟡 Faible | 🔨 Choix à confirmer (persister vs mergedStream à la lecture) |
| D13 | Saisie CRIM via window.prompt | 🟡 Faible | ✅ Dialog @recette/ui |