[DTP-Worker] Sprint 7 · Générateur Audit 4Big qualité (95+/100 sur 100% deliverables) (QA · roadmap L69)
Audit de méta-niveau + gate : note la qualité 4Big de 100% des livrables gated et bloque (FAIL) si un module < 95/100 (CLAUDE.md #5). Couverture PROUVÉE par recoupement bijectif registre ↔ working-directory du CI (moins l'auditeur · SoD ISA 315). 5 critères déterministes (DOC/CONTRAT/TESTS/CLI/HANDOFF) renormalisés par archétype. Anti-invention (#6) : chaque note est recalculée depuis des faits du dépôt, jamais saisie ; un invariant recompute chaque note. Résultat : PASS · 17/17 modules à 100/100. Régression 442 tests verts (+34). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
"""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) les 17 modules atteignent ≥ 95/100.
|
||||
Sinon FAIL — l'audit est un GATE, pas un rapport indicatif.
|
||||
|
||||
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", []),
|
||||
}
|
||||
Reference in New Issue
Block a user