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