[DTP-Worker 20260803_130717] Log session · drift-hunt docstring-vs-CODE · balayage des 12 générateurs restants = CLEAN

Audit read-only (agent Explore) des docstrings vs code réel des 12 *_gen.py non
encore couverts. Verdict CLEAN : 2 candidats remontés, tous deux faux positifs.
· ecf_dgii « omet ecf_spec.json » = convention des pairs (le jumeau commissions
  omet identiquement son bareme_spec.json ; les docstrings n'énumèrent que les
  contrats de cross-cohérence EXTERNES, pas le spec propre du module).
· confotur lit rbac via rbac_scan.load_contract() = docstring nomme correctement
  rbac_50_roles.json (le fichier est la source, direct ou via helper).
· ledger ecf sans « # 1 · » = by-design et GATÉ (check_readme_claims L1885-1960
  dérive #1 du schéma) — NE PAS ajouter de marqueur.
Zéro fichier prod modifié. run_ci.sh = 32 PASS · 0 FAIL · 0 SKIP.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-03 13:14:24 +00:00
parent f0827a7b6c
commit 0bdd400b45
+48
View File
@@ -977,3 +977,51 @@ input/output/fallback.
**Réalisé / gate-vert.** 1 ligne docstring alignée. `./run_ci.sh` en clôture = **32 PASS · 0 FAIL · **Réalisé / gate-vert.** 1 ligne docstring alignée. `./run_ci.sh` en clôture = **32 PASS · 0 FAIL ·
0 SKIP**. Commit `2e4ff2d`. 0 SKIP**. Commit `2e4ff2d`.
---
## Session `20260803_130717` · QA drift-hunt — docstring-vs-CODE (balayage des générateurs restants) · CLEAN
**État d'entrée.** Tous sprints livrés ; `./run_ci.sh` = **32 PASS · 0 FAIL · 0 SKIP**. Mode
maintenance/anti-dérive. Poursuite de la classe ouverte/récurrente [[docstring-vs-code-drift]] : la
session `123715` avait audité pie/manifest + financement_bancaire + mobile ; sessions antérieures
commissions + workflow_vente. Cette session balaie les **12 générateurs restants** non encore couverts.
**Audit (agent Explore, read-only).** Comparaison docstring module-level (inputs/fallbacks/outputs
annoncés) vs code réel (open/Path/read_text/json.load/from_path/PATH-constants ; write_text/json.dump)
pour : `faisabilite/generator`, `fiscal/ecf_dgii`, `seo`, `frontend/portails/workspaces`,
`crm/dossier_vente`, `legal/confotur`, `qa/{acceptance,audit_5d,regression}`,
`rbac/{fixtures_gen,roleprofile_gen,userperm_gen}`.
**Verdict : CLEAN.** Deux candidats remontés par l'agent, **tous deux faux positifs après
vérification manuelle** :
1. **`ecf_dgii_gen.py` « omet `ecf_spec.json` de ses inputs ».** *Non-dérive — convention des pairs.*
La docstring (L5-9) énumère les **3 contrats de cross-cohérence EXTERNES** (`workflow_vente_spec.json`
L7, `dossier_vente/doctype_spec.json` L8, `rbac_50_roles.json` L9), pas le **spec PROPRE** du module.
Le jumeau structurel exact `commissions_gen.py` fait à l'identique : il lit son propre
`bareme_spec.json` (L48, `_SPEC_PATH`) mais sa docstring (L5-8) n'énumère **que** les 3 mêmes
contrats externes, jamais son spec. Ajouter `ecf_spec.json` à ecf **créerait** une asymétrie avec
commissions. Par ailleurs la docstring ecf **acknowledge déjà** son spec comme 4ᵉ contrat :
L110 « 12 invariants de cross-coherence (**les 4 contrats**) » + L24-25 « e-CF↔workflow↔DocType↔RBAC »
(4 = e-CF-spec + les 3 externes). Cohérent.
2. **`confotur_application_gen.py` « lit rbac via helper `rbac_scan.load_contract()` ».** *Non-dérive.*
La docstring (L8) nomme correctement le fichier-source `rbac_50_roles.json` — que le CODE le lise
directement ou via un helper de scan, le fichier nommé **est** la source. Docstring exacte.
**Ledger ecf `# 1 ·` absent = by-design, gaté.** Le ledger de `_validate` porte des marqueurs `# 2 ·`
… `# 12 ·` (avec split `# 12a`/`# 12b`) mais **aucun `# 1 ·`**. Ce n'est pas une lacune : le gate
`ci/check_readme_claims.sh` (bloc « Fiscal · e-CF DGII », L1885-1960) **documente et exige** cette
convention — L1906-1907 « l'invariant 1 est la validation de SCHÉMA (`validate(bundle, schema)`), **non
marquée `# 1 ·`** ; les marqueurs couvrent 2..N » ; le gate calcule `ecf_led = sorted(_top | {1})` et
vérifie la contiguïté 1..12. Le README (« ## Les 12 invariants », item 1 = « Conformité au schéma »)
confirme l'énumération 1..12 avec schéma = #1. **Ne PAS ajouter de `# 1 ·`** (contredirait l'intention
de design gatée). Compte « 12 » aligné à SEPT surfaces (4 chaînes .py + 3 README), toutes gatées.
**Portée de la classe.** Avec ce balayage, **l'ensemble des générateurs `*_gen.py`** du dépôt est
désormais vérifié pour la classe docstring-vs-CODE (12 ici + 5 des sessions antérieures). La classe
reste **ouverte** ([[docstring-vs-code-drift]]) pour tout code NEUF, mais le parc existant est propre.
**Réalisé.** **Zéro fichier de production modifié** (aucune dérive réelle). Audit + vérification
manuelle des 2 faux positifs + inspection du gate ecf. `./run_ci.sh` = **32 PASS · 0 FAIL · 0 SKIP**
(inchangé). Session de vérification → commit log-only (rythme établi, cf. `f0827a7`).