[DTP-Worker 20260802_073526] Sprint 8 · buffer · Ledger d'invariants 2ᵉ FAMILLE : ancrage du COMPTE # INVn ·/validate_bundle de deploy_runbook (11) + acceptance (11) — dialecte « N familles d'invariants » qui avait glissé la clôture
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -8646,6 +8646,94 @@ if mbi_src is not None:
|
||||
bad(f"Mobile invariants · {MBI_RD} — mention(s) « N invariants » "
|
||||
f"{mbi_rd_rep} MAIS ledger en compte {mbi_ninv} → régénérer le README")
|
||||
|
||||
# ============================================================================
|
||||
# DevOps deploy_runbook + QA acceptance · IDENTITÉ du COMPTE d'INVARIANTS de
|
||||
# `validate_bundle` — DEUXIÈME famille de « ledger d'invariants », distincte des
|
||||
# 8 générateurs déjà gatés (Chat OTOIA · SEO · Fiscal · CONFOTUR · Dossier Vente ·
|
||||
# Audit 5D · Commissions · Mobile).
|
||||
# ----------------------------------------------------------------------------
|
||||
# La série « ledger » précédente a été déclarée close à 8 générateurs — MAIS sur
|
||||
# le SEUL patron `# N ·` / « N invariants » / `_validate`(`_validate_bundle`).
|
||||
# DEUX générateurs portent le MÊME nombre magique dans un DIALECTE différent, resté
|
||||
# HORS de tout gate : marqueurs `# INVn ·` (préfixe `INV`) dans `validate_bundle`,
|
||||
# et phrasé « N **familles d'**invariants ». C'est exactement le piège consigné
|
||||
# (« CLOSED après N était FAUX — un style de marqueur différent avait glissé ») :
|
||||
# • devops/deploy_runbook — ledger `# INV1..INV11` dans `validate_bundle`, compte
|
||||
# « 11 familles d'invariants » recopié à TROIS surfaces (générateur l.272 · README
|
||||
# l.73 · suite tests l.4) ;
|
||||
# • qa/acceptance — ledger `# INV1..INV11` dans `validate_bundle`, compte à DEUX
|
||||
# surfaces (README l.46 « 11 invariants » · suite tests l.4 « 11 familles
|
||||
# d'invariants »). Le .py acceptance ne porte PAS de compte numéroté → non exigé.
|
||||
# Ajouter un contrôle `# INV12 ·` à `validate_bundle` sans toucher ces chaînes ⇒
|
||||
# README + self-reports mentent en silence pendant que la CI applique 12 contrôles —
|
||||
# « vert trompeur » (#6) que ni les suites tests/ (FONCTIONS de validation, jamais
|
||||
# la prose) ni le byte-gate d'artefact (aveugle au .py source) n'attrapent. Ledger
|
||||
# PROPRE 1..N compté À PART du schéma (phrasé « schéma + N invariants »). Les
|
||||
# mentions NON numérotées de « invariants » (docstrings « invariants de … », « Un
|
||||
# invariant refuse … ») ne sont pas ancrées par un chiffre → aucun faux positif. On
|
||||
# RECOMPUTE le ledger depuis le SEUL registre-source (les `# INVn ·` de
|
||||
# `validate_bundle`) et on exige : (a) ledger CONTIGU 1..N (lacune/doublon = défaut
|
||||
# de registre) ; (b) CHAQUE surface déclarée porte ≥1 mention « N [familles d']
|
||||
# invariants » toutes == |ledger|. Surface sans mention = self-report évaporé (échec
|
||||
# · régression de traçabilité #6). Les daily_reports/activity_log (snapshots datés,
|
||||
# ex. acceptance « 10 » d'avant la croissance 10→11) NE sont PAS des surfaces vives
|
||||
# et ne sont volontairement pas ancrés.
|
||||
# ============================================================================
|
||||
DRA_INV_RE = re.compile(r"(\d+)\s+(?:familles\s+d['’ʼ]\s*)?invariants")
|
||||
DRA_MODS = [
|
||||
("DevOps · deploy_runbook", f"{D}/devops/deploy_runbook/deploy_runbook_gen.py",
|
||||
[("générateur", f"{D}/devops/deploy_runbook/deploy_runbook_gen.py"),
|
||||
("README", f"{D}/devops/deploy_runbook/README.md"),
|
||||
("suite tests", f"{D}/devops/deploy_runbook/tests/test_deploy_runbook.py")]),
|
||||
("QA · acceptance", f"{D}/qa/acceptance/acceptance_gen.py",
|
||||
[("README", f"{D}/qa/acceptance/README.md"),
|
||||
("suite tests", f"{D}/qa/acceptance/tests/test_acceptance.py")]),
|
||||
]
|
||||
for _lbl, _gen, _surfaces in DRA_MODS:
|
||||
try:
|
||||
_src = open(_gen, encoding="utf-8").read()
|
||||
except OSError as e:
|
||||
bad(f"{_lbl} invariants · générateur {_gen} illisible : {e}"); continue
|
||||
_mfn = re.search(r"def validate_bundle\b", _src)
|
||||
if _mfn is None:
|
||||
bad(f"{_lbl} invariants · fonction `validate_bundle` INTROUVABLE dans {_gen} "
|
||||
"(registre-source du ledger absent → impossible de re-dériver)"); continue
|
||||
_bs = _mfn.end()
|
||||
_mn = re.search(r"\ndef ", _src[_bs:])
|
||||
_body = _src[_bs: _bs + _mn.start()] if _mn else _src[_bs:]
|
||||
_pairs = re.findall(r"#\s*INV\s*(\d+)([a-z]?)\s*·", _body)
|
||||
_dup_bare = sorted({n for n in {p[0] for p in _pairs}
|
||||
if [s for num, s in _pairs if num == n and s == ""]
|
||||
and sum(1 for num, _ in _pairs if num == n) > 1})
|
||||
_top = sorted({int(n) for n, _ in _pairs})
|
||||
if not _top:
|
||||
bad(f"{_lbl} invariants · aucun marqueur `# INVn ·` dans `validate_bundle` de "
|
||||
f"{_gen} (ledger vide → impossible de re-dériver)"); continue
|
||||
if _dup_bare:
|
||||
bad(f"{_lbl} invariants · marqueur(s) `# INVn ·` dupliqué(s) dans "
|
||||
f"`validate_bundle` : {_dup_bare} — vrai doublon de registre"); continue
|
||||
_ninv = len(_top)
|
||||
if _top != list(range(1, _ninv + 1)):
|
||||
bad(f"{_lbl} invariants · ledger `validate_bundle` NON contigu : {_top} "
|
||||
f"(attendu 1..{_ninv}) — lacune/doublon dans les marqueurs `# INVn ·`")
|
||||
else:
|
||||
good(f"{_lbl} invariants · ledger `validate_bundle` contigu 1..{_ninv} "
|
||||
f"({_ninv} marqueurs `# INVn ·` · schéma compté à part)")
|
||||
for _sname, _spath in _surfaces:
|
||||
try:
|
||||
_sraw = open(_spath, encoding="utf-8").read()
|
||||
except OSError as e:
|
||||
bad(f"{_lbl} invariants · {_sname} {_spath} illisible : {e}"); continue
|
||||
_rep = sorted({int(x) for x in DRA_INV_RE.findall(_sraw)})
|
||||
if not _rep:
|
||||
bad(f"{_lbl} invariants · aucune mention « N (familles d')invariants » dans "
|
||||
f"{_spath} ({_sname}) — self-report évaporé (attendu {_ninv} · régression #6)")
|
||||
elif _rep == [_ninv]:
|
||||
good(f"{_lbl} invariants · {_sname} — mention(s) {_rep} == ledger ({_ninv})")
|
||||
else:
|
||||
bad(f"{_lbl} invariants · {_sname} ({_spath}) — mention(s) « N invariants » "
|
||||
f"{_rep} MAIS ledger `validate_bundle` en compte {_ninv} → resynchroniser")
|
||||
|
||||
# ============================================================================
|
||||
# Traçabilité roadmap · le `roadmap_ref` VERBATIM des artefacts — la CITATION
|
||||
# (n° de ligne + « libellé bullet ») ANCRÉE sur la ligne RÉELLE de la roadmap,
|
||||
|
||||
Reference in New Issue
Block a user