Poursuite de la sous-classe help-text du fix a8342e9 (session 004414). Audit exhaustif
des 22 générateurs `*_gen.py` (help d'une sous-commande énumérant ses fichiers de sortie
↔ fichiers réellement écrits) → 21/22 CLEAN, 1 vrai défaut : seo_gen.py:293.
Le help `build` disait « genere seo_keywords/schema_org/hreflang + MANIFEST » alors que
le code (l.259-262) écrit seo_keywords.json, seo_schema_org.json, seo_hreflang.json,
MANIFEST.json : le help droppait le préfixe seo_ sur 2 des 3 fichiers (schema_org,
hreflang) + l'extension .json sur tous → nommait des fichiers INEXISTANTS
(schema_org ≠ seo_schema_org.json). Même classe que a8342e9.
Preuve fix-en-une-passe : docstring module (l.6-9) ET README (l.15-18) nommaient déjà
correctement les 4 fichiers exacts ; le help était le seul outlier, aligné maintenant
sur eux + la convention des frères (commissions/audit_5d/app_config = noms complets).
Style ASCII sans-accent du fichier respecté (genere).
0 gate (#5 — help ni sérialisé ni AST-parsé ; parseur de help fragile : pas de
convention commune aux 22, classe couverte par audit périodique). Sortie build
byte-identical aux 4 out/ commités (0 rebuild). 0 prod (#8), 0 chiffre inventé (#6).
run_ci 33 PASS · 0 FAIL · 0 SKIP.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Défaut réel (classe prose-facts-vs-numeric-drift) présent dans DEUX surfaces —
daily_reports/2026-08-06.md (l.48-54, canal stakeholder) ET 05_activity_log/2026-08-06.md
(entrée 011419) : l'« axe de vérification objectif » annonçait « concordance totale sur les
14 READMEs annonceurs » mais son énumération omettait 2 modules qui annoncent pourtant un
compte de tests dans leur README, tous deux concordants avec le réel — frontend/portails 19
(19 def test_) et demo/scenarios 39 (39 def test_). Le vrai total est 16 annonceurs / 9 sans
annonce, corroboré par l'en-tête faisant autorité de ci/check_readme_claims.sh (l.96 :
« 27 claims sur 16 modules »). Le « 11 sans annonce » était le complément erroné 25−14 → 9.
Fix (sweep des 2 surfaces en une passe, cf. prose-facts-vs-numeric-drift : un twin fix balaie
TOUTES les surfaces) : daily_reports 14→16 + ajout des 2 entrées manquantes + 11→9 + ancrage
explicite au gate ; journal 14→16 dans l'entrée 011419 (fait courant) avec commentaire de
traçabilité + nouvelle entrée documentant la correction. Chiffres recomputés, non saisis
(grep READMEs annonceurs=16 · def test_ concordance 16/16 · find tests=25 → complément 9).
Écarté au préalable : candidat comment↔code check_regression.sh:17 (« ran/passed/failures »)
= FAUX POSITIF — le commentaire décrit ce que l'ARTEFACT porte (le JSON a bien failures:0),
pas la ligne d'affichage l.79 ; le contrat réel = diff -q byte-à-byte du fichier entier l.71.
0 prod édité, 0 artefact rebuild, 0 gate ajouté (#5 — la surface README-count est déjà gatée),
0 chiffre inventé (#6), 0 VPS (#8). run_ci 33 PASS · 0 FAIL · 0 SKIP avant/après.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Chasse adversariale ciblée (classe RECURRING docstring↔code, scopée aux modules non balayés
la veille) → 1 vrai défaut ungaté. Le help= de sub.add_parser("build") énumérait 4 sorties
(app_config/eas_build/role_navigation/MANIFEST) alors que cmd_build() en écrit 5 : store_listing.json
(l.243) était omis. Docstring (l.15 « les 5 fichiers ci-dessus ») + README (l.56/68) listent bien
les 5. Nouvelle sous-classe help-text argparse du motif docstring↔code (2e surface prose dans le code,
distincte des open('w') vs docstring déjà balayés). Fix = ajout store_listing.json à sa position
canonique. Aucun gate/test ne fige la chaîne (grep -rn = 0 hit externe) → pas d'oracle à réaligner,
pas de gate ajouté (#5). Non-régression : help n'affecte aucune sortie, artefacts byte-identiques,
run_ci 33 PASS·0 FAIL·0 SKIP avant/après. Reste de l'audit (audit_5d/acceptance/regression/
deploy_runbook/commissions/dossier_vente/ecf/portails/faisabilite) CLEAN. 0 artefact rebuild, 0 VPS (#8).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>