Aller au contenu

PD-295 — Rapport de confrontation (Étape 3)

Ce rapport est produit par l'orchestrateur Claude avant chaque gate PMO. Il confronte les documents produits pour identifier convergences, divergences et zones d'ombre.

1. Sources confrontées

  • PD-295-specification.md (cycle 2 v2, étape Spécification)
  • PD-295-tests.md (cycle 2 v2, étape Tests)

2. Convergences

  • Les deux documents convergent sur le périmètre contractuel B1..B5, le mode fail-closed et l’exclusion des changements de stack/hors-scope (Spec §1-2 ; Tests §1-2).
  • Le contrat B5 est cohérent: cardinalités fixes 5/3/3, calcul count_effective, drapeau under_corpus, et bloc EMPTY_BLOCK en échec de trace signée (Spec INV-295-10/11, §5.6, CA-295-07/08 ; Tests TC-NOM-08, TC-ERR-13, TC-NEG-15).
  • L’audit HMAC canonique JCS est aligné, y compris la validation des vecteurs V1..V8 (Spec INV-295-06..08, §5.14, CA-295-05 ; Tests TC-NOM-06, TC-NOM-06-bis, TC-ERR-11/12).
  • Le traitement B2 (résumé non-PII validé, rejet sans persistance si PO=non, isolation runtime) est convergent (Spec INV-295-01/03, INV-295-RUNTIME-01..03 ; Tests TC-NOM-02/03, TC-ERR-14, TC-RUNTIME-01..03).
  • Le scoring reuse_score (formule, arrondi 4 décimales, écrêtage 0.9999, interdiction 1.0000) est cohérent (Spec INV-295-13, §5.7, CA-295-09 ; Tests TC-NOM-07, TC-NOM-10, TC-NEG-05).
  • Les machines à états learning.scope et clarification.lifecycle_state sont globalement alignées, y compris les transitions interdites (Spec §5.9, INV-295-LS-01..12, INV-295-CL-01..08 ; Tests TC-NOM-11/12/13/14, TC-ERR-15, TC-NEG-06/07).
  • Les contraintes Gate 8 méta (measure-cs1..4.sh présents + exécutables) et la requalification post-merge de CA-295-16..19 sont convergentes (Spec INV-295-16, CA-295-15..19 ; Tests TC-NOM-17, TC-META-01..04, TC-NOM-18-A/B/C/D, §12).
  • L’absence d’artefacts DDL SQL est alignée (Spec §5.10, CA-295-20 ; Tests TC-NOM-19, TC-NR-08).

3. Divergences

⚠️ Les conflits ne doivent JAMAIS être lissés. Chaque divergence est rendue visible.

  • DIV-01 : Couverture annoncée de INV-295-STATE-04 non alignée avec le scénario testé.
  • Source A (spécification) : INV-295-STATE-04 impose une migration one-shot via scripts/sign-existing-state.py pour re-signer les entrées pré-B3 avant activation B3/B4/B5 (Spec INV-295-STATE-04, §5.4, §5.15).
  • Source B (tests) : TC-STATE-02 (référencé sur INV-295-STATE-04) exécute scripts/rotate-audit-hmac.sh et vérifie une rotation de clé N -> N+1, pas la migration one-shot pré-B3 (Tests §6, TC-STATE-02).
  • Impact : preuve de conformité de INV-295-STATE-04 incomplète; risque d’activation B3/B4/B5 sans validation explicite de la migration historique requise.

  • DIV-02 : Incohérence sur la forme attendue du payload runtime verbatim_subprocess_invoked.

  • Source A (spécification) : le vecteur contractuel V5 place story_id au niveau de l’événement, tandis que payload_canonique contient detail, duration_ms, subprocess_name, success (Spec §5.14, V5).
  • Source B (tests) : TC-RUNTIME-03 exige que le payload contienne {story_id, subprocess_name, duration_ms, success} (Tests §5, TC-RUNTIME-03).
  • Impact : risque de faux négatifs QA (implémentation conforme aux vecteurs mais non conforme au test, ou inversement).

  • DIV-03 : Chemin de script writer d’état signé non homogène.

  • Source A (spécification) : writer obligatoire scripts/lib/write-signed-state.py; écriture manuelle via scripts/write-signed-state.py (Spec INV-295-STATE-03, §5.15).
  • Source B (tests) : scripts ciblés listent lib/write-signed-state.py (sans préfixe scripts/) (Tests §1).
  • Impact : ambiguïté d’exécution/CI sur le binaire de référence; risque de test non exécutable ou pointant le mauvais chemin.

  • DIV-04 : Scénario de test hors contrat explicite de la spécification.

  • Source A (spécification) : aucune exigence explicite on_story_close avec statuts REJECTED/DONE_WITH_ANOMALY pour déclencher une purge (absence de ce hook/statuts dans invariants/flux/erreurs/CA).
  • Source B (tests) : TC-NOM-20 impose ce comportement (on_story_close purge dans les deux cas) (Tests §3).
  • Impact : extension implicite du scope côté tests; impossibilité d’arbitrer la conformité si le code suit strictement la spec sans implémenter ce hook.

4. Zones d'ombre

  • Q-295-01 reste ouvert: référence épique détaillée (ID Epic interne final) non explicitée dans les tests.
  • Q-295-02 reste ouvert: chemin de livraison final non consolidé entre les documents.
  • Q-295-05 reste ouvert: validation DPO de pii_ruleset_v1 non matérialisée en preuve dans les tests.
  • Q-295-06 reste ouvert: contenu final du bloc d’orchestration {{LEARNINGS}} non contracté dans les scénarios de test (les tests vérifient la structure et les compteurs, pas le contenu final attendu).
  • Le clearing MEMORY_DEGRADED -> MEMORY_HEALTHY après 2 cycles conformes est défini (Spec §5.12) et observable (Tests §11), mais aucun scénario dédié ne vérifie explicitement la transition de bout en bout.

5. Recommandation

  • Procéder — convergence confirmée, aucun conflit bloquant
  • Rework nécessaire — divergences à résoudre avant de continuer
  • Escalade — décision humaine requise sur un point structurant ```