From 0b2c97916afe653b84858ece15f81c930fce3c76 Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Wed, 29 Jul 2026 23:59:38 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker]=20Sprint=201=20=C2=B7=20Template?= =?UTF-8?q?=20Faisabilit=C3=A9=20canonique=20v1.0=20(d=C3=A9bloque=20gap?= =?UTF-8?q?=20P02/P03/P05/P07)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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) --- 05_deliverables_mvp/GAP_ANALYSIS_SPRINT1.md | 2 +- .../daily_reports/2026-07-29.md | 36 +++ .../TEMPLATE_FAISABILITE_CANONIQUE_v1.0.md | 231 ++++++++++++++++++ .../faisabilite/projets_master.schema.json | 113 +++++++++ .../faisabilite/version.schema.json | 75 ++++++ 5 files changed, 456 insertions(+), 1 deletion(-) create mode 100644 05_deliverables_mvp/faisabilite/TEMPLATE_FAISABILITE_CANONIQUE_v1.0.md create mode 100644 05_deliverables_mvp/faisabilite/projets_master.schema.json create mode 100644 05_deliverables_mvp/faisabilite/version.schema.json diff --git a/05_deliverables_mvp/GAP_ANALYSIS_SPRINT1.md b/05_deliverables_mvp/GAP_ANALYSIS_SPRINT1.md index 7f11d81..426de8d 100644 --- a/05_deliverables_mvp/GAP_ANALYSIS_SPRINT1.md +++ b/05_deliverables_mvp/GAP_ANALYSIS_SPRINT1.md @@ -201,7 +201,7 @@ Chaque item confirmé lève le marqueur **⚠ à confirmer VPS** correspondant. | Repo Gitea mandat live + fichiers poussés | DevOps | ⚠ à confirmer VPS | | CI/CD Gitea Actions configuré | DevOps | ☐ à faire | | **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 | | Cartographie DocTypes `otov7_platform` | ERPNext | ☐ à faire (⚠ VPS) | diff --git a/05_deliverables_mvp/daily_reports/2026-07-29.md b/05_deliverables_mvp/daily_reports/2026-07-29.md index 59953a2..98f6106 100644 --- a/05_deliverables_mvp/daily_reports/2026-07-29.md +++ b/05_deliverables_mvp/daily_reports/2026-07-29.md @@ -28,3 +28,39 @@ ## Prochaine tâche suggérée - 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). + +--- + +# 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`). diff --git a/05_deliverables_mvp/faisabilite/TEMPLATE_FAISABILITE_CANONIQUE_v1.0.md b/05_deliverables_mvp/faisabilite/TEMPLATE_FAISABILITE_CANONIQUE_v1.0.md new file mode 100644 index 0000000..b2b2e11 --- /dev/null +++ b/05_deliverables_mvp/faisabilite/TEMPLATE_FAISABILITE_CANONIQUE_v1.0.md @@ -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 % ». diff --git a/05_deliverables_mvp/faisabilite/projets_master.schema.json b/05_deliverables_mvp/faisabilite/projets_master.schema.json new file mode 100644 index 0000000..a8443af --- /dev/null +++ b/05_deliverables_mvp/faisabilite/projets_master.schema.json @@ -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"] + } + } + } + } + } + ] + } + } +} diff --git a/05_deliverables_mvp/faisabilite/version.schema.json b/05_deliverables_mvp/faisabilite/version.schema.json new file mode 100644 index 0000000..75b7ef2 --- /dev/null +++ b/05_deliverables_mvp/faisabilite/version.schema.json @@ -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 } + } + } + } + ] +}