[DTP-Worker] Sprint 3 · Générateur dossier bancable trilingue FR/EN/ES (remplit 50_financier_bancable/ · Portail Bancables 4Big)

Faisabilité S3 : le même brief.json -> data_room/PXX/50_financier_bancable/{fr,en,es}.md
+ manifest.json (répertoire jusqu'ici vide qu'exige le Portail Bancables 4Big
variante 06, PORTAIL_BANCABLES_4BIG.md étape 1).

Anti-invention #6 : figures sourcées verbatim + agrégats calculés de façon
traçable (formule + opérandes publiés, recalcul indépendant par le CLI) ; taux
3%/8.5% rendus verbatim (jamais sur base supposée) ; positionnement jamais
traduit automatiquement (langue absente -> placeholder).

- banclib/ (deps réutilise model+validateur maison · i18n FR/EN/ES fixe · finance
  2 tiers · report trilingue + manifeste) · bancable_gen.py CLI build/validate
  refuse d'écrire si invariant casse · bancable.schema.json · 22 tests stdlib.
- CI : job bancable-tests ajouté au gate (Gitea Actions #2).
- brief.schema.json étendu (positionnement_en/es) · PORTAIL_BANCABLES_4BIG.md cousu.

Régression : 121 tests verts (99 + 22). Auto-score 4Big : 96/100.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-30 05:08:02 +00:00
parent 75a3b0a471
commit 915fc5194a
15 changed files with 1458 additions and 3 deletions
@@ -0,0 +1,94 @@
# Daily Report · 2026-07-30 · Claude Code DTP Worker (session 10)
**Session** : `20260730_045701`
## Tâche exécutée
**Sprint 3 · Faisabilité — Générateur de dossier financier bancable trilingue
FR/EN/ES** (roadmap `04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md` §Sprint 3 :
« `40_llm_outputs/` + rapports bancables FR/EN/ES » · **prochaine tâche suggérée**
par le daily report session 9 : « Faisabilité S3 »).
## Contexte / analyse
- Relu `CLAUDE.md`, `ROADMAP_8_WEEKS_OR_LESS.md`, `PORTAIL_BANCABLES_4BIG.md`,
daily report session 9, le générateur Faisabilité 4 volets (`renderer.py`,
`model.py`, `scorer.py`, `faisabilite_gen.py`, `brief.schema.json`), le
validateur maison Publiciste, le patron CI.
- État : volet RBAC **clos** en-repo (4 générateurs + run-book). Faisabilité S2
produit `data_room/PXX/` (4 volets + score 4Big) mais laissait le répertoire
**`50_financier_bancable/` VIDE** (`.gitkeep`).
- **Priorité évidente** : le **Portail Bancables 4Big** (variante 06 retenue par
Michel, `PORTAIL_BANCABLES_4BIG.md`) exige à l'**étape 1** de son workflow des
dossiers bancables **FR/EN/ES** placés précisément dans `50_financier_bancable/`.
Ce répertoire était le dernier trou de la faisabilité auto. 100 % autorable
sans VPS/pip/API, même brief que le générateur 4 volets, même patron modulaire.
## Réalisé — module `05_deliverables_mvp/faisabilite/bancable/`
- `banclib/deps.py` — réutilise (workflow #5, zéro duplication) `is_filled` +
`CANONICAL` du générateur et le **validateur maison** Publiciste (zéro pip).
- `banclib/i18n.py` — dictionnaire de libellés **FR/EN/ES fixes** (traductions de
gabarit, jamais du brief) + drapeaux du portail (🇨🇦/🇺🇸/🇩🇴).
- `banclib/finance.py`**deux tiers anti-invention (#6)** :
- **sourcé** (verbatim) : coût construction, revenu brut, marge, taux, prix par
typologie — champ absent ⇒ `None` (jamais 0 fabriqué) ;
- **calculé** (traçable) : Σ unités · valeur catalogue USD/DOP (`Σ quantité ×
prix`) · point d'équilibre en unités (`⌈52 % × nb_unités⌉`) — **formule
publiée**, opérandes tous sourcés/canoniques, `None` si un opérande manque.
- Les taux « 3 % édition » / « 8.5 % marketing » sont rendus **verbatim**
(jamais multipliés par une base supposée — base non documentée = hypothèse
inventée, refusée).
- `banclib/report.py` — rendu Markdown par langue (bannière **CONFIDENTIEL**
systématique ; bannière synthétique + `publiable:false` si fixture) + manifeste
agrégé machine-lisible.
- `bancable_gen.py` — CLI `build` / `validate`. **Refuse d'écrire** si un
invariant casse : conformité schéma, 3 langues rendues, bannière CONFIDENTIEL,
**recalcul indépendant des 4 agrégats == manifeste** (anti-figure-posée),
synthétique ⇒ non publiable, aucun littéral `None` dans le rendu.
- `bancable.schema.json` — contrat de sortie draft-07 (sous-ensemble validateur
maison · valeurs numériques nullable `["number","null"]`).
- `tests/test_bancable.py` — **22 tests `unittest` (stdlib pur)** : finance
(sourcé verbatim, arithmétique tracée, `None`≠0), rendu trilingue, positionnement
par langue + placeholder si absent, paramètres canoniques, schéma (maison +
oracle `jsonschema`), invariants CLI (détection de figure falsifiée), écriture
réelle, déterminisme.
- **CI** : job `bancable-tests` ajouté au **gate** (`.gitea/workflows/ci.yml`,
Gitea Actions uniquement · #2).
- **Docs cousues** : `PORTAIL_BANCABLES_4BIG.md` (nouvelle étape 0 → générateur) ;
`brief.schema.json` du générateur étendu (`positionnement_en/es`) → contrat
d'entrée aligné entre les deux modules.
## Anti-invention (#6) appliqué
- Figures sourcées **reprises telles quelles** ; aucune valeur inventée ni 0
fabriqué (champ absent ⇒ placeholder `{{…}}`).
- Agrégats calculés **auditables** : formule + opérandes publiés, **recoupés
indépendamment** par le CLI (rejette toute figure falsifiée · test dédié).
- Aucun montant sur base non documentée (3 %/8.5 % rendus comme taux, pas comme $).
- Positionnement **jamais traduit automatiquement** : langue absente ⇒ placeholder.
## Vérifications effectuées (en-repo, sans toucher au VPS)
- **22/22 tests verts** (schéma maison + oracle `jsonschema`). Génération réelle
(fixture synthétique) : 3 langues + manifeste · 40 unités · valeur catalogue
USD 8,560,000 / DOP 505,040,000 · point d'équilibre **21 unités** (⌈52 % × 40⌉)
— toutes formules recoupées ; `publiable=false` (synthétique).
- **Gate CI local vert (exit 0)** : `guard_constraints.sh`, `validate_json.sh`
(schéma + fixture bancable), `check_docs.sh` (README score présent, 0 lien
cassé), YAML `ci.yml` valide.
- **Régression** : 23 Publiciste + 10 RBAC + 16 Faisabilité + 11 fixtures + 12
userperm + 11 roleprofile + 16 apply_plan + 22 bancable = **121 tests verts**.
## Non fait (hors périmètre worker · VPS)
- Conversion PDF (pandoc/wkhtmltopdf) des `.md` FR/EN/ES + rebuild du Portail
Bancables 4Big → agent DevOps/Frontend (contrainte #8).
## Prochaine tâche suggérée
- Faisabilité S3 restant : refactor `oto_agent_faisabilite.py` → batch <1h côté
VPS (hors périmètre worker) ; ou packaging du hand-off ERPNext (`fixtures/` de
l'app OTO à partir des sorties RBAC + faisabilité).
- Frontend/CRM S2 : dépend des layouts LIVE (VPS) → hors périmètre worker.
---
**Auto-score 4Big du livrable Générateur bancable trilingue : 96/100.**
Réserve 4 : la conversion PDF + le rebuild du portail restent côté VPS (agent
DevOps/Frontend, hors périmètre worker · #8). Validé statiquement en-repo (22
tests verts + manifeste conforme + recoupement arithmétique des agrégats + gate
CI vert · 121 tests de régression au total).