[DTP-Worker] Sprint 8 · buffer L75 · Traçabilité non vérifiée : les n° de ligne roadmap_line de la matrice d'acceptation pouvaient pointer à côté en silence (roadmap éditée) → INV11 ancrage roadmap (dérive 8+7 du fichier · #6) + parse_roadmap_anchors + 6 tests ; régénéré 558→564

INV10 ne garantissait que « roadmap_line est un entier positif ». Ajout de
parse_roadmap_anchors (deps) qui DÉRIVE la structure réelle de la roadmap, et
d'INV11 qui exige que chaque roadmap_line pointe RÉELLEMENT son bullet
(DELIVERABLE du sprint SX · k-ième bullet métrique) et que le « 8 + 7 » soit
dérivé du fichier, pas figé. Morsure prouvée sur le spec réel (S1=999, M3=200).
Régénéré consommateurs : regression 558→564 (run/plan/MANIFEST), quality_report
(acceptance 31→37 méthodes, 100/100 inchangé), fiches QA + Backend, README
acceptance (10→11 invariants). 7 gates verts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-31 06:12:15 +00:00
parent 11f1250b29
commit 25541c365d
11 changed files with 273 additions and 22 deletions
+66
View File
@@ -667,3 +667,69 @@ l'artefact.
**Hors périmètre worker (VPS · #8)** : néant (docs + gate bash/stdlib en-repo).
**Auto-score 4Big** : 96/100.
---
## Session `20260731_060012` · Buffer S8 · Traçabilité NON vérifiée : les n° de ligne `roadmap_line` de la matrice d'acceptation pouvaient pointer à côté en silence
**Tâche** : **Sprint 8 · buffer L75 (« Regression tests exhaustifs »)** — roadmap
fonctionnellement close (22/22 modules gated · 558 tests · 7 gates verts au démarrage).
Recherche d'un **défaut réel** (traçabilité `CLAUDE.md` #6) plutôt qu'un cosmétique.
### Défaut trouvé — `qa/acceptance` : `roadmap_line` déclaré, jamais ancré
- **Symptôme** : chaque promesse de `acceptance_spec.json` (8 livrables S1..S8 + 7
métriques M1..M7) porte un `roadmap_line` (33, 39, … 87) censé pointer son bullet
dans `04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md`. Le docstring promet des « CITATIONS
verbatim de la roadmap » (#6), mais le **seul** invariant (INV10) ne vérifiait que
« `roadmap_line` est un entier positif ».
- **Contradiction** : si la roadmap est éditée (une ligne insérée/retirée, un sprint
ré-ordonné), **tous** les `roadmap_line` se décalent en silence — ils pointeraient un
bullet qui n'existe plus, tout en restant « vert ». Même classe de « vert trompeur »
que les compteurs périmés (534→551→558) ou l'`orphan_tests_dirs`, appliquée cette
fois à une **référence de ligne** (traçabilité déclarée mais non prouvée).
- **Vérif (#1 analyser)** : recomputé la structure réelle → 8 bullets `**DELIVERABLE**`
(S1@33 … S8@76) + 7 bullets métrique `- ✅` (81..87). Les `roadmap_line` du spec sont
**exacts aujourd'hui** — la faille est l'absence de garde, pas une valeur fausse.
### Fix (2 volets · vérifier + garder)
1. **`acclib/deps.py`** — nouveau `parse_roadmap_anchors(roadmap_ref)` qui **DÉRIVE**
la structure de la roadmap (jamais une liste de n° saisie · #6) : `{SX → ligne du
DELIVERABLE}` (SX **lu** dans le titre `## SPRINT n · SX (…`) + lignes ordonnées des
bullets métrique. `OSError` honnête si la roadmap est absente (référence fantôme = red).
2. **`acceptance_gen.py` · INV11 (ancrage roadmap)** — exige que (a) le nombre de bullets
DELIVERABLE == nb de livrables du spec et nb de bullets métrique == nb de métriques
(le **« 8 + 7 » devient dérivé du fichier**, plus un compte figé), (b) chaque livrable
SX pointe le DELIVERABLE de SX, (c) chaque métrique (dans l'ordre) pointe le k-ième
bullet `- ✅`. Docstring #6 mis à jour (« n° de ligne VÉRIFIÉ, pas déclaré »).
3. **Tests** — fixture roadmap **synthétique** (temp file, mêmes motifs en miniature :
S2@L3, S3@L5, M1@L7) pour contrôler l'écart injecté ; classe `TestRoadmapAnchor`
(+6 méthodes) : parse réel (8+7), DELIVERABLE désancré, métrique décalée, mauvais
propriétaire de sprint, compte en trop, roadmap absente. **37 méthodes** (31→37).
### Preuves
- **Passe** : build/validate réel **vert** ; `parse_roadmap_anchors` réel = {S1:33 …
S8:76} + métriques [81..87] ; les 15 `roadmap_line` du spec **matchent**.
- **Morsure (spec RÉEL)** : `S1.roadmap_line=999` ⇒ `roadmap: S1: … ne pointe pas le
DELIVERABLE de S1 (ligne 33)` ; `M3=200` ⇒ `… ≠ 3e bullet métrique (ligne 83)`.
**Régénération des consommateurs (mémoire projet)** : +6 méthodes test dans
`qa/acceptance` → matrice **558→564** (22 suites inchangées). Régénérés :
`qa/regression/out/{regression_run,regression_plan,MANIFEST}.json` (564/564 · PASS),
`qa/audit_4big/out/quality_report.json` (evidence acceptance « 31→37 méthodes », score
**100/100 inchangé**), fiches **QA** et **Backend** (`558→564`, gate `check_readme_claims`
vert), README acceptance (« 10→11 invariants »). L'artefact `acceptance_matrix.json` est
**byte-identique** (INV11 ne change que la validation, pas la sortie).
**Vérifs** : **7 gates** locaux verts (`guard_constraints` · `validate_json` ·
`check_docs` · `check_artifacts` · `check_regression` · `check_ci_integrity` ·
`check_readme_claims`) ; matrice **564/22 · PASS** ; 22/22 modules **100/100**.
**Anti-invention (#6)** : rien inventé — INV11 **dérive** la vérité de la roadmap et
compare ; le « 8 + 7 » cesse d'être un compte à la main.
**Hors périmètre worker (VPS · #8)** : néant (stdlib pur en-repo).
**Auto-score 4Big** : 96/100.