[DTP-Worker 20260802_053514] Sprint 8 · buffer · RBAC SPEC §6 : ancrage de l'ÉNUMÉRATION des DocTypes custom (2ᵉ surface prose) sur le catalogue byte-gaté du contrat

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-02 05:49:04 +00:00
parent 11c48b668b
commit 0d4fd0942c
2 changed files with 70 additions and 0 deletions
+47
View File
@@ -1,5 +1,52 @@
# Activity log · 2026-08-02 · Claude Code DTP Worker
## Sprint 8 · buffer · RBAC SPEC §6 — ancrage de l'ÉNUMÉRATION des DocTypes `custom` sur le catalogue du contrat (2ᵉ surface prose)
**Contexte** — Série anti-dérive Sprint 8 (CLAUDE.md #6 « zéro invention »). Le
générateur `rbac_fixtures_gen` émet `MANIFEST.custom_doctypes_a_confirmer` =
l'ensemble des DocTypes `custom: true` du contrat `rbac_50_roles.json` (les DocTypes
DTP **à créer** côté VPS avant import — `Faisabilité`, `Publiciste Log`, `CONFOTUR
Application`, `API Access`). Cet ensemble data-derived est transcrit À LA MAIN à
**deux** surfaces prose : (1) `rbac/fixtures_gen/README.md`**déjà gatée** (bloc
« RBAC fixtures · catalogue custom ») ; (2) `RBAC_50_ROLES_SPEC.md §6` l.117
**DocTypes `custom: true`** (`Faisabilité`, `Publiciste Log`, `CONFOTUR
Application`, `API Access`) ») — **NON gatée**. Le bloc `apply_plan` ne gate que le
COMPTE (`len(custom_doctypes)`), aveugle aux NOMS ; `check_artifacts` est aveugle
(la SPEC n'est pas un `out/*.json`).
**Le « vert trompeur »** — AJOUTER un DocType `custom` au contrat (le MANIFEST
rebâtit l'entrée) ou RENOMMER/ÉCHANGER l'un des 4 laisse §6 à ses 4 noms périmés en
silence : la cible d'application VPS énumérée par la SPEC ne correspond plus aux
DocTypes que l'agent ERPNext doit réellement créer. Vérifié par mutation : dropper
`Publiciste Log` de §6 laissait le gate à **exit 0**. Même patron que la 2ᵉ surface
CONFOTUR/entités (README gaté, fiche non).
**Gate ajouté** (`ci/check_readme_claims.sh`, extension du bloc « RBAC fixtures »,
point 3) — RÉUTILISE `fx_cdt` (= `MANIFEST.custom_doctypes_a_confirmer`, byte-gaté,
déjà dérivé par le point 1) et le normaliseur d'accents `_fx_acc` (zéro duplication
du contrat) : capte l'énumération §6 (`DocTypes `custom: true`** (…)` sur le texte
whitespace-normalisé, robuste au retour-ligne 117↔118), extrait les tokens
backtickés, et exige set-diff EXACT == catalogue MANIFEST (absent ET en trop, casse/
accents neutralisés). Énumération INTROUVABLE = échec (anti-évaporation #6).
**Vérif** — 1 check vert sur l'arbre propre (les 4 == MANIFEST). **5 morsures**
adversariales : A dropper `Publiciste Log` ⇒ absent · B renommer `API Access``API
Acces` ⇒ absent+en-trop · C ajouter `Ghost DocType` fantôme ⇒ en-trop · **D
SILENT-GREEN : le MANIFEST GAGNE un 5ᵉ DocType custom (§6 inchangé) ⇒ mord « absents=
[new custom dt] » — preuve que l'autorité est l'ARTEFACT, pas la cohérence interne
de la SPEC** · E énumération §6 supprimée ⇒ INTROUVABLE. Reverts par chemin ciblé
(jamais `git checkout` large — cf. incident consigné). Suite complète re-verte :
`check_artifacts` · `check_docs` · `guard_constraints` · `check_ci_integrity` ·
`check_regression` · `check_readme_claims` tous exit 0.
**Note process** — un candidat initial (ancrage des attributs de rôle des fiches
`mobile`/`rendu`/`ifc_speckle`) s'est révélé DÉJÀ couvert par les blocs existants
« Fiche Mobile » / « Fiches Faisabilité » : la ligne d'index `MEMORY.md` était
périmée vs le corps détaillé de la mémoire (classe close le 2026-08-01). Doublon
écarté (interdit #5 « jamais accumuler doublons »), index mémoire corrigé.
---
## Sprint 8 · buffer · RBAC SPEC §2 — ancrage de l'ÉNUMÉRATION des `scope_donnees` (ligne Row-level) sur l'ENUM du schéma
**Contexte** — Série anti-dérive Sprint 8 (CLAUDE.md #6 « zéro invention de
+23
View File
@@ -4493,6 +4493,29 @@ if fx_cdt is not None:
else:
bad(f"RBAC fixtures · {FX_RD} — nomme « {mr.group(1).strip()} » MAIS "
f"set_user_permissions porté par {fx_sup[0]!r} → régénérer le README")
# 3) RBAC_50_ROLES_SPEC.md §6 — 2ᵉ surface prose du MÊME catalogue custom :
# « **DocTypes `custom: true`** (`Faisabilité`, `Publiciste Log`, … ) ». Le
# bloc apply_plan ne gate que le COMPTE (len custom_doctypes), le point (1)
# ci-dessus que le README fixtures — la SPEC §6 restait AVEUGLE : renommer/
# retirer un DocType `custom` du contrat (le MANIFEST suit, byte-gaté) y
# laisse les 4 noms périmés en silence, comme la 2ᵉ surface CONFOTUR/entités.
if spec_rd is not None:
m6 = re.search(r"DocTypes `custom: true`\*\* \(([^)]*)\)", spec_rd)
if m6 is None:
bad(f"RBAC fixtures · {SPEC_RD} §6 — énumération « DocTypes `custom: "
f"true` (…) » INTROUVABLE (attendu {sorted(fx_cdt)} · anti-évaporation #6)")
else:
got6 = {_fx_acc(t) for t in re.findall(r"`([^`]+)`", m6.group(1))}
exp6 = {_fx_acc(x) for x in fx_cdt}
if got6 == exp6:
good(f"RBAC fixtures · {SPEC_RD} §6 — catalogue custom {sorted(got6)} "
f"== MANIFEST.custom_doctypes_a_confirmer")
else:
miss6 = sorted(exp6 - got6); extra6 = sorted(got6 - exp6)
detail6 = (f" · absents={miss6}" if miss6 else "") + \
(f" · en trop={extra6}" if extra6 else "")
bad(f"RBAC fixtures · {SPEC_RD} §6 — énumère {sorted(got6)} MAIS "
f"MANIFEST {sorted(exp6)}{detail6} → régénérer la SPEC")
# ============================================================================
# SEO · la COMPOSITION du graphe schema.org (JSON-LD) — un nœud racine