d815c7ab63
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>
5.0 KiB
5.0 KiB
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_ownerdérivé descope_donnees == "own", constructeursrole_fixture()/docperm_fixture(). Aucun chiffre métier (contrainte #1 : ERPNext natif, aucun modèle externe).fixturelib/builder.py—build_bundle()déterministe (tri stable rôles par nom Frappe, DocPerms par (role, doctype, permlevel)), collecte des DocTypescustomà confirmer, manifeste de traçabilité.rbac_fixtures_gen.py— CLIbuild(écritrole.json/custom_docperm.json/MANIFEST.json) etvalidate. 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.py— 11 testsunittest(stdlib pur) : schéma (maison + oraclejsonschemasi 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-testsajouté au gate de.gitea/workflows/ci.yml(Gitea Actions uniquement · #2). README.md+.gitignore(outputout/non commité, re-généré à la demande).RBAC_50_ROLES_SPEC.md §7mis à jour (générateur livré).
Anti-invention (#6) appliqué
- 100 % des données proviennent du contrat
rbac_50_roles.jsondé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 →
ValueErrorexplicite (garde-fou anti-contrat corrompu). - DocTypes DTP
customjamais supposés existants : listés dans le manifeste « à créer + confirmer VPS » avant import (SPEC §6/§7). - Séparation des pouvoirs :
set_user_permissionsré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 DocTypescustomsignalés. - Gate CI local vert (exit 0) :
guard_constraints.sh,validate_json.sh,check_docs.sh(0 lien cassé), YAMLci.ymlvalide. - 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) surerpnext-backend-1→ agent ERPNext Backend. - Création des DocTypes DTP
custom+ mappingscope_donnees→User Permissionpar 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 Permissionpar entité (WAF/WA SRL/AC…) depuisscope_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).