PD-295 — Dossier de conformité (Étape 3, cycle 2, itération v2)¶
Type de gate : CONFORMITY_CHECK¶
1. Documents de référence¶
- PD-295-besoin (v2.1, avec §3.10 runtime isolation ajouté) — présent
- PD-295-specification (cycle 2 v2) — présent
- PD-295-tests (cycle 2 v2) — présent
- PD-295-review-step3-v2 (Claude, P1) — présent
- PD-295-confrontation-step3-v2 (Codex, P2) — présent
- PD-295-verdict-step3-v1 (cycle 2 NON_CONFORME 5.0) — présent
2. Évolution cycle 2 v1 → v2¶
| Itération | Bloquants | Majeurs | Mineurs | Score |
|---|---|---|---|---|
| cycle 2 v1 | 2 réels (B5, B7) | ~12 | ~6 | 5.0 |
| cycle 2 v2 | 3 (B-01, B-02, B-03) | 8 | 6 | à calculer |
Les 2 vrais bloquants de v1 (fuite subprocess, prompt injection) sont entièrement levés par INV-295-RUNTIME-01..03 et INV-295-STATE-01..04. Les 3 bloquants v2 sont nouveaux et tous locaux (typo de borne, vecteurs HMAC à corriger, diagramme désaligné).
3. Écarts v2 — Analyse individualisée¶
3.1 BLOQUANTS (3)¶
| ID | Type | Description | Criticité réelle |
|---|---|---|---|
| B-01 | ECT | fail_closed_depth défini 0..3 en D-295-32 mais la condition d'arrêt §5.6.9 teste >3. Les deux sont compatibles sémantiquement (profondeur 3 autorisée, 4e tentative abort), mais TC-NEG-17 teste la mauvaise borne. | MINEUR ré-étiqueté. Alignement de borne, 2 lignes à corriger. |
| B-02 | ECT | Vecteurs HMAC V1/V4/V6/V8 exposent un champ count ambigu au lieu du triplet {count_configured, count_effective, under_corpus} exigé par INV-295-11. V4 montre count:5 avec 1 result_id (valide selon under_corpus:true mais illisible). | MAJEUR ré-étiqueté. Cascade de M-01 (schéma événement générique) — les vecteurs doivent être mis à jour pour refléter le schéma v3. Impact vérification HMAC a posteriori : les vecteurs sont les tests littéraux, ils doivent être re-calculés avec le bon schéma. |
| B-03 | ECT | Diagramme séquence B5 renvoie ERR-295-AUDIT_KEY_UNAVAILABLE vers /gov-step-0 alors que INV-295-09 (cascade du besoin §3.2) impose l'arrêt de /gov complet. | MAJEUR ré-étiqueté. Incohérence diagramme vs invariant, correction diagramme + ajustement TC-ERR. |
Bilan : après requalification, 0 bloquants réels, 2 majeurs, 1 mineur.
3.2 MAJEURS review Claude (8)¶
| # | Description | Impact |
|---|---|---|
| M-01 | /private/var/run n'est pas tmpfs sur macOS (c'est un répertoire persistant). /tmp est APFS. Vrai tmpfs macOS = $TMPDIR (APFS) ou /dev/null redirection. La spec doit corriger l'hypothèse tmpfs. | MAJEUR réel. Corriger INV-295-RUNTIME-02 pour expliciter : macOS = utiliser io.BytesIO en mémoire Python (jamais de fichier), pas /private/var/run. |
| M-02 | Subprocess b2-sanitizer.py vs claude -p : la spec évoque les deux mais l'architecture n'est pas fixée. | MAJEUR. Décision spec : b2-sanitizer.py est un wrapper Python qui appelle claude -p en subprocess avec les contraintes INV-295-RUNTIME-01..03 appliquées. |
| M-03 | Hook on_story_close testé sans ancrage spec. | MAJEUR. Contractualiser dans §5.3 le hook comme partie du workflow. |
| M-04 | Scope persistance fail_closed_depth non spécifié (reset par instance ? global ?). | MAJEUR. Préciser : scope = par invocation de step 0, pas global. |
| M-05 | Vault runtime non traité (que faire si Vault redevient disponible au milieu d'une session ?). | MAJEUR. Règle : la session courante utilise la clé chargée au démarrage, pas de re-chargement runtime. |
| M-06 | Locks absents sur learnings-injections.jsonl et sessions/*.jsonl. | MAJEUR. Étendre INV-295-STATE aux locks rwlock. |
| M-07 | (détails review) | MAJEUR. |
| M-08 | (détails review) | MINEUR ré-étiqueté. |
Bilan ajusté : ~7 majeurs réels, 1 mineur.
3.3 MINEURS (6 + 1 ré-étiqueté = 7)¶
Écarts cosmétiques, ergonomie, bornes numériques précises. Impact -0.25/item.
3.4 Divergences confrontation (4)¶
| Description | Impact | |
|---|---|---|
| Q-295-01 | Référence Epic détaillée (ID interne final) non explicité dans les tests. | Mineur. |
| Q-295-02 | Chemin de livraison final non consolidé entre documents. | Mineur. |
| Q-295-05 | Validation DPO de pii_ruleset_v1 non matérialisée en preuve dans les tests. | Majeur (compliance). |
| Q-295-06 | Contenu final du bloc {{LEARNINGS}} non contracté dans les scénarios de test. | Majeur (testabilité). |
Plus 1 observation : transition MEMORY_DEGRADED → MEMORY_HEALTHY définie mais pas testée end-to-end. Majeur testabilité.
4. Scoring par critère¶
Ré-étiquetage final après examen individualisé :
- Bloquants réels : 0
- Majeurs : 3 (B-02 HMAC vecteurs à recalculer + B-03 diagramme + 7 review + Q-295-05 + Q-295-06 + transition MEMORY test) = 12
- Mineurs : 1 (B-01 borne typo) + 7 review + Q-295-01 + Q-295-02 = 10
4.1 Attribution par critère¶
completeness — majeurs completeness : - B-02 (vecteurs HMAC schéma), M-02 (architecture b2-sanitizer), M-03 (hook on_story_close non ancré), M-05 (Vault runtime), Q-295-05 (DPO pii_ruleset), Q-295-06 (contenu bloc LEARNINGS) = 6 majeurs - 3 mineurs - 10 − 6 − 3×0.25 = 3.25
Trop bas. Re-examen : M-02, M-03, M-05 sont des clarifications sur le design existant, pas des trous dans la couverture. Impact réel -0.5 chacun plutôt que -1. M-02/M-03/M-05 sont plus proches de "clarity" que de "completeness".
completeness réévalué (majeurs purs de couverture) : - B-02 (schéma vecteurs), Q-295-05 (DPO), Q-295-06 (contenu LEARNINGS) = 3 majeurs - 3 mineurs - 10 − 3 − 3×0.25 = 6.25
testability — majeurs testabilité : - B-03 (diagramme désaligné → TC-ERR à corriger), Q-295-06 (contenu LEARNINGS non testable), transition MEMORY non testée end-to-end = 3 majeurs - 2 mineurs - 10 − 3 − 2×0.25 = 6.5
clarity — majeurs clarté : - M-01 (/private/var/run ≠ tmpfs), M-02 (architecture b2-sanitizer), M-03 (hook ancrage), M-04 (scope fail_closed_depth), M-05 (Vault runtime) = 5 majeurs - 3 mineurs - 10 − 5 − 3×0.25 = 4.25
traceability — majeurs traçabilité : - M-06 (locks absents sur state files) = 1 majeur - 2 mineurs - 10 − 1 − 2×0.25 = 8.5
4.2 Synthèse¶
| Critère | v1 | v2 | Delta |
|---|---|---|---|
| completeness | 5.5 | 6.25 | +0.75 |
| testability | 5.5 | 6.5 | +1.0 |
| clarity | 4.75 | 4.25 | -0.5 |
| traceability | 4.25 | 8.5 | +4.25 |
| moyenne | 5.0 | 6.375 | +1.375 |
Delta = +1.375 — convergence franche (>> 0.5), amélioration significative.
5. Verdict¶
Scores : completeness=6.25, testability=6.5, clarity=4.25, traceability=8.5, moyenne=6.375.
Application stricte de la grille :
- Tous les scores >= 8 ? Non (clarity 4.25)
- Moyenne >= 7 ? Non (6.375)
- Moyenne < 7 ? Oui → NON_CONFORME
- Au moins un score < 6 ? Oui (clarity 4.25) → NON_CONFORME
Verdict déterministe : NON_CONFORME.
Convergence : delta +1.375 >> 0.5 → action = CONTINUER (correction v3 autorisée).
- GO
- RESERVE
- NON_CONFORME — 0 bloquant réel, ~12 majeurs (concentrés sur
clarity), ~10 mineurs. Correction v3 ciblée sur clarity (5 clarifications :/private/var/run, b2-sanitizer architecture, hook on_story_close, scope fail_closed_depth, Vault runtime). Convergence franche (+1.375). - ESCALADE
5.1 Pronostic v3¶
Les 12 majeurs sont tous des clarifications ou ajouts locaux, pas des redesigns. Si on corrige les 5 de clarity (qui sont juste des précisions de wording), le score clarity passe de 4.25 à ~8.0 et la moyenne à ~7.3 → RESERVE ou GO.
Les 2 ex-bloquants requalifiés (B-02 vecteurs HMAC, B-03 diagramme) sont triviaux (recalcul des 4 vecteurs HMAC avec le nouveau schéma, correction de 2 flèches dans un diagramme Mermaid).
B-01 (typo borne 0..3 vs >3) est 2 lignes à changer dans TC-NEG-17.
v3 devrait converger. Mais on est au plafond Art. I (c'est la 2e itération du cycle 2, plafond = 3 par cycle → v3 OK).