915fc5194a
Faisabilité S3 : le même brief.json -> data_room/PXX/50_financier_bancable/{fr,en,es}.md
+ manifest.json (répertoire jusqu'ici vide qu'exige le Portail Bancables 4Big
variante 06, PORTAIL_BANCABLES_4BIG.md étape 1).
Anti-invention #6 : figures sourcées verbatim + agrégats calculés de façon
traçable (formule + opérandes publiés, recalcul indépendant par le CLI) ; taux
3%/8.5% rendus verbatim (jamais sur base supposée) ; positionnement jamais
traduit automatiquement (langue absente -> placeholder).
- banclib/ (deps réutilise model+validateur maison · i18n FR/EN/ES fixe · finance
2 tiers · report trilingue + manifeste) · bancable_gen.py CLI build/validate
refuse d'écrire si invariant casse · bancable.schema.json · 22 tests stdlib.
- CI : job bancable-tests ajouté au gate (Gitea Actions #2).
- brief.schema.json étendu (positionnement_en/es) · PORTAIL_BANCABLES_4BIG.md cousu.
Régression : 121 tests verts (99 + 22). Auto-score 4Big : 96/100.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
109 lines
4.2 KiB
JSON
109 lines
4.2 KiB
JSON
{
|
|
"$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",
|
|
"description": "Chaînes libres commerciales, langue par langue. Le générateur 4 volets consomme le FR (positionnement §40_llm_outputs) ; le générateur bancable consomme FR/EN/ES pour la section Positionnement du dossier bancable. Une langue absente reste un placeholder (jamais traduite automatiquement · #6).",
|
|
"properties": {
|
|
"positionnement_fr": { "type": "string" },
|
|
"positionnement_en": { "type": "string" },
|
|
"positionnement_es": { "type": "string" }
|
|
}
|
|
},
|
|
"rendus": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"fichier": { "type": "string" },
|
|
"vue": { "type": "string" },
|
|
"hero": { "type": "boolean" }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|