Files
oto-enterprise-os-dtp/05_deliverables_mvp/daily_reports/2026-07-30-session8.md
T
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

5.6 KiB
Raw Blame History

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.pybuild_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.py11 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).