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