Le bloc Publiciste/branding existant ancre les 4 tokens DESIGN (#4 : couleurs + typographies). Le MÊME module porte une 2e constante constitutionnelle NON gatée : les devises CLAUDE.md #10 (« **USD + DOP** »), recopiées à 4 endroits data-derived, tous invisibles à check_artifacts (pas un out/*.json) : (a) branding.py DEVISE_PRIMAIRE/SECONDAIRE (auto-étiquetées « #10 · USD + DOP » sans gate) ; (b) 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) ; (c) footer HTML « Prix … en USD + DOP (Cardnet) » ; (d) l'oracle hardcodé assertIn("USD 150 000") du test — une copie jamais comparée à CLAUDE.md. Aucune suite tests/ (FONCTIONS de rendu, pas l'ancre à CLAUDE.md) n'attrape la dérive. Nouveau bloc : RE-PARSE les 2 devises depuis la ligne #10 de CLAUDE.md (indépendamment de exp amont · aucun skip hérité), exige (a) constantes branding == #10 ordre inclus ; (b) ensemble des codes émis par les formateurs == #10 ; (c) footer cite les 2 devises dans l'ordre + (Cardnet) ; (d) oracle test == devise primaire. Claim absent échoue AUSSI (#6). 6 morsures vérifiées (M5 : rename #10 CLAUDE.md-only cascade sur les 4 copies = preuve ancre live), 4 gates re-verts. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2.6 KiB
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) :
lib/branding.pyDEVISE_PRIMAIRE/DEVISE_SECONDAIRE— constantes auto- étiquetées « contrainte #10 · USD + DOP », sans gate ;lib/generator.py_fmt_usd/_fmt_dop— les formateurs qui IMPRIMENT le code devise sur la grille de prix du site publicvente.otov7.com(sortie face-public : une devise hors #10 = mandat trahi en silence) ;lib/generator.pyfooter HTML « Prix … en USD + DOP (Cardnet) » ;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.pyDEVISE_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.