[DTP-Worker 20260802_223614] Sprint 8 · buffer · Dérive doc-vs-CODE réelle : docstring q4lib/builder.py « 17 modules » périmé (17→22)

Sweep docstring-vs-CODE des sous-paquets lib/ (nouveau périmètre vs les
générateurs de tête déjà balayés). Concordance quasi totale — UNE dérive réelle :
le docstring d'en-tête de qa/audit_4big/q4lib/builder.py annonçait « les 17 modules
atteignent >= 95/100 » alors que l'artefact commité out/quality_report.json porte
totals.modules = 22 (tous PASS). Le compte a grandi 17->22 au fil des livrables gatés.

Preuve d'antériorité : ci/check_readme_claims.sh l.414-417 documente CETTE dérive
exacte — « 17/17 SAISI À LA MAIN … PÉRIMÉ … (17 -> 22) » — et re-calcule le compte
du README de l'auditeur (désormais 22/22), MAIS le gate ne couvre pas le docstring
du module (les docstrings ne sont pas count-checkés · classe docstring-vs-code-drift).
Le même « 17 » gaté dans le README a survécu, non gaté, dans le docstring de prod.

Correction anti-re-dérive : pas de substitution « 22 » (re-dériverait au module #23) ;
reformulé en énonçant la RÈGLE réelle du builder (verdict = coverage.ok AND not below
=> TOUS les modules audités >= 95/100), + note que le compte est DÉRIVÉ (len(modules)
== totals.modules). Aligné fix-vs-gate (décrire depuis l'autorité = le code).

Zéro module · zéro gate (#5) · un seul fichier de prod touché (docstring seul, zéro
logique) · run_ci.sh 30 PASS · README module gaté déjà à 22/22 (concordant).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-02 22:40:40 +00:00
parent 828fa838e0
commit 16db05af20
2 changed files with 44 additions and 2 deletions
+39
View File
@@ -2078,3 +2078,42 @@ fantôme ; docstring/help `demo_scenario_gen` omettant `run_sheet.md`). Chaque a
seuls des fichiers de doc/log touchés). **Zéro nouveau module · zéro gate ajouté (#5) · seuls des fichiers de doc/log touchés). **Zéro nouveau module · zéro gate ajouté (#5) ·
zéro fichier de production modifié** (reporting + vérification pure). Aucune commande zéro fichier de production modifié** (reporting + vérification pure). Aucune commande
touchant au VPS (#8) · aucun `git clean` (#interdits). touchant au VPS (#8) · aucun `git clean` (#interdits).
---
## Session `20260802_223614` — Dérive doc-vs-CODE réelle : docstring `q4lib/builder.py` « 17 modules » périmé (17 → 22)
**Contexte.** Reprise buffer Sprint 8, veille saturée. CI vert d'entrée
(`./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP**). Roadmap intégralement livrée.
**Analyse — sweep docstring-vs-CODE des `lib/` submodules (classe RÉCURRENTE, non close).**
Les sessions précédentes avaient balayé les **déclarations de sortie** des 22 générateurs
de tête. Nouveau périmètre ce jour : les **docstrings de module** des sous-paquets `lib/`
(là où la vraie dérive du parser publiciste vivait). Extraction AST de tous les docstrings
mentionnant des I/O (Sources lues / Entrées / Sortie / fallback / §), confrontés au code.
**Résultat : concordance quasi totale** — parser publiciste propre (6 sources lues = 6 lues
dans `parse_projet`/`_sources_presentes`), tous les builders/deps/frappe fidèles.
**UNE dérive réelle trouvée.** Docstring `qa/audit_4big/q4lib/builder.py` l.4 :
« (b) les **17** modules atteignent ≥ 95/100 ». Or l'artefact commité
`out/quality_report.json` porte `totals.modules = **22**` · `coverage.ci_modules_count = 22`
· `pass = 22`. **Preuve d'antériorité de la dérive :** le gate `ci/check_readme_claims.sh`
l.414-417 la documente noir sur blanc — « 17/17 modules SAISI À LA MAIN … PÉRIMÉ en silence
quand des modules ont été ajoutés (17 → 22) ». Le gate **recalcule** le compte du *README*
de l'auditeur (désormais « 22/22 » l.68) — mais le **docstring du module** est resté hors
couverture (les docstrings ne sont ni link- ni count-checkés · cf. mémoire
`docstring-vs-code-drift`). Le même « 17 » gaté dans le README avait survécu, non gaté, dans
le docstring de production.
**Correction — honnête ET anti-re-dérive (pas de substitution d'un compte magique).**
Le verdict réel du builder est `PASS ssi coverage.ok AND not below` — le nombre de modules
est **DÉRIVÉ** (`len(modules)`), jamais figé. Remplacer « 17 » par « 22 » ne ferait que
re-dériver au module #23. Reformulé en énonçant la **RÈGLE** : « TOUS les modules audités
atteignent ≥ 95/100 (aucun sous le seuil) », + note explicite que le compte est dérivé
(`len(modules)` == `totals.modules`, 17 → 22 à ce jour) et ne se retouche pas ici. Aligné
sur l'éthos `fix-vs-gate` (ne pas empiler un gate N+1 ; décrire depuis l'autorité = le code).
**Vérifications.** `./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP** (inchangé — docstring seul,
zéro changement de logique). README module gaté déjà à **22/22** (concordant). **Zéro nouveau
module · zéro gate ajouté (#5) · un seul fichier de production touché (docstring)**. Aucune
commande VPS (#8) · aucun `git clean`.
@@ -1,8 +1,11 @@
"""Assemblage déterministe du rapport d'audit 4Big. """Assemblage déterministe du rapport d'audit 4Big.
Verdict global = PASS ssi (a) la couverture est bijective vs le CI (100% des Verdict global = PASS ssi (a) la couverture est bijective vs le CI (100% des
livrables gated, hors auditeur) ET (b) les 17 modules atteignent ≥ 95/100. livrables gated, hors auditeur) ET (b) TOUS les modules audités atteignent
Sinon FAIL — l'audit est un GATE, pas un rapport indicatif. ≥ 95/100 (aucun sous le seuil). Sinon FAIL — l'audit est un GATE, pas un rapport
indicatif. Le nombre de modules est DÉRIVÉ (`len(modules)` == `totals.modules`),
jamais figé ici : il croît quand un livrable est gated (17 → 22 à ce jour) sans
retoucher ce docstring.
Aucune date/horodatage → build reproductible + diffable (gate CI stable). Aucune date/horodatage → build reproductible + diffable (gate CI stable).
""" """