From 354a68788da64c93aa398a3116d71923b8897fe6 Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Thu, 6 Aug 2026 02:20:04 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker=2020260806=5F021424]=20FIX=20argpar?= =?UTF-8?q?se-help=E2=86=94code=20=E2=80=94=20seo/seo=5Fgen.py=20help=20`b?= =?UTF-8?q?uild`=20nommait=20des=20fichiers=20de=20sortie=20INEXISTANTS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- 05_activity_log/2026-08-06.md | 40 ++++++++++++++++++++++++++++++ 05_deliverables_mvp/seo/seo_gen.py | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/05_activity_log/2026-08-06.md b/05_activity_log/2026-08-06.md index 914bad0..2f0468e 100644 --- a/05_activity_log/2026-08-06.md +++ b/05_activity_log/2026-08-06.md @@ -1,5 +1,45 @@ # Activity Log · 2026-08-06 · Claude Code DTP Worker +## Session `20260806_021424` — FIX argparse-help↔code (classe `docstring-vs-code-drift`, sous-classe help-text du fix `a8342e9`) · `seo/seo_gen.py` : le help `build` nommait des fichiers de sortie INEXISTANTS + +**Choix de tâche.** `./run_ci.sh` au démarrage = **33 PASS · 0 FAIL · 0 SKIP**, arbre propre. +Les 5 derniers commits étant currency/vérif-only, chasse **adversariale à un vrai défaut ungaté**, +en poursuivant la sous-classe ouverte par le fix `a8342e9` (session `004414`) : le **texte help +d'une sous-commande argparse énumérant ses fichiers de sortie**. Audit exhaustif des **22 +générateurs** (`*_gen.py` avec sous-commande `build`/`generate`) : annoncé-dans-le-help ↔ +réellement-écrit-par-le-code. + +**Résultat de l'audit.** 21/22 CLEAN — mais **1 vrai défaut** trouvé, haute confiance : +`05_deliverables_mvp/seo/seo_gen.py:293`. Le help `build` disait +`"genere seo_keywords/schema_org/hreflang + MANIFEST"`, or les fichiers RÉELLEMENT écrits +(`seo_gen.py:259-262`) sont `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`) ET l'extension `.json` sur tous : il nommait donc des fichiers **qui n'existent pas** +(`schema_org` ≠ `seo_schema_org.json`). Ce n'est pas un simple raccourci toléré — exactement la +classe du fix `a8342e9` (le help ment sur la surface de sortie que l'agent lit pour lancer son +propre livrable). + +**Preuve que c'était bien la SEULE surface fautive (fix en une passe).** Le docstring module +(`seo_gen.py:6-9`) ET le README (`README.md:15-18`) nomment déjà correctement les 4 fichiers +exacts (`out/seo_schema_org.json`, `out/seo_hreflang.json`, …) — c'est le help l'outlier, pas +l'inverse. Les modules frères (`commissions`, `audit_5d`, `app_config` post-`a8342e9`) énumèrent +des **noms de fichiers complets** ; `seo` était le seul en raccourci imprécis. + +**Fix (`seo_gen.py:293`).** Help → `"genere seo_keywords.json / seo_schema_org.json / +seo_hreflang.json / MANIFEST.json"` — exact, aligné sur le docstring/README du module ET la +convention des frères. Style respecté : ASCII sans-accent (`genere`, comme le reste du fichier). + +**Pourquoi 0 gate ajouté (#5).** Le help n'est ni sérialisé dans un artefact ni parsé par un gate +(le gate `check_readme_claims` « Entrée CLI » ne lit que le NOM `add_parser("build")` via AST, pas +le `help=`). Un gate parseur du help serait **fragile** : les 22 help strings n'ont PAS de +convention machine-parsable commune (`seo` en raccourci, `faisabilite` décrit un répertoire +`data_room/PXX/`, séparateurs `/` vs `+` mêlés). Mauvais compromis robustesse/valeur → la classe +reste couverte par l'audit périodique (ici 22/22 balayés), pas par un gate. + +**Non-régression.** Sortie `build` **byte-identical** aux 4 artefacts `out/` commités (help = code +pur, non sérialisé → 0 rebuild). `python3 -S seo_gen.py build/validate` OK. `run_ci.sh` **33 PASS · +0 FAIL · 0 SKIP**. 0 prod (#8), 0 artefact reconstruit, 0 chiffre inventé (#6 — tout recomputé). + ## Session `20260806_014423` — FIX prose-numérique canal stakeholder · le compte « bijection README↔réel » de la session `011419` sous-comptait (14 → **16**) · 0 édition de production **Choix de tâche.** `./run_ci.sh` au démarrage = **33 PASS · 0 FAIL · 0 SKIP**, arbre propre, diff --git a/05_deliverables_mvp/seo/seo_gen.py b/05_deliverables_mvp/seo/seo_gen.py index 4be84b6..a4c733f 100644 --- a/05_deliverables_mvp/seo/seo_gen.py +++ b/05_deliverables_mvp/seo/seo_gen.py @@ -290,7 +290,7 @@ def main(argv: list[str] | None = None) -> int: p = argparse.ArgumentParser(description="Generateur SEO trilingue (Sprint 6 · SEO).") sub = p.add_subparsers(dest="cmd", required=True) - pb = sub.add_parser("build", help="genere seo_keywords/schema_org/hreflang + MANIFEST") + pb = sub.add_parser("build", help="genere seo_keywords.json / seo_schema_org.json / seo_hreflang.json / MANIFEST.json") pb.add_argument("--master", default=None, help="projets_master.json (defaut: fixtures/)") pb.add_argument("-o", "--out", default=_DEFAULT_OUT, help="dossier de sortie (defaut: ./out)") pb.set_defaults(func=cmd_build)