From 0d4fd0942c03b0a045ea65ded0757fa80c2e1b41 Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Sun, 2 Aug 2026 05:49:04 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker=2020260802=5F053514]=20Sprint=208?= =?UTF-8?q?=20=C2=B7=20buffer=20=C2=B7=20RBAC=20SPEC=20=C2=A76=20:=20ancra?= =?UTF-8?q?ge=20de=20l'=C3=89NUM=C3=89RATION=20des=20DocTypes=20custom=20(?= =?UTF-8?q?2=E1=B5=89=20surface=20prose)=20sur=20le=20catalogue=20byte-gat?= =?UTF-8?q?=C3=A9=20du=20contrat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- 05_activity_log/2026-08-02.md | 47 +++++++++++++++++++++++++++++++++++ ci/check_readme_claims.sh | 23 +++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/05_activity_log/2026-08-02.md b/05_activity_log/2026-08-02.md index 77e0f0a..873065e 100644 --- a/05_activity_log/2026-08-02.md +++ b/05_activity_log/2026-08-02.md @@ -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 diff --git a/ci/check_readme_claims.sh b/ci/check_readme_claims.sh index 3260821..1894bc6 100755 --- a/ci/check_readme_claims.sh +++ b/ci/check_readme_claims.sh @@ -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