[DTP-Worker] Sprint 8 · buffer · Mobile/fiche agent : la FICHE D'IDENTITÉ du rôle RBAC plateforme-mobile (03_agents/mobile/AGENT.md:36) — le SEUL ancrage in-repo réellement vérifiable de l'agent mobile (builds/stores hors-repo #8) — recopiait EN PROSE, DEPUIS le contrat rbac_50_roles.json, TOUS les attributs data-derived du rôle (erpnext_role_name · nom_fr · famille/portail · entite_principale · niveau · scope_donnees · modules · perm API Access custom R/W · description) SANS AUCUN gate d'IDENTITÉ. Le README mobile/app_config n'est gaté que sur des COMPTES agrégés (« 5 onglets · 44 rôles »), aveugles à l'identité de CE rôle — la carte que l'agent ERPNext Backend lit pour seeder le rôle. Gate ajouté : chaque attribut recomputé du contrat, prose EXACTE par attribut (sigle de perm canonique ordonné C/R/W/D/S/X/A — élargir/rétrécir change le sigle), description verbatim (emphase/point neutralisés), cohérences croisées famille==portail · perm custom · role_id singleton ; 12 morsures (6 contrat + 6 fiche) vérifiées, restauré vert, 7 gates re-verts.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -119,3 +119,67 @@ CLAUDE.md #9 · exit 0. Working tree byte-restauré via `git checkout --` (JAMAI
|
||||
aucune écriture dans un `out/` ⇒ 0 dérive d'artefact ; conversion PDF + rebuild
|
||||
Portail Bancables restent côté VPS).
|
||||
- **Auto-score 4Big** : 96/100.
|
||||
|
||||
## Session `20260801_010204` · Buffer S8 · Domaine Mobile/fiche agent : la **fiche d'identité du rôle RBAC `plateforme-mobile`** (`03_agents/mobile/AGENT.md:36`) — le **SEUL ancrage in-repo réellement vérifiable** de l'agent mobile (builds/soumissions stores étant hors-repo, #8) — recopiait EN PROSE, DEPUIS le contrat `rbac_50_roles.json`, TOUS les attributs data-derived du rôle (`erpnext_role_name` · `nom_fr` · `famille`/`portail` · `entite_principale` · `niveau` · `scope_donnees` · `modules` · permission `API Access` custom R/W · `description`) SANS AUCUN gate d'IDENTITÉ. Le README `mobile/app_config` n'est gaté que sur des COMPTES agrégés (« 5 onglets · 44 rôles couverts · 3 langues · 13 identifiants »), AVEUGLES à l'identité de CE rôle.
|
||||
|
||||
**Tâche** : **Sprint 8 · buffer** (DevOps CI/CD · QA). Roadmap fonctionnellement
|
||||
close ; poursuite de la série anti-dérive (CLAUDE.md #6). Même patron d'IDENTITÉ que
|
||||
la table gardes CRM/`workflow_vente` (rôle qui garde chaque transition) ou le mapping
|
||||
RBAC `userperm_gen` (portée→mécanisme) — appliqué à la **surface distincte** de la
|
||||
fiche agent mobile : la carte que l'agent ERPNext Backend lit pour **seeder le rôle**
|
||||
(`seed_mobile_rbac.py`), jamais gatée hors les comptes agrégés de `app_config`.
|
||||
|
||||
**Dérive silencieuse fermée** :
|
||||
- `03_agents/mobile/AGENT.md:36` — ligne « Points de contact réellement commités »,
|
||||
cellule « Ce qu'il fixe » : nomme, PAR attribut, le rôle ERPNext
|
||||
**`OTO Plateforme Mobile`** (« Développeur Mobile » · famille/portail
|
||||
**`plateforme`** · entité **9060 QC** · niveau 2 · scope `groupe` · modules
|
||||
`Core`+`Website` · perm `API Access` custom R/W · description « Maintient
|
||||
l'app Expo/React Native et l'API mobile ; gère les builds EAS et les
|
||||
soumissions stores »).
|
||||
- Source faisant autorité : `05_deliverables_mvp/rbac/rbac_50_roles.json` (contrat
|
||||
RBAC, schéma-validé · les 3 MANIFEST RBAC recomputés en dérivent et sont byte-gatés
|
||||
par `check_artifacts`) → le rôle d'`id` `plateforme-mobile` porte chacun de ces
|
||||
champs. Autres blocs du gate lisent déjà ce contrat directement (userperm,
|
||||
workflow_vente, confotur).
|
||||
- Piège : la seule vérification existante (`tests/`) teste des **FONCTIONS** de
|
||||
résolution RBAC, jamais la PROSE d'une fiche agent. Éditer le contrat — élever le
|
||||
`scope_donnees` (`groupe`→`entite` : sur-portée inter-entités, la restriction même
|
||||
que le rôle pose), changer le `niveau`/l'`entite_principale`, renommer le rôle,
|
||||
ajouter/retirer un module ou élargir la permission (`R/W`→`R/W/D`) — laisse la fiche
|
||||
périmée pendant que le contrat dit autre chose → l'agent ERPNext Backend câblerait
|
||||
le mauvais rôle (le risque même que la fiche veut prévenir).
|
||||
- **État courant** : **aucun attribut périmé** — les 9 attributs + la description
|
||||
recoupent le contrat exactement (anti-invention #6, rien à réécrire). Le défaut est
|
||||
la **surface ungated**.
|
||||
|
||||
**Gate ajouté** (`ci/check_readme_claims.sh`, nouveau bloc « Fiche Mobile » avant
|
||||
`sys.exit`) : (1) **par attribut** — `erpnext_role_name` · `nom_fr` · `portail` ·
|
||||
`entite_principale` · `niveau` · `scope_donnees` · `modules` · permission recomputés
|
||||
du contrat, prose EXACTE exigée (regex par attribut, lookaheads anti-préfixe pour
|
||||
niveau/modules/perm) ; (2) **permission** — le sigle des verbes est **canonique et
|
||||
ordonné** (C/R/W/D/S/X/A) : élargir OU rétrécir la perm change le sigle attendu (un
|
||||
préfixe `R/W` ne satisfait plus `R/W/D`, ni l'inverse) ; verbe inconnu ⇒ ROUGE
|
||||
(étendre le gate) ; (3) **description** recoupée **verbatim** (emphase markdown `**` et
|
||||
point final neutralisés). Cohérences croisées bonus (mordent un contrat INTERNEMENT
|
||||
incohérent) : `famille == portail` (bijection portail) · permission bien `custom` ·
|
||||
`role_id` présent EXACTEMENT une fois. Un claim absent échoue AUSSI (traçabilité :
|
||||
ligne de rôle INTROUVABLE).
|
||||
|
||||
**12 morsures vérifiées** (6 côté contrat = fiche périmée · 6 côté fiche = fiche
|
||||
fausse) : contrat `scope groupe→entite` (sur-portée) · contrat `niveau 2→3` · contrat
|
||||
`+delete` (sigle `R/W→R/W/D`) · contrat description réécrite · contrat rôle renommé
|
||||
(`OTO Plateforme Mobile→OTO Mobile Dev`) · fiche `modules Website→Selling` · fiche
|
||||
`entité 9060 QC→WAF` · fiche perm `R/W→R/W/D` (sur-revendication) · fiche perm `R/W→R`
|
||||
(sous-revendication) · fiche modules over-claim `+Selling` et under-claim `Core` seul ·
|
||||
ligne de rôle entièrement supprimée (INTROUVABLE) ; restauré = green : 9 attributs +
|
||||
description == contrat · famille==portail · perm custom · role_id singleton · exit 0.
|
||||
Working tree byte-restauré (`git checkout --`, **JAMAIS** `git clean`, interdit
|
||||
absolu) · **7 gates re-verts**.
|
||||
|
||||
- `ci/README.md` (table récap du pipeline + paragraphe détaillé « Fiche d'identité
|
||||
du rôle RBAC mobile ») 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
|
||||
du rôle `bench` reste côté VPS).
|
||||
- **Auto-score 4Big** : 96/100.
|
||||
|
||||
Reference in New Issue
Block a user