[DTP-Worker 20260805_104219] FIX de COHÉRENCE 4Big : acceptance_gen.py était le SEUL des 23 générateurs à rompre la convention universelle de code de sortie (main() -> None + appel nu main() vs -> int + raise SystemExit(main()) chez les 22 autres) → aligné (cmd_build/cmd_validate/main -> int, return 0, SystemExit(main())) ; le paramètre argv que tous exposent pour la testabilité renvoyait None au lieu de 0 à un appelant programmatique. Comportement inchangé (chemin d'échec _validate_or_die -> sys.exit(1) préservé, succès=0/échec=1), artefacts byte-identiques, 37 tests OK, 33 PASS CI. Classe docstring-vs-code auditée end-to-end aujourd'hui (23 gen + *lib/ helpers) = exacte par ailleurs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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`** <!-- ci-allow : mention de l'interdit, jamais exécuté -->.
|
||||
|
||||
## 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,
|
||||
|
||||
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user