Files
Claude Code DTP Worker a30ff937f0 [DTP-Worker] Sprint 8 · buffer L75 · Reproductibilité checkout propre : hand-off out/ des 4 générateurs RBAC était .gitignore-é (gate rouge en CI, vert local seulement) + durcissement check_artifacts (build produit ⇒ DOIT être suivi par git)
Défaut réel (même classe que le bug regression_run.json corrigé plus tôt) :
les 4 générateurs RBAC (fixtures_gen/userperm_gen/roleprofile_gen/apply_plan)
.gitignore-aient leur out/, alors qu'ils sont audités en archétype `generator`
(critère HANDOFF). En checkout PROPRE (git archive HEAD = ce que voit le runner
Gitea) leur out/ est absent → qa/audit_4big (dont le build relit le out/ de
CHAQUE module) les note 80<95 ⇒ INV7 ⇒ build refusé ⇒ check-artifacts ET
check-regression ROUGES. Ça ne passait qu'en local via les out/ non suivis
laissés par des build manuels.

Fix : committer le out/ des 4 générateurs (build byte-déterministe prouvé ;
apply_plan lit ses frères en process, pas via out/) → alignement sur les 15
autres générateurs ; audit 100/100 en checkout propre.

Durcissement : check_artifacts.sh exige désormais `git ls-files --error-unmatch`
sur chaque fichier produit → un out/ ignoré/non commité devient une erreur
LOCALE honnête au lieu d'une surprise en CI. Bite-proof : git rm --cached d'un
artefact (laissé sur disque) ⇒ exit 1 ; re-add ⇒ exit 0.

Régénéré : quality_report.json (dérive DOC = taille des 4 README édités).
Vérifs : 6 gates verts sur git archive propre ; 534/21 inchangé ; suites OK.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-31 01:42:14 +00:00
..

Générateur de fixtures ERPNext · RBAC 50 rôles → Frappe

Sprint 2 · agent ERPNext Backend. Transforme le contrat ../rbac_50_roles.json (validé par ../rbac.schema.json) en fixtures Frappe/ERPNext v15 natives, prêtes à appliquer sur le VPS par bench. Réalise le « prochain incrément » annoncé au §7 de ../RBAC_50_ROLES_SPEC.md.

Ce worker n'écrit jamais sur le VPS (contrainte #8). Il produit les fichiers en-repo ; l'application réelle (bench migrate) reste côté serveur.

Ce qui est généré (out/, commité · byte-déterministe)

Fichier DocType Frappe Rôle
role.json Role 50 rôles desk préfixés OTO (anti-collision natif).
custom_docperm.json Custom DocPerm Permissions par DocType, sans modifier le DocType (réversible, ne casse pas les updates d'app).
MANIFEST.json Traçabilité (comptes, version source) + DocTypes DTP custom à créer/confirmer VPS.

Utilisation

# Génère out/role.json, out/custom_docperm.json, out/MANIFEST.json
python3 rbac_fixtures_gen.py build            # [-o DOSSIER]

# Valide le bundle (schéma + invariants) sans rien écrire
python3 rbac_fixtures_gen.py validate

# Tests (stdlib pur, zéro pip)
python3 -m unittest discover -s tests -v

Mapping RBAC → Frappe (aucune invention · #6)

  • Chaque permissions_cibles[].actions du contrat lève 1:1 le flag DocPerm natif correspondant (read/write/create/delete/submit/cancel/ report/export/print/email/share/set_user_permissions). Les flags non pilotés (select/amend/import) restent à 0 (défaut sûr).
  • scope_donnees == "own"if_owner = 1 (restriction Frappe native). Les portées equipe/entite/groupe relèvent des User Permission par utilisateur → appliquées sur le VPS (SPEC §7), hors périmètre worker.
  • permlevel = 0 (le contrat ne segmente pas par niveau de champ).
  • Sortie déterministe (tri stable, aucun horodatage) → diffable, re-générable bit-à-bit en CI.

Séparation des pouvoirs (défense en profondeur)

Le flag set_user_permissions n'est émis que pour le rôle RBAC Admin (famille = plateforme, scope = groupe) — vérifié par test et par le CLI (validate échoue si un autre rôle le porte). Aucune élévation de privilège possible via les fixtures.

Application sur VPS (agent ERPNext Backend · hors périmètre worker)

  1. Créer d'abord les DocTypes DTP custom listés dans MANIFEST.custom_doctypes_a_confirmer (Faisabilité, Publiciste Log, CONFOTUR Application, API Access) après confirmation d'existence.
  2. Déposer role.json + custom_docperm.json dans fixtures/ de l'app OTO, référencés dans hooks.py.
  3. bench --site frontend migrate (ou bench import-fixtures).
  4. Mapper scope_donneesUser Permission par utilisateur — plan généré par ../userperm_gen.
  5. Vérification HTTP post-déploiement (workflow #3) + audit QA 4Big.

Vérification en-repo

  • python3 -m unittest discover -s tests -v11/11 verts (schéma maison + oracle jsonschema si présent ; round-trip fidèle au contrat, déterminisme, séparation des pouvoirs).
  • Job CI dédié rbac-fixtures-tests ajouté au gate (.gitea/workflows/ci.yml, Gitea Actions uniquement · #2).

Auto-score 4Big du livrable : 96/100

Réserve 4 : application des fixtures + création des DocTypes custom + mapping User Permission = côté VPS (agent ERPNext, hors périmètre worker) ; permlevel > 0 non couvert (le contrat RBAC ne le spécifie pas — anti-invention #6). Validé statiquement en-repo (11 tests verts + schéma conforme + gate CI).