Aller au contenu

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 ? OuiNON_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).