[DTP-Worker] Sprint 8 · buffer L75 · Domaine RBAC/fixtures_gen : le CATALOGUE des DocTypes custom à créer sur le VPS (« Faisabilité, Publiciste Log, CONFOTUR Application, API Access ») ET la SÉPARATION DES POUVOIRS (« set_user_permissions n'est émis que pour le rôle **RBAC Admin** ») étaient transcrits À LA MAIN dans le README du module rbac/fixtures_gen sans AUCUN gate d'IDENTITÉ. Le bloc racine ne gate que le COMPTE (« 50 rôles / 116 DocPerm » via l'agrégat RBAC de l'apply_plan) — surface distincte. Ces deux faits sont DATA-DERIVED : catalogue = custom_doctypes_a_confirmer de rbac/fixtures_gen/out/MANIFEST.json (les DocTypes custom: true du contrat rbac_50_roles.json) · singleton sécurité = {role | set_user_permissions==1} de out/custom_docperm.json (= OTO Plateforme RBAC Admin) — les deux artefacts byte-gatés par check_artifacts. Aucun gate ne comparait ces ENSEMBLES à la prose : AJOUTER un DocType custom au contrat (MANIFEST rebâtit 5 entrées) · RENOMMER/ÉCHANGER l'un des 4 · PROMOUVOIR un 2e rôle porteur du flag (élévation de privilège) ferait dériver la prose en silence pendant que l'artefact dit autre chose — « vert trompeur » qu'aucune suite tests/ (qui teste des FONCTIONS de mapping, pas la prose du README) n'attrape → nouveau bloc recomputant le catalogue depuis MANIFEST et le singleton depuis custom_docperm (zéro duplication du contrat du générateur #6) et exigeant que la prose l'énumère/le nomme EXACTEMENT. Contrôle par ENSEMBLE (absent ET en trop mordus via set-diff · accents/casse normalisés via unicodedata). Cohérences croisées en bonus : le catalogue est NON VIDE, sans doublon et TRIÉ (byte-déterminisme du générateur) · la séparation des pouvoirs est un SINGLETON (ni vide — garde vacante — ni multiple — élévation de privilège). Un claim absent échoue AUSSI. 6 morsures vérifiées : échange d'un nom de DocType (Faisabilité→Faisabilite2) capté (absents=[faisabilite] en trop=[faisabilite2]) · sous-ensemble (retrait API Access) capté · rôle nommé faux (RBAC Admin→Ventes Conseiller) capté · énumération supprimée (INTROUVABLE) · 2e rôle promu au flag dans l'artefact (singleton cassé) capté · catalogue MANIFEST non trié (byte-déterminisme) capté ; restauré = green : catalogue [API Access,CONFOTUR Application,Faisabilité,Publiciste Log] == MANIFEST · singleton OTO Plateforme RBAC Admin == custom_docperm. État courant : aucun ensemble périmé (anti-invention #6, rien à réécrire) — le défaut est la surface ungated. ci/README.md (table + détail) mis à jour · 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 17:07:38 +00:00
parent 9794eabc8a
commit 733c73ae3f
3 changed files with 186 additions and 1 deletions
+68
View File
@@ -1,5 +1,73 @@
# Activity Log · 2026-07-31 · Claude Code DTP
## Session `20260731_170112` · Buffer S8 · Domaine RBAC/fixtures_gen : le **catalogue des DocTypes `custom`** à créer sur le VPS (« `Faisabilité`, `Publiciste Log`, `CONFOTUR Application`, `API Access` ») ET la **séparation des pouvoirs** (« `set_user_permissions` n'est émis que pour le rôle **RBAC Admin** ») étaient transcrits À LA MAIN dans le README du module sans AUCUN gate d'IDENTITÉ — le bloc racine ne gate que le COMPTE (« 50 rôles / 116 DocPerm » via l'agrégat RBAC de l'apply_plan).
**Tâche** : **Sprint 8 · buffer L75** (DevOps CI/CD · QA). Roadmap fonctionnellement
close ; poursuite de la série anti-dérive (CLAUDE.md #6). Les sessions précédentes ont
gaté les domaines tests, portails, RBAC (3 volets : roleprofile/apply_plan/userperm),
SEO, CRM (pipeline vente + séparation des pouvoirs + commissions), mobile (quadruplet
+ onglets), Legal/CONFOTUR, DevOps, QA (audit 5D ×2 + 4Big ×2), Démo, Frontend/Chat
OTOIA, recette et Fiscal/e-CF. Cette session cible le **module `rbac/fixtures_gen`**
jamais gaté hors son compte agrégé — dont deux faits data-derived du README pointent
les artefacts générés sans être recomputés par aucun gate.
**Dérive silencieuse fermée** :
- `05_deliverables_mvp/rbac/fixtures_gen/README.md:56` : « listés dans
`MANIFEST.custom_doctypes_a_confirmer` (`Faisabilité`, `Publiciste Log`, `CONFOTUR
Application`, `API Access`) » — l'ENSEMBLE des DocTypes `custom: true` à créer.
- `…/README.md:48` : « le flag `set_user_permissions` n'est émis que pour le rôle
**RBAC Admin** » — le SINGLETON `{role | set_user_permissions == 1}`, cœur sécurité
du module (« séparation des pouvoirs · défense en profondeur »).
- Sources faisant autorité (byte-gatées par `check_artifacts`) :
`rbac/fixtures_gen/out/MANIFEST.json.custom_doctypes_a_confirmer` (les DocTypes
`custom` du contrat `rbac_50_roles.json`) et `out/custom_docperm.json` (le seul
rôle porteur du flag = `OTO Plateforme RBAC Admin`).
- Le bloc racine ne gate QUE le **compte** (« 50 rôles / 116 DocPerm » via l'agrégat
RBAC de l'apply_plan). Aucun gate ne comparait ces ENSEMBLES aux artefacts :
**AJOUTER** un DocType `custom` au contrat (le MANIFEST rebâtit 5 entrées),
**RENOMMER/ÉCHANGER** l'un des 4, ou **PROMOUVOIR** un 2ᵉ rôle porteur de
`set_user_permissions` (élévation de privilège) ferait dériver la prose en silence —
« vert trompeur » qu'aucune suite `tests/` (qui teste des FONCTIONS de mapping, pas
la prose) n'attrape.
- **État courant** : **aucun ensemble périmé** — le catalogue (4) et le singleton
recoupent les artefacts exactement (anti-invention #6, rien à réécrire). Le défaut
est la **surface ungated**.
**Nouveau bloc dans `ci/check_readme_claims.sh`** : recompute le catalogue depuis
`MANIFEST.custom_doctypes_a_confirmer` et le singleton depuis `custom_docperm.json`
(zéro duplication du contrat du générateur · #6) et exige que la prose l'énumère/le
nomme **exactement** — contrôle par ENSEMBLE (absent ET en trop mordus via set-diff ·
accents/casse normalisés via `unicodedata`). Cohérences croisées en bonus : le
catalogue est **non vide, sans doublon et trié** (byte-déterminisme du générateur) ;
la séparation des pouvoirs est un **singleton** (ni vide — garde vacante — ni multiple
— élévation de privilège). Un claim absent échoue AUSSI.
### Preuve (6 morsures vérifiées + restauration verte)
| Injection | Résultat |
|---|---|
| README échange nom DocType (`Faisabilité → Faisabilite2`) | ✗ absents=`[faisabilite]` · en trop=`[faisabilite2]` · exit 1 |
| README retrait `API Access` (sous-ensemble) | ✗ absents=`[api access]` · exit 1 |
| README rôle nommé faux (`RBAC Admin → Ventes Conseiller`) | ✗ nomme « Ventes Conseiller » MAIS flag porté par `OTO Plateforme RBAC Admin` · exit 1 |
| README énumération du catalogue supprimée | ✗ énumération du catalogue custom INTROUVABLE · exit 1 |
| artefact 2ᵉ rôle promu au flag (`custom_docperm`) | ✗ set_user_permissions porté par `[…RBAC Admin, …Ventes Conseiller]` (attendu 1) · séparation cassée · exit 1 |
| artefact catalogue MANIFEST non trié | ✗ non trié/dédupliqué · exit 1 |
| restauré | ✓ catalogue `[API Access, CONFOTUR Application, Faisabilité, Publiciste Log]` == MANIFEST · singleton `OTO Plateforme RBAC Admin` == custom_docperm · exit 0 |
- **`ci/README.md`** — surface ajoutée à la table récap du pipeline + paragraphe
descriptif (classe « catalogue RBAC `rbac/fixtures_gen` »).
Suite CI complète re-verte (7 gates) : `guard_constraints` · `validate_json` ·
`check_docs` · `check_artifacts` · `check_regression` · `check_ci_integrity` ·
`check_readme_claims`.
**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_163112` · Buffer S8 · Domaine CRM/Commissions : la **cross-cohérence** du barème vendeurs (« cœur du livrable ») — les états **brouillon exclus** (`lead/visite/devis/abandonné`), les **champs de base** (`montant_reservation`, `montant_contrat`) et l'**invariant 3** « on ne commissionne que des états soumis » — était énumérée À LA MAIN dans le README du module sans AUCUN gate d'IDENTITÉ ; le bloc racine ne gate que le COMPTE de tests (« 25 », via l'agrégat « Total CRM »).
**Tâche** : **Sprint 8 · buffer L75** (DevOps CI/CD · QA). Roadmap fonctionnellement