PD-295 — Rapport de confrontation (Gate 5 — Plan)¶
Ce rapport est produit par l'orchestrateur Claude avant Gate 5 PMO. Il confronte spécification, tests, plan et code-contracts afin d'identifier convergences, divergences et zones d'ombre.
1. Sources confrontées¶
- Spécification :
PD-295-specification.md(étape 1, version canonique contractuelle) - Tests :
PD-295-tests.md(étape 2, matrice de couverture INV/CA/TC) - Plan :
PD-295-plan.md(étape 4, résout 4 réserves Gate 3 : M-01/M-02/M-03/M-06) - Code contracts :
PD-295-code-contracts.yaml(étape 4, 9 modules, invariants cross-module)
2. Convergences¶
- CV-01 — Formule
reuse_score(INV-295-05) : spec §4, tests TC-NOM-05 (scores 1.0 et 1.8), plan §2.3 et code-contractsscoring.invariantsconvergent sur la somme pondérée brute0.4*nb_injections + 0.4*nb_stories_gate8_go + 0.2*nb_domains_distincts. Coefficients hardcodés, pas de normalisation. Les bornes D-295-08[0.0000..999999.9999]confirment que la valeur n'est pas un ratio. - CV-02 — Seuils de promotion (INV-295-09/10) : spec 0.3 / 0.6 appliqués à la somme brute, tests TC-NOM-09 (bornes 0.29/0.30 et 0.59/0.60), plan §2.4 step 2, code-contracts
lifecycle.invariants: alignement strict. - CV-03 — Éviction conjonctive (INV-295-11) :
age > 56j ET nb_injections == 0. Convergence spec §4 / tests TC-NOM-10 matrix 4 cas / plan §2.4 step 3 / code-contractslifecycle. - CV-04 — FSM scope :
ALLOWED_TRANSITIONSidentiques entre spec §5.9, tests TC-NOM-16 + TC-ERR-07 + TC-ERR-11, plan §2.4 step 4, code-contractslifecycle.ARCHIVEDterminal, aucun downgrade. - CV-05 — Bloc injection 3 sections, cardinalités max 5/3/3 (INV-295-13) : convergence entre spec §5.8, tests TC-NOM-12, plan §2.5 step 5 et code-contracts
injection.invariants. Note : spec parle de « cardinalités cibles », tests et plan interprètent uniformément commemax(cf. Écart 8 plan). - CV-06 — Mode dégradé non bloquant (INV-295-14/15) :
_aucun résultat_si 0 hit ; section vide + stderr si exception ; step 0 jamais bloqué. Convergence spec §5.8, tests TC-NOM-13/14 + TC-ERR-04/05/06/09, plan §2.5 step 6, code-contractsinjection.invariants(exit 0garanti). - CV-07 — Scan veille (INV-295-01) : motif
ProbatioVault-doc/docs/veille/**/*.md, robustesse partry/exceptfichier par fichier, fiches invalides ignorées + stderr. Convergence 4/4. - CV-08 — Stack contractuelle (CA-295-17) : Python, FAISS (
IndexFlatIP), Ollamanomic-embed-text768 dim, Markdown + YAML. Tests TC-NOM-15 + TC-NR-03. Pas de Swift/Spring. Convergence. - CV-09 — Exclusions maintenues (INV-295-16) : HMAC, Vault, JCS, PII filter, purge RGPD, rate-limit, reranker, BM25, knowledge graph restent hors périmètre. Convergence spec §2, tests TC-NR-04, plan §10, code-contracts (aucun module crypto/secret).
- CV-10 — Atomicité JSONL renforcée (M-06) : plan introduit
jsonl_atomicet le contractualise dans code-contractsjsonl-atomicet cross-moduleM-06-resolution. Pas dans la spec d'origine mais compatible (renforcement défensif, zéro régression fonctionnelle). - CV-11 — Canonicalisation
tags_hash(M-03) : fonction uniquecompute_tags_hash()(NFC+lower+#+dedup+sort+sha256). Convergence plan §2.6 / code-contractsdata-format/ INV-plan-03. Cohérent avec D-295-06 regex^[a-f0-9]{64}$. - CV-12 — Aucune exigence de performance : spec §5.2 colonne percentile
n/a, plan §5 confirme hors scope. Convergence.
3. Divergences¶
⚠️ Conflits rendus visibles. Aucun lissage.
- DIV-01 — Nommage des fichiers clarifications (ré-entrée step 0) (MAJEUR)
- Spec :
D-295-15imposeclarification_filenameregex^PD-[0-9]{1,4}-clarifications\.md$(taille 24..31). TestsTC-NEG-04refuse toute persistance sur filename invalide. - Plan §2.2 step 3 : en cas de ré-entrée step 0, création d'un fichier horodaté
PD-XXX-clarifications-{YYYY-MM-DD-HHMMSS}.md. Code-contractsclarifications-store.invariantsétend la regex à^PD-[0-9]{1,4}-clarifications(-[0-9]{8}-[0-9]{6})?\.md$. - Conflit direct : le filename horodaté viole D-295-15 tel que contractualisé. TC-NEG-04, appliqué strictement, rejettera la persistance produite par le plan. Le plan modifie unilatéralement un contrat spec immuable (Art. I §Immuabilité).
-
Impact : non-régression impossible à faire passer en Gate 8 sans soit amendement spec, soit renoncement à la ré-entrée horodatée (écrasement ou refus). À trancher avant implémentation.
-
DIV-02 — Recherche clarifications : KNN vs filtre exact (MODÉRÉ)
- Spec §5bis diagramme de séquence :
CLR → OLL embed(domain+project) → FAI knn_search(embedding, 3). Le diagramme est normatif (section 5bis obligatoire). - Spec §5.5 : « Exposition recherche
/clarificationsavec filtres--domainet--project». Ambigu : filtres exacts ou filtres post-KNN. - Plan M-02 / §2.5 step 4 / code-contracts
clarifications-store.search_clarifications_exact: filtre exact strict sur{domain, project}+ tridateDESC. Pas d'appel Ollama pour cette section. Argumenté comme « diagramme stylisé, H-02 ». - Conflit : le diagramme §5bis décrit un KNN explicite, le plan opte pour un filtre exact. Le plan reconnaît l'écart mais construit quand même un index FAISS clarifications (dette §9 plan « à brancher ou supprimer »).
-
Impact : tests existants
TC-NOM-04(CA-295-04 « search retrouve la clarification ») etTC-NOM-13(0 hit) ne départagent pas les deux approches ; aucun test ne vérifie actuellement qu'un filtre non-exact serait refusé ou qu'un KNN retournerait des hits hors{domain,project}. À arbitrer par le PMO : soit amender la spec §5bis, soit supprimer le filtre exact. -
DIV-03 — Base de calcul de l'âge pour éviction (MODÉRÉ)
- Spec : seul
D-295-12 date(ISO) est défini dans le modèle de données. Aucun champdate_createdn'existe au contrat. - Plan §2.4 step 3 + H-03 + INV-plan-09 : éviction calculée sur
date_created(champ « persisté par gov-compounder »), avec fallback surD-295-12 datesi absent. Code-contractslifecyclereprend cette règle. - Conflit : le plan introduit un nouveau champ non couvert par §5.1 D-295-*. Les tests
TC-NOM-10fournissent directementage=Xjsans préciser la colonne source, donc ils ne tranchent pas — mais un learning historique sansdate_createdtombera systématiquement sur le fallback, ce qui équivaut à utiliserdatepour tous → alors pourquoi introduiredate_created? Dette contractuelle injustifiée ou spec incomplète. -
Impact : ambiguïté opérationnelle sur le champ réel utilisé. Peut provoquer des évictions divergentes selon la version de
gov-compounderqui a écrit la ligne. À résoudre : soit ajouterdate_createdau modèle §5.1 D-295-*, soit statuer « base = D-295-12date, point ». -
DIV-04 — Tri tertiaire sur
date_created(MINEUR) - Spec : INV-295-07 impose uniquement un tri secondaire par
reuse_score. Aucun tri tertiaire spécifié.Q-295-03liste explicitement le tie-break comme point à clarifier. - Plan §2.5 step 2 + INV-plan-08 + code-contracts
injection: tri(similarité DESC, reuse_score DESC, date_created DESC)ajouté comme invariant de plan (TC-PLAN-05). - Conflit : le plan tranche Q-295-03 unilatéralement via un champ qui lui-même est litigieux (cf. DIV-03). La spec dit « à clarifier », le plan dit « clarifié ».
-
Impact : acceptable si PMO valide le choix, mais la bonne voie est d'amender la spec et d'ajouter
date_createdà D-295-*. Tests TC-PLAN-05 seul le couvre — non présent dansPD-295-tests.mdofficiel. -
DIV-05 — Tests de plan introduits hors
PD-295-tests.md(MINEUR) - Plan §5 liste 5 tests nouveaux
TC-PLAN-01..05qui couvrent M-03, M-06, Écarts 9/11/13. - Tests : le document
PD-295-tests.mdne contient aucunTC-PLAN-*. La matrice de couverture §2 ne référence pas ces tests. - Conflit : invariants de plan
INV-plan-03/06/07/08/09sans cible de test dans le document tests officiel. Rupture Art. II (séparation auteur/évaluateur) si c'est l'agent d'implémentation qui crée ses propres tests. - Impact : exige soit un amendement à
PD-295-tests.md(par l'agent tests, pas Claude), soit une note explicite Gate 5 « ces tests seront ajoutés en step 2-bis ».
4. Zones d'ombre¶
- ZO-01 — Champ
date_created: origine, format, producteur (gov-compounder ?), compatibilité rétrograde avec corpus existant. Pas mentionné en spec §5.1, seulement en plan H-03. - ZO-02 — Index FAISS clarifications construit mais non utilisé : si DIV-02 est tranché en faveur du filtre exact, l'index FAISS
data/clarifications-index.faissdevient dette morte dès livraison (plan §9 l'admet). Aucune décision sur sa suppression. - ZO-03 — Enum exacte de
D-295-04 project: spec déclare « Enum 2..32 », sans lister les valeurs. Tests§9 Règles non testablesle flaggent « majeur ». Plan §10 admet « traité comme string best-effort, dette ». Aucun des 4 documents ne tranche. - ZO-04 — Baseline CS-1 : fenêtre historique de comparaison non définie (Q-295-02). Plan §10 confirme hors scope. Mesure non reproductible tant que cette fenêtre n'est pas fixée.
- ZO-05 — Validation des champs veille
title/summary: spec §5.1 ne les liste pas dans D-295-*, plan H-04 les valide « best-effort » (longueur 256/2000, pas de regex). Si Gate 5 exige regex stricte, plan à revoir. - ZO-06 — Tie-break triple égalité : plan admet en §10 « non déterministe au-delà de l'ordre stable Python ». Spec ne statue pas. Acceptable si documenté en Gate 5.
- ZO-07 — Écriture concurrente multi-process : spec H-295-01 pose « mono-instance ». Plan §2.7 INV-plan-06 fournit une défense
jsonl_atomicmais H-07 rappelle « aucune garantie hors mono-instance ». Bonne posture défensive, mais pas de test adversarial multi-writer validé. - ZO-08 — Épic parent :
Q-295-01toujours ouvert (champ « Référence épique » vide dans spec §11). Aucun des 3 autres documents ne le renseigne.
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
Raison : DIV-01 est un conflit direct entre le plan et un invariant contractuel de la spec (D-295-15) doublé d'un test négatif existant (TC-NEG-04). Il bloque l'implémentation telle que proposée. DIV-02 et DIV-03 modifient des éléments de contrat (séquence §5bis, modèle de données §5.1) sans amendement spec/tests correspondant, en violation de l'Art. I §Immuabilité. DIV-04/DIV-05 sont des dettes de cohérence qui doivent être transférées soit en spec, soit en test officiel.
Actions proposées au PMO Gate 5 (aucune ne relève du rôle confrontation — simple visibilité) :
- Trancher DIV-01 : autoriser un amendement spec pour régex filename horodaté, ou retirer la ré-entrée du plan et retomber sur écrasement/refus.
- Trancher DIV-02 : confirmer filtre exact et supprimer le diagramme §5bis CLR→OLL→FAI, ou revenir au KNN côté plan.
- Trancher DIV-03 / ZO-01 : ajouter officiellement
date_createdà §5.1 D-295-*, ou figer le calcul d'âge surD-295-12 date. - Rapatrier les tests
TC-PLAN-01..05dansPD-295-tests.md(step 2 amendement) pour préserver Art. II. - Documenter les zones d'ombre ZO-02..ZO-08 comme dettes explicitement acceptées au Gate 5 ou les déplacer en §10 points à clarifier de la spec.