[DTP-Worker] Sprint 2 · Générateur Role Profile par portail (RBAC 50 rôles → 6 bundles assignables ERPNext v15)

- roleprofile_gen/ : profilelib (frappe Role Profile + Has Role natif v15,
  builder déterministe), roleprofile.schema.json, CLI build/validate refusant
  d'écrire si invariant cassé, 11 tests stdlib, README, .gitignore (out/).
- 6 profils couvrant les 50 rôles de façon bijective (5 portails métier +
  console technique plateforme). Aucun DocType custom (que du natif).
- Anti-invention #6 : rôles 100 % issus du contrat, nom de profil = convention
  déterministe dérivée de la clé portail.
- CI : job rbac-roleprofile-tests ajouté au gate (.gitea/workflows/ci.yml).
- Doc : SPEC §7 ét.5 + encart livré. Daily report session 8.
- Régression : 83 tests verts (72 + 11). Gate CI local vert.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-30 04:04:04 +00:00
parent b1b011ab81
commit 70e022ccd6
11 changed files with 879 additions and 2 deletions
@@ -0,0 +1,93 @@
# Daily Report · 2026-07-30 · Claude Code DTP Worker (session 8)
**Session** : `20260730_035651`
## Tâche exécutée
**Sprint 2 · Livrable ERPNext Backend « Générateur de `Role Profile` par portail
(RBAC 50 rôles → bundles de rôles assignables) »**
(roadmap `04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md` §Sprint 2 « RBAC 50 rôles » ·
`RBAC_50_ROLES_SPEC.md` §7 ét. 5 · **prochaine tâche suggérée** par le daily
report session 7 : « générateur `Role Profile` par portail »).
## Contexte / analyse
- Relu `CLAUDE.md`, `ROADMAP_8_WEEKS_OR_LESS.md`, daily report session 7,
`rbac_50_roles.json` + `rbac.schema.json`, les deux générateurs existants
(`fixtures_gen` Role+DocPerm, `userperm_gen` row-level), le validateur maison
Publiciste, le patron CI.
- État Sprint 2 : contrat RBAC (s4), Publiciste (s3), Faisabilité (s5), fixtures
`Role`+`Custom DocPerm` (s6), plan `User Permission` row-level (s7) livrés.
Frontend/CRM dépendent de layouts LIVE (VPS) → hors périmètre worker.
- **Priorité évidente** (SPEC §7 + report s7) : le **bundle assignable** manquant.
`fixtures_gen` = « quels verbes sur quel DocType », `userperm_gen` = « sur
quelles lignes » ; il manquait « comment donner à un utilisateur tous les rôles
de son portail en un geste ». ERPNext v15 le fait nativement avec le DocType
`Role Profile`. 100 % autorable sans VPS/pip/API, même patron que les deux
générateurs précédents, sur le chemin critique de l'application RBAC (S4).
## Réalisé — module `05_deliverables_mvp/rbac/roleprofile_gen/`
- `profilelib/frappe.py` — modèle **Frappe/ERPNext v15 natif** : DocTypes
`Role Profile` + child `Has Role` (aucun DocType custom). Nom de profil =
**convention de nommage déterministe** `OTO Portail <Portail>` dérivée de la
clé `portail` (aucun libellé métier fabriqué, #6). Garde-fous : portail vide et
profil sans rôle → `ValueError`.
- `profilelib/builder.py``build_bundle()` **déterministe** : regroupe les 50
rôles par `portail` (profils triés par portail, `Has Role` triés par nom de
rôle) → **6 profils** + manifeste (comptes, flag métier vs technique, mapping
`portail → role_profile`).
- `roleprofile_gen.py` — CLI `build` / `validate`. **Refuse d'écrire** si un
invariant casse (schéma, couverture **bijective** des 50 rôles, un profil par
portail distinct, cohérence portail intra-profil, fidélité du manifeste,
cohérence des comptes, tris déterministes).
- `roleprofile.schema.json` — contrat de sortie draft-07 (sous-ensemble supporté
par le **validateur maison Publiciste**, zéro pip).
- `tests/test_roleprofile_gen.py`**11 tests `unittest` (stdlib pur)** : schéma
(maison + oracle `jsonschema` si présent), couverture bijective, un profil par
portail, cohérence portail, manifeste fidèle, anti-invention (que du natif v15),
déterminisme, garde-fous.
- **CI** : job `rbac-roleprofile-tests` ajouté au **gate** de
`.gitea/workflows/ci.yml` (Gitea Actions uniquement · #2).
- `README.md` + `.gitignore` (output `out/` non commité, re-généré à la demande).
- **Docs cousues** : `RBAC_50_ROLES_SPEC.md §7` (nouvelle ét. 5 + encart livré,
renumérotation de la vérification HTTP en ét. 6).
## Anti-invention (#6) appliqué
- 100 % des rôles (et leur portail) proviennent du contrat `rbac_50_roles.json`.
- **Que du natif ERPNext v15** : `Role Profile` + `Has Role` → aucun DocType
custom à confirmer côté VPS (contrainte #1 « ERPNext natif »).
- Le nom du profil est une convention déterministe dérivée de la clé `portail`,
pas un libellé métier inventé ; la clé brute reste tracée dans le manifeste.
- Le flag `metier` reflète strictement l'appartenance à `portails_business` du
contrat (les 6 portails = 5 métier + la console technique `plateforme`).
## Vérifications effectuées (en-repo, sans toucher au VPS)
- **11/11 tests verts** (schéma maison + oracle `jsonschema`). Génération réelle :
**6 profils** (Ventes 12, Construction 10, Direction 9, Compta 8, Achat 5 =
métier ; Plateforme 6 = technique), **50/50 rôles couverts** de façon bijective.
- **Gate CI local vert (exit 0)** : `guard_constraints.sh`, `validate_json.sh`,
`check_docs.sh` (0 lien cassé, mention score présente), YAML `ci.yml` valide.
- **Régression** : 23 Publiciste + 10 RBAC + 11 fixtures + 12 userperm + 16
Faisabilité + 11 roleprofile = **83 tests verts**.
## Note de cohérence documentaire
- Le tableau §3 du SPEC annonçait direction=10 / plateforme=5 ; le JSON réel porte
direction=9 / plateforme=6. Le SPEC note explicitement que **le JSON est la
source de vérité** → le générateur est data-driven (compte réel). Pas de
correction du tableau §3 (marqué « indicatif ») pour ne pas dévier du périmètre.
## Non fait (hors périmètre worker · VPS)
- Import `bench migrate` des fixtures + affectation `User.role_profile_name` par
utilisateur → agent ERPNext Backend (SPEC §7 ét. 3/5).
## Prochaine tâche suggérée
- ERPNext S2 : agrégateur `MANIFEST` unifié Role + DocPerm + User Permission +
Role Profile (vue/ordre d'application VPS unique), pour clore le volet RBAC.
- Ou Faisabilité S3 : `40_llm_outputs/` + rapports bancables FR/EN/ES.
- Frontend/CRM S2 : dépend des layouts LIVE (VPS) → hors périmètre worker.
---
**Auto-score 4Big du livrable Générateur de Role Profile : 96/100.**
Réserve 4 : import `bench` + affectation `role_profile_name` par utilisateur =
côté VPS (agent ERPNext, hors périmètre worker, #8). Validé statiquement en-repo
(11 tests verts + schéma conforme + couverture bijective fidèle au contrat + gate
CI vert · 83 tests de régression au total).