[DTP-Worker] Sprint 8 · buffer · Frontend Console/AGENT.md : gate d'IDENTITÉ de l'ENSEMBLE des portails métier (énumération L11 · double ancrage workspaces frontend ⨯ rbac portails_business) + exclusion nommée de la console technique plateforme (6ᵉ portail RBAC hors métier, L46)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-01 12:12:10 +00:00
parent dce409f0f6
commit 64238f6833
3 changed files with 180 additions and 1 deletions
+62
View File
@@ -1283,3 +1283,65 @@ descripteurs · `(c)` 7 portées) · exit 0. Working tree byte-restauré (`git c
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact ; le seed réel des
rôles/entités `bench` reste côté VPS).
- **Auto-score 4Big** : 96/100.
## Session `20260801_120319` · Buffer S8 · Frontend Console/AGENT.md — IDENTITÉ de l'ENSEMBLE des portails métier + exclusion nommée de la console technique
**Contexte** : Sprint 8 · buffer (roadmap fonctionnellement close ; poursuite de la
série anti-dérive CLAUDE.md #6 — fiche-agent qui restitue une donnée gatée seulement
en AGRÉGAT/COMPTE, cf. [[agent-fiche-role-attrs-ungated]]). Même patron que
l'énumération ordonnée des onglets Mobile (`role_navigation`) et la colonne « Entité »
de la SPEC §4 ([[rbac-spec-portail-count-gate]]) — appliqué à une surface encore ungated
de la fiche **Frontend Console**.
**Dérive silencieuse fermée** :
- `03_agents/frontend_console/AGENT.md` restitue à la main, en **deux endroits**
data-derived, l'IDENTITÉ de l'ensemble des portails — jamais gatée hors le COMPTE :
- **L11** « **5 portails rôle métier** (Ventes / Construction / Achat / Compta /
Direction) » — l'ENSEMBLE ORDONNÉ des noms courts.
- **L46** « la console technique `plateforme` (**6ᵉ portail RBAC**) est **exclue** »
— l'identité + le rang + la non-appartenance au métier de la console exclue.
- **Deux artefacts faisant autorité** : (i) `frontend/portails/out/MANIFEST.json`
(byte-gaté) — les workspaces métier (`OTO Ventes` … → noms courts sans le préfixe
« OTO ») ; (ii) `rbac_50_roles.json` — `portails_business` (l'ordre du contrat) + les
portails distincts des rôles (6 : 5 métier + `plateforme`).
- Piège : le bloc « triplets par workspace » recompute cartes/liens/rôles **par**
portail mais reste **aveugle à QUELS portails** composent l'ensemble ; les autres
gates comptent « 5 » sans jamais confronter le SET. Un ÉCHANGE (Achat→Marketing),
RETRAIT, RÉORDRE, RENOMMAGE de la console technique dans le contrat
(`plateforme`→`console`) ou un contrat qui PROMEUT `plateforme` en métier laisse la
fiche contredire les artefacts EN SILENCE — « vert trompeur » qu'aucune suite
`tests/` (FONCTIONS RBAC, jamais la prose) n'attrape.
- **État courant** : aucune dérive — L11 == workspaces frontend == `portails_business` ·
L46 `plateforme` == unique portail RBAC hors métier == 6ᵉ. Le défaut est la **surface
ungated**.
**Gate ajouté** (`ci/check_readme_claims.sh`, bloc « Portails ensemble » juste après le
bloc triplets, réutilise `ws_list`/`ws_fi`/`WS_FI` déjà en scope · relit le contrat
`rbac_50_roles.json`) :
- **(a) ENSEMBLE** — noms courts ordonnés (label `MANIFEST.workspaces[].workspace` sans
« OTO ») == énumération L11 (compte + absents/en trop + ordre) **ET DOUBLE ANCRAGE**
les ids workspaces frontend == `portails_business` du contrat (l'« égalité stricte »
que la fiche revendique en L47).
- **(b) EXCLUSION** — `plateforme` == l'UNIQUE portail RBAC hors métier
(`distinct(roles.portail) portails_business`, len==1), nommé EXACTEMENT dans L46,
de rang == `|distinct|` (6ᵉ), avec `**exclue**` structurellement exigé (regex `\S*`
absorbe l'exposant « ᵉ » multi-octets sans le coder en dur).
- Claim absent (L11 ou L46 INTROUVABLE) = régression #6.
**8 morsures vérifiées** (6 côté fiche · 2 côté contrat) : L11 `Achat→Marketing`
(`(a)` en trop/absent) · L11 retire `Compta` (`(a)` compte+absent) · L11 réordonne
`Ventes↔Construction` (`(a)` ordre) · L46 `plateforme→console` (`(b)` nom) · L46
`6ᵉ→7ᵉ` (`(b)` rang) · L46 retire `**exclue**` (INTROUVABLE) · contrat réordonne
`portails_business` (ancrage rompu) · contrat `ventes→sales` dans `portails_business`
(ancrage rompu + `plateforme` n'est plus l'unique hors-métier ⇒ 2 fails) ; restauré =
green (3 ✓ : double ancrage · énumération L11 · console technique L46) · exit 0.
Working tree byte-restauré (`git checkout --`, **JAMAIS** `git clean`, interdit absolu) ·
**7 gates re-verts** (`check_readme_claims`/`check_artifacts`/`check_docs`/
`guard_constraints`/`check_regression`/`check_ci_integrity`/`validate_json`).
- `ci/README.md` (clause de la ligne récap du pipeline + paragraphe détaillé « Ensemble
des portails métier + exclusion nommée de la console technique ») mis à jour.
- **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 ; le seed réel des
Workspaces/rôles `bench` reste côté VPS).
- **Auto-score 4Big** : 96/100.