From 6b61ff8b68c3cf088ecee16163d12f49e5b2036c Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Wed, 5 Aug 2026 10:49:58 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker=2020260805=5F104219]=20FIX=20de=20C?= =?UTF-8?q?OH=C3=89RENCE=204Big=20:=20acceptance=5Fgen.py=20=C3=A9tait=20l?= =?UTF-8?q?e=20SEUL=20des=2023=20g=C3=A9n=C3=A9rateurs=20=C3=A0=20rompre?= =?UTF-8?q?=20la=20convention=20universelle=20de=20code=20de=20sortie=20(m?= =?UTF-8?q?ain()=20->=20None=20+=20appel=20nu=20`main()`=20vs=20`->=20int`?= =?UTF-8?q?=20+=20`raise=20SystemExit(main())`=20chez=20les=2022=20autres)?= =?UTF-8?q?=20=E2=86=92=20align=C3=A9=20(cmd=5Fbuild/cmd=5Fvalidate/main?= =?UTF-8?q?=20->=20int,=20return=200,=20SystemExit(main()))=20;=20le=20par?= =?UTF-8?q?am=C3=A8tre=20`argv`=20que=20tous=20exposent=20pour=20la=20test?= =?UTF-8?q?abilit=C3=A9=20renvoyait=20None=20au=20lieu=20de=200=20=C3=A0?= =?UTF-8?q?=20un=20appelant=20programmatique.=20Comportement=20inchang?= =?UTF-8?q?=C3=A9=20(chemin=20d'=C3=A9chec=20`=5Fvalidate=5For=5Fdie`=20->?= =?UTF-8?q?=20sys.exit(1)=20pr=C3=A9serv=C3=A9,=20succ=C3=A8s=3D0/=C3=A9ch?= =?UTF-8?q?ec=3D1),=20artefacts=20byte-identiques,=2037=20tests=20OK,=2033?= =?UTF-8?q?=20PASS=20CI.=20Classe=20docstring-vs-code=20audit=C3=A9e=20end?= =?UTF-8?q?-to-end=20aujourd'hui=20(23=20gen=20+=20*lib/=20helpers)=20=3D?= =?UTF-8?q?=20exacte=20par=20ailleurs.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- 05_activity_log/2026-08-05.md | 39 +++++++++++++++++++ .../qa/acceptance/acceptance_gen.py | 12 +++--- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/05_activity_log/2026-08-05.md b/05_activity_log/2026-08-05.md index ada7ad7..3b63247 100644 --- a/05_activity_log/2026-08-05.md +++ b/05_activity_log/2026-08-05.md @@ -1,5 +1,44 @@ # Activity Log · 2026-08-05 · Claude Code DTP Worker +## Session 104219 · FIX de COHÉRENCE 4Big — `qa/acceptance/acceptance_gen.py` était le **SEUL outlier sur 23 générateurs** à rompre la convention universelle de code de sortie : `main()` typé `-> None` + appel nu `main()` (au lieu de `-> int` + `raise SystemExit(main())` chez les 22 autres) → aligné (`cmd_build`/`cmd_validate`/`main` → `int`, `return 0`, `raise SystemExit(main())`) · comportement inchangé · artefacts byte-identiques · 0 chiffre inventé · 0 gate ajouté + +**Contexte + choix de tâche.** `./run_ci.sh` au démarrage : **33 PASS · 0 FAIL · 0 SKIP**, arbre propre, +roadmap `ROADMAP_8_WEEKS_OR_LESS.md` intégralement livrée/gatée. Aucune tâche fonctionnelle in-repo +restante → chasse à la dérive réelle non-gatée. **Audit end-to-end de la classe *docstring-vs-code drift*** +(récurrente/non-close · [[docstring-vs-code-drift]]) : sweep des docstrings de sortie des 23 générateurs + +des modules `*lib/` helper (que l'Explore scopé `*_gen.py` rate). **Tous vérifiés exacts** : `financement` +7 fichiers out ✓, `seo` 4 hand-off ✓, `confotur` 14 invariants (ledger `# N ·` numéroté 1..14) ✓, +`userperm` ✓ ; le parser `publiciste/lib/parser.py` mappe fidèlement ses 6 sources→§ (§1.1 localisation, +§3.2 typologies, §3.3 services) — aucun phantom résiduel (cf. l'ancien §5.3 déjà corrigé). Root README +`24/24 · 15 promesses (8+7)` re-dérivé des artefacts (`quality_report.coverage`, `acceptance/MANIFEST`) = +exacts. **Classe doc-drift saturée aujourd'hui.** + +**Le seul écart concret trouvé (cohérence de code, pas dérive doc).** Un Explore sur la classe a signalé +`acceptance_gen.py` comme atypique. Vérité-terrain (`grep` `def main` + bloc `__main__` des 23) : +**22/23 générateurs** exposent `def main(...) -> int:` retournant `0`, `cmd_* -> int`, et +`raise SystemExit(main())` dans `__main__` — la CLI **propage un vrai code de sortie**. `acceptance_gen` +seul : `main(argv=None) -> None` + `cmd_build/cmd_validate -> None` + appel nu `main()`. Le chemin d'échec +restait correct (`_validate_or_die` → `sys.exit(1)` interne, L280), **donc pas un bug fonctionnel** — mais +un appelant programmatique (`rc = gen.main(["validate"])`, la **raison d'être** du paramètre `argv` que +tous les frères exposent pour la testabilité) recevait `None` au lieu de `0`. **Défaut de cohérence 4Big +réel** (1 outlier / 23), pas une invention. + +**Fix minimal, comportement préservé.** 4 annotations `-> None`→`-> int`, deux `return 0` en fin de +`cmd_*`, `return args.func(args)`, `main()`→`raise SystemExit(main())` (7+/5− sur 1 fichier). Le chemin +d'échec `sys.exit(1)` est **inchangé** (succès=0, échec=1 comme avant). Les tests n'assertent que +« succès ne lève pas » (`test_validate_exits_zero` : `gen.main(["validate"])` sans vérifier le retour) → +inchangés au vert. + +**Vérifications.** `python3 -m unittest` = **Ran 37 tests · OK** · `main(["validate"])` **renvoie 0** +(était `None`), `validate` rc=**0** · rebuild `build -o /tmp` → `acceptance_matrix.json` + `MANIFEST.json` +**byte-identiques** à `out/` (aucune dérive d'artefact · [[artifact-reproducibility-gate]], pas de rebuild +de consommateur nécessaire) · `./run_ci.sh` final : **33 PASS · 0 FAIL · 0 SKIP**. + +**Bilan.** 1 fichier touché · **0 changement de comportement** (exit 0/1 identiques) · **0 artefact modifié** +· **0 gate ajouté** (#5 · la convention `-> int`/`SystemExit(main())` reste une norme de style non gatée, +défaut isolé unique — comme les typos d'origine, ne justifie pas un 34e check) · **0 chiffre inventé** (#6) +· **0 commande VPS** (#8) · **aucun `git clean`** . + ## Session 094211 · FIX RÉEL — le README module **SEO** annonçait « 36 tests (dont **8** injections négatives) » alors que la suite en compte **10** `test_negative_*` (faux depuis le commit d'origine `0d3b242`, jamais gaté) → corrigé **8→10** ; toute la classe « sous-compte négatif en prose » (seo/devops/confotur) auditée · 0 gate ajouté · 0 chiffre inventé **Contexte + choix de tâche.** `./run_ci.sh` au démarrage : **33 PASS · 0 FAIL · 0 SKIP**, arbre propre, diff --git a/05_deliverables_mvp/qa/acceptance/acceptance_gen.py b/05_deliverables_mvp/qa/acceptance/acceptance_gen.py index d098239..8896c1d 100644 --- a/05_deliverables_mvp/qa/acceptance/acceptance_gen.py +++ b/05_deliverables_mvp/qa/acceptance/acceptance_gen.py @@ -280,7 +280,7 @@ def _validate_or_die(bundle: dict) -> None: sys.exit(1) -def cmd_build(args) -> None: +def cmd_build(args) -> int: bundle = _build_bundle() _validate_or_die(bundle) out_dir = args.out or _DEFAULT_OUT @@ -297,17 +297,19 @@ def cmd_build(args) -> None: f"hors-périmètre sourcés.") print(f" → {os.path.join(out_dir, 'acceptance_matrix.json')}") print(f" → {os.path.join(out_dir, 'MANIFEST.json')}") + return 0 -def cmd_validate(args) -> None: +def cmd_validate(args) -> int: bundle = _build_bundle() _validate_or_die(bundle) cov = bundle["manifest"]["coverage"] print(f"✅ Matrice valide — bijective={cov['bijective']} · " f"partition_ok={cov['partition_ok']} · verdict={bundle['verdict']}.") + return 0 -def main(argv=None) -> None: +def main(argv=None) -> int: p = argparse.ArgumentParser( prog="acceptance_gen", description="Matrice d'acceptation / traçabilité MVP (roadmap → preuve).") @@ -322,8 +324,8 @@ def main(argv=None) -> None: v.set_defaults(func=cmd_validate) args = p.parse_args(argv) - args.func(args) + return args.func(args) if __name__ == "__main__": - main() + raise SystemExit(main())