[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:
Claude Code DTP Worker
2026-07-29 23:59:38 +00:00
parent e63be08b3a
commit 0b2c97916a
5 changed files with 456 additions and 1 deletions
@@ -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 }
}
}
}
]
}