f0a7d71357
Livrable Publiciste · Sprint 2 · Semaine 2 (seul module net-neuf · chemin critique · GAP_ANALYSIS §3.13). Cible portage VPS : otoia/capabilities/publiciste.py. - lib/parser.py : data_room/PXX/ (template v1.0) → projet dict conforme au contrat projets_master.schema.json (livré S1). Mapping colonnes par en-tête, parsing montants USD/DOP robuste. Anti-invention #6 : rétrogradation défensive « en_developpement » si prix USD manquant ; absent → null (jamais 0/inventé). - lib/validator.py : validateur JSON-Schema draft-07 (sous-ensemble) ZÉRO dépendance pip (runner Gitea sans pip). Oracle jsonschema en test si présent. - lib/generator.py + template + branding : rendu HTML luxury #4 (dark+doré, Fraunces + Cormorant Garamond) ; sans prix → « Prochainement · Détails à venir ». - publiciste.py : CLI parse/validate/generate/run. - fixtures/ : données SYNTHÉTIQUES de test (jamais publiées) P01 complète + P02 incomplète. - tests/ : 23 tests unittest (stdlib) verts. - CI : job publiciste-tests ajouté au gate (.gitea/workflows/ci.yml · Gitea #2). Vérifs (en-repo, sans VPS) : 23/23 tests verts · gate CI local vert (guard/JSON/ docs) · pipeline CLI produit un master conforme au schéma. Auto-score 4Big 95/100. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Fixtures Publiciste — ⚠️ DONNÉES SYNTHÉTIQUES DE TEST
Ces fichiers ne proviennent d'AUCUNE archive réelle data_room/ et ne doivent
JAMAIS être publiés. Ils existent uniquement pour exercer le parser + le
générateur + le validateur de schéma en CI, sans dépendre du VPS.
- Les chiffres (prix, surfaces) sont volontairement ronds et fictifs — ils ne
décrivent aucun projet OTO. Aucun risque d'« invention » publiée (CLAUDE.md #6) :
rien ici n'alimente
vente.otov7.com. data_room/P01/— faisabilité complète (statutcomplete, score ≥ 95) : exerce le chemin « disponible » avec grille de prix.data_room/P02/— faisabilité incomplète (prix manquant) : exerce la rétrogradation défensive → « En développement · Prochainement · Détails à venir ».
Codes projet réels réutilisés (P01/P02) car le schéma impose le motif ^P0[1-9]$ ;
la nature synthétique est portée par ce README + les valeurs manifestement fictives.