[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:
@@ -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).
|
||||
Reference in New Issue
Block a user