[DTP-Worker] Sprint 8 · buffer · Domaine RBAC/roleprofile_gen (2e surface) : le CLASSEMENT métier/technique des 6 Role Profile (colonne « Type » de la table « Profils générés » + prose « 6 profils (5 métier + 1 technique) ») était NON GATÉ. Le bloc RBAC existant ne gatait que le COMPTE Nb rôles par ligne + total bijectif 50 — sa colonne « Type » était un WILDCARD ([^|]*), et le split métier/technique en prose n'était gaté nulle part. Preuve reproduite : classer le portail technique plateforme en « métier » dans le README → check_readme_claims EXIT 0 (le gate ne voyait que 6==6). Ce classement est DATA-DERIVED : le flag booléen metier par profil de MANIFEST.profiles + le split = counts.portails_metier(5)/portails_techniques(1)/role_profiles(6), MANIFEST recomputé du contrat rbac_50_roles.json à chaque build (byte-gaté par check_artifacts). Un « métier vs technique » faux détournerait le Sprint 4 (« 5 portails rôle » = les 5 métier · plateforme = console technique). PIÈGE : check_artifacts ne prouve QUE MANIFEST==build (byte-for-byte) et la boucle Nb rôles existante n'itère que MANIFEST→README (capte le MANQUANT) — donc RENVERSER un flag dans la prose · MENTIR sur le split · AJOUTER une ligne fantôme d'un profil inventé restait « vert trompeur » qu'aucune suite tests/ (qui teste des FONCTIONS de builder, pas la prose du README) n'attrape → gate étendu (bloc roleprofile de ci/check_readme_claims.sh) : (1) colonne « Type » recomputée du flag metier, exigée EXACTE par profil (fin du wildcard) ; (2) prose « N profils (X métier + Y technique) » == comptes MANIFEST ; (3) identité d'ensemble — nombre de lignes de profil de la table == |profiles| (aucune ligne FANTÔME absente du contrat ; complète le sens MANIFEST→README) ; (4) cohérences croisées mordant un MANIFEST INTERNEMENT incohérent : portails_metier + portails_techniques == role_profiles == |profiles| ET ces comptes recomptent les flags metier réels. 5 morsures vérifiées : README classe plateforme métier (technique→métier) · README classe ventes technique (métier→technique) · prose split 5→4 métier (6/4/1 MAIS 6/5/1) · ligne FANTÔME OTO Portail Fantome (7≠6) · MANIFEST portails_metier 5→6 sans toucher aux flags (incohérence interne, flags réels=5) ; restauré = green : 6 Types == MANIFEST · split 6/5/1 · 6 lignes · comptes cohérents · exit 0. État courant : aucun classement périmé (anti-invention #6, rien à réécrire) — le défaut est la surface ungated. ci/README.md (table + détail « 2e surface roleprofile_gen ») mis à jour · 7 gates re-verts.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2215,3 +2215,38 @@ verrouillés) · `guard_constraints` · `validate_json`.
|
||||
`check_ci_integrity` · `check_regression` · `guard_constraints` · `validate_json`).
|
||||
- **Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo).
|
||||
- **Auto-score 4Big** : 96/100.
|
||||
|
||||
## Sprint 8 · buffer · RBAC roleprofile_gen (2e surface) · classement métier/technique
|
||||
- **Constat** : le README `rbac/roleprofile_gen` porte une table « Profils générés »
|
||||
(6 `Role Profile` : nom · portail · **Type** métier/technique · Nb rôles). Le bloc
|
||||
RBAC existant ne gatait que le COMPTE `Nb rôles` par ligne + total bijectif — sa
|
||||
colonne « Type » était un **WILDCARD** (`[^|]*`). Preuve reproduite : classer le
|
||||
portail technique `plateforme` en « métier » dans le README → `check_readme_claims`
|
||||
**exit 0** (le gate ne voyait que `6 == 6`). Aveugle aussi au **split** en prose
|
||||
« 6 profils (5 métier + 1 technique) » (README:93) — gaté nulle part.
|
||||
- **Data-derived** : le classement = flag booléen `metier` par profil de
|
||||
`MANIFEST.profiles` ; le split = `counts.portails_metier`(5) / `portails_techniques`(1)
|
||||
/ `role_profiles`(6) — MANIFEST recomputé de `rbac_50_roles.json` à chaque build,
|
||||
byte-gaté par `check_artifacts`. Un « métier vs technique » faux détournerait le
|
||||
Sprint 4 (« 5 portails rôle » = les 5 métier ; `plateforme` = console technique).
|
||||
- **Gate ajouté** (`ci/check_readme_claims.sh`, bloc roleprofile) : (1) colonne
|
||||
« Type » recomputée du flag `metier`, exigée EXACTE par profil (fin du wildcard) ;
|
||||
(2) prose « N profils (X métier + Y technique) » == comptes MANIFEST ; (3) identité
|
||||
d'ensemble — nombre de lignes de profil de la table == `|profiles|` (aucune ligne
|
||||
FANTÔME d'un profil inventé absent du contrat ; complète le sens MANIFEST→README de
|
||||
la boucle Nb rôles qui capte le MANQUANT) ; (4) cohérences croisées mordant un
|
||||
MANIFEST INTERNEMENT incohérent : `portails_metier + portails_techniques ==
|
||||
role_profiles == |profiles|` ET ces comptes recomptent les flags `metier` réels.
|
||||
- **5 morsures vérifiées** : README classe `plateforme` métier (technique→métier)
|
||||
capté · README classe `ventes` technique (métier→technique) capté · prose split
|
||||
5→4 métier capté (6/4/1 MAIS 6/5/1) · ligne FANTÔME `OTO Portail Fantome` (7≠6)
|
||||
captée · MANIFEST `portails_metier` 5→6 sans toucher aux flags (incohérence interne)
|
||||
capté (flags réels=5) ; restauré = green : 6 Types == MANIFEST · split 6/5/1 ·
|
||||
6 lignes · comptes cohérents · exit 0.
|
||||
- État courant : aucun classement périmé (anti-invention #6, rien à réécrire) — le
|
||||
défaut est la surface ungated (colonne wildcardée). `ci/README.md` (table + détail
|
||||
« 2e surface roleprofile_gen ») mis à jour · **7 gates re-verts**
|
||||
(`check_readme_claims` · `check_artifacts` · `check_docs` · `check_ci_integrity` ·
|
||||
`check_regression` · `guard_constraints` · `validate_json`).
|
||||
- **Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo).
|
||||
- **Auto-score 4Big** : 96/100.
|
||||
|
||||
Reference in New Issue
Block a user