[DTP-Worker 20260801_233454] Sprint 8 · buffer · RBAC SPEC §5 : gate de la LIGNE D'AUTO-CONTRÔLE du « résumé »
La SPEC RBAC a déjà 3 gates (§3 ventilation par portail · §4 colonne Entité · §7 run-book) mais son §5 « Les N rôles (résumé) » restait AVEUGLE. Ce §5 restitue le total de rôles sur 3 surfaces prose : le compte-titre « ## 5. Les 50 rôles », NEUF comptes parenthétiques de regroupement (`**Ventes (8)**` …) et une ligne d'auto-contrôle arithmétique `_(6+8+4+7+5+8+4+2+6 = 50.)_`. AJOUTER un rôle au contrat (|rôles| 50→51) laisse titre/somme/`= 50` périmés en silence ; ÉDITER `Ventes (8)→(7)` sans toucher la ligne casse la cohérence titre↔somme — ni les suites tests/ (FONCTIONS RBAC, jamais la prose) ni le byte-gate d'artefact ne l'attrapent. Subtilité (memory rbac-spec-portail-count-gate : « §5 by-family is editorial ») : les 9 regroupements sont ÉDITORIAUX (« Direction / Gouvernance » agrège des rôles de familles direction+finance ≠ colonne `famille`) ⇒ AUCUN mapping groupe↔famille (dérive fausse). On gate UNIQUEMENT ce qui est data-derived sans ce mapping. Nouveau bloc « 1septies) §5 » : on recompute N = |rôles| du contrat (rbac_50_roles.json, byte-gaté) et on exige (a) compte-titre == N ; (b) les 9 comptes de regroupement == EXACTEMENT dans l'ordre les termes de la ligne (comparaison de LISTES ⇒ mord valeur ET position) ; (c) Σ termes == membre droit ; (d) membre droit == N. Section/titre/ligne/comptes absents = échec (#6). 5 morsures vérifiées (working tree byte-restauré via git checkout -- <fichier>, gate rc=1 sous mutation · rc=0 restauré) : titre 50→51 (a) · Ventes (8)→(9) (b) · = 50.→= 49. (c+d double) · terme 6+→7+ (b+c double) · suppression ligne (absence). ci/README.md : row check-readme-claims étendue de la clause §5. 7 gates re-verts. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2553,3 +2553,61 @@ Restauré = green : (a)(b)(c)(d) tous ✓ (ledger contigu 1..15 · 15 marqueurs)
|
||||
- **Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ;
|
||||
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact).
|
||||
- **Auto-score 4Big** : 96/100.
|
||||
|
||||
---
|
||||
|
||||
## Sprint 8 · buffer · RBAC SPEC §5 : gate de la LIGNE D'AUTO-CONTRÔLE du « résumé »
|
||||
|
||||
**Contexte** : suite de la campagne anti-dérive documentaire (Sprint 8 · QA
|
||||
« regression tests exhaustifs »). Baseline des 7 gates verte avant intervention.
|
||||
Recherche (sous-agent Explore) de la prochaine surface data-derived transcrite en
|
||||
prose mais NON gatée — la plupart des COMPTES d'artefact sont déjà fermés. Le
|
||||
candidat retenu est une surface interne de `rbac/RBAC_50_ROLES_SPEC.md` : le §5.
|
||||
|
||||
**Défaut** : la SPEC RBAC a DÉJÀ trois gates (§3 ventilation par portail · §4
|
||||
colonne Entité · §7 run-book), mais son §5 « Les N rôles (résumé) » restait
|
||||
AVEUGLE. Ce §5 restitue le total de rôles sur TROIS surfaces prose : (i) le
|
||||
compte-titre « ## 5. Les 50 rôles (résumé) », (ii) NEUF comptes parenthétiques de
|
||||
regroupement (`**Ventes (8)**` …) et (iii) une LIGNE d'auto-contrôle arithmétique
|
||||
`_(6+8+4+7+5+8+4+2+6 = 50.)_`. AJOUTER un rôle au contrat (|rôles| 50→51) laisse le
|
||||
titre, la somme et le « = 50 » PÉRIMÉS en silence ; ÉDITER `Ventes (8)→(7)` sans
|
||||
toucher la ligne casse la cohérence titre↔somme — aucune suite `tests/` (FONCTIONS
|
||||
RBAC, jamais la prose de la SPEC) ni le byte-gate d'artefact ne l'attrape.
|
||||
|
||||
**Subtilité (memory `rbac-spec-portail-count-gate` : « §5 by-family is
|
||||
editorial »)** : les 9 regroupements sont ÉDITORIAUX — « Direction / Gouvernance »
|
||||
agrège des rôles de familles direction+finance, ≠ la colonne `famille` du contrat.
|
||||
On NE mappe donc PAS groupe↔famille (ce serait une dérive fausse). On gate
|
||||
UNIQUEMENT ce qui est data-derived et vérifiable SANS ce mapping.
|
||||
|
||||
**Gate ajouté** (`ci/check_readme_claims.sh`, bloc « 1septies) §5 », inséré après
|
||||
le bloc §4 et avant le bloc apply_plan) : on RECOMPUTE N = |rôles| du contrat
|
||||
(`rbac_50_roles.json`, byte-gaté par check_artifacts) et on exige — **(a)** le
|
||||
compte-titre « ## 5. Les N rôles » == N ; **(b)** les 9 comptes de regroupement ==
|
||||
EXACTEMENT, dans l'ordre, les termes de la ligne arithmétique (cohérence interne
|
||||
prose↔somme, comparaison de LISTES ordonnées) ; **(c)** l'arithmétique est VRAIE
|
||||
(Σ termes == membre droit) ; **(d)** le membre droit == N. Section/titre/ligne/
|
||||
comptes absents = échec (#6).
|
||||
|
||||
**5 morsures vérifiées** (working tree byte-restauré après chacune via
|
||||
`git checkout -- <fichier précis>`, JAMAIS `git checkout .` / `git clean` ;
|
||||
gate rc=1 sous mutation, rc=0 restauré) :
|
||||
1. titre `50`→`51` → ✗ (a) « titre dit 51 rôles MAIS le contrat en compte 50 » ;
|
||||
2. regroupement `Ventes (8)`→`(9)` → ✗ (b) « [6, 9, 4…] ≠ termes [6, 8, 4…] » ;
|
||||
3. ligne `= 50.`→`= 49.` → ✗ (c) « écrit = 49 MAIS Σ = 50 » + ✗ (d) « totalise
|
||||
49 MAIS le contrat compte 50 » (double morsure) ;
|
||||
4. terme `6+8+…`→`7+8+…` → ✗ (b) « termes [7, 8…] ≠ [6, 8…] » + ✗ (c) « = 50
|
||||
MAIS Σ = 51 » (double morsure) ;
|
||||
5. suppression de la ligne d'auto-contrôle → ✗ « ligne … INTROUVABLE » (absence).
|
||||
Restauré = green : (a)(b)(c)(d) tous ✓ (titre 50 · 9 comptes == 6+8+4+7+5+8+4+2+6
|
||||
· Σ=50 · membre droit 50 == |rôles|).
|
||||
|
||||
- `ci/README.md` : la row `check-readme-claims` étendue de la clause §5 (compte-
|
||||
titre + 9 comptes de regroupement éditoriaux + ligne d'auto-contrôle, sans
|
||||
mapping groupe↔famille).
|
||||
- **7 gates re-verts** : `guard_constraints` / `validate_json` / `check_docs` /
|
||||
`check_artifacts` / `check_regression` / `check_ci_integrity` /
|
||||
`check_readme_claims` (tous rc=0).
|
||||
- **Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ;
|
||||
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact).
|
||||
- **Auto-score 4Big** : 96/100.
|
||||
|
||||
Reference in New Issue
Block a user