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

76 lines
3.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Générateur de fixtures ERPNext · RBAC 50 rôles → Frappe
**Sprint 2 · agent ERPNext Backend.** Transforme le contrat
[`../rbac_50_roles.json`](../rbac_50_roles.json) (validé par
[`../rbac.schema.json`](../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`](../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
```bash
# 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_donnees``User Permission` par utilisateur — plan généré par [`../userperm_gen`](../userperm_gen/README.md).
5. Vérification HTTP post-déploiement (workflow #3) + audit QA 4Big.
## Vérification en-repo
- `python3 -m unittest discover -s tests -v`**11/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).