Files
oto-enterprise-os-dtp/05_deliverables_mvp/daily_reports/2026-07-30-session6.md
T
Claude Code DTP Worker d815c7ab63 [DTP-Worker] Sprint 2 · Générateur fixtures ERPNext (RBAC 50 rôles → Role + Custom DocPerm)
Transforme rbac_50_roles.json en fixtures Frappe/ERPNext v15 natives, prêtes à
appliquer via bench (VPS · agent ERPNext). Réalise le prochain incrément annoncé
au §7 de RBAC_50_ROLES_SPEC.md. Zéro pip, zéro VPS, sortie déterministe.

- fixturelib/frappe.py : modèle natif (15 flags DocPerm, mapping 1:1 des verbes
  RBAC, if_owner⇔scope "own"). fixturelib/builder.py : bundle déterministe.
- rbac_fixtures_gen.py : CLI build/validate (refuse d'écrire si invariant KO).
- fixtures.schema.json : contrat de sortie (validateur maison Publiciste réutilisé).
- 11 tests unittest : schéma+oracle, 50 rôles, séparation des pouvoirs,
  round-trip fidèle au contrat, déterminisme. Job CI rbac-fixtures-tests au gate.
- Anti-invention #6 : 100% dérivé du contrat, flags non pilotés à 0, DocTypes
  custom signalés « à confirmer VPS ».

Vérif : 11/11 verts + gate CI local vert (exit 0) + régression 60 tests OK.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 03:03:12 +00:00

5.0 KiB
Raw Blame History

Daily Report · 2026-07-30 · Claude Code DTP Worker (session 6)

Session : 20260730_025643

Tâche exécutée

Sprint 2 · Livrable ERPNext Backend « Générateur de fixtures RBAC → Frappe » (roadmap 04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md §Sprint 2 « RBAC 50 rôles » · RBAC_50_ROLES_SPEC.md §7 qui l'annonce comme prochain incrément · suggéré par les daily reports sessions 4-5).

Contexte / analyse

  • Relu CLAUDE.md, ROADMAP_8_WEEKS_OR_LESS.md, GAP_ANALYSIS_SPRINT1.md, daily reports sessions 4-5, rbac_50_roles.json + rbac.schema.json + RBAC_50_ROLES_SPEC.md, validateur maison Publiciste, patrons générateur Faisabilité + CI.
  • État Sprint 2 côté repo : RBAC contrat (s4), Publiciste parser+gen (s3), Faisabilité générateur 4 volets (s5) livrés. Frontend/CRM dépendent des layouts LIVE (VPS · hors périmètre).
  • Priorité évidente et déjà annoncée (SPEC §7, reports s4/s5) : le générateur de fixtures ERPNext rbac_50_roles.json → Role + Custom DocPerm. Sur le chemin critique de l'application RBAC (S4), 100 % autorable en-repo (zéro API, zéro VPS, zéro pip), branché sur le même patron que le Publiciste/Faisabilité.

Réalisé — module 05_deliverables_mvp/rbac/fixtures_gen/

  • fixturelib/frappe.py — modèle natif Frappe/ERPNext v15 : ordre des 15 flags DocPerm, mapping 1:1 des 12 verbes RBAC → flags, if_owner dérivé de scope_donnees == "own", constructeurs role_fixture() / docperm_fixture(). Aucun chiffre métier (contrainte #1 : ERPNext natif, aucun modèle externe).
  • fixturelib/builder.pybuild_bundle() déterministe (tri stable rôles par nom Frappe, DocPerms par (role, doctype, permlevel)), collecte des DocTypes custom à confirmer, manifeste de traçabilité.
  • rbac_fixtures_gen.py — CLI build (écrit role.json / custom_docperm.json / MANIFEST.json) et validate. La génération refuse d'écrire si un invariant casse (schéma, 50 rôles, unicité, séparation des pouvoirs).
  • fixtures.schema.json — contrat de sortie draft-07 (sous-ensemble supporté par le validateur maison Publiciste, zéro pip).
  • tests/test_fixtures_gen.py11 tests unittest (stdlib pur) : schéma (maison + oracle jsonschema si présent), 50 rôles uniques, flags non pilotés à 0, if_owner⇔scope, séparation des pouvoirs, round-trip fidèle au contrat (aucune permission inventée ni perdue), déterminisme bit-à-bit.
  • CI : job rbac-fixtures-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).
  • RBAC_50_ROLES_SPEC.md §7 mis à jour (générateur livré).

Anti-invention (#6) appliqué

  • 100 % des données proviennent du contrat rbac_50_roles.json déjà validé ; seuls ajouts = flags DocPerm natifs à 0 (défaut sûr) + méta de traçabilité.
  • Verbes non pilotés (select/amend/import) forcés à 0 et testés.
  • Verbe hors contrat → ValueError explicite (garde-fou anti-contrat corrompu).
  • DocTypes DTP custom jamais supposés existants : listés dans le manifeste « à créer + confirmer VPS » avant import (SPEC §6/§7).
  • Séparation des pouvoirs : set_user_permissions réservé au RBAC Admin, vérifié par test et par le CLI (échec si un autre rôle le porte).

Vérifications effectuées (en-repo, sans toucher au VPS)

  • 11/11 tests verts (schéma maison + oracle jsonschema → concordance draft-07 confirmée). Génération réelle : 50 rôles, 116 Custom DocPerm sur 45 DocTypes, 4 DocTypes custom signalés.
  • Gate CI local vert (exit 0) : guard_constraints.sh, validate_json.sh, check_docs.sh (0 lien cassé), YAML ci.yml valide.
  • Régression : 23/23 Publiciste + 10/10 RBAC + 16/16 Faisabilité toujours verts (réutilisation du validateur sans effet de bord). Total 60 tests.

Non fait (hors périmètre worker · VPS)

  • Application des fixtures (bench migrate / import-fixtures) sur erpnext-backend-1 → agent ERPNext Backend.
  • Création des DocTypes DTP custom + mapping scope_donneesUser Permission par utilisateur → VPS.
  • permlevel > 0 (segmentation par niveau de champ) : non spécifié par le contrat RBAC → non couvert (anti-invention #6).

Prochaine tâche suggérée

  • ERPNext S2 : générateur des fixtures User Permission par entité (WAF/WA SRL/AC…) depuis scope_donnees (même patron, autorable en-repo partiellement).
  • Ou Faisabilité S3 : 40_llm_outputs/ + rapports bancables FR/EN/ES.
  • Ou Frontend/CRM S2 : dépend des layouts LIVE (VPS) → hors périmètre worker.

Auto-score 4Big du livrable Générateur de fixtures RBAC : 96/100. Réserve 4 : application bench + DocTypes custom + User Permission = côté VPS (agent ERPNext, hors périmètre) ; permlevel > 0 non couvert (anti-invention #6). Validé statiquement en-repo (11 tests verts + round-trip fidèle au contrat

  • gate CI vert).