[DTP-Worker 20260802_040511] Sprint 8 · buffer · RBAC SPEC §3 : ancrage de la colonne « Familles rattachées » PAR portail sur rbac_50_roles.json
Nouvelle surface anti-dérive (#6) : la table §3 « Cartographie portails ↔ familles » porte deux colonnes data-derived du contrat ; « Nb rôles » était gatée, « Familles rattachées » (SET des `famille` distinctes par portail) ne l'était pas — le count-gate l'avale via `[^|]*`. Gate « 1quater-bis » : recompute le SET de familles par portail depuis rbac_50_roles.json[roles][].famille, égalité par ENSEMBLE (absent + fantôme) avec les jetons bruts de la cellule (parenthèses éditoriales exclues, ordre non gaté). Silent-green prouvé : reclasser les 2 rôles `legal` de `direction` en `finance` garde le compte 9==9 VERT mais fait mordre FANTÔME {legal}. 6 verts arbre propre · 5 morsures adversariales · 6 gates re-verts exit 0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,54 @@
|
||||
# Activity log · 2026-08-02 · Claude Code DTP Worker
|
||||
|
||||
## Sprint 8 · buffer · RBAC SPEC §3 — ancrage de la colonne « Familles rattachées » PAR portail sur le contrat
|
||||
|
||||
**Contexte** — Série anti-dérive Sprint 8 (CLAUDE.md #6 « zéro invention de
|
||||
chiffres »). La table §3 « Cartographie portails ↔ familles » de
|
||||
`05_deliverables_mvp/rbac/RBAC_50_ROLES_SPEC.md` porte DEUX colonnes data-derived
|
||||
du contrat `rbac_50_roles.json` : « Nb rôles » (déjà gatée, bloc §3 count) et —
|
||||
juste à sa gauche — « **Familles rattachées** » : pour chaque portail, l'ENSEMBLE
|
||||
des `famille` distinctes de ses rôles (ex. `direction` → {direction, finance,
|
||||
faisabilite, legal}). Cette 2ᵉ colonne était **NON gatée** : le bloc §3 count la
|
||||
capture avec `[^|]*` (il ne lit QUE le compte), le §5 « résumé » traite volontairement
|
||||
les regroupements comme ÉDITORIAUX (pas de mapping famille↔groupe, cf. memory
|
||||
`rbac-spec-portail-count-gate`), et `check_artifacts` est aveugle (la SPEC n'est
|
||||
pas un `out/*.json`). Même classe que « colonne SET gatée seulement sur son COUNT
|
||||
voisin » (roleprofile per-profil count vs quels rôles).
|
||||
|
||||
**Le « vert trompeur »** — reclasser la `famille` d'un rôle À L'INTÉRIEUR d'un
|
||||
portail change le SET de familles **sans** changer le « Nb rôles » du portail → la
|
||||
cellule §3 ment en silence pendant que le count-gate reste VERT. Prouvé (M4) :
|
||||
reclasser les DEUX rôles `legal` de `direction` (Directeur Juridique + Agent ONAPI)
|
||||
en `finance` laisse le compte à **9==9 VERT** tandis que le nouveau gate mord
|
||||
**FANTÔME {legal}** (la SPEC liste encore `legal`, le contrat ne l'a plus).
|
||||
Ajouter/retirer une famille (rôle d'une famille inédite) laisse aussi la cellule
|
||||
périmée. Aucune suite `tests/` (FONCTIONS de validation, pas l'ancre SPEC↔contrat)
|
||||
ne mord.
|
||||
|
||||
**Gate ajouté** (`ci/check_readme_claims.sh`, bloc « 1quater-bis » juste après le
|
||||
§3 count-gate, RÉUTILISE `src_roles`/`spec_rd` déjà chargés) — RECOMPUTE le SET de
|
||||
familles distinctes PAR portail depuis `rbac_50_roles.json[roles][].famille` et
|
||||
exige, par ENSEMBLE (absent ET fantôme), l'égalité avec les jetons `famille` de la
|
||||
cellule. On ne gate QUE les jetons `famille` bruts (identifiant de tête de chaque
|
||||
item séparé par `,`, via `(?:^|,)\s*([a-z]+)`), **PAS** les parenthèses ÉDITORIALES
|
||||
(« finance (CFO) », « faisabilite (analyste/rendu/IFC/économiste) » — paraphrase,
|
||||
pas contrat, #6). Ordre NON gaté (réordonner les rôles dans le contrat byte-gaté
|
||||
est sémantiquement neutre pour l'appartenance). Un portail sans cellule échoue AUSSI
|
||||
(INTROUVABLE = régression de traçabilité #6).
|
||||
|
||||
**Vérif** — 6 checks verts sur l'arbre propre (un par portail). **5 morsures**
|
||||
adversariales : M1 SPEC retire `legal` de `direction` ⇒ MANQUE {legal} · M2 SPEC
|
||||
ajoute `rh` à `achat` ⇒ FANTÔME {rh} · M3 SPEC `finance`→`financ` sur `compta` ⇒
|
||||
MANQUE {finance} · FANTÔME {financ} · **M4 SILENT-GREEN : contrat reclasse les 2
|
||||
rôles `legal`→`finance` dans `direction`, compte inchangé (count-gate 9==9 VERT) ⇒
|
||||
familles-gate mord FANTÔME {legal} — preuve que l'autorité est le CONTRAT, pas la
|
||||
cohérence interne de la SPEC** · M5 SPEC supprime la ligne `direction` ⇒ cellule
|
||||
INTROUVABLE. Gates re-verts : `check_artifacts` · `check_ci_integrity` ·
|
||||
`check_docs` · `check_readme_claims` · `check_regression` · `guard_constraints`
|
||||
tous exit 0.
|
||||
|
||||
---
|
||||
|
||||
## Sprint 8 · buffer · Faisabilité — ancrage du TEMPLATE CANONIQUE v1.0 (5 surfaces #9/#10) sur CLAUDE.md
|
||||
|
||||
**Contexte** — Série anti-dérive Sprint 8 (CLAUDE.md #6 « zéro invention de
|
||||
|
||||
Reference in New Issue
Block a user