PD-295 — Dossier de conformité (Étape 3, cycle 3, itération v2)¶
Type de gate : CONFORMITY_CHECK¶
1. Documents de référence¶
- PD-295-besoin v2.2 (§3.12 arbitrages cycle 3)
- PD-295-specification (cycle 3 v2, 515 lignes — sous la limite 530)
- PD-295-tests (cycle 3 v2, 273 lignes — sous la limite 290)
- PD-295-review-step3-v2 (Claude, P1) : 2 bloquants + 12 majeurs + 6 mineurs
- PD-295-confrontation-step3-v2 (Codex, P2) : rework, pas de divergences bloquantes
- PD-295-verdict-step3-v1 (NON_CONFORME 7.0)
2. Vérification des corrections E-01..E-07¶
Par grep direct dans la spec c3v2 :
| # | Correction demandée | État |
|---|---|---|
| E-01 | nb_domains sans plancher | ✅ Intégré 4× (§3, LS-01, procédure B3, table seuils) |
| E-02 | pii_ruleset_v1 énumération 6 familles | ✅ Intégré |
| E-03 | INV-295-09 rotation = hors session | ✅ Intégré |
| E-04 | D-295-32 plage [0,3] | ✅ Intégré |
| E-05 | retention_until = 540 days | ✅ Intégré 5× (INV-295-05, LS-05, D-295-13, table bornes, texte) |
| E-06 | ERR-295-CLOCK_DRIFT_EXCEEDED | ✅ Intégré 3× |
| E-07 | Hook erreur path retry + fail-safe | ✅ Intégré |
7/7 corrections E- intégrées avec succès.
3. Écarts c3v2 — Analyse individualisée¶
3.1 BLOQUANTS Claude (2)¶
| ID | Description | Criticité réelle |
|---|---|---|
| B-E02 | Contradiction FSM : on_story_close (INV-295-STATE-04) déclenche une purge immédiate des clarifications, mais §5.9.2 (INV-295-CL-04, CL-05) définit la machine à états SUMMARY_INDEXED → EXPIRED → PURGED qui n'autorise la purge qu'après expiration (date > retention_until). TC-NOM-20/22 contredisent TC-NEG-07. | MAJEUR réel, pas bloquant. C'est une contradiction logique entre deux invariants du même document. La résolution est claire : on_story_close ne purge pas les clarifications, il déclenche uniquement une transition vers un état "éligible à purge future" si applicable. La purge effective reste conditionnée à date > retention_until. Le hook est utile pour les stories REJECTED dont les clarifications doivent être purgées quand elles expirent, pas immédiatement. Correction = 5 lignes. |
| B-E04 | Sous-subprocess claude -p appelé depuis une session Claude Code active sans unset CLAUDECODE. Learning universel déjà documenté dans .claude/rules/learnings-universal.md (2026-02-20). Tous les tests B2 runtime échoueraient. | 🔴 BLOQUANT VRAI. Régression d'un learning connu. Correction : INV-295-RUNTIME-01 doit explicitement documenter que b2-sanitizer.py préfixe son appel par unset CLAUDECODE (ou utilise subprocess.Popen(env={...}, ...) en retirant CLAUDECODE de l'environnement hérité). 3 lignes. |
Bilan bloquants : 1 vrai bloquant (E-04 unset CLAUDECODE), 1 majeur ré-étiqueté (E-02 FSM contradiction).
3.2 MAJEURS Claude (12)¶
Synthèse des axes :
| # | Description | Réel / Ré-étiquetage |
|---|---|---|
| E-03 | Traçabilité ST↔TC cassée (éléments de sécurité non reliés à un TC) | Réel, mais mineur d'ergonomie de matrice |
| E-05 | tmutil macOS-only sur déploiement potentiellement hybride Linux | Déjà adressé en besoin v2.2 §3.9 (mono-hôte) + v2.2 §9.1 déploiement "mono-hôte" ; ajouter ligne "macOS-only B2, Linux = pas de backup auto configurable" → mineur |
| E-06 | timestamp_ntp_reference non défini (source NTP) | Réel, précision : ntpdate pool.ntp.org ou équivalent système |
| E-07 | CA-295-02 dépend de Q-295-05 non résolu (validation DPO pii_ruleset) | Mineur : Q-295-05 est résolue par le commit signé DPO en §3.1 besoin v2.2, mais spec ne le cite pas explicitement |
| E-09 | Rotation clé sans lock anti-session concurrent | Réel : un rotate-audit-hmac.sh doit vérifier qu'il n'y a pas de session /gov en cours (lockfile dédié) |
| E-12 | Portée rwlock sous-spécifiée (quels fichiers, quelle granularité) | Réel : aligner §5.12 |
| E-20 | Vecteur V6 signé par la mauvaise clé (V6 doit être signé par la nouvelle clé après rotation) | Réel, précision sur les vecteurs HMAC |
| E-08/10/11/13/14 | (non détaillés) | Répartition : 2 réels, 3 mineurs |
Bilan majeurs après ré-étiquetage : ~5 vrais majeurs + 1 majeur ex-bloquant (B-E02) = 6 vrais majeurs, 6 mineurs additionnels.
3.3 MINEURS Claude (6) + 6 ré-étiquetés + confrontation zones d'ombre = ~15 mineurs¶
4. Scoring par critère¶
4.1 Attribution par critère¶
- completeness :
pii_rulesetdépendance Q-295-05 (E-07, mineur),timestamp_ntp_referencenon défini (E-06 réel), FSM contradiction purge (B-E02, réel majeur), NTP source ajustement = 2 vrais majeurs + 4 mineurs - 10 − 2 − 4×0.25 = 7.0
- testability : traçabilité ST↔TC cassée (E-03), TC manquant sur promotion/injection filtrage non signé, CA-295-12 clearing sans test dédié, TC-NR-02 frontière ambiguë (zones d'ombre) = 2 vrais majeurs + 3 mineurs
- 10 − 2 − 3×0.25 = 7.25
- clarity : B-E04 unset CLAUDECODE vrai bloquant (traité en bloquant), rwlock portée (E-12), vecteur V6 mauvaise clé (E-20) = 1 bloquant + 2 vrais majeurs + 4 mineurs
- 10 − 2 − 2 − 4×0.25 = 5.0
- traceability : rotate-audit-hmac.sh lock anti-session concurrent (E-09, réel), tmutil Linux (E-05 ré-étiqueté mineur), 3 mineurs = 1 majeur + 3 mineurs
- 10 − 1 − 3×0.25 = 8.25
4.2 Synthèse¶
| Critère | c3v1 | c3v2 | Δ |
|---|---|---|---|
| completeness | 5.0 | 7.0 | +2.0 |
| testability | 6.0 | 7.25 | +1.25 |
| clarity | 7.25 | 5.0 | -2.25 |
| traceability | 9.75 | 8.25 | -1.5 |
| moyenne | 7.0 | 6.875 | -0.125 |
Régression apparente de -0.125 mais :
- completeness a bondi de +2.0 (les 7 corrections E-01..E-07 ont frappé juste — c'est le critère qui bloquait c3v1)
- clarity a chuté de -2.25 à cause du bloquant B-E04 (unset CLAUDECODE) qui est un seul point corrigeable en 3 lignes
- traceability a chuté de -1.5 (rotation clé sans lock concurrent, tmutil)
Sans le bloquant B-E04, le score clarity serait 7.0 (10 − 2×1 − 4×0.25 = 7.0), la moyenne serait 7.375 → RESERVE.
5. Verdict déterministe¶
Scores : completeness=7.0, testability=7.25, clarity=5.0, traceability=8.25, moyenne=6.875.
Application stricte de la grille :
-
Au moins un score < 6 ? Oui (clarity 5.0) → NON_CONFORME
-
GO
- RESERVE
- NON_CONFORME — 1 vrai bloquant (B-E04 unset CLAUDECODE régression learning universel), 6 vrais majeurs, ~15 mineurs. Le bloquant est une correction triviale (3 lignes dans INV-295-RUNTIME-01).
- ESCALADE
6. Pronostic c3v3 (dernière itération cycle 3)¶
Si on corrige les 7-8 points :
- B-E04 unset CLAUDECODE : +2.0 clarity (retire le bloquant, +3 mineurs → 3 points)
- B-E02 FSM contradiction purge : +1.0 completeness
- E-06 timestamp_ntp_reference source NTP : +0.5 completeness
- E-09 lock rotate-audit-hmac anti-session : +1.0 traceability
- E-12 rwlock portée : +0.5 clarity
- E-20 V6 clé rotation : +0.5 clarity
- E-03 traçabilité ST↔TC : +0.5 testability
Projection c3v3 :
| Critère | c3v2 | c3v3 attendu |
|---|---|---|
| completeness | 7.0 | 8.5 |
| testability | 7.25 | 7.75 |
| clarity | 5.0 | 8.0 |
| traceability | 8.25 | 9.25 |
| moyenne | 6.875 | 8.375 |
→ Tous les scores ≥ 7.75, moyenne 8.375 : RESERVE (certains scores < 8 : testability 7.75). Probabilité GO si clarity atteint 8.0 et testability 8.0 : moyenne 8.5 → GO si completeness ≥ 8 et tous ≥ 8.
Ma recommandation : lancer immédiatement c3v3. C'est la dernière itération du cycle 3 (plafond Art. I), mais la correction est extrêmement ciblée (7 points, tous locaux, 1 bloquant trivial) et la projection RESERVE est solide.