70e022ccd6
- 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>
5.6 KiB
5.6 KiB
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_genRole+DocPerm,userperm_genrow-level), le validateur maison Publiciste, le patron CI. - État Sprint 2 : contrat RBAC (s4), Publiciste (s3), Faisabilité (s5), fixtures
Role+Custom DocPerm(s6), planUser Permissionrow-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 DocTypeRole 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 : DocTypesRole Profile+ childHas Role(aucun DocType custom). Nom de profil = convention de nommage déterministeOTO 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 parportail(profils triés par portail,Has Roletriés par nom de rôle) → 6 profils + manifeste (comptes, flag métier vs technique, mappingportail → role_profile).roleprofile_gen.py— CLIbuild/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 testsunittest(stdlib pur) : schéma (maison + oraclejsonschemasi 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-testsajouté au gate de.gitea/workflows/ci.yml(Gitea Actions uniquement · #2). README.md+.gitignore(outputout/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
metierreflète strictement l'appartenance àportails_businessdu contrat (les 6 portails = 5 métier + la console techniqueplateforme).
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), YAMLci.ymlvalide. - 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 migratedes fixtures + affectationUser.role_profile_namepar utilisateur → agent ERPNext Backend (SPEC §7 ét. 3/5).
Prochaine tâche suggérée
- ERPNext S2 : agrégateur
MANIFESTunifié 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).