[DTP-Worker] Sprint 8 · buffer · CRM/workflow_vente (3e surface) : la TABLE « Rôles = contrat RBAC » — le RÔLE RBAC qui GARDE chaque transition du pipeline vente, CŒUR sécurité du workflow — était transcrite EN PROSE (README:55-62) SANS AUCUN gate d'IDENTITÉ.

Les deux blocs CRM/workflow existants gatent le COMPTE (« 9 états · 11 transitions ») ET l'énumération des transitions à séparation des pouvoirs (allow_self_approval=0), jamais l'identité des GARDES. Sources faisant autorité (byte-gatées par check_artifacts) : out/workflow.json (chaque transition porte `allowed` = le rôle gardien) + out/MANIFEST.json.roles_rbac_utilises[].erpnext_role_name (recomputé du contrat rbac_50_roles.json à chaque build). PIÈGE : les blocs COMPTE/séparation sont AVEUGLES à l'identité des gardes → RÉAFFECTER un pas monétaire (« Confirmer réservation » Réservations→Conseiller = élévation de privilège) · RENOMMER un rôle · AJOUTER un fantôme · en OUBLIER un laissait le README périmé pendant que l'artefact dit autre chose → l'agent ERPNext Backend câblerait le mauvais garde (le risque même que la table veut prévenir) — « vert trompeur » qu'aucune suite tests/ (qui teste des FONCTIONS de graphe/résolution RBAC, pas la prose) n'attrape. Même patron d'IDENTITÉ que la cross-cohérence PERMISSIONS Legal/CONFOTUR déjà gatée.

Nouveau bloc « CRM gardes » dans ci/check_readme_claims.sh (après le bloc Démo scénarios) : (1) identité d'ensemble — colonne « Rôle » de la table == {allowed} de workflow.json (set-diff · NFKD/casefold) ; (2) cohérence artefacts — {allowed} == roles_rbac_utilises du MANIFEST (aucun garde hors manifeste ni l'inverse) · ensemble NON VIDE ; (3) cross-cohérence par pas — les gardes des étapes SENSIBLES et uniques Confirmer réservation/Signer contrat/Approuver CONFOTUR (recomputés `allowed`, jamais figés) nommés EXACTEMENT dans leur ligne. Le (3) mord la RÉAFFECTATION vers un rôle DÉJÀ présent (rôle servant deux transitions) que le set-diff seul manquerait. Un claim absent échoue AUSSI.

7 morsures vérifiées : README réaffecte Confirmer réservation→Conseiller (absents=[réservations] + pas mordu) · artefact réaffecte Signer contrat→Conseiller (en trop=[contrats] + incohérence MANIFEST + pas mordu) · README rôle fantôme (en trop=[oto fantome]) · README retire un rôle (absents=[direction commerciale]) · artefact MANIFEST perd un garde (garde pas dans MANIFEST=[réservations]) · table supprimée (INTROUVABLE) · artefact réaffecte Approuver CONFOTUR→Directeur (rôle déjà présent, set INCHANGÉ, captée UNIQUEMENT par la cross-cohérence par pas) ; restauré = green : 7 rôles · colonne == {allowed} == roles_rbac_utilises · 3 étapes sensibles pinnées · exit 0. État courant : aucun garde périmé (anti-invention #6, rien à réécrire) — le défaut était la surface ungated. ci/README.md (table + détail « 3e surface workflow_vente ») mis à jour · working tree byte-restauré (git checkout --, JAMAIS git clean) · 7 gates re-verts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-31 23:11:18 +00:00
parent 63760a144b
commit 082b057639
3 changed files with 191 additions and 1 deletions
+58
View File
@@ -1,5 +1,63 @@
# Activity Log · 2026-07-31 · Claude Code DTP
## Session `20260731_230154` · Buffer S8 · Domaine CRM/workflow_vente (3e surface) : la **table « Rôles = contrat RBAC »** — le **rôle RBAC qui GARDE chaque transition** du pipeline vente, CŒUR sécurité du workflow (qui a le droit d'exécuter quel pas) — était transcrite EN PROSE (README:55-62) SANS AUCUN gate d'IDENTITÉ. Les deux blocs CRM/workflow existants gatent le COMPTE (« 9 états · 11 transitions ») ET l'énumération des transitions à séparation des pouvoirs (`allow_self_approval=0`), jamais l'identité des gardes.
**Tâche** : **Sprint 8 · buffer** (DevOps CI/CD · QA). Roadmap fonctionnellement
close ; poursuite de la série anti-dérive (CLAUDE.md #6). Même patron d'IDENTITÉ que
la cross-cohérence PERMISSIONS Legal/CONFOTUR (`role_id`→actions) ou le catalogue
RBAC `fixtures_gen` — appliqué à la **3ᵉ surface data-derived du même README
`crm/workflow_vente`**, jamais gatée.
**Dérive silencieuse fermée** :
- `05_deliverables_mvp/crm/workflow_vente/README.md:55-62` — table « Étape → Rôle
qui garde la transition » : nomme, PAR pas, le rôle RBAC autorisé (`Planifier
visite · Émettre devis``OTO Ventes Conseiller` · `Confirmer réservation``OTO
Ventes Réservations` · `Signer contrat``OTO Ventes Contrats` · `Déposer/Approuver
CONFOTUR``OTO Ventes CONFOTUR` · `Annuler/Résilier``OTO Ventes Directeur · OTO
Direction Commerciale` · etc.).
- Sources faisant autorité (byte-gatées par `check_artifacts`) :
`out/workflow.json` — chaque transition porte `allowed` (le rôle qui garde le pas) ;
ET `out/MANIFEST.json.roles_rbac_utilises[].erpnext_role_name` — l'ensemble des
rôles employés, RECOMPUTÉ du contrat `rbac_50_roles.json` à chaque build.
- Piège : les blocs de COMPTE/séparation sont AVEUGLES à l'identité des gardes.
RÉAFFECTER un pas monétaire (« Confirmer réservation » — soumission d'argent —
`Réservations``Conseiller` : **élévation de privilège**), RENOMMER un rôle,
AJOUTER un fantôme dans la prose ou en OUBLIER un laisse le README périmé pendant
que l'artefact dit autre chose → l'agent ERPNext Backend câblerait le mauvais garde
(le risque même que la table veut prévenir). Aucune suite `tests/` (qui teste des
FONCTIONS de graphe/résolution RBAC, pas la prose) n'attrape ce « vert trompeur ».
- **État courant** : **aucun garde périmé** — les 7 rôles de la table recoupent les
artefacts exactement (anti-invention #6, rien à réécrire). Le défaut est la
**surface ungated**.
**Gate ajouté** (`ci/check_readme_claims.sh`, nouveau bloc « CRM gardes » après le
bloc Démo scénarios) : (1) **identité d'ensemble** — colonne « Rôle » de la table ==
`{allowed}` de `workflow.json` (set-diff · NFKD/casefold) ; (2) **cohérence
artefacts** — `{allowed}` == `roles_rbac_utilises` du MANIFEST (aucun garde hors
manifeste, ni l'inverse) · ensemble NON VIDE ; (3) **cross-cohérence par pas** — les
gardes des étapes SENSIBLES et uniques `Confirmer réservation`/`Signer contrat`/
`Approuver CONFOTUR` (recomputés `allowed`, jamais figés) doivent être nommés
EXACTEMENT dans leur ligne. Le (3) mord la **réaffectation vers un rôle DÉJÀ
présent** que le set-diff seul manquerait (un rôle servant deux transitions). Un
claim absent échoue AUSSI (traçabilité).
**7 morsures vérifiées** : README réaffecte `Confirmer réservation``Conseiller`
(absents=[réservations] + cross-cohérence par pas mordue) · artefact réaffecte
`Signer contrat``Conseiller` (en trop=[contrats] + incohérence MANIFEST + pas
mordu) · README ajoute rôle fantôme (en trop=[oto fantome]) · README retire un rôle
(absents=[direction commerciale]) · artefact MANIFEST perd un garde (garde pas dans
MANIFEST=[réservations]) · table supprimée (INTROUVABLE) · **artefact réaffecte
`Approuver CONFOTUR``Directeur` — rôle déjà présent, set INCHANGÉ, captée UNIQUEMENT
par la cross-cohérence par pas** ; restauré = green : 7 rôles · colonne == `{allowed}`
== `roles_rbac_utilises` · 3 étapes sensibles pinnées · exit 0. Working tree
byte-restauré (`git checkout --`, JAMAIS `git clean`) · **7 gates re-verts**.
- `ci/README.md` (table récap + détail « 3ᵉ surface du même README workflow_vente »)
mis à jour.
- **Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ;
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact).
- **Auto-score 4Big** : 96/100.
## Session `20260731_220140` · Buffer S8 · Domaine Legal/CONFOTUR (2e surface) : la **cross-cohérence PERMISSIONS** du DocType — le CŒUR sécurité du livrable — énumérait EN PROSE, PAR rôle, son **portail** ET son **jeu d'actions RBAC** (`ventes-confotur`→read/write/create/print · `legal-onapi`→read/write/create · `legal-directeur`→read/write/**submit**/report) SANS AUCUN gate d'IDENTITÉ. Le bloc CONFOTUR existant ne gate QUE le COMPTE (« 3 rôles »).
**Tâche** : **Sprint 8 · buffer** (DevOps CI/CD · QA). Roadmap fonctionnellement