From 0f7a1d8f6f97a3e4b62596ba0248db6ed461f10c Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Wed, 12 Aug 2026 16:09:26 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker=2020260812=5F160204]=20surface=20?= =?UTF-8?q?=C2=B7=20D-09=20=C2=B7=20s=C3=A9parateur=20de=20milliers=20mon?= =?UTF-8?q?=C3=A9taire=20divergent=20entre=20les=20deux=20surfaces=20de=20?= =?UTF-8?q?rendu=20stakeholder=20(publiciste=3Despace=20=C2=B7=20faisabili?= =?UTF-8?q?t=C3=A9=3Dvirgule)=20=E2=80=94=20arbitrage=20produit=20surfac?= =?UTF-8?q?=C3=A9,=20NON=20un=20bug/fix=20worker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Chasse au défaut d'abord (pas un énième sweep stérile) : grep TODO/FIXME/stub = RIEN ; axe format `:g`/`:,`/`:f` de prod = les 2 `:g` restants bornés+annotés sûrs (commissions:86 percent 0-100 · bancable/finance:143 nb-unités borné) → axe `:g` genuinement clos, 0 bug de correctness. Vrai locus = arbitrage de PRÉSENTATION transverse, non un défaut : - publiciste/lib/generator.py:34-39 → espace (`.replace(",", " ")`) : USD 8 560 000 - faisabilite/generator/genlib/renderer.py:28-37 + bancable/banclib/report.py:21-32 → virgule US (`,.0f` sans replace) : USD 8,560,000 - signaux partiels sans règle dure : OTO_DESIGN_SYSTEM_v1.md:89-90 illustre l'espace (« dès 145 000 USD ») ↔ fixtures data_room écrivent en virgule (architecture.md:11 « USD 150,000 ») ; aucune directive ne tranche. SURFACE, don't rewrite : ajout D-09 au OPEN_DECISIONS_REGISTER (+ note d'en-tête). Choisir un séparateur = convention design/audience (arbitrage Michel), pas une correction worker (#6). Les 2 rendeurs sont internes-cohérents+testés ; aucune sortie formatée n'est un artefact commité (out/ = nombres bruts ; formatage au runtime VPS #8) → aucun gate concerné. Pas de gate (#5) : classe D-01…D-08. Vérif : run_ci 33 PASS · 0 FAIL · 0 SKIP (inchangé, doc éditorial). 0 code V18 (bloqué #6) · 0 module prod · 0 artefact reconstruit · 0 chiffre figé · NFC-clean. Fichiers : M OPEN_DECISIONS_REGISTER.md · M 05_activity_log/2026-08-12.md. Co-Authored-By: Claude Opus 4.8 (1M context) --- 05_activity_log/2026-08-12.md | 21 +++++++++ .../OPEN_DECISIONS_REGISTER.md | 45 +++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/05_activity_log/2026-08-12.md b/05_activity_log/2026-08-12.md index 105607c..6cd2f5f 100644 --- a/05_activity_log/2026-08-12.md +++ b/05_activity_log/2026-08-12.md @@ -467,3 +467,24 @@ Chaque incrément correspond à un **test de régression à dents** ajouté par **Pourquoi PAS un gate (#5).** Dérive de currency d'un document éditorial (le rapport = *surface, ne tranche pas*), comme `daily_reports` par nature. Un gate line-number/hash sur de la prose stakeholder serait fragile (chaque commit worker le rougirait) et de faible valeur ; la discipline « remonter les jalons non-opposables en fin de vague » suffit, désormais appliquée. **Vérif.** `./run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP** (inchangé — le rapport est un document, 0 dépendance de gate). Rapport **NFC-clean** (vérifié). **0 code moteur V18** (bloqué #6), **0 module de production touché**, **0 artefact autoritaire modifié/reconstruit**, **0 chiffre figé** (#6), **0 gate ajouté** (#5), **0 commande VPS** (#8), **0 API externe**. Fichiers : `M 05_deliverables_mvp/daily_reports/2026-08-12.md` (3 blocs de currency) + ce journal. + +--- + +## Session `20260812_160204` — SURFACE · D-09 · séparateur de milliers monétaire divergent entre publiciste (espace) et faisabilité (virgule) + +**État au démarrage.** `./run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP** (baseline verte). Roadmap Sprints 1→8 **livrée + gatée + verte** ; séquence moteur V18 **bloquée** en gouvernance (D-06 = gate d'entrée · « NE PAS coder avant l'audit approuvé » · #6) → **aucun code moteur légitime** ; arbitrages D-01→D-08 en attente Michel. Historique récent = boucle de churn (sweeps CLEAN + re-currency du rapport), cause-racine déjà traitée (`1cf0e18`/`c73ed5b`). Objectif de session : **éviter un énième sweep-note stérile**, chercher un défaut/arbitrage RÉEL. + +**Chasse au défaut.** +- Grep TODO/FIXME/NotImplemented + READMEs indigents sur toute la prod → **RIEN** (le seul « placeholder » = design anti-invention `{{…}}` ; le seul README <15 l = fixture data_room). +- Balayage des spécificateurs de format `:g`/`:,`/`:f` en production (frère de l'arc « `:g` lossy » `e7cc3c4`/`5af86e3`/`g-format-lossy-for-human-numbers`). Les 2 `:g` restants sont **bornés + déjà annotés sûrs** (`crm/commissions/commlib/finance.py:86` percent 0-100 · `faisabilite/bancable/banclib/finance.py:143` = 0.52×nb-unités, borné à quelques centaines, justification in-situ) → axe `:g` **genuinement clos**, pas de bug. + +**Vrai locus = arbitrage de présentation transverse (non un bug, non gaté).** Le même montant est rendu **différemment** par les deux surfaces face au stakeholder : +- **Publiciste** (HTML marketing) → **espace** : `publiciste/lib/generator.py:34-39` (`f"{v:,.0f}".replace(",", " ")`) ⟹ `USD 8 560 000`. +- **Faisabilité** (rapport + bancable) → **virgule US** : `faisabilite/generator/genlib/renderer.py:28-37` + `faisabilite/bancable/banclib/report.py:21-32` (`,.0f` **sans** `replace`) ⟹ `USD 8,560,000`. +- Signaux partiels sans règle dure : le design system illustre le format public en **espace** (`OTO_DESIGN_SYSTEM_v1.md:89-90`, « dès 145 000 USD ») → suit le publiciste ; mais les fixtures sources écrivent en **virgule** (`data_room/P01/20_architecture/architecture.md:11`, « USD 150,000 ») → suit la faisabilité. L'exemple DS place aussi le montant AVANT la devise, ce qu'aucun des deux ne fait — donc pas de calque littéral possible. + +**Action = SURFACE, don't rewrite.** Ajout de **D-09** au `OPEN_DECISIONS_REGISTER.md` (+ note d'en-tête « Ajout »). Choisir un séparateur unique = **convention de présentation transverse** (arbitrage design/audience), pas une correction ponctuelle worker ; l'imposer unilatéralement réécrirait implicitement une règle DS ou la graphie des sources (#6). Les deux rendeurs sont **internes-cohérents et testés** ; **aucune sortie formatée n'est un artefact commité** (les `out/` des deux modules ne stockent que des nombres bruts — le formatage vit dans le HTML/rapport généré au runtime VPS · #8) → **aucun gate concerné**. + +**Pourquoi PAS un gate (#5) / PAS un fix.** Arbitrage produit ouvert (classe D-01…D-08) : le registre *regroupe et source, il ne tranche pas*. Aucun défaut de correctness (les deux formats sont valides, ni exponentiel ni arrondi — distinct de la classe `:g`). Une seule occurrence-classe → pas de gate. + +**Vérif.** `./run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP** (inchangé — édition d'un document éditorial, 0 dépendance de gate). **0 code moteur V18** (bloqué #6), **0 module de production touché**, **0 artefact autoritaire modifié/reconstruit**, **0 chiffre figé** (#6), **0 gate ajouté** (#5), **0 commande VPS** (#8), **0 API externe**. Fichiers : `M 05_deliverables_mvp/OPEN_DECISIONS_REGISTER.md` (D-09 + note d'en-tête) + ce journal. diff --git a/05_deliverables_mvp/OPEN_DECISIONS_REGISTER.md b/05_deliverables_mvp/OPEN_DECISIONS_REGISTER.md index c193338..0ec3716 100644 --- a/05_deliverables_mvp/OPEN_DECISIONS_REGISTER.md +++ b/05_deliverables_mvp/OPEN_DECISIONS_REGISTER.md @@ -25,6 +25,11 @@ > commits `85cd625`/`1992ee6` ont décalé `_cond_validation_wag`) ; D-01 `legal/confotur/README.md:8-17 > → :32-33` (bannière de statut V18 préfixée). Sweep des autres citations = résolvent (snapshots > V18/directives datés = stables). +> +> **Ajout** — 2026-08-12 · session `20260812_160204` : **D-09** (séparateur de milliers divergent +> entre surfaces de rendu monétaire publiciste / faisabilité). Arbitrage de présentation +> stakeholder ; ni un bug worker ni gaté (aucune sortie formatée n'est un artefact commité) — +> **surfacé, pas tranché**. --- @@ -216,6 +221,46 @@ fine A1-A20, contenue dans la directive complète **non lisible** (§0 · #8). * --- +## D-09 · 🟠 Présentation : séparateur de milliers divergent entre les deux surfaces de rendu monétaire (publiciste = espace · faisabilité = virgule) + +**Décision attendue** — Michel (ou le design system) doit **fixer la convention canonique** du +séparateur de milliers pour les montants **face au stakeholder**, puis harmoniser les deux +rendeurs sur ce choix. Options : (a) **espace** partout (`USD 8 560 000`), aligné sur l'exemple +public du design system ; (b) **virgule US** partout (`USD 8,560,000`), aligné sur la graphie des +`data_room` sources ; (c) convention **par audience** (espace pour le marketing public, virgule +pour le dossier technique/banquier) — statu quo assumé et documenté. + +**Constat** — deux modules rendent le **même montant** différemment, tous deux face au stakeholder : +- **Publiciste** (HTML marketing public) → **espace** : + `05_deliverables_mvp/publiciste/lib/generator.py:34-39` + (`_fmt_usd`/`_fmt_dop` = `f"{value:,.0f}".replace(",", " ")`) ⟹ `USD 8 560 000`. +- **Faisabilité** (rapport de faisabilité + bancable) → **virgule** : + `05_deliverables_mvp/faisabilite/generator/genlib/renderer.py:28-37` (`_money`, docstring `:29` + « USD 250,000 ») et `05_deliverables_mvp/faisabilite/bancable/banclib/report.py:21-32` + (`_money`/`_int` = `,.0f` / `:,`, **sans** `replace`) ⟹ `USD 8,560,000`. + +**Signaux partiels (pas de règle dure)** — le design system illustre le format public avec un +**espace** (`OTO_DESIGN_SYSTEM_v1.md:89-90`, « ### Séparateur privilégié » → ex. « dès 145 000 USD »), +ce que suit le publiciste ; mais les fixtures `data_room` sources écrivent en **virgule US** +(`publiciste/fixtures/data_room/P01/20_architecture/architecture.md:11` → « USD 150,000 »), ce que +suit la faisabilité. À noter aussi : l'exemple du design system place le **montant avant la devise** +(`145 000 USD`), alors que **les deux** modules mettent la devise **en tête** (`USD …`) — donc aucun +des deux ne calque l'exemple à la lettre. Aucune directive datée ne tranche le séparateur. + +**Pourquoi worker n'édite pas** — Choisir un séparateur unique impose une **convention de présentation +transverse** (arbitrage design/audience), non une correction ponctuelle ; l'imposer unilatéralement +réécrirait implicitement une règle du design system ou la graphie des sources (#6). Les deux rendeurs +sont **internes-cohérents et testés** ; aucune sortie formatée n'est un **artefact commité** (les +`out/` des deux modules ne stockent que des nombres bruts — le formatage vit dans le HTML/rapport +généré au runtime VPS · #8), donc **aucun gate n'est concerné**. + +**Sources / surface** — surfacé session `20260812_160204` (balayage des spécificateurs de format +`:g`/`:,`/`:f` de production, frère de l'arc « `:g` lossy » des commits `e7cc3c4`/`5af86e3`). Les deux +`:g` de production restants sont bornés + annotés sûrs (`crm/commissions/commlib/finance.py:86` +percent 0-100 · `faisabilite/bancable/banclib/finance.py:143` unités bornées) — hors périmètre de D-09. + +--- + ## Rappel de discipline - Ces items sont **surfacés, pas tranchés** : les éditer côté worker violerait #6 (invention) ou réécrirait une source d'autorité (`CLAUDE.md`, une directive datée).