Aller au contenu

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_ruleset dépendance Q-295-05 (E-07, mineur), timestamp_ntp_reference non 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.375RESERVE.

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.