Files
oto-enterprise-os-dtp/05_deliverables_mvp/qa/audit_4big/q4lib/builder.py
T
Claude Code DTP Worker 16db05af20 [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>
2026-08-02 22:40:40 +00:00

56 lines
1.9 KiB
Python

"""Assemblage déterministe du rapport d'audit 4Big.
Verdict global = PASS ssi (a) la couverture est bijective vs le CI (100% des
livrables gated, hors auditeur) ET (b) TOUS les modules audités atteignent
≥ 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).
"""
from __future__ import annotations
from typing import Any
from . import registry, scoring
REPORT_NAME = "OTO QA · Audit 4Big Qualité"
def build(spec: dict[str, Any]) -> dict[str, Any]:
coverage = registry.coverage_report(spec)
modules = scoring.score_all(spec)
scores = [m["score"] for m in modules]
below = [m["id"] for m in modules if m["verdict"] != "PASS"]
totals = {
"modules": len(modules),
"pass": sum(1 for m in modules if m["verdict"] == "PASS"),
"fail": len(below),
"min_score": min(scores) if scores else 0,
"max_score": max(scores) if scores else 0,
"pass_rate_pct": scoring._round_half_up(
100.0 * sum(1 for m in modules if m["verdict"] == "PASS") / len(modules)
) if modules else 0,
}
verdict = "PASS" if (coverage["ok"] and not below) else "FAIL"
return {
"audit": REPORT_NAME,
"version": spec["version"],
"reference_cadre": spec["reference_cadre"],
"pass_score": spec["thresholds"]["pass_score"],
"coverage": coverage,
"criteria": [
{"id": c["id"], "label": c["label"], "weight": c["weight"]}
for c in spec["criteria"]
],
"modules": modules,
"totals": totals,
"verdict": verdict,
"notes": spec.get("notes", []),
}