[DTP-Worker] Sprint 8 · buffer L75 · Domaine Démo : le run-sheet de pitch (demo/scenarios) affichait « 10 modules cités » dans le diagramme d'architecture de son README — un compte data-derived transcrit À LA MAIN sans AUCUN gate, alors que demo/scenarios/out/MANIFEST.json (byte-gaté par check_artifacts, counts.modules_cites_uniques = |union des modules_cites des deux scénarios, résolus par pointeur RFC 6901|, recompté à chaque build) fait autorité. Ajouter un beat qui cite un module encore non tissé (11) OU retirer la dernière citation d'un module d'un scénario (9) ferait dériver le diagramme en silence pendant que l'artefact dit autre chose — « vert trompeur » qu'aucune suite tests/ (qui teste des FONCTIONS, pas la prose du README) n'attrape → nouveau bloc dans check_readme_claims recomputant le nombre depuis counts.modules_cites_uniques et exigeant l'égalité avec le README. Cohérence croisée en bonus : counts.modules_cites_uniques == |modules_cites| (liste dédupliquée du manifeste, elle-même sans doublon) — mord un compteur désynchronisé de sa propre liste. Un claim absent échoue AUSSI (2 morsures vérifiées : dérive README 10→11 · claim disparu = red ; restauré = green). 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:
@@ -977,6 +977,57 @@ if dr_ph is not None:
|
||||
bad(f"DevOps · {DR_RD} — énumération {listed} ≠ confirmations_ouvertes "
|
||||
f"{sorted(dr_open)} → régénérer le README")
|
||||
|
||||
# ============================================================================
|
||||
# Démo · run-sheet de pitch (nombre de modules cités) — même classe de « vert
|
||||
# trompeur », transcrit À LA MAIN dans le diagramme d'architecture du README du
|
||||
# module, sans AUCUN gate.
|
||||
# ----------------------------------------------------------------------------
|
||||
# Le générateur demo_scenario_gen émet out/MANIFEST.json (byte-gaté par
|
||||
# check_artifacts ⇒ faisant autorité) dont `counts.modules_cites_uniques` est
|
||||
# RECOMPTÉ à chaque build = |union des `modules_cites` des deux scénarios| — les
|
||||
# hand-off amont que les beats citent par pointeur RFC 6901 (le module ne saisit
|
||||
# AUCUNE valeur métier ; il résout depuis le disque). Ce nombre est recopié À LA
|
||||
# MAIN dans le diagramme du README du module (05_deliverables_mvp/demo/scenarios/
|
||||
# README.md — « out/ des modules livrés (10 modules cités) »). Aucun gate ne le
|
||||
# couvrait : ajouter un beat qui cite un module encore non tissé (11) ou retirer
|
||||
# la dernière citation d'un module d'un scénario (9) ferait dériver le diagramme
|
||||
# en silence pendant que le MANIFEST byte-gaté dit autre chose — dérive qu'aucune
|
||||
# suite tests/ (qui teste des FONCTIONS, pas la prose du README) n'attrape. Même
|
||||
# piège que les mots-clés SEO, les triplets par workspace des portails, le
|
||||
# quintuplet CONFOTUR ou la synthèse audit_5d. On RECOMPUTE depuis
|
||||
# counts.modules_cites_uniques (jamais figé ici · zéro duplication du compteur du
|
||||
# générateur #5) et on exige l'égalité. Cohérence croisée en bonus :
|
||||
# counts.modules_cites_uniques == |modules_cites| (liste dédupliquée du manifeste,
|
||||
# elle-même sans doublon) — mord un compteur désynchronisé de sa propre liste. Un
|
||||
# claim absent échoue AUSSI (la disparition d'un chiffre est une régression).
|
||||
# ============================================================================
|
||||
DEMO_RD = f"{D}/demo/scenarios/README.md"
|
||||
try:
|
||||
demo_man = load("demo/scenarios/out/MANIFEST.json")
|
||||
demo_n = str(demo_man["counts"]["modules_cites_uniques"])
|
||||
demo_list = demo_man["modules_cites"]
|
||||
if len(demo_list) != len(set(demo_list)):
|
||||
bad(f"Démo · incohérence artefact : modules_cites contient des doublons "
|
||||
f"({len(demo_list)} entrées, {len(set(demo_list))} uniques)")
|
||||
if demo_n != str(len(demo_list)):
|
||||
bad(f"Démo · incohérence artefact : counts.modules_cites_uniques={demo_n} "
|
||||
f"MAIS |modules_cites|={len(demo_list)}")
|
||||
except (OSError, KeyError, ValueError) as e:
|
||||
bad(f"Démo · artefact scenarios illisible/inattendu : {e}"); demo_n = None
|
||||
if demo_n is not None:
|
||||
demo_rd = read_norm(DEMO_RD)
|
||||
if demo_rd is not None:
|
||||
m = re.search(r"out/ des modules livrés \((\d+) modules cités\)", demo_rd)
|
||||
if m is None:
|
||||
bad(f"Démo · {DEMO_RD} — claim « (N modules cités) » INTROUVABLE "
|
||||
f"(attendu modules_cites_uniques={demo_n})")
|
||||
elif m.group(1) == demo_n:
|
||||
good(f"Démo · {DEMO_RD} — {m.group(1)} modules cités == artefact "
|
||||
f"(modules_cites_uniques={demo_n})")
|
||||
else:
|
||||
bad(f"Démo · {DEMO_RD} — dit {m.group(1)} modules cités MAIS artefact dit "
|
||||
f"{demo_n} → régénérer le README")
|
||||
|
||||
sys.exit(1 if FAIL else 0)
|
||||
PY
|
||||
rc=$?
|
||||
|
||||
Reference in New Issue
Block a user