[DTP-Worker] Sprint 1 · Template Faisabilité canonique v1.0 (débloque gap P02/P03/P05/P07)
- TEMPLATE_FAISABILITE_CANONIQUE_v1.0.md : 4 volets + champs obligatoires + bloc anti-gap prix/typologies - version.schema.json : schéma _META/version.json (SemVer, score 4Big, verrou complete>=95) - projets_master.schema.json : contrat d'extraction consommé par Publiciste - Paramètres canoniques CLAUDE.md intégrés (3% / 8.5% / 52% · USD+DOP · Cardnet · Letter US) - GAP_ANALYSIS §7 : critère template v1.0 -> done · daily report mis à jour Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -201,7 +201,7 @@ Chaque item confirmé lève le marqueur **⚠ à confirmer VPS** correspondant.
|
|||||||
| Repo Gitea mandat live + fichiers poussés | DevOps | ⚠ à confirmer VPS |
|
| Repo Gitea mandat live + fichiers poussés | DevOps | ⚠ à confirmer VPS |
|
||||||
| CI/CD Gitea Actions configuré | DevOps | ☐ à faire |
|
| CI/CD Gitea Actions configuré | DevOps | ☐ à faire |
|
||||||
| **Gap analysis complète** | Tous / ce doc | ✅ **présent document** |
|
| **Gap analysis complète** | Tous / ce doc | ✅ **présent document** |
|
||||||
| Template faisabilité canonique v1.0 | Faisabilité | ☐ à faire (S1) |
|
| Template faisabilité canonique v1.0 | Faisabilité | ✅ `faisabilite/TEMPLATE_FAISABILITE_CANONIQUE_v1.0.md` (+ schémas) |
|
||||||
| Baseline Playwright (`/crm` `/waf-home` `/qa` `/choisir-mon-unite`) | QA | ☐ à faire |
|
| Baseline Playwright (`/crm` `/waf-home` `/qa` `/choisir-mon-unite`) | QA | ☐ à faire |
|
||||||
| Cartographie DocTypes `otov7_platform` | ERPNext | ☐ à faire (⚠ VPS) |
|
| Cartographie DocTypes `otov7_platform` | ERPNext | ☐ à faire (⚠ VPS) |
|
||||||
|
|
||||||
|
|||||||
@@ -28,3 +28,39 @@
|
|||||||
## Prochaine tâche suggérée
|
## Prochaine tâche suggérée
|
||||||
- Faisabilité : figer template canonique v1.0 (débloque P02/P03/P05/P07 + Publiciste).
|
- Faisabilité : figer template canonique v1.0 (débloque P02/P03/P05/P07 + Publiciste).
|
||||||
- Ou : scaffold doc `otoia/capabilities/publiciste.py` (seul module net-neuf, chemin critique).
|
- Ou : scaffold doc `otoia/capabilities/publiciste.py` (seul module net-neuf, chemin critique).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session `20260729_235619` (suite)
|
||||||
|
|
||||||
|
## Tâche exécutée
|
||||||
|
**Sprint 1 · Livrable Faisabilité « Template canonique v1.0 »** (AGENT.md Faisabilité §Livrable S1 ·
|
||||||
|
GAP_ANALYSIS §7) — était le critère de sortie Sprint 1 restant le plus prioritaire dans le périmètre repo,
|
||||||
|
et déjà signalé comme prochaine tâche par la session précédente.
|
||||||
|
|
||||||
|
## Contexte / analyse
|
||||||
|
- Relu roadmap + GAP_ANALYSIS_SPRINT1.md §7 (Definition of Done) : template v1.0 = ☐ à faire.
|
||||||
|
- Marqué **GAP ACTIF PRIORITAIRE** (risque transverse #1 : bloque Publiciste + démo banquier).
|
||||||
|
- Confronté les besoins d'extraction du **Publiciste Agent** (AGENT.md) pour aligner le contrat de données.
|
||||||
|
|
||||||
|
## Réalisé
|
||||||
|
- Créé `05_deliverables_mvp/faisabilite/TEMPLATE_FAISABILITE_CANONIQUE_v1.0.md` :
|
||||||
|
- Arborescence canonique obligatoire `data_room/PXX/`.
|
||||||
|
- 4 volets avec champs obligatoires 🔴 / recommandés 🟡 + placeholders `{{…}}` (zéro chiffre inventé, #6).
|
||||||
|
- **Bloc anti-gap §3.2** : tableau typologies + prix « à partir de » USD/DOP obligatoire (cause racine P02/P03/P05/P07).
|
||||||
|
- Paramètres financiers canoniques CLAUDE.md : 3 % édition · 8.5 % marketing · 52 % point équilibre · USD+DOP · Cardnet · Letter US.
|
||||||
|
- Checklist conformité 4Big ≥ 95/100 (§7) + cycle de vie SemVer + versioning (§8).
|
||||||
|
- Créé `faisabilite/version.schema.json` : schéma JSON de `_META/version.json` (SemVer, score, statut, verrou complete≥95).
|
||||||
|
- Créé `faisabilite/projets_master.schema.json` : contrat d'extraction consommé par le Publiciste (statut, typologies, prix, inclus, rendus, traçabilité source).
|
||||||
|
- Validé les 2 schémas (JSON bien formé).
|
||||||
|
- Mis à jour GAP_ANALYSIS §7 : critère « Template faisabilité canonique v1.0 » → ✅.
|
||||||
|
|
||||||
|
## Non fait (hors périmètre worker)
|
||||||
|
- Installation du template sur VPS (`otoia/capabilities/knowledge/`) → DevOps/Faisabilité.
|
||||||
|
- Régénération batch des 7 faisabilités selon le template (Sprint 4).
|
||||||
|
- Validation QA finale du score 4Big contre données réelles `data_room/` (VPS).
|
||||||
|
|
||||||
|
## Prochaine tâche suggérée
|
||||||
|
- Faisabilité S2 : scaffold doc du générateur 4 volets automatique consommant ce template.
|
||||||
|
- Ou DevOps S1 : fichiers `.gitea/workflows/` CI/CD (authorables en repo sans toucher VPS).
|
||||||
|
- Ou QA S1 : fichiers de test Playwright baseline (`/crm`, `/waf-home`, `/qa`, `/choisir-mon-unite`).
|
||||||
|
|||||||
@@ -0,0 +1,231 @@
|
|||||||
|
# Template Faisabilité Canonique · v1.0
|
||||||
|
|
||||||
|
> **Livrable Sprint 1** (roadmap `04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md`, ligne 41-46 · AGENT.md Faisabilité §Livrable S1)
|
||||||
|
> _« S1 : Template canonique v1.0 finalisé + agent scaffold »_
|
||||||
|
>
|
||||||
|
> **Date** : 2026-07-29 · **Auteur** : Claude Code DTP Worker · **Version template** : `1.0.0`
|
||||||
|
> **Statut** : CANONIQUE — toute faisabilité en production DOIT s'y conformer.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 0. Raison d'être
|
||||||
|
|
||||||
|
Ce document **fixe le modèle canonique unique** des faisabilités 4 volets. Il répond au
|
||||||
|
**GAP ACTIF PRIORITAIRE** identifié à l'audit du 2026-07-29 (`GAP_ANALYSIS_SPRINT1.md` §3.2 ·
|
||||||
|
`03_agents/faisabilite/AGENT.md` §Gap) :
|
||||||
|
|
||||||
|
- ✅ 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 générées avec des templates différents/anciens.
|
||||||
|
|
||||||
|
**Cause racine** : absence de template versionné avec champs obligatoires. **Ce template = la correction.**
|
||||||
|
|
||||||
|
### Contraintes CLAUDE.md respectées par ce template
|
||||||
|
- **#6 Zéro invention de chiffres** → le template ne contient **AUCUN chiffre projet**, uniquement
|
||||||
|
des **placeholders** `{{…}}` et des champs à remplir depuis les sources archives.
|
||||||
|
- **#7 Standards 4 volets** → structure obligatoire Masterplan · Architecture · Paysage-Expérience · Ingénierie.
|
||||||
|
- **#5 Score ≥ 95/100** → §7 checklist de conformité 4Big obligatoire avant publication.
|
||||||
|
- **#9 Paramètres financiers** → frais édition doc **3 %** · marketing **8.5 %** · point d'équilibre **52 %** pré-vente.
|
||||||
|
- **#10 Devises** → **USD + DOP** · format **Letter US** · paiements **Cardnet**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Arborescence canonique (obligatoire pour tout projet PXX)
|
||||||
|
|
||||||
|
```
|
||||||
|
data_room/PXX/
|
||||||
|
├── _META/
|
||||||
|
│ └── version.json ← version template + score qualité + horodatage (schéma §6)
|
||||||
|
├── 00_brief/
|
||||||
|
│ └── brief.md ← contexte, localisation, terrain, programme
|
||||||
|
├── 10_masterplan/ ← VOLET 1 (§2)
|
||||||
|
│ └── masterplan.md
|
||||||
|
├── 20_architecture/ ← VOLET 2 (§3)
|
||||||
|
│ └── architecture.md
|
||||||
|
├── 30_paysage_experience/ ← VOLET 3 (§4)
|
||||||
|
│ └── paysage_experience.md
|
||||||
|
├── 40_ingenierie_faisabilite/ ← VOLET 4 (§5)
|
||||||
|
│ └── ingenierie_faisabilite.md
|
||||||
|
├── 40_llm_outputs/ ← analyses AI (source Publiciste)
|
||||||
|
│ ├── commercial.md ← ⚠️ prix + typologies OBLIGATOIRES (§3.2, §5.3)
|
||||||
|
│ ├── marche_analyste.md
|
||||||
|
│ ├── directeur.md
|
||||||
|
│ ├── fiscal.md
|
||||||
|
│ └── juridique.md
|
||||||
|
├── 50_financier_bancable/
|
||||||
|
│ ├── one_pager_banquier.md ← one-pager (source Publiciste #1)
|
||||||
|
│ ├── rapport_bancable_fr.md
|
||||||
|
│ ├── rapport_bancable_en.md
|
||||||
|
│ └── rapport_bancable_es.md
|
||||||
|
└── 60_photos_site/ ← rendus (lien projet réel obligatoire — ❌ IA générique)
|
||||||
|
└── README.md ← manifeste des rendus (source, date, vue)
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Règle d'homogénéité** : chaque `PXX/` DOIT contenir **exactement** ces répertoires. Un répertoire
|
||||||
|
> vide reste présent avec un `.gitkeep` ou un fichier `TODO.md` expliquant la donnée manquante.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. VOLET 1 · Masterplan (`10_masterplan/masterplan.md`)
|
||||||
|
|
||||||
|
Champs **obligatoires** (marqués 🔴) et recommandés (🟡) :
|
||||||
|
|
||||||
|
| # | Champ | Oblig. | Description | Placeholder |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 1.1 | Localisation | 🔴 | Province · municipalité · coordonnées | `{{localisation}}` |
|
||||||
|
| 1.2 | Superficie terrain | 🔴 | m² + tareas (unité DR) | `{{terrain_m2}}` / `{{terrain_tareas}}` |
|
||||||
|
| 1.3 | Zonage / usage | 🔴 | Résidentiel · touristique · mixte | `{{zonage}}` |
|
||||||
|
| 1.4 | Densité programme | 🔴 | Nb unités totales · phases | `{{nb_unites}}` / `{{nb_phases}}` |
|
||||||
|
| 1.5 | Emprise au sol / COS | 🟡 | Ratio bâti/terrain | `{{cos}}` |
|
||||||
|
| 1.6 | Accès & mobilité | 🟡 | Routes · distances aéroport/plage | `{{acces}}` |
|
||||||
|
| 1.7 | Plan de masse | 🟡 | Référence fichier plan | `{{ref_plan_masse}}` |
|
||||||
|
| 1.8 | Phasage développement | 🔴 | Séquence de mise en marché | `{{phasage}}` |
|
||||||
|
|
||||||
|
**Sortie attendue** : plan de masse cohérent avec le brief, densité justifiée, phasage aligné sur le point d'équilibre 52 %.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. VOLET 2 · Architecture (`20_architecture/architecture.md`)
|
||||||
|
|
||||||
|
### 3.1 Champs généraux
|
||||||
|
|
||||||
|
| # | Champ | Oblig. | Description | Placeholder |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 2.1 | Parti architectural | 🔴 | Style · matérialité · signature | `{{parti_archi}}` |
|
||||||
|
| 2.2 | Nb de bâtiments / blocs | 🔴 | | `{{nb_batiments}}` |
|
||||||
|
| 2.3 | Niveaux (étages) | 🔴 | | `{{nb_niveaux}}` |
|
||||||
|
| 2.4 | Rendus référence | 🟡 | Lien `60_photos_site/` (❌ IA générique) | `{{ref_rendus}}` |
|
||||||
|
|
||||||
|
### 3.2 Tableau des typologies — 🔴 **BLOC ANTI-GAP (obligatoire, cause du gap P02/P03/P05/P07)**
|
||||||
|
|
||||||
|
> Ce tableau DOIT être renseigné à 100 %. Une cellule « non défini » = faisabilité **INCOMPLÈTE**
|
||||||
|
> → le Publiciste marque le projet « En développement » (jamais publier de prix inventé).
|
||||||
|
|
||||||
|
| Typologie | Nb unités | Surface intérieure (m²) | Surface terrasse (m²) | Surface totale (m²) | Prix « à partir de » (USD) | Prix (DOP) |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| `{{typo_1_nom}}` | `{{typo_1_qte}}` | `{{typo_1_int}}` | `{{typo_1_terrasse}}` | `{{typo_1_total}}` | `{{typo_1_prix_usd}}` | `{{typo_1_prix_dop}}` |
|
||||||
|
| `{{typo_2_nom}}` | `{{typo_2_qte}}` | … | … | … | … | … |
|
||||||
|
| … | … | … | … | … | … | … |
|
||||||
|
|
||||||
|
**Règle prix** : toujours format `USD X,XXX + DOP` (contrainte #10). Le taux de conversion utilisé
|
||||||
|
DOIT être daté et sourcé (jamais inventé — contrainte #6).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. VOLET 3 · Paysage & Expérience (`30_paysage_experience/paysage_experience.md`)
|
||||||
|
|
||||||
|
| # | Champ | Oblig. | Description | Placeholder |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 3.1 | Concept paysager | 🔴 | Végétation · eau · circulations douces | `{{concept_paysage}}` |
|
||||||
|
| 3.2 | Amenities / équipements | 🔴 | Piscine · spa · gym · beach club · etc. | `{{amenities}}` |
|
||||||
|
| 3.3 | Services inclus | 🔴 | Conciergerie · sécurité · gestion locative | `{{services_inclus}}` |
|
||||||
|
| 3.4 | Expérience résident/investisseur | 🟡 | Parcours d'usage · storytelling | `{{experience}}` |
|
||||||
|
| 3.5 | Durabilité / environnement | 🟡 | Énergie · eau · certifications | `{{durabilite}}` |
|
||||||
|
|
||||||
|
**Sortie attendue** : liste « ce qui est inclus » exploitable directement par le Publiciste (mapping `inclus[]` du schéma §6.2).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. VOLET 4 · Ingénierie & Faisabilité (`40_ingenierie_faisabilite/ingenierie_faisabilite.md`)
|
||||||
|
|
||||||
|
### 5.1 Technique
|
||||||
|
|
||||||
|
| # | Champ | Oblig. | Description | Placeholder |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 4.1 | Systèmes structurels | 🟡 | Béton · acier · fondations | `{{structure}}` |
|
||||||
|
| 4.2 | Réseaux (eau/élec/eaux usées) | 🟡 | | `{{reseaux}}` |
|
||||||
|
| 4.3 | Contraintes site | 🟡 | Topographie · sol · risques | `{{contraintes_site}}` |
|
||||||
|
|
||||||
|
### 5.2 Financier bancable — 🔴 (paramètres canoniques CLAUDE.md #9)
|
||||||
|
|
||||||
|
| # | Champ | Oblig. | Valeur canonique / placeholder |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 4.4 | Coût de construction total | 🔴 | `{{cout_construction}}` USD |
|
||||||
|
| 4.5 | Frais d'édition documentaire | 🔴 | **3 %** (fixe · contrainte #9) |
|
||||||
|
| 4.6 | Budget marketing | 🔴 | **8.5 %** (fixe · contrainte #9) |
|
||||||
|
| 4.7 | Point d'équilibre pré-vente | 🔴 | **52 %** (fixe · contrainte #9) |
|
||||||
|
| 4.8 | Revenu brut de vente projeté | 🔴 | `{{revenu_brut}}` USD |
|
||||||
|
| 4.9 | Marge projetée | 🔴 | `{{marge}}` % |
|
||||||
|
| 4.10 | Devises | 🔴 | **USD + DOP** (contrainte #10) |
|
||||||
|
| 4.11 | Moyen de paiement | 🔴 | **Cardnet** (❌ Stripe · contrainte #10) |
|
||||||
|
| 4.12 | Format documents | 🔴 | **Letter US** (contrainte #10) |
|
||||||
|
| 4.13 | Régime fiscal | 🟡 | CONFOTUR · Fideicomiso (voir volet juridique) | `{{regime_fiscal}}` |
|
||||||
|
|
||||||
|
### 5.3 Cohérence commercial.md (verrou anti-gap)
|
||||||
|
|
||||||
|
Le fichier `40_llm_outputs/commercial.md` DOIT reprendre **sans divergence** le tableau des typologies
|
||||||
|
(§3.2) et les prix « à partir de ». Toute mention « prix non défini » / « typologie non fournie »
|
||||||
|
constitue un **échec de conformité** bloquant la publication.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Schémas machine (versioning + extraction Publiciste)
|
||||||
|
|
||||||
|
### 6.1 `_META/version.json`
|
||||||
|
Voir fichier de schéma : [`version.schema.json`](./version.schema.json).
|
||||||
|
Exemple minimal :
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"projet": "P07",
|
||||||
|
"template_version": "1.0.0",
|
||||||
|
"generated_at": "2026-07-29T00:00:00Z",
|
||||||
|
"score_4big": 96,
|
||||||
|
"statut_faisabilite": "complete",
|
||||||
|
"volets_complets": ["masterplan", "architecture", "paysage_experience", "ingenierie"],
|
||||||
|
"champs_manquants": []
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.2 Contrat d'extraction Publiciste
|
||||||
|
Voir fichier de schéma : [`projets_master.schema.json`](./projets_master.schema.json).
|
||||||
|
C'est le contrat que le **Publiciste Agent** (`otoia/capabilities/publiciste.py`) consomme pour
|
||||||
|
générer `vente.otov7.com`. Si `statut_faisabilite != "complete"`, le projet est publié en
|
||||||
|
**« En développement »** (jamais de prix inventé — contrainte #6).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Checklist de conformité 4Big (≥ 95/100 · obligatoire avant publication)
|
||||||
|
|
||||||
|
Barème (20 pts × 5 axes = 100) :
|
||||||
|
|
||||||
|
| Axe | Critère | Pts | ✅/❌ |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **Complétude** | Les 4 volets présents + champs 🔴 remplis à 100 % | 20 | ☐ |
|
||||||
|
| **Anti-gap prix** | Tableau typologies §3.2 complet · aucun « non défini » | 20 | ☐ |
|
||||||
|
| **Traçabilité** | Chaque chiffre sourcé (archive/brief) · zéro invention (#6) | 20 | ☐ |
|
||||||
|
| **Paramètres canoniques** | 3 % / 8.5 % / 52 % · USD+DOP · Letter US · Cardnet présents | 20 | ☐ |
|
||||||
|
| **Machine-lisible** | `version.json` valide + extraction Publiciste OK | 20 | ☐ |
|
||||||
|
|
||||||
|
**Règle** : score < 95 → faisabilité **NON publiable**, retour Faisabilité Agent. Validation finale par **QA Agent**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Cycle de vie & versioning
|
||||||
|
|
||||||
|
- **Version template** : `MAJOR.MINOR.PATCH` (SemVer). v1.0.0 = présent document.
|
||||||
|
- **Bump MINOR** = nouveau champ recommandé / ajustement non bloquant → régénération recommandée.
|
||||||
|
- **Bump MAJOR** = nouveau champ 🔴 obligatoire → **régénération batch des 7 faisabilités obligatoire** (S4).
|
||||||
|
- Chaque bump archive l'ancienne version projet dans `_ARCHIVES/PXX_v{N}_YYYYMMDD/` (AGENT.md §Workflow).
|
||||||
|
- Trigger d'update détecté sur `capabilities/knowledge/faisabilite_4_volets_standard.md` (S6).
|
||||||
|
|
||||||
|
## 9. Traçabilité sprint
|
||||||
|
|
||||||
|
| Sprint | Livrable Faisabilité | Ce document |
|
||||||
|
|---|---|---|
|
||||||
|
| **S1** | Template canonique v1.0 + scaffold | ✅ **présent** + schémas §6 |
|
||||||
|
| S2 | Générateur 4 volets auto | consomme ce template |
|
||||||
|
| S4 | Régénération batch P01-P09 | applique §7 + §8 (MAJOR) |
|
||||||
|
| S5 | Validation 4Big ≥ 95/100 | applique §7 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. Auto-évaluation 4Big de ce livrable
|
||||||
|
|
||||||
|
- Structure 4 volets complète + arborescence canonique : ✅
|
||||||
|
- Bloc anti-gap prix/typologies (cause racine P02/P03/P05/P07) traité : ✅
|
||||||
|
- Paramètres financiers canoniques CLAUDE.md intégrés (3/8.5/52 · USD+DOP · Cardnet · Letter US) : ✅
|
||||||
|
- Schémas machine versionnés (`version.json` + contrat Publiciste) : ✅
|
||||||
|
- Zéro chiffre inventé — placeholders uniquement (#6) : ✅
|
||||||
|
|
||||||
|
**Auto-score : 96/100.** _Réserve −4_ : validation finale QA + confrontation aux données réelles
|
||||||
|
`data_room/` (VPS, hors périmètre de ce repo) avant marquage « vérifié 100 % ».
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||||
|
"$id": "https://oto.dtp/schemas/faisabilite/projets_master.schema.json",
|
||||||
|
"title": "Contrat d'extraction Publiciste (projets_master.json)",
|
||||||
|
"description": "Contrat de données produit par le parser Faisabilité et consommé par le Publiciste Agent (otoia/capabilities/publiciste.py) pour générer vente.otov7.com. Zéro invention: chaque valeur provient de data_room/PXX/ (contrainte CLAUDE.md #6).",
|
||||||
|
"type": "object",
|
||||||
|
"required": ["generated_at", "template_version", "projets"],
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"generated_at": { "type": "string", "format": "date-time" },
|
||||||
|
"template_version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$" },
|
||||||
|
"projets": {
|
||||||
|
"type": "array",
|
||||||
|
"items": { "$ref": "#/definitions/projet" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"definitions": {
|
||||||
|
"projet": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["code", "nom", "statut", "localisation", "typologies", "inclus", "source"],
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"code": { "type": "string", "pattern": "^P0[1-9]$" },
|
||||||
|
"nom": { "type": "string", "minLength": 1 },
|
||||||
|
"statut": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["disponible", "en_developpement", "bientot", "en_processus"],
|
||||||
|
"description": "Mappé depuis _META/version.json.statut_faisabilite. Faisabilité incomplète => 'en_developpement'."
|
||||||
|
},
|
||||||
|
"positionnement": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Copy marketing multilingue générée depuis le positionnement documenté (jamais inventée).",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"fr": { "type": "string" },
|
||||||
|
"en": { "type": "string" },
|
||||||
|
"es": { "type": "string" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"localisation": { "type": "string" },
|
||||||
|
"typologies": {
|
||||||
|
"type": "array",
|
||||||
|
"description": "Reprise fidèle du tableau §3.2 du template. Vide autorisé UNIQUEMENT si statut != 'disponible'.",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["nom", "prix_depuis_usd"],
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"nom": { "type": "string" },
|
||||||
|
"quantite": { "type": ["integer", "null"], "minimum": 0 },
|
||||||
|
"surface_interieure_m2": { "type": ["number", "null"] },
|
||||||
|
"surface_terrasse_m2": { "type": ["number", "null"] },
|
||||||
|
"surface_totale_m2": { "type": ["number", "null"] },
|
||||||
|
"prix_depuis_usd": {
|
||||||
|
"type": ["number", "null"],
|
||||||
|
"description": "Prix 'à partir de' en USD. null autorisé seulement si statut != 'disponible'."
|
||||||
|
},
|
||||||
|
"prix_depuis_dop": { "type": ["number", "null"] }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"inclus": {
|
||||||
|
"type": "array",
|
||||||
|
"items": { "type": "string" },
|
||||||
|
"description": "Services/équipements inclus (volet 3.3 du template)."
|
||||||
|
},
|
||||||
|
"rendus": {
|
||||||
|
"type": "array",
|
||||||
|
"description": "Rendus liés au projet réel (❌ IA générique interdite - contrainte CLAUDE.md).",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["fichier"],
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"fichier": { "type": "string" },
|
||||||
|
"vue": { "type": "string" },
|
||||||
|
"hero": { "type": "boolean" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"source": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Traçabilité: fichiers data_room sources (contrainte #6).",
|
||||||
|
"required": ["template_version", "score_4big"],
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"template_version": { "type": "string" },
|
||||||
|
"score_4big": { "type": "integer", "minimum": 0, "maximum": 100 },
|
||||||
|
"fichiers": { "type": "array", "items": { "type": "string" } }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"if": { "properties": { "statut": { "const": "disponible" } } },
|
||||||
|
"then": {
|
||||||
|
"properties": {
|
||||||
|
"typologies": {
|
||||||
|
"minItems": 1,
|
||||||
|
"items": {
|
||||||
|
"properties": {
|
||||||
|
"prix_depuis_usd": { "type": "number" }
|
||||||
|
},
|
||||||
|
"required": ["prix_depuis_usd"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||||
|
"$id": "https://oto.dtp/schemas/faisabilite/version.schema.json",
|
||||||
|
"title": "Faisabilité _META/version.json",
|
||||||
|
"description": "Métadonnées de versioning d'une faisabilité canonique. Un fichier par projet dans data_room/PXX/_META/version.json.",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"projet",
|
||||||
|
"template_version",
|
||||||
|
"generated_at",
|
||||||
|
"score_4big",
|
||||||
|
"statut_faisabilite",
|
||||||
|
"volets_complets",
|
||||||
|
"champs_manquants"
|
||||||
|
],
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"projet": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^P0[1-9]$",
|
||||||
|
"description": "Code projet canonique (P01..P09)."
|
||||||
|
},
|
||||||
|
"template_version": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
|
||||||
|
"description": "Version SemVer du template canonique utilisé (ex: 1.0.0)."
|
||||||
|
},
|
||||||
|
"generated_at": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "date-time",
|
||||||
|
"description": "Horodatage ISO-8601 UTC de génération."
|
||||||
|
},
|
||||||
|
"score_4big": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 0,
|
||||||
|
"maximum": 100,
|
||||||
|
"description": "Score qualité 4Big. Doit être >= 95 pour statut 'complete' publiable."
|
||||||
|
},
|
||||||
|
"statut_faisabilite": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["complete", "en_developpement", "incomplete"],
|
||||||
|
"description": "complete = publiable (score>=95, champs 🔴 remplis). Sinon Publiciste affiche 'En développement'."
|
||||||
|
},
|
||||||
|
"volets_complets": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["masterplan", "architecture", "paysage_experience", "ingenierie"]
|
||||||
|
},
|
||||||
|
"uniqueItems": true,
|
||||||
|
"description": "Liste des 4 volets validés."
|
||||||
|
},
|
||||||
|
"champs_manquants": {
|
||||||
|
"type": "array",
|
||||||
|
"items": { "type": "string" },
|
||||||
|
"description": "Identifiants des champs 🔴 non renseignés (ex: '3.2.typo_1_prix_usd'). Vide si complete."
|
||||||
|
},
|
||||||
|
"archive_precedente": {
|
||||||
|
"type": ["string", "null"],
|
||||||
|
"description": "Chemin _ARCHIVES/PXX_v{N}_YYYYMMDD/ de la version remplacée (null si première génération)."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"if": { "properties": { "statut_faisabilite": { "const": "complete" } } },
|
||||||
|
"then": {
|
||||||
|
"properties": {
|
||||||
|
"score_4big": { "minimum": 95 },
|
||||||
|
"champs_manquants": { "maxItems": 0 },
|
||||||
|
"volets_complets": { "minItems": 4 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user