[DTP-Worker] Sprint 8 · buffer L75 · Domaine QA/Audit 4Big (2e surface) : la CARTE DE RENORMALISATION PAR ARCHÉTYPE de l'auditeur (« data_room (sans HANDOFF) · parser (sans CONTRAT … ni HANDOFF) · contract (sans CLI ni HANDOFF) ») était transcrite À LA MAIN dans le README du module sans AUCUN gate. La session précédente a gaté le BARÈME (nombre de critères + poids par critère de la table + « generator (N critères) », recomputés de quality_report.criteria) mais PAS les exclusions des trois autres archétypes — surface data-derived distincte du MÊME README. Cette carte dérive de quality_report.json.modules (byte-gaté par check_artifacts) : pour un archétype, l'ensemble des critères APPLICABLES = {check.criterion} de ses modules (les non-applicables sont ABSENTS des checks) ⇒ EXCLUS = ordre du barème − applicables. Changer la règle de renormalisation d'un archétype (ex. data_room exclut aussi CLI) ferait dériver la prose en silence pendant que l'artefact dit autre chose — « vert trompeur » qu'aucune suite tests/ (qui teste des FONCTIONS, pas la prose) n'attrape → nouveau bloc (6) dans check_readme_claims recomputant PAR archétype l'ensemble des critères exclus depuis les checks de quality_report.modules (zéro duplication du modèle de renormalisation #6) et exigeant que la parenthèse du README l'énumère EXACTEMENT. Contrôle par ensemble (mauvais critère, sous-ensemble ET sur-ensemble mordus), pas seulement présence. Bonus d'uniformité : tous les modules d'un même archétype portent le MÊME jeu applicable (« 1 archétype → 1 jeu de critères », base même de la carte). Un claim absent échoue AUSSI (3 morsures vérifiées : data_room « sans HANDOFF »→« sans CLI » capté · parser exclusion HANDOFF retirée = sous-ensemble capté · énumération contract disparue = red ; restauré = green : 4 archétypes uniformes · data_room/parser/contract == référentiel). État courant : aucune exclusion périmée (anti-invention #6, rien à réécrire) — le défaut est la surface ungated. ci/README.md (table + détail) mis à jour · 7 gates re-verts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-31 14:08:51 +00:00
parent 327aa298a2
commit abc9b62214
3 changed files with 127 additions and 1 deletions
+51
View File
@@ -320,6 +320,12 @@ else:
# len(criteria) checks — c.-à-d. « generator = tous les critères » (mord une dérive
# du modèle qui rendrait le « generator (N critères) » du README faux). Un claim
# absent échoue AUSSI (disparition = régression de traçabilité).
# Bloc (6) : la carte de RENORMALISATION PAR ARCHÉTYPE (« data_room sans HANDOFF ·
# parser sans CONTRAT ni HANDOFF · contract sans CLI ni HANDOFF ») est elle aussi
# data-derived — critères applicables d'un archétype = {check.criterion} de ses
# modules ⇒ exclus = barème applicables. Recomputés par archétype, comparés à la
# parenthèse du README (exclusions des 3 archétypes non-generator, jamais gatées
# avant), + uniformité « 1 archétype → 1 jeu ».
# ============================================================================
try:
qr_crit = load("qa/audit_4big/out/quality_report.json")
@@ -378,6 +384,51 @@ if criteria is not None and a4_txt:
else:
good(f"README audit_4big · {len(gen)} module(s) generator portent {n_crit} "
f"checks (« generator = tous les critères » vérifié)")
# 6) carte « archétype → critères EXCLUS » (renormalisation) : le README énumère
# data_room « sans HANDOFF », parser « sans CONTRAT … ni HANDOFF », contract
# « sans CLI ni HANDOFF ». Cette carte est DATA-DERIVED : pour un archétype,
# l'ensemble des critères APPLICABLES = {check.criterion} de ses modules (les
# non-applicables sont ABSENTS des checks) ⇒ EXCLUS = ordre du barème appl.
# Le bloc (3) ne recompute QUE generator (5 critères) ; les exclusions des
# trois autres archétypes n'étaient recomputées par AUCUN gate. Changer la
# règle de renormalisation d'un archétype (ex. data_room exclut aussi CLI)
# ferait dériver cette prose en silence pendant que quality_report dit autre
# chose. On recompute par archétype + on exige que la parenthèse du README
# énumère EXACTEMENT cet ensemble. Uniformité en bonus : tous les modules
# d'un même archétype portent le MÊME ensemble applicable (sinon la carte
# « 1 archétype → 1 jeu de critères » n'a pas de sens).
crit_ids = [c["id"] for c in criteria]
crit_set = set(crit_ids)
by_arch, uni_bad = {}, []
for m in qr_crit["modules"]:
a = m.get("archetype")
appl = frozenset(ck["criterion"] for ck in m.get("checks", []))
if a in by_arch and by_arch[a] != appl:
uni_bad.append(m["id"])
else:
by_arch.setdefault(a, appl)
if uni_bad:
bad(f"README audit_4big · archétypes NON uniformes (modules aux critères "
f"applicables divergents) : {uni_bad} → renormalisation incohérente")
else:
good(f"README audit_4big · {len(by_arch)} archétype(s) à critères applicables "
f"uniformes (« 1 archétype → 1 jeu » vérifié)")
for a in sorted(by_arch):
if a == "generator":
continue # traité en (3) : « generator (N critères) », zéro exclusion
exp = [c for c in crit_ids if c not in by_arch[a]] # ordre du barème, stable
ma = re.search(rf"`{re.escape(a)}` \(([^)]*)\)", a4_txt)
if ma is None:
bad(f"README audit_4big · archétype `{a}` — énumération INTROUVABLE dans "
f"{A4} (attendu « sans {' ni '.join(exp)} »)")
continue
got = set(re.findall(r"[A-Z]{2,}", ma.group(1))) & crit_set
if got == set(exp):
good(f"README audit_4big · archétype `{a}` — exclus {sorted(got)} == "
f"référentiel ({exp})")
else:
bad(f"README audit_4big · archétype `{a}` — {A4} exclut {sorted(got)} MAIS "
f"le référentiel exclut {exp} → régénérer le README")
# ============================================================================
# Fiches agents · comptes de tests PAR SUITE (colonne « Tests » des tables) —