[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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user