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)