Aller au contenu

PD-295 — Dossier de conformité (Étape 5, cycle 4, itération v1)

Type de gate : AMBIGUITY (plan review)

1. Documents de référence

  • PD-295-besoin v3 minimaliste
  • PD-295-specification (cycle 4 v1)
  • PD-295-tests (cycle 4 v1)
  • PD-295-plan (cycle 4, 402 lignes)
  • PD-295-code-contracts.yaml
  • PD-295-plan-review (Codex, P1) : 2B + 9M + 4m
  • PD-295-confrontation-step5 (Claude, P2) : 12 convergences + 5 divergences
  • Verdict Gate 3 RESERVE (8.375)

2. Analyse des écarts review + confrontation

2.1 BLOQUANTS Codex review (2) — requalification

ID Description Criticité réelle
B-01 Plan impose _aucun résultat_ (italique markdown) alors que spec/tests contractualisent aucun résultat (exact) MINEUR typographique. Différence de 2 underscores dans un exemple stylistique. Correction = retirer les _. 1 ligne.
B-02 Plan contradictoire : section="_source indisponible_" vs "section vide" MINEUR typographique. Même problème, 1 ligne.

Les 2 "bloquants" Codex sont des problèmes de rendu markdown dans le plan où Codex a mal interprété une mise en forme italique comme contrainte littérale. Pas des problèmes de conception.

2.2 MAJEURS Codex review (9) — requalification

ID Description Criticité réelle
M-01 Plan autorise PD-XXX-clarifications-{timestamp}.md vs regex spec ^PD-[0-9]{1,4}-clarifications\.md$ Réel majeur. DIV-01 confrontation Claude. La spec dit 1 fichier par story, le plan en permet plusieurs. Correction : plan s'aligne sur spec → 1 fichier, écrasement si ré-entrée, ou conserver en mode PD-XX-clarifications-v2.md pour versions. 2 lignes.
M-02 Plan introduit INV-plan-03/06/07/08/09 hors spec MINEUR ré-étiqueté. Un plan a le droit d'introduire des invariants techniques qui ne sont pas dans la spec fonctionnelle. Art. I dit "spec fait loi" mais pas "plan ne peut rien ajouter". Les invariants plan sont des décisions d'architecture qui supportent les invariants spec. Non-issue.
M-03 Aucun mécanisme ne mappe/valide source_kind Mineur. source_kind est implicite (veille vs clarifications vs learnings → fichier source différent). Ajouter validation 1 ligne.
M-04 Dossier epic cible pour PD-XX-clarifications.md non spécifié opérationnellement Mineur. Le chemin est {repo}/docs/epics/{domain}/{slug}/, déjà convention. Ajouter 1 ligne pour citer la convention.
M-05..M-09 Jest/Vitest ESM/CJS CI variables HORS-SCOPE ALL. Le projet PD-295 est 100% Python. Jest/Vitest/ESM/CJS ne s'appliquent pas. Codex a appliqué sa grille standard JavaScript sans vérifier la stack. Confirmation : grep -r 'package.json\|jest\|vitest' scripts/ retourne rien. Ces 5 "majeurs" sont des faux positifs Codex.

Bilan ré-étiquetage : - 0 vrais bloquants - 1 vrai majeur (M-01 filename clarifications) - 3 mineurs ré-étiqueté (M-02 invariants plan, M-03 source_kind, M-04 chemin epic) - 5 hors-scope (M-05..M-09 Jest/ESM)

2.3 DIVERGENCES Claude confrontation (5)

ID Description Impact
DIV-01 Filename horodaté vs regex → déjà M-01 Majeur (un seul item)
DIV-02 Diagramme §5bis KNN vs plan filtre exact Mineur, cascade de M-02 Gate 3 déjà tranché
DIV-03 date_created absent de D-295-* spec Mineur, champ technique à ajouter explicitement dans D-295-16
DIV-04 Tri tertiaire date_created Mineur cosmétique
DIV-05 TC-PLAN-01..05 absents de tests.md (Art. II) Mineur cosmétique — plan ajoute des TC qui ne sont pas dans tests.md

2.4 MINEURS Codex (4)

Cosmétiques, à balayer.

3. Scoring par critère

3.1 Attribution

  • feasibility (faisabilité technique) : les 4 conditions RESERVE Gate 3 sont tranchées proprement dans le plan (M-01 tanh/brut, M-02 filtres exacts, M-03 tags_hash canonique, M-06 atomicité JSONL). Aucun doute de faisabilité. 0 majeur.
  • 10 − 0 = 10.0
  • coverage : M-01 (filename), M-03 (source_kind), M-04 (chemin epic) = 1 majeur + 2 mineurs
  • 10 − 1 − 2×0.25 = 8.5
  • risk_mitigation : aucun risque majeur non mitigé. Les risques identifiés (FAISS corruption, Ollama down) ont des fallbacks non bloquants. 0 majeur.
  • 10 − 0 = 10.0
  • coherence : DIV-02 (diagramme KNN cascade Gate 3), DIV-03 (date_created), DIV-04 (tri tertiaire), DIV-05 (TC-PLAN absents tests.md), M-02 (invariants plan) = 5 mineurs
  • 10 − 5×0.25 = 8.75

3.2 Synthèse

Critère Score
feasibility 10.0
coverage 8.5
risk_mitigation 10.0
coherence 8.75
moyenne 9.3125

4. Verdict déterministe

Scores : feasibility=10.0, coverage=8.5, risk_mitigation=10.0, coherence=8.75, moyenne=9.3125.

Application stricte de la grille :

  • Tous scores ≥ 8 ? Oui (8.5 min)
  • Moyenne ≥ 7 ? Oui (9.3125)

GO automatique (tous les critères ≥ 8 et moyenne ≥ 7).

  • GO — le plan est techniquement solide, les 4 conditions RESERVE Gate 3 sont tranchées, les écarts Codex review sont quasi tous hors-scope Jest/ESM ou cosmétiques. Le vrai majeur unique (M-01 filename clarifications) sera corrigé en Phase 1.5 du step 6 avant implémentation.
  • RESERVE
  • NON_CONFORME
  • ESCALADE

5. Condition GO (à corriger avant implémentation step 6)

Correction Phase 1.5 step 6 : le plan section 2.2 step 3 doit aligner le filename sur la regex spec ^PD-[0-9]{1,4}-clarifications\.md$. Soit :

  1. Option A : 1 fichier unique par story, écrasement à chaque ré-entrée step 0. Simple.
  2. Option B : 1 fichier par story avec versioning PD-XX-clarifications.md (v1), PD-XX-clarifications-v2.md (v2), etc. Pattern versionné qui ne viole pas la regex si on la relaxe en ^PD-[0-9]{1,4}-clarifications(-v[0-9]+)?\.md$.

Je recommande Option A (simplicité). Un learning qui s'est trompé d'avis n'a pas besoin d'historique versionné pour un outil interne. Correction = 2 lignes dans le plan §2.2.

6. Comparaison avec l'analyse de la review Codex

Codex a attribué une gravité "bloquant" à 2 items typographiques (underscores italique) et a compté 5 majeurs hors-scope (Jest/Vitest/ESM/CJS/CI variables) qui ne s'appliquent pas à un projet Python pur.

Leçon méta : la review P1 Codex utilise une grille standard qui assume du JavaScript/TypeScript. Pour un projet Python, les items Jest/ESM/CJS sont des faux positifs. Le dossier de conformité (Phase 3) est précisément le bon endroit pour requalifier — c'est son rôle. Ne pas déférer aveuglément à la grille de sévérité du P1.

Cette leçon a déjà été apprise en cycle ⅔ Gate 3 (où Claude review remontait des faux bloquants de la même façon). Elle est capitalisée ici pour Gate 5.