[DTP-Worker] Sprint 8 · buffer · RBAC/SPEC §7 : gate d'IDENTITÉ des comptes du run-book d'application (28 UP templates · 6 Role Profiles / 5 métier · 50 rôles bijectifs) ancrés sur rbac_50_roles.json

Surface data-derived non gatée : la NOTE §7 «  … livré en-repo » de
RBAC_50_ROLES_SPEC.md restitue 3 comptes du run-book (28 templates Company /
6 profils (5 métier + plateforme technique) / 50 rôles bijectifs) sur une
surface DISTINCTE des READMEs userperm_gen/roleprofile_gen déjà gatés et du
§3 (per-portail). Nouveau bloc 1quinquies dans check_readme_claims.sh :
recompute depuis le contrat byte-gaté (|scope==entite|, |portails distincts|,
|métier hors plateforme|, |roles|), blockquote « > » neutralisé avant match.
6 morsures vérifiées (dont contrat entite→groupe = silent green), restauré
vert, 7 gates PASS. ci/README.md (récap + paragraphe détaillé) mis à jour.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-01 10:11:39 +00:00
parent 7ce0f7b1e7
commit 7e8bb9a0de
3 changed files with 134 additions and 1 deletions
+55
View File
@@ -1051,3 +1051,58 @@ check_readme_claims · guard_constraints · check_regression · check_ci_integri
- **Hors périmètre worker (VPS · #8)** : néant (correction d'un doc en-repo + gate
bash/python3 stdlib ; l'unique artefact `out/` touché a été régénéré à l'identique).
- **Auto-score 4Big** : 96/100.
## Session `20260801_100301` · Buffer S8 · RBAC/RBAC_50_ROLES_SPEC §7 — comptes du run-book d'application ancrés sur le contrat rbac_50_roles.json
**Contexte** : Sprint 8 · buffer (roadmap fonctionnellement close ; poursuite de la
série anti-dérive CLAUDE.md #6). Même classe que le §3 gaté à la session précédente
(`093301`, per-portail) : une **2ᵉ surface de la MÊME SPEC** transcrivant à la main des
comptes data-derived, déjà gatés ailleurs mais AVEUGLES à cette note (mémoire
[[rbac-spec-portail-count-gate]]).
**Dérive silencieuse fermée** :
- `05_deliverables_mvp/rbac/RBAC_50_ROLES_SPEC.md` §7 — la NOTE « ✅ … est **livré**
en-repo » restitue TROIS comptes du run-book d'application sur une **surface
DISTINCTE** des READMEs `userperm_gen` / `roleprofile_gen` (déjà gatés) et du §3
(ventilation par portail, bloc `1quater`) : « **28** templates `Company` (portée
`entite`) » · « **6 profils** (**5** portails métier + console technique
`plateforme`) » · « **50 rôles de façon bijective** ».
- Source faisant autorité : `rbac/rbac_50_roles.json` (contrat, byte-gaté par
`check_artifacts`). Recomputes : 28 == |`scope_donnees == entite`| (= nombre de
`User Permission` templates) · 6 == |portails distincts| (1 `Role Profile` par
portail) · 5 == portails **métier** (hors `plateforme`) · 50 == |rôles|.
- Piège #6 : BUMPER une portée `entite``groupe` (le décompte de templates change) ou
AJOUTER/RETIRER un portail (le décompte de profils change) dans le contrat périme la
note EN SILENCE pendant que les READMEs de volet et le §3 restent verts → l'agent
ERPNext Backend lirait un run-book promettant un décompte faux. Aucune suite `tests/`
(FONCTIONS de génération/résolution RBAC, jamais la prose de la SPEC) n'attrape ce
« vert trompeur ».
- **État courant** : aucun compte périmé — 28/6/5/50 recoupent le contrat exactement
(anti-invention #6, rien à réécrire). Le défaut est la **surface ungated**.
**Gate ajouté** (`ci/check_readme_claims.sh`, bloc « 1quinquies) RBAC_50_ROLES_SPEC §7 »
après le bloc §3) : réutilise `src_roles` (contrat) + `spec_rd` (déjà chargés par le
§3, zéro duplication). Le blockquote markdown `> ` de la note survit au collapse de
`read_norm` et fragmente la prose (« 28 > templates ») ⇒ **neutralisé** (`spec7 =
spec_rd.replace("> ", "")`) avant match. Exige : (a) « N templates `Company` (portée
`entite`) » == |scope==entite| ; (b) « **N profils** (M portails métier + console
technique `plateforme`) couvrant les **K rôles de façon bijective** » == |portails
distincts|/|métier hors plateforme|/|rôles|. Garde anti-typo : `plateforme` doit exister
au contrat (sinon la note « console technique plateforme » est fausse). Un claim absent
échoue AUSSI (INTROUVABLE = régression #6).
**6 morsures vérifiées** (restauré vert après chacune) : SPEC `28→27` (prose périmée) ·
SPEC `6 profils→7` · SPEC `5 portails métier→4` · SPEC `50→49` · **contrat** une portée
`entite→groupe` (28→27 · README stale = le vrai *silent green* · « SPEC dit 28 MAIS
compte 27 ») · SPEC retire « 28 templates » (claim absent = INTROUVABLE) ; restauré =
green : UP templates 28 == |entite| · Role Profiles 6 (métier 5) bijectifs sur 50 ==
contrat · exit 0. Working tree byte-restauré (`git checkout --`, **JAMAIS** `git clean`,
interdit absolu) · **7 gates re-verts** (`check_readme_claims`/`check_ci_integrity`/
`check_docs`/`guard_constraints`/`check_artifacts`/`check_regression`/`validate_json`).
- `ci/README.md` (clause de la table récap du pipeline + paragraphe détaillé « Comptes
du run-book d'application `RBAC_50_ROLES_SPEC.md` §7 ») mis à jour.
- **Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ;
aucune écriture dans un `out/` ⇒ 0 dérive d'artefact ; l'application `bench` réelle
reste côté agent ERPNext Backend / VPS).
- **Auto-score 4Big** : 96/100.