Aller au contenu

PD-285 — Specification Review (Gate 3 — CONFORMITY_CHECK)

Auditeur : Claude (review indépendante) Date : 2026-03-14 Itération : v1 Documents audités : PD-285-specification.md, PD-285-tests.md


Constats

C-01 — Ambiguïté storage.category_max_bytes vs maxSizeBytes

Type : Ambiguïté Référence : Spec §4 INV-285-04 vs §5 Modèle de données contractuel Description : INV-285-04 définit un paramètre storage.category_max_bytes avec défaut 524288000, min 1, max 524288000. Le modèle de données §5 définit un champ maxSizeBytes avec la même plage 1..524288000. La relation entre ces deux noms n'est pas explicitement définie : s'agit-il du même attribut (auquel cas un seul nom contractuel devrait exister) ou de deux niveaux distincts (paramètre de configuration global vs champ par catégorie) ? Impact : Une équipe tierce pourrait implémenter deux mécanismes distincts là où un seul est attendu, ou inversement fusionner deux concepts différents. Gravité : Majeur


C-02 — Ambiguïté sur la portée de storage.category_max_bytes

Type : Ambiguïté Référence : Spec §4 INV-285-04 vs INV-285-02 Description : INV-285-04 définit storage.category_max_bytes au singulier avec une seule valeur (défaut 524288000). Or INV-285-02 stipule que seules DEFAULT et B2C_EVIDENCE_MINOR sont relevées à 500 MB, impliquant que d'autres catégories conservent des limites différentes. Si storage.category_max_bytes est un paramètre unique global, il ne peut pas coexister avec des limites par catégorie différentes. Si c'est un paramètre par catégorie, le nom au singulier et la définition d'une seule borne sont trompeurs. Impact : Confusion sur l'architecture de configuration : paramètre global vs par catégorie. Gravité : Majeur


C-03 — Comportement middleware quand Content-Length absent

Type : Ambiguïté Référence : Spec §5 Flux N2 étape 1 ("si présent"), §9 Q-03, §6 (absent du tableau d'erreurs) Description : Le flux N2 conditionne la pré-validation à la présence de Content-Length. Le comportement quand cet en-tête est absent (chunked transfer encoding, requête mal formée) n'est pas contractualisé. Q-03 le signale comme point à clarifier mais aucun invariant ni cas d'erreur ne le couvre. En conséquence, le middleware pourrait laisser passer un upload sans limite de taille vers la validation métier. Impact : L'hypothèse H-05 reconnaît que la validation métier est l'autorité finale, mais la spec ne contractualise pas le chemin nominal en absence de Content-Length, rendant le flux N2 partiellement indéterminé. Gravité : Majeur


C-04 — Code/statut HTTP du rejet middleware non spécifié

Type : Ambiguïté Référence : Spec §5 Flux N2 étape 3, §6 E-01 Description : E-01 indique "Rejet immédiat de la requête (pré-validation)" mais ne spécifie ni le code HTTP retourné (413 Payload Too Large ?), ni le format de la réponse, ni si un code d'erreur métier est inclus. Le code ERR-79-004 est explicitement réservé au rejet service (E-02/INV-285-05). Le rejet middleware est donc sans contrat de réponse. Impact : Un client ne peut pas distinguer un rejet taille middleware d'un autre type de rejet. Un test ne peut pas vérifier le comportement exact du middleware au-delà du fait que la requête est rejetée. Gravité : Mineur


C-05 — Scénarios TC-INV-08 à TC-INV-12 non définis

Type : Incohérence Spec↔Tests Référence : Tests §2 matrice de couverture (TC-INV-08 à TC-INV-12) vs §3-§7 (absents) Description : La matrice de couverture §2 référence 5 tests (TC-INV-08, TC-INV-09, TC-INV-10, TC-INV-11, TC-INV-12) couvrant les invariants INV-285-08 à INV-285-12. Ces tests ne sont définis nulle part dans le document : aucun scénario Given/When/Then, aucune section dédiée. Leur observable est décrit comme "validation d'absence" dans la matrice §5 mais sans procédure de vérification. Impact : 5 tests référencés dans la matrice sont inexécutables en l'état. Un auditeur ne peut pas reproduire ces vérifications. Gravité : Majeur


C-06 — TC-NOM-06 non mappé dans la matrice de couverture

Type : Incohérence Spec↔Tests Référence : Tests §3 TC-NOM-06 vs §2 matrice Description : TC-NOM-06 (borne haute acceptée côté service, taille = 524288000, pas de ERR-79-004) est défini en §3 mais n'apparaît pas dans la matrice de couverture §2. Ce test couvre le cas symétrique de TC-NOM-05 au niveau service et devrait être mappé à INV-285-03 / CA-04. Impact : Couverture matrice incomplète ; risque d'oubli lors de l'implémentation des tests. Gravité : Mineur


C-07 — Invariants INV-285-08 à INV-285-12 : pertinence contractuelle

Type : Non testable Référence : Spec §4 INV-285-08 à INV-285-12 Description : Ces 5 invariants affirment l'absence de transition temporelle, d'états retour, de protection distribuée, d'atomicité DDL et de contraintes inter-module. Ce sont des assertions d'absence, pas des règles fonctionnelles. Leur formulation ("Aucune transition temporelle identifiée") est une constatation d'analyse, pas une contrainte vérifiable par un test automatisé. L'observable proposé ("preuve d'analyse") n'est pas reproductible par une équipe tierce. Impact : Ces invariants ne sont pas falsifiables au sens test contractuel. Ils documentent une décision de périmètre, pas une règle implémentable. Gravité : Mineur


C-08 — INV-285-04 : borne max = défaut rend le paramètre non configurable à la hausse

Type : Hypothèse dangereuse Référence : Spec §4 INV-285-04 ("min 1, max 524288000, défaut 524288000") Description : Le paramètre storage.category_max_bytes a un maximum égal à sa valeur par défaut (524288000). Cela implique que la valeur ne peut être que diminuée, jamais augmentée au-delà de 500 MB. Si l'intention est de rendre la limite configurable à la baisse uniquement, c'est correct mais non documenté explicitement. Si c'est un artefact de rédaction, le max devrait être plus élevé (ex: NORMATIVE_DEFAULTS.MAX_FILE_SIZE). Impact : Confusion potentielle sur la configurabilité du paramètre. Gravité : Mineur


C-09 — Détermination de la catégorie au niveau middleware

Type : Hypothèse dangereuse Référence : Spec §5 Flux N2 étape 2 Description : Le flux N2 stipule "Le middleware compare Content-Length à la limite de catégorie". Cela suppose que le middleware connaît la catégorie documentaire avant le traitement de la requête. Or la catégorie est typiquement déterminée par le corps de la requête (métadonnées du document) ou par la route. La spec ne précise pas comment le middleware accède à cette information à ce stade du pipeline. Impact : Si le middleware ne peut pas déterminer la catégorie, il ne peut pas appliquer la bonne limite. Il devrait alors appliquer la limite maximale globale ou la limite la plus permissive, ce qui change la sémantique du contrôle. Gravité : Majeur


C-10 — TC-NEG-01 mappé à CA-01/CA-02 dans la matrice mais teste un concept différent

Type : Incohérence Spec↔Tests Référence : Tests §2 matrice (TC-NEG-01 → CA-01, CA-02) vs §7 TC-NEG-01 Description : La matrice associe TC-NEG-01 aux critères CA-01 et CA-02 (qui vérifient les valeurs de config). Mais TC-NEG-01 vérifie qu'aucune autre catégorie n'est relevée à 500 MB (INV-285-02). C'est un test de non-contamination de périmètre, pas un test de valeur de config. Le mapping CA-01/CA-02 est trompeur. Impact : Un auditeur pourrait considérer CA-01/CA-02 couverts par TC-NEG-01 alors qu'ils sont en réalité couverts par TC-NOM-01/TC-NOM-02. Gravité : Mineur


C-11 — Absence de spécification du format de rapport inter-EB (CA-07)

Type : Non testable Référence : Spec §7 CA-07, §9 Q-04, Tests §9 règles non testables Description : CA-07 repose sur l'absence d'incohérence dans un "rapport de cohérence" dont le format n'est pas contractualisé. Le test TC-NOM-08 vérifie "aucune incohérence remontée" et "statut de contrôle conforme" sans définir la structure du rapport, le nom de la règle à vérifier, ni le format du statut. La référence coherence-report.py (Level 1.1, issue #5) est citée en §Références mais pas dans les invariants ni les critères. Impact : Le critère CA-07 n'est pas vérifiable de manière déterministe par une équipe tierce sans accès à l'outil coherence-report.py et sans connaître le format de sortie attendu. Gravité : Majeur


Synthèse

Gravité Nombre
Bloquant 0
Majeur 5 (C-01, C-02, C-03, C-05, C-09, C-11)
Mineur 5 (C-04, C-06, C-07, C-08, C-10)

Constats majeurs à résoudre : 1. Clarifier la relation storage.category_max_bytes vs maxSizeBytes (C-01, C-02) 2. Contractualiser le comportement middleware en absence de Content-Length (C-03) 3. Définir les scénarios TC-INV-08 à TC-INV-12 ou les retirer de la matrice (C-05) 4. Préciser comment le middleware détermine la catégorie documentaire (C-09) 5. Contractualiser le format du rapport inter-EB pour rendre CA-07 vérifiable (C-11)