diff --git a/05_activity_log/2026-08-03.md b/05_activity_log/2026-08-03.md index 9aaba5a..acc64ee 100644 --- a/05_activity_log/2026-08-03.md +++ b/05_activity_log/2026-08-03.md @@ -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 · 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`).