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())