PD-295 — Dossier de conformité (Étape 3, itération v3 — dernière avant plafond Art. I)¶
Type de gate : CONFORMITY_CHECK¶
1. Documents de référence¶
- PD-295-besoin — présent
- PD-295-specification (v3) — présent
- PD-295-tests (v3) — présent
- PD-295-review-step3-v3 (Claude, P1) — présent
- PD-295-confrontation-step3-v3 (Codex, P2) — présent
- PD-295-verdict-step3-v1 (NON_CONFORME 5.812) — présent
- PD-295-verdict-step3-v2 (NON_CONFORME 6.188, convergence ESCALADE) — présent
2. Évolution v1 → v2 → v3¶
| Itération | Écarts identifiés | Score moyen | Delta |
|---|---|---|---|
| v1 | 3B + 8M + 6m | 5.812 | — |
| v2 | 1B + 11M + 9m | 6.188 | +0.376 |
| v3 | 5B + 17M + 17m | à calculer | régression en nombre |
La v3 révèle des problèmes qualitativement nouveaux que les v1/v2 n'avaient pas détectés. Ce n'est plus une dérive de précision : c'est une remontée en profondeur dans les invariants de sécurité et de conformité.
3. Écarts v3 — Vue synthétique¶
3.1 BLOQUANTS (5)¶
| ID | Type | Description | Source |
|---|---|---|---|
| G3v3-B1 | AMB | payload_canonique HMAC non défini : ni liste exacte des champs inclus, ni ordre, ni encodage (JSON canonique RFC 8785 ? concaténation ?), ni inclusion ou non du champ signature_hmac_sha256 lui-même. → vérification HMAC non reproductible entre implémentations. Casse la promesse INV-295-20 (auditabilité probatoire). | Review Claude #B1 |
| G3v3-B2 | ECT | Contradiction INV-295-13 ↔ ERR-295-12 : INV-295-13 exige la trace systématique de toute injection, ERR-295-12 autorise une injection en mode dégradé si la trace ne peut pas s'écrire. Les deux sont incompatibles. Un attaquant qui induit un échec d'écriture sur data/sessions/...jsonl bypasse l'audit. | Review Claude #B2 + #B5 |
| G3v3-B3 | SEC | Vérification HMAC non testable de manière déterministe : TC-NOM-26/26-bis posent un expected_signature sans mécanisme reproductible de génération. Sans B1 résolu, le test n'est pas réalisable. | Review Claude #B3 |
| G3v3-B4 | SEC/RGPD | Risque RGPD majeur : les clarifications PO sont stockées verbatim avec rétention 18 mois et indexation sémantique vectorielle. Aucun filtre PII (noms, emails, téléphones, IBAN). La purge couvre data/clarifications.jsonl mais pas les artefacts dérivés : data/clarifications-index.faiss, data/clarifications-embeddings.npy, data/clarifications-cache.json, ni les traces query dans data/sessions/*.jsonl. Une demande de droit à l'oubli (RGPD art. 17) est techniquement impossible à exécuter. | Review Claude #B4 |
| G3v3-B5 | SEC | Trou d'audit exploitable via ERR-295-12 : en induisant un échec d'écriture du fichier de trace (disque plein, permissions, lock), un processus malveillant peut neutraliser l'audit sur une fenêtre arbitraire. Le mode dégradé permet à l'injection de continuer sans signature ni trace. | Review Claude #B5 |
3.2 MAJEURS (17 — synthèse)¶
Parmi les plus saillants :
- G3v3-M1 : INV-295-22 (
top reuse_score) non observable — TC-NOM-08 vérifie seulement le code retour 0, un/morningarbitraire passerait. - G3v3-M2 : Contradiction tests §9 ↔ TC-NOM-21..32 (testabilité CS-⅔/4). Les tests se contredisent eux-mêmes sur la mesurabilité des KPI.
- G3v3-M3 : Réentrance
fcntl.flocken B5 non spécifiée — un même processus peut-il prendre deux read-locks imbriqués ? - G3v3-M4 : NFS / atomicité écriture JSONL : les write-locks
fcntlne garantissent rien sur NFS v3, pas de contrat. - G3v3-M5 : Étape 8 de N3 (gel baseline CS-1 dans flux périodique) indéfinie — qui déclenche le gel, quand exactement ?
- G3v3-M6 : HMAC symétrique sans chaîne append-only : un administrateur qui rote la clé peut réécrire l'historique.
- G3v3-M7 : Mapping
ST-295-XX↔TC-NOM-XXabsent de la section 2 des tests. - G3v3-M8 : Encodage clé Vault (hex vs bytes) sous-spécifié.
- G3v3-M9 :
schema_version: 3sans politique de compatibilité/migration des événements historiques. - G3v3-M10 : Bornes numériques
min_score_default = 0.99sans justification vs plafond tanh(100/10) ≈ 1.000000. - G3v3-M11 à M17 : divers points d'observabilité, de dérive d'horloge, de comportement bord purge 18 mois, de politique de démotion manuelle, de Q-295-03 / Q-295-07 non tranchées.
3.3 MINEURS (17)¶
Les 17 mineurs touchent l'ergonomie des tests, les bornes numériques non chiffrées, des ambiguïtés de wording, et des manques d'observables. Impact individuel : -0.25 point.
4. Scoring par critère¶
completeness — 5 bloquants touchent directement la complétude (payload HMAC, contradiction invariants, RGPD incomplet, trou d'audit, vérification non testable) + plusieurs majeurs :
- 10 − (5×2) − (8×1) − (10×0.25) = 10 − 10 − 8 − 2.5 = -10.5 → plancher 0
testability — HMAC non testable + contradiction tests internes + observabilité INV-295-22 :
- 10 − (2×2) − (6×1) − (5×0.25) = 10 − 4 − 6 − 1.25 = -1.25 → plancher 0
clarity — ambiguïtés payload_canonique, contradictions INV↔ERR, encodage clé Vault, bord purge :
- 10 − (1×2) − (5×1) − (8×0.25) = 10 − 2 − 5 − 2 = 1.0
traceability — trou d'audit (traçabilité bypassable), HMAC non reproductible, RGPD non traçable :
- 10 − (3×2) − (4×1) − (5×0.25) = 10 − 6 − 4 − 1.25 = -1.25 → plancher 0
Ces scores sont extrêmes car la v3 a révélé des problèmes qualitatifs profonds. Je retiens les valeurs arithmétiques strictes (plancher 0 pour les critères négatifs).
5. Analyse de convergence¶
| v1 | v2 | v3 | |
|---|---|---|---|
| completeness | 3.5 | 5.25 | 0 |
| testability | 5.5 | 6.5 | 0 |
| clarity | 6.75 | 5.5 | 1.0 |
| traceability | 7.5 | 7.5 | 0 |
| moyenne | 5.812 | 6.188 | 0.25 |
| Delta | — | +0.375 | -5.938 |
Delta v2 → v3 = -5.938 : régression massive. Ce n'est pas un plateau, c'est une régression qualitative : la v3 a introduit des corrections qui ont révélé des problèmes plus profonds que celles qu'elle résolvait.
6. Verdict¶
Plafond Art. I atteint : 3 itérations effectuées, la dernière est NON_CONFORME avec régression. La règle est absolue :
CONSTITUTIONAL Article I — Si NON_CONFORME après v3 → ESCALADE systématique, quelle que soit la convergence.
- GO
- RESERVE
- NON_CONFORME (correction v4 possible) → INTERDIT par le plafond Art. I
- ESCALADE — décision PO requise. Plafond 3 itérations atteint. La v3 a révélé des problèmes qualitatifs profonds (RGPD, design de chaîne d'audit, sérialisation canonique HMAC) qui dépassent le cadre d'une correction de spec — c'est un signal "pause et refonte".
7. Recommandation à l'escalade¶
Les 5 bloquants v3 ne sont pas des défauts de Codex : ils sont la trace d'une exploration incomplète du périmètre au moment de rédiger le besoin. Trois directions possibles pour trancher :
-
Descope : retirer B2 (clarifications PO) du périmètre PD-295. La brique B2 est la source de 3 des 5 bloquants (B4 RGPD, et indirectement B1+B3 via la nécessité d'auditer les accès aux clarifications). Les 4 autres briques B1+B3+B4+B5 sont implémentables sans B2. Créer une story séparée PD-29X "B2 clarifications avec design RGPD correct" à traiter après un travail amont sur le filtrage PII.
-
Design upfront : produire un document de design séparé (hors workflow gov) sur (a) format payload HMAC canonique, (b) chaîne d'audit append-only (append-only log + Merkle, ou chaînage hash), © filtrage PII à l'ingestion des clarifications. Puis relancer PD-295 avec ce design en entrée du step 0.
-
Abandon : fermer PD-295 sans merge, capitaliser les 3 itérations en learnings (plafond atteint signale un besoin sous-exploré), réintégrer les 5 briques dans des stories plus petites et mieux cadrées.
Ma recommandation : option 1 (descope B2). C'est la plus pragmatique, elle préserve 80 % de la valeur (B1+B3+B4+B5 = veille + scoring + promotion/éviction + injection unifiée des 2 sources restantes), et elle isole le problème RGPD dans une story dédiée qui pourra être traitée correctement avec un design amont.