Files
Claude Code DTP Worker 70e022ccd6 [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>
2026-07-30 04:04:04 +00:00

94 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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).