# Activity log · 2026-08-02 · Claude Code DTP Worker ## Sprint 8 · buffer · Publiciste — gate d'ANCRAGE des DEVISES du site public sur CLAUDE.md #10 **Contexte** — Série anti-dérive Sprint 8 (CLAUDE.md #6 « zéro invention de chiffres »). Le bloc `Publiciste/branding` existant ancre les **4 tokens DESIGN** de CLAUDE.md #4 (2 couleurs + 2 typographies) sur leurs 4 copies. Mais le MÊME module publiciste porte une **2ᵉ constante constitutionnelle** — les **devises CLAUDE.md #10 (« USD + DOP »)** — recopiée à 4 endroits data-derived, **aucun gaté**, tous invisibles à `check_artifacts` (pas un `out/*.json`) : 1. `lib/branding.py` `DEVISE_PRIMAIRE`/`DEVISE_SECONDAIRE` — constantes auto- étiquetées « contrainte #10 · USD + DOP », sans gate ; 2. `lib/generator.py` `_fmt_usd`/`_fmt_dop` — les **formateurs qui IMPRIMENT le code devise sur la grille de prix du site public** `vente.otov7.com` (sortie face-public : une devise hors #10 = mandat trahi en silence) ; 3. `lib/generator.py` footer HTML « Prix … en USD + DOP (Cardnet) » ; 4. `tests/test_publiciste.py` — l'oracle hardcodé `assertIn("USD 150 000", …)`, une copie de plus jamais comparée à CLAUDE.md. Aucune suite `tests/` (qui teste des **fonctions** de rendu, pas l'ancre à CLAUDE.md) n'attrape la dérive : renommer la devise #10 et aligner le module reste vert alors que le site émettrait la mauvaise devise ; ne rien bouger reste vert alors que `branding.py` se dit « #10 » en mentant. **Gate ajouté** (`ci/check_readme_claims.sh`, bloc « Publiciste/generator+branding · DEVISES CANONIQUES ») — RE-PARSE les 2 devises depuis la ligne #10 de CLAUDE.md (indépendamment de `exp` amont · aucun skip hérité) puis exige : - **(a)** `branding.py` DEVISE_PRIMAIRE/SECONDAIRE == #10 (ordre inclus) ; - **(b)** l'ensemble des codes émis par les formateurs `generator.py` == #10 ; - **(c)** le footer HTML cite les 2 devises dans l'ordre + `(Cardnet)` ; - **(d)** l'oracle du test == devise primaire #10. Un claim absent échoue AUSSI (traçabilité #6 · anti-évaporation). **Vérif** — 5 checks verts sur l'arbre propre. **6 morsures** adversariales : M1 branding primaire USD→EUR · M2 formateur `_fmt_usd`→EUR (hors #10) · M3 footer USD+DOP→USD+EUR · M4 oracle test → EUR · **M5 CLAUDE.md #10 USD→EUR = cascade sur les 4 copies simultanément** (preuve que l'ancre est CLAUDE.md, pas la cohérence interne) · M6 footer supprimé → INTROUVABLE. Gates re-verts : `check_readme_claims` · `check_docs` · `guard_constraints` · `check_ci_integrity` tous exit 0.