Files
oto-enterprise-os-dtp/05_deliverables_mvp/faisabilite/generator/README.md
T
Claude Code DTP Worker 911f70b9ab [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>
2026-07-30 02:37:47 +00:00

113 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Générateur Faisabilité 4 volets · Sprint 2
> Livrable **Faisabilité · Sprint 2** — `03_agents/faisabilite/AGENT.md` §Livrable S2
> (« Générateur 4 volets automatique »).
> Cible de portage VPS : `otoia/capabilities/faisabilite_agent.py`.
Produit une faisabilité canonique `data_room/PXX/` (conforme au
[`TEMPLATE_FAISABILITE_CANONIQUE_v1.0.md`](../TEMPLATE_FAISABILITE_CANONIQUE_v1.0.md))
à partir d'un **brief JSON sourcé**, puis **prouve** que le résultat est
consommable par le Publiciste.
## Place dans la chaîne de valeur
```
brief.json ──► faisabilite_gen ──► data_room/PXX/ (template v1.0)
▼ (module Publiciste, déjà livré)
publiciste.parser ──► projets_master.json ──► site
```
Le générateur ferme la boucle amont du Publiciste : ce dernier ne fait que
**publier** ; c'est ici que les 4 volets sont **produits** et **notés**.
## Zéro invention de chiffres (CLAUDE.md #6)
Principe défensif de bout en bout :
- Les **paramètres canoniques** (3 % édition · 8.5 % marketing · 52 % point
d'équilibre · USD+DOP · Cardnet · Letter US, CLAUDE.md #9/#10) sont **imposés
par le générateur** — ils ne proviennent jamais du brief, donc ne peuvent être
faussés projet par projet.
- Tout **champ 🔴 absent** du brief est rendu en placeholder `{{…}}`, listé dans
`champs_manquants`, et **rétrograde** le statut (jamais « complete » douteux).
- Un prix manquant reste `{{…}}` (jamais `0`, jamais une valeur inventée) → le
Publiciste publie le projet « En développement ».
## Scoring 4Big (§7 du template · 5 axes × 20)
| Axe | Source | Calcul |
|---|---|---|
| Complétude | brief | fraction des champs 🔴 des 4 volets remplis |
| Anti-gap prix | brief §3.2 | fraction des cellules typologies renseignées |
| Traçabilité | brief | `sources[]` + `taux_conversion{date,source}` |
| Paramètres canoniques | générateur | 20 (garanti · vérifié dans le rendu) |
| Machine-lisible | **preuve** | `version.json` valide **+** parser Publiciste OK |
L'axe machine-lisible n'est **pas auto-décerné** : le CLI re-parse le projet
généré avec le parser Publiciste et valide `version.json` contre
[`version.schema.json`](../version.schema.json). En cas d'échec, les 20 points
sont retirés, `version.json` réécrit, et la commande sort en erreur.
Statut « complete » ⇔ score ≥ 95 **et** aucun champ 🔴 manquant **et** bloc prix
intégral **et** 4 volets — cohérent avec la contrainte `allOf` de
`version.schema.json`.
## Utilisation
```bash
# Bilan 4Big d'un brief (sans rien écrire)
python3 faisabilite_gen.py score fixtures/brief_complete.json
# Générer une faisabilité (+ preuve machine-lisible)
python3 faisabilite_gen.py generate fixtures/brief_complete.json -o /tmp/data_room
# Amorcer un nouveau projet (arborescence vide à placeholders)
python3 faisabilite_gen.py scaffold P07 -o /tmp/data_room
# Générer tous les briefs d'un dossier
python3 faisabilite_gen.py batch fixtures -o /tmp/data_room
```
Puis, via le module Publiciste, publier :
```bash
cd ../../publiciste
python3 publiciste.py run /tmp/data_room -o /tmp/site
```
`--generated-at` fige l'horodatage (sorties déterministes / tests).
## Contrat d'entrée
Voir [`brief.schema.json`](./brief.schema.json). Les fixtures sont **synthétiques**
(`"synthetique": true`, bannière « ne jamais publier ») :
- `fixtures/brief_complete.json` → statut `complete`, score 100/100.
- `fixtures/brief_incomplete.json` → prix absents → rétrogradation
`en_developpement`, prix restés en placeholders (démontre l'anti-invention).
## Tests
```bash
python3 -m unittest discover -s tests -v
```
16 tests `unittest` (stdlib pur, **zéro pip**) : scoring, rétrogradation,
paramètres canoniques, et **round-trip end-to-end** generator → parser Publiciste
`projets_master.json` validé contre le schéma. Réutilise le parser + le
validateur du Publiciste (aucune duplication · workflow #5). Un oracle
`jsonschema` est activé en plus s'il est installé.
Job CI : `faisabilite-gen-tests` (gate `.gitea/workflows/ci.yml` · Gitea Actions
uniquement · contrainte #2).
## Hors périmètre worker (VPS / calendrier ultérieur)
- Application sur les **données réelles** `data_room/` (VPS · Faisabilité/ERPNext).
- Archives auto `_ARCHIVES/PXX_v{N}_YYYYMMDD/` sur bump MAJOR du template (S3/S4).
- Génération des `40_llm_outputs/` marché/directeur/fiscal/juridique + rapports
bancables FR/EN/ES (S3+ ; seuls brief/masterplan/architecture/paysage/
ingénierie/commercial sont produits ici).
- Trigger `otoia-faisabilite.timer` + notification Publiciste/WhatsApp (S6 · VPS).