[DTP-Worker] Sprint 8 · buffer L75 · Surface RBAC non gatée : 3 READMEs de module (roleprofile · apply_plan · userperm) recopiaient À LA MAIN des comptes dérivés des out/MANIFEST.json byte-gatés (recalculés du contrat rbac_50_roles.json à chaque build) sans AUCUN gate — table « Nb rôles » par profil (6 lignes + total bijectif 50), ligne agrégée « 6 étapes · 50 rôles / 116 DocPerm / 28 UP templates / 6 Role Profile · 4 DocType custom + 5 Company + 4 rôles » (8 comptes de tous les volets) et ventilation « 28 entite · 16 groupe · 2 own · 4 equipe » ; ajouter un rôle/DocType ferait dériver les trois docs en silence → nouveau bloc dans check_readme_claims recomputant chaque nombre depuis le MANIFEST du volet (10 checks · 3 morsures vérifiées : dérive par-profil · dérive agrégat consolidé · dérive ventilation ; claim absent = red)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -981,3 +981,72 @@ plan.suites / count_tests ; les nombres de la fiche **découlent** de la source.
|
||||
**Hors périmètre worker (VPS · #8)** : néant (docs + gate bash/stdlib en-repo).
|
||||
|
||||
**Auto-score 4Big** : 96/100.
|
||||
|
||||
---
|
||||
|
||||
## Session `20260731_083034` · Buffer S8 · Comptes RBAC des 3 volets recopiés à la main — surface non gatée
|
||||
|
||||
**Tâche** : **Sprint 8 · buffer L75 (« Regression tests exhaustifs »)** — roadmap
|
||||
fonctionnellement close (22/22 modules gated · 564 tests · 7 gates verts au
|
||||
démarrage). Chasse d'une surface **« vert trompeur » (#6)** encore non gatée.
|
||||
|
||||
### Défaut trouvé — 3 READMEs RBAC transcrivent à la main des comptes de MANIFEST byte-gatés
|
||||
|
||||
- **Symptôme** : les trois générateurs RBAC émettent chacun un `out/MANIFEST.json`
|
||||
recalculé du contrat `rbac_50_roles.json` à chaque build (byte-gaté par
|
||||
`check_artifacts` ⇒ autorité). Trois READMEs de module recopiaient **à la main**
|
||||
des comptes qui en dérivent, sans **AUCUN** gate :
|
||||
1. `rbac/roleprofile_gen/README.md` — table « Nb rôles » **par profil** (6 lignes
|
||||
: Ventes 12 · Construction 10 · Direction 9 · Compta 8 · Achat 5 · Plateforme
|
||||
6) + total bijectif **50**.
|
||||
2. `rbac/apply_plan/README.md` — ligne agrégée « Génération réelle : **6 étapes ·
|
||||
50 rôles / 116 DocPerm / 28 UP templates / 6 Role Profile · 4 DocType custom +
|
||||
5 Company + 4 rôles equipe** » : **8 comptes** de TOUS les volets en une phrase.
|
||||
3. `rbac/userperm_gen/README.md` — ventilation « **28 entite · 16 groupe · 2 own ·
|
||||
4 equipe** » (par mécanisme d'enforcement).
|
||||
- **Contradiction latente** : ajouter un rôle/DocType au contrat ferait dériver
|
||||
**les trois** docs en silence pendant que les MANIFEST (byte-gatés) disent autre
|
||||
chose — même classe que les cellules « Tests », la prose agrégée CRM/RBAC et les
|
||||
triplets par workspace, mais sur le **domaine RBAC** (contrainte NON-NÉGOCIABLE
|
||||
#5 « 50 rôles »), au grain le plus fin (par profil) **et** au niveau consolidé.
|
||||
- **État au démarrage** : les 10 nombres étaient **justes** (aucune dérive déjà
|
||||
survenue) — le défaut est l'**absence de garde**, pas une valeur périmée.
|
||||
|
||||
### Fix (1 volet · garder — aucun chiffre à corriger)
|
||||
|
||||
- **`ci/check_readme_claims.sh`** — nouveau bloc RBAC recomputant chaque nombre
|
||||
depuis le `out/MANIFEST.json` du volet (zéro duplication des compteurs des
|
||||
générateurs · #6) et exigeant l'égalité avec ce que la doc ÉCRIT :
|
||||
- roleprofile : chaque `nb_roles` par profil (ancré sur nom+portail) + total
|
||||
`counts.roles_couverts` ;
|
||||
- apply_plan : les 8 comptes (`len(apply_plan.json)` · `counts.{roles,
|
||||
custom_docperm,user_permission_templates,role_profiles}` · `len(confirmations_
|
||||
vps.{custom_doctypes,companies,roles_scope_equipe})`) en un n-uplet ordonné ;
|
||||
- userperm : `by_mechanism.{user_permission_company,none_consolidated,
|
||||
docperm_if_owner,vps_confirm_team}`.
|
||||
Claim absent ⇒ red (disparition = régression de traçabilité). Header + ci/README
|
||||
documentés.
|
||||
|
||||
### Preuves
|
||||
|
||||
- **Passe** : gate vert, **10 nouvelles lignes RBAC** vérifiées (6 profils + total
|
||||
+ agrégat apply_plan + ventilation userperm), toutes == MANIFEST.
|
||||
- **Morsures (3, une par surface)** : Ventes 12→13 ⇒ `✗ … dit 13 MAIS MANIFEST
|
||||
dit 12` ; apply_plan 116→117 DocPerm ⇒ `✗ … 6/50/117/… MAIS … 6/50/116/…` ;
|
||||
userperm 28→29 entite ⇒ `✗ … 29/16/2/4 MAIS … 28/16/2/4`. Exit 1 dans les trois
|
||||
cas ; restauration ⇒ PASS (exit 0).
|
||||
|
||||
**Régénération des consommateurs** : néant — aucun compte n'a changé (fix = gate
|
||||
seul). Artefacts `out/` **byte-identiques** (`check_artifacts` vert) ; matrice
|
||||
**564/22 PASS** inchangée.
|
||||
|
||||
**Vérifs** : **7 gates** locaux verts (`guard_constraints` · `validate_json` ·
|
||||
`check_docs` · `check_artifacts` · `check_regression` · `check_ci_integrity` ·
|
||||
`check_readme_claims`) ; matrice **564/22 · PASS** ; 22/22 modules **100/100**.
|
||||
|
||||
**Anti-invention (#6)** : rien inventé — le gate **recompute** chaque nombre depuis
|
||||
les MANIFEST byte-gatés ; les comptes des READMEs **découlent** du contrat RBAC.
|
||||
|
||||
**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