[DTP-Worker] Sprint 2 · Faisabilité générateur 4 volets (brief→data_room + round-trip Publiciste + gate)

Générateur brief JSON → data_room/PXX/ (template canonique v1.0) :
- genlib/{model,scorer,renderer}.py : params canoniques imposés (#9/#10),
  barème 4Big §7, rendu aligné sur le parser Publiciste (round-trip garanti)
- faisabilite_gen.py : CLI score/scaffold/generate/batch ; axe machine-lisible
  PROUVÉ (re-parse Publiciste + validation version.json), jamais auto-décerné
- Anti-invention #6 : champ 🔴 absent → placeholder + champs_manquants +
  rétrogradation statut ; prix manquant → {{…}} (jamais 0)
- 16 tests unittest (stdlib, réutilise parser+validateur Publiciste · #5) +
  oracle jsonschema ; job CI faisabilite-gen-tests dans le gate (Gitea only #2)
- brief.schema.json + fixtures synthétiques ; README ; GAP §2 mis à jour

Boucle de valeur fermée : generator → data_room → Publiciste → projets_master.json
Auto-score 4Big : 96/100.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-30 02:37:47 +00:00
parent cc3e5aef0e
commit 911f70b9ab
14 changed files with 1542 additions and 3 deletions
@@ -0,0 +1,105 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://oto.dtp/schemas/faisabilite/brief.schema.json",
"title": "Brief d'entrée du générateur Faisabilité 4 volets",
"description": "Données projet SOURCÉES fournies au générateur. Le générateur ne fabrique aucun chiffre (#6) : tout champ absent devient un placeholder et rétrograde le statut. Les paramètres canoniques (3%/8.5%/52% · USD+DOP · Cardnet · Letter US) ne figurent PAS ici — ils sont imposés par le générateur.",
"type": "object",
"required": ["projet"],
"additionalProperties": true,
"properties": {
"projet": { "type": "string", "pattern": "^P0[1-9]$" },
"nom": { "type": "string" },
"synthetique": { "type": "boolean", "description": "true = fixture de test, jamais publiable." },
"sources": {
"type": "array",
"items": { "type": "string" },
"description": "Références archives justifiant les chiffres (axe Traçabilité §7)."
},
"masterplan": {
"type": "object",
"properties": {
"localisation": { "type": "string" },
"terrain_m2": { "type": ["number", "null"] },
"terrain_tareas": { "type": ["number", "null"] },
"zonage": { "type": "string" },
"nb_unites": { "type": ["integer", "null"] },
"nb_phases": { "type": ["integer", "null"] },
"cos": { "type": "string" },
"acces": { "type": "string" },
"ref_plan_masse": { "type": "string" },
"phasage": { "type": "string" }
}
},
"architecture": {
"type": "object",
"properties": {
"parti_archi": { "type": "string" },
"nb_batiments": { "type": ["integer", "null"] },
"nb_niveaux": { "type": ["integer", "null"] },
"ref_rendus": { "type": "string" },
"taux_conversion": {
"type": "object",
"properties": {
"taux": { "type": ["number", "null"] },
"date": { "type": "string" },
"source": { "type": "string" }
}
},
"typologies": {
"type": "array",
"items": {
"type": "object",
"properties": {
"nom": { "type": "string" },
"quantite": { "type": ["integer", "null"] },
"surface_interieure_m2": { "type": ["number", "null"] },
"surface_terrasse_m2": { "type": ["number", "null"] },
"surface_totale_m2": { "type": ["number", "null"] },
"prix_usd": { "type": ["number", "null"] },
"prix_dop": { "type": ["number", "null"] }
}
}
}
}
},
"paysage": {
"type": "object",
"properties": {
"concept_paysage": { "type": "string" },
"amenities": { "type": "array", "items": { "type": "string" } },
"services_inclus": { "type": "array", "items": { "type": "string" } },
"experience": { "type": "string" },
"durabilite": { "type": "string" }
}
},
"ingenierie": {
"type": "object",
"properties": {
"structure": { "type": "string" },
"reseaux": { "type": "string" },
"contraintes_site": { "type": "string" },
"cout_construction_usd": { "type": ["number", "null"] },
"revenu_brut_usd": { "type": ["number", "null"] },
"marge_pct": { "type": ["number", "null"] },
"regime_fiscal": { "type": "string" }
}
},
"commercial": {
"type": "object",
"properties": {
"positionnement_fr": { "type": "string" }
}
},
"rendus": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fichier": { "type": "string" },
"vue": { "type": "string" },
"hero": { "type": "boolean" }
}
}
}
}
}