3cb1bf06e1
Le générateur workflow_vente_gen.py (Livrable Sprint 4 l.50) porte un ledger de 9 invariants métier de graphe dans `_validate_bundle` (marqueurs `# Invariant N ·`, phrasé « schéma + 9 invariants »), avec le nombre « 9 » recopié à la main à 4 surfaces vives (gen l.223 + README l.78/114/125), aucune gatée. Prouvé ungate avant ajout (README 9→10 laissait check_readme_claims exit 0). Gate ajouté (a)(b)(d) sur le modèle Mobile : recompute le ledger depuis le SEUL registre-source `# Invariant N ·`, exige contiguïté 1..N + toute mention « N invariants » du .py et du README == |ledger|. Pas de gate (e) enum : la liste « ## Invariants vérifiés par le CLI » compte le schéma en item 1 et fusionne les invariants 8&9 → n'est pas le ledger (faux positif fragile évité). « 25 tests » exclu nativement par l'ancre « invariants » (aucun faux positif). 3 checks verts arbre propre · 7 morsures adversariales (dont M3 SILENT-GREEN `# Invariant 10 ·` ⇒ autorité=CODE, M7 no-false-positive) · unittest 25 OK · suite CI complète re-verte. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>