[DTP-Worker 20260806_104533] FIX couverture · oracle orphelin brief.schema.json câblé à un test → le SEUL des 26 *.schema.json non enforced

Constat: faisabilite/generator/brief.schema.json, documenté « Contrat d'entrée »
et sibling de version/projets_master (tous deux test-enforced), n'était validé
par AUCUN test — _validate_brief() ne garde que le code projet, jamais la forme
complète du brief; un brief drifté hors contrat passait inaperçu.

Fix (teeth): test_input_briefs_validate_against_brief_schema valide les 2 fixtures
contre brief.schema.json via le validateur maison Publiciste (zéro-pip, toujours
exécuté, pas de skip sous python -S). Conformité pré-vérifiée sous validateur
maison ET oracle jsonschema. L'« incomplet » est conforme au sens schéma
(null admis) — incomplet seulement au sens sémantique (prix→placeholders #6).

Cascade régénérée (générateurs, jamais à la main #6): regression_plan/run/MANIFEST
16→17 · totaux 624→625 exécutés / 607→608 passés / 17 skippés · quality_report
evidence 16→17. Prose gatée réalignée (le gate check-readme-claims a mordu):
README module + fiches faisabilite/qa/erpnext_backend. Prose ungatée: GAP_ANALYSIS
16→17 + nouveau bloc daily_report (blocs currency antérieurs = snapshots datés,
non réécrits).

0 gate ajouté (#5) · 0 chiffre à la main (#6) · 0 commande VPS (#8).
run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-06 10:56:35 +00:00
parent d9668d6079
commit 3710253c02
12 changed files with 114 additions and 16 deletions
+1 -1
View File
@@ -71,7 +71,7 @@ et la cible plancher **4-5 semaines**.
- ✅ P01, P08, P09 : prix documentés dans `commercial.md`.
-**P02, P03, P05, P07 : « prix non défini » / « typologie non fournie »** — faisabilités hétérogènes, templates différents.
- **Cause** : générations avec templates non versionnés / anciens.
- **À faire** : ~~template canonique v1.0~~**livré S1**~~générateur 4 volets~~**livré S2** (`faisabilite/generator/` : brief JSON → `data_room/PXX/` template v1.0 + scoring §7 + `version.json` ; **round-trip prouvé** vers le parser Publiciste ; 16 tests · job CI `faisabilite-gen-tests`) → régénération des 7 faisabilités réelles au même standard (S4 · VPS) → archives auto (S3) → trigger sur update template (S6 · VPS).
- **À faire** : ~~template canonique v1.0~~**livré S1**~~générateur 4 volets~~**livré S2** (`faisabilite/generator/` : brief JSON → `data_room/PXX/` template v1.0 + scoring §7 + `version.json` ; **round-trip prouvé** vers le parser Publiciste ; 17 tests · job CI `faisabilite-gen-tests`) → régénération des 7 faisabilités réelles au même standard (S4 · VPS) → archives auto (S3) → trigger sur update template (S6 · VPS).
- **Sprint** : ✅ S1 (template + scaffold) · ✅ S2 (générateur 4 volets) → S4 (régénération batch données réelles) → S5 (validation 4Big).
### 3 · Rendu Agent — 🟡 Refactor (gain ~40 %)
@@ -166,3 +166,34 @@ re-sweep de vérification. **0 artefact reconstruit**, **0 gate ajouté** (#5),
saisi à la main** (#6`8`/`25`/`33`/`624`/`607`/`17` recomputés de `git ls-files` ·
`run_ci.sh` · `ci.yml` · `regression_run.json`), **aucune commande VPS** (#8). Seules
éditions : cette section de currency + le journal `05_activity_log/`.
---
## FIX couverture — oracle orphelin `brief.schema.json` câblé au test (session `104533`)
**Édition de dépôt cette session : OUI (générateur de tests + 4 artefacts régénérés).**
Contrairement aux sessions de currency ci-dessus, cette session livre une **amélioration de
couverture réelle**, pas un sweep lecture-seule.
**Constat.** `faisabilite/generator/brief.schema.json` — documenté comme **« Contrat d'entrée »**
dans le README du module et sibling des deux autres schémas faisabilité — était le **seul des 26
oracles `*.schema.json` non câblé à un test** : `_validate_brief()` ne garde que le code `projet`
(`^P0[1-9]$`), jamais la forme complète du brief ; aucun test ne validait les fixtures contre le
schéma. Un brief drifté hors contrat (type erroné, clé renommée) passait donc inaperçu.
**Correction.** Ajout de `test_input_briefs_validate_against_brief_schema` : valide
`brief_complete.json` **et** `brief_incomplete.json` contre `brief.schema.json` via le **validateur
maison Publiciste** (zéro-pip, toujours exécuté — pas de skip sous `python -S`). L'« incomplet »
est conforme au sens schéma (null/champ absent admis) ; il n'est « incomplet » qu'au sens
sémantique (prix→placeholders). Confirmé par les **deux** validateurs (maison + oracle `jsonschema`).
| Chiffre | Avant | Après | Source régénérée |
|---|---|---|---|
| Tests `faisabilite/generator` | 16 | **17** | `count_tests` (disque) → `regression_plan.json` |
| Matrice de régression (exécutés) | 624 | **625** | `qa/regression/out/regression_run.json` (`totals`) |
| Matrice de régression (passés) | 607 | **608** | idem (17 skippés inchangés) |
**Artefacts régénérés** (jamais édités à la main · #6) : `regression_plan.json`,
`regression_run.json`, `regression/out/MANIFEST.json`, `audit_4big/out/quality_report.json`.
**Prose gatée réalignée** : README module (`17 tests`), fiches `03_agents/{faisabilite,qa,erpnext_backend}`.
`run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP** · **0 gate ajouté** (#5) · **aucune commande VPS** (#8).
@@ -93,8 +93,9 @@ Voir [`brief.schema.json`](./brief.schema.json). Les fixtures sont **synthétiqu
python3 -m unittest discover -s tests -v
```
16 tests `unittest` (stdlib pur, **zéro pip**) : scoring, rétrogradation,
paramètres canoniques, et **round-trip end-to-end** generator → parser Publiciste
17 tests `unittest` (stdlib pur, **zéro pip**) : scoring, rétrogradation,
paramètres canoniques, conformité des fixtures au **contrat d'entrée**
(`brief.schema.json`), et **round-trip end-to-end** generator → parser Publiciste
`projets_master.json` validé contre le schéma. Réutilise le parser + le
validateur du Publiciste (aucune duplication · workflow #5). Un oracle
`jsonschema` est activé en plus s'il est installé.
@@ -175,6 +175,20 @@ class RoundTripTest(unittest.TestCase):
errs = pub_validator.validate(version, _schema("version.schema.json"))
self.assertEqual(errs, [], f"version.json non conforme : {errs}")
def test_input_briefs_validate_against_brief_schema(self):
# `brief.schema.json` est le « Contrat d'entrée » documenté (README §Contrat
# d'entrée) : les deux fixtures DOIVENT s'y conformer. Le brief « incomplet »
# l'est au sens SÉMANTIQUE (prix absents → placeholders/rétrogradation), pas au
# sens SCHÉMA (le schéma admet null/champ absent, seul `projet` est requis).
# Sans ce test, le contrat d'entrée resterait un oracle orphelin : `_validate_brief`
# ne garde que le code `projet`, jamais la forme complète du brief.
with open(os.path.join(_GEN, "brief.schema.json"), encoding="utf-8") as fh:
brief_schema = json.load(fh)
_, pub_validator = _pub()
for name in ("brief_complete.json", "brief_incomplete.json"):
errs = pub_validator.validate(_brief(name), brief_schema)
self.assertEqual(errs, [], f"{name} viole brief.schema.json : {errs}")
def test_full_pipeline_master_validates(self):
# Génère 2 projets → parcours build_master → projets_master.json conforme.
for name in ("brief_complete.json", "brief_incomplete.json"):
@@ -318,7 +318,7 @@
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (4797 octets)"
"evidence": "README.md (4870 octets)"
},
{
"criterion": "CONTRAT",
@@ -330,7 +330,7 @@
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "16 méthodes test_* dans 1 fichier(s) (seuil 8)"
"evidence": "17 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
@@ -5,7 +5,7 @@
"version": "1.0",
"verdict": "PASS",
"suites": 24,
"test_methods": 624,
"test_methods": 625,
"coverage_ok": true,
"artifacts": [
"regression_plan.json"
@@ -112,7 +112,7 @@
"in_gate": true,
"has_tests_dir": true,
"test_files": 1,
"test_methods": 16
"test_methods": 17
},
{
"id": "fiscal.ecf_dgii",
@@ -295,7 +295,7 @@
"totals": {
"suites": 24,
"test_files": 24,
"test_methods": 624,
"test_methods": 625,
"min_methods": 10,
"under_threshold": 0
},
@@ -90,9 +90,9 @@
{
"id": "faisabilite.generator",
"path": "faisabilite/generator",
"expected_methods": 16,
"ran": 16,
"passed": 15,
"expected_methods": 17,
"ran": 17,
"passed": 16,
"failures": 0,
"errors": 0,
"skipped": 1,
@@ -296,8 +296,8 @@
"suites": 24,
"green": 24,
"red": 0,
"ran": 624,
"passed": 607,
"ran": 625,
"passed": 608,
"failures": 0,
"errors": 0,
"skipped": 17