[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:
@@ -1,5 +1,52 @@
|
|||||||
# Activity log · 2026-08-02 · Claude Code DTP Worker
|
# 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
|
## 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
|
**Contexte** — Série anti-dérive Sprint 8 (CLAUDE.md #6 « zéro invention de
|
||||||
|
|||||||
@@ -4493,6 +4493,29 @@ if fx_cdt is not None:
|
|||||||
else:
|
else:
|
||||||
bad(f"RBAC fixtures · {FX_RD} — nomme « {mr.group(1).strip()} » MAIS "
|
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")
|
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
|
# SEO · la COMPOSITION du graphe schema.org (JSON-LD) — un nœud racine
|
||||||
|
|||||||
Reference in New Issue
Block a user