[DTP-Worker 20260805_064201] FIX RÉEL : fenêtre de sprint roadmap-globale de faisabilite/generator corrigée S2→S3

Défaut (1re vraie édition de prod après plusieurs sessions de sondes « 0 édition ») :
quality_spec.json:66 attribuait au générateur de faisabilité 4 volets la fenêtre roadmap
« S2 » avec un source falsifiable-faux (« roadmap Sprint 2 · Faisabilité… »), alors que la
roadmap n'a AUCUNE faisabilité au Sprint 2 (Console/CRM/RBAC) et place « génération 4 volets »
au Sprint 3 (L43, livrable L46 « P07 faisabilité complète auto-générée »). Cause racine :
confusion de 2 cadres de sprint — le label agent-interne « S2 » (AGENT.md §130-133 : phases
S1 template/S2 générateur/S3 versioning, toutes ancrées roadmap Sprint 3) recopié dans le
champ roadmap-global (seul quality_spec le porte, toutes ses entrées sourcent « roadmap
Sprint N »). Effet : le livrable-phare S3 était prouvé SANS son propre générateur, ce dernier
mal-classé comme preuve du S2 (dashboards/CRM/RBAC) sans rapport.

Correctif coordonné 2-spec + régénération byte-gatée :
- quality_spec.json:66 : sprint S2→S3 + source recitée « roadmap Sprint 3 » (style aligné sur
  le jumeau bancable, déjà S3).
- acceptance_spec.json : generator retiré de evidence_modules S2, ajouté à S3
  (sinon invariant 5 « partition exacte » casse : want lu dans quality_spec ≠ have déclaré).
- régénération audit_4big PUIS acceptance (lit la fenêtre depuis quality_spec).

Vérif : partition_ok=True · bijective=True · S2=6 (publiciste+5 rbac) · S3={bancable,generator}
· run_ci 33 PASS · score 4Big générateur inchangé 100/100 (le champ sprint ne sert qu'au tri+méta,
pas d'oracle de scoring). Portée honnête : 5 fichiers (2 specs + 3 artefacts régénérés) + log.
0 doc de module éditée (les ~10 « S2 » ailleurs = cadre agent-interne, corrects, #5) · daily_reports
= historique non réécrit · 0 gate ajouté (déjà gaté par inv5) · 0 chiffre inventé (#6) · 0 VPS (#8).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-05 06:56:32 +00:00
parent 40ddab05af
commit caa3b90556
6 changed files with 103 additions and 51 deletions
+53
View File
@@ -629,3 +629,56 @@ pour que la prochaine session ne rejoue pas ce sweep à froid ni ne re-flague ce
log ; aucun fichier de code gaté). **0 chiffre inventé (#6) · faux positifs backtick écartés log ; aucun fichier de code gaté). **0 chiffre inventé (#6) · faux positifs backtick écartés
par résolution multi-ancre + inspection · 0 édition de production · 0 gate ajouté (#5) · par résolution multi-ancre + inspection · 0 édition de production · 0 gate ajouté (#5) ·
aucune commande VPS (#8) · aucun `git clean`.** <!-- ci-allow : mention de l'interdit, jamais exécuté --> aucune commande VPS (#8) · aucun `git clean`.** <!-- ci-allow : mention de l'interdit, jamais exécuté -->
---
## Session 20260805_064201 · FIX RÉEL — la fenêtre de sprint *roadmap-globale* de `faisabilite/generator` était fausse (S2 → S3)
**Défaut trouvé (première vraie édition de production depuis plusieurs sessions de sondes « 0 édition »).**
Le registre de l'auditeur 4Big attribuait au **générateur de faisabilité 4 volets** une fenêtre
de sprint **roadmap-globale erronée** :
- `05_deliverables_mvp/qa/audit_4big/quality_spec.json:66`
`"sprint": "S2"`, `"source": "roadmap Sprint 2 · Faisabilité générateur 4 volets …"`.
Or la roadmap **ne contient AUCUNE faisabilité au Sprint 2** (`04_roadmap/…:35-39` = Console /
CRM / RBAC). La **« génération 4 volets <1h »** est explicitement au **Sprint 3**
(`…:43`, livrable `…:46` « P07 Aqua Terra faisabilité complète auto-générée »). La citation
`source` était donc **falsifiable et fausse** (classe [[prose-facts-vs-numeric-drift]] · sous-classe
*citation mal-attribuée* + [[roadmap-anchor-gate]]).
**Cause racine — confusion de deux cadres de « sprint ».**
1. **Cadre agent-interne** (phases de construction par agent) : `03_agents/faisabilite/AGENT.md`
§130-133 définit S1 = template · **S2 = générateur 4 volets** · S3 = version tracking — le tout
**ancré à la roadmap Sprint 3** (L41-46). Ce cadre est repris tel quel dans les docs de module
(`generator/README.md` H1 « Sprint 2 », `TEMPLATE_…:216`, `GAP_ANALYSIS_SPRINT1.md:74-75`,
`publiciste/README.md:26`, `daily_reports/*`). **Cohérent dans son cadre — laissé intact.**
2. **Cadre roadmap-global** (autorité de la recette) : le champ `sprint` de `quality_spec.json`
**toutes** les autres entrées le sourcent « roadmap Sprint N ». C'est le **seul** endroit qui
doit porter le sprint roadmap-global. Il avait recopié le label agent-interne « S2 ».
**Conséquence corrigée.** Le livrable-phare **S3** « P07 faisabilité complète auto-générée »
était prouvé **sans** le module qui la génère (`faisabilite/generator`), tandis que ce dernier
était compté comme preuve du **S2** (« 7 dashboards · CRM · RBAC ») — auquel il n'a **aucun**
rapport. La preuve la plus directe du livrable-phare était mal-classée.
**Correctif (édition coordonnée 2-spec + régénération byte-gatée).**
- `quality_spec.json:66` : `"sprint"` **S2 → S3**, `source` recitée « roadmap Sprint 3 · Faisabilité
générateur 4 volets → data_room/PXX » (aligné sur le style de son jumeau `bancable`, ligne 71,
déjà S3).
- `acceptance_spec.json` : `faisabilite/generator` **retiré** de `evidence_modules` S2, **ajouté**
à S3 (`["faisabilite/bancable", "faisabilite/generator"]`) — sinon l'**invariant 5 « partition
exacte »** casse (`want` lu dans `quality_spec``have` déclaré). Édition des DEUX specs
obligatoire et suffisante.
- Régénération : `audit_4big` (report) **puis** `acceptance` (lit la fenêtre depuis `quality_spec`).
**Vérifications.** `partition_ok=True · bijective=True` · S2 = 6 modules (publiciste + 5 rbac,
exact) · S3 = {bancable, generator} (exact). `./run_ci.sh`**33 PASS · 0 FAIL · 0 SKIP**.
Score 4Big du générateur **inchangé 100/100** (le champ `sprint` ne sert qu'au tri + méta du
report, pas d'oracle de scoring vérifié dans `q4lib/scoring.py`).
**Portée honnête / anti-churn.** **5 fichiers** touchés (2 specs + 3 artefacts régénérés) + ce log.
**Zéro** doc de module éditée : les ~10 « S2 » du générateur ailleurs sont le **cadre agent-interne**
(ancré Sprint 3), corrects — les churner serait de la dérive #5. `daily_reports/*` = historique,
non réécrit. **0 gate ajouté** (surface déjà gatée par invariant 5 · [[verify-uncovered-before-gating]]),
**0 chiffre inventé** (#6, tout dérivé du roadmap), **0 commande VPS** (#8), **aucun `git clean`**. <!-- ci-allow : mention de l'interdit, jamais exécuté -->
@@ -41,8 +41,7 @@
"rbac/fixtures_gen", "rbac/fixtures_gen",
"rbac/userperm_gen", "rbac/userperm_gen",
"rbac/roleprofile_gen", "rbac/roleprofile_gen",
"rbac/apply_plan", "rbac/apply_plan"
"faisabilite/generator"
], ],
"evidence_artifacts": [], "evidence_artifacts": [],
"out_of_scope": [ "out_of_scope": [
@@ -59,7 +58,7 @@
"roadmap_line": 46, "roadmap_line": 46,
"statement": "P07 Aqua Terra faisabilité complète auto-générée en <1h", "statement": "P07 Aqua Terra faisabilité complète auto-générée en <1h",
"status": "in_repo", "status": "in_repo",
"evidence_modules": ["faisabilite/bancable"], "evidence_modules": ["faisabilite/bancable", "faisabilite/generator"],
"evidence_artifacts": [], "evidence_artifacts": [],
"out_of_scope": [ "out_of_scope": [
{ {
@@ -33,7 +33,6 @@
{ {
"sprint": "S2", "sprint": "S2",
"expected": [ "expected": [
"faisabilite/generator",
"publiciste", "publiciste",
"rbac", "rbac",
"rbac/apply_plan", "rbac/apply_plan",
@@ -42,7 +41,6 @@
"rbac/userperm_gen" "rbac/userperm_gen"
], ],
"cited": [ "cited": [
"faisabilite/generator",
"publiciste", "publiciste",
"rbac", "rbac",
"rbac/apply_plan", "rbac/apply_plan",
@@ -57,10 +55,12 @@
{ {
"sprint": "S3", "sprint": "S3",
"expected": [ "expected": [
"faisabilite/bancable" "faisabilite/bancable",
"faisabilite/generator"
], ],
"cited": [ "cited": [
"faisabilite/bancable" "faisabilite/bancable",
"faisabilite/generator"
], ],
"missing": [], "missing": [],
"extra": [], "extra": [],
@@ -62,11 +62,6 @@
"module": "rbac/apply_plan", "module": "rbac/apply_plan",
"ci_job": "rbac-applyplan-tests", "ci_job": "rbac-applyplan-tests",
"gated": true "gated": true
},
{
"module": "faisabilite/generator",
"ci_job": "faisabilite-gen-tests",
"gated": true
} }
], ],
"artifacts": [], "artifacts": [],
@@ -76,7 +71,7 @@
"source": "CLAUDE.md #8 (VPS) · #1 (ERPNext natif = priorité — import via bench par agent Backend)" "source": "CLAUDE.md #8 (VPS) · #1 (ERPNext natif = priorité — import via bench par agent Backend)"
} }
], ],
"n_modules": 7, "n_modules": 6,
"all_modules_gated": true, "all_modules_gated": true,
"all_artifacts_exist": true, "all_artifacts_exist": true,
"has_evidence": true "has_evidence": true
@@ -93,6 +88,11 @@
"module": "faisabilite/bancable", "module": "faisabilite/bancable",
"ci_job": "bancable-tests", "ci_job": "bancable-tests",
"gated": true "gated": true
},
{
"module": "faisabilite/generator",
"ci_job": "faisabilite-gen-tests",
"gated": true
} }
], ],
"artifacts": [], "artifacts": [],
@@ -102,7 +102,7 @@
"source": "CLAUDE.md #8 (VPS) — le rendu 3D/BIM tourne hors repo (bim-cloud.otov7.com)" "source": "CLAUDE.md #8 (VPS) — le rendu 3D/BIM tourne hors repo (bim-cloud.otov7.com)"
} }
], ],
"n_modules": 1, "n_modules": 2,
"all_modules_gated": true, "all_modules_gated": true,
"all_artifacts_exist": true, "all_artifacts_exist": true,
"has_evidence": true "has_evidence": true
@@ -40,42 +40,6 @@
} }
], ],
"modules": [ "modules": [
{
"id": "faisabilite-generator",
"path": "faisabilite/generator",
"sprint": "S2",
"archetype": "data_room",
"applicable_weight": 80,
"earned_weight": 80,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (4797 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "brief.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "16 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "faisabilite_gen.py (argparse + __main__)"
}
]
},
{ {
"id": "publiciste", "id": "publiciste",
"path": "publiciste", "path": "publiciste",
@@ -340,6 +304,42 @@
} }
] ]
}, },
{
"id": "faisabilite-generator",
"path": "faisabilite/generator",
"sprint": "S3",
"archetype": "data_room",
"applicable_weight": 80,
"earned_weight": 80,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (4797 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "brief.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "16 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "faisabilite_gen.py (argparse + __main__)"
}
]
},
{ {
"id": "crm-commissions", "id": "crm-commissions",
"path": "crm/commissions", "path": "crm/commissions",
@@ -63,7 +63,7 @@
"modules": [ "modules": [
{ "id": "publiciste", "path": "publiciste", "sprint": "S2", "archetype": "parser", "source": "roadmap Sprint 2 · Publiciste (parser faisabilité → projets_master.json) · ci.yml publiciste-tests" }, { "id": "publiciste", "path": "publiciste", "sprint": "S2", "archetype": "parser", "source": "roadmap Sprint 2 · Publiciste (parser faisabilité → projets_master.json) · ci.yml publiciste-tests" },
{ "id": "rbac", "path": "rbac", "sprint": "S2", "archetype": "contract", "source": "roadmap Sprint 2 · RBAC 50 rôles (contrat rbac_50_roles.json) · ci.yml rbac-tests" }, { "id": "rbac", "path": "rbac", "sprint": "S2", "archetype": "contract", "source": "roadmap Sprint 2 · RBAC 50 rôles (contrat rbac_50_roles.json) · ci.yml rbac-tests" },
{ "id": "faisabilite-generator", "path": "faisabilite/generator", "sprint": "S2", "archetype": "data_room", "source": "roadmap Sprint 2 · Faisabilité générateur 4 volets → data_room/PXX · ci.yml faisabilite-gen-tests" }, { "id": "faisabilite-generator", "path": "faisabilite/generator", "sprint": "S3", "archetype": "data_room", "source": "roadmap Sprint 3 · Faisabilité générateur 4 volets → data_room/PXX · ci.yml faisabilite-gen-tests" },
{ "id": "rbac-fixtures", "path": "rbac/fixtures_gen", "sprint": "S2", "archetype": "generator", "source": "roadmap Sprint 2 · fixtures Role + Custom DocPerm · ci.yml rbac-fixtures-tests" }, { "id": "rbac-fixtures", "path": "rbac/fixtures_gen", "sprint": "S2", "archetype": "generator", "source": "roadmap Sprint 2 · fixtures Role + Custom DocPerm · ci.yml rbac-fixtures-tests" },
{ "id": "rbac-userperm", "path": "rbac/userperm_gen", "sprint": "S2", "archetype": "generator", "source": "roadmap Sprint 2 · plan User Permission · ci.yml rbac-userperm-tests" }, { "id": "rbac-userperm", "path": "rbac/userperm_gen", "sprint": "S2", "archetype": "generator", "source": "roadmap Sprint 2 · plan User Permission · ci.yml rbac-userperm-tests" },
{ "id": "rbac-roleprofile", "path": "rbac/roleprofile_gen", "sprint": "S2", "archetype": "generator", "source": "roadmap Sprint 2 · Role Profile par portail · ci.yml rbac-roleprofile-tests" }, { "id": "rbac-roleprofile", "path": "rbac/roleprofile_gen", "sprint": "S2", "archetype": "generator", "source": "roadmap Sprint 2 · Role Profile par portail · ci.yml rbac-roleprofile-tests" },