[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:
+26
-1
@@ -20,7 +20,7 @@ et manuellement (`workflow_dispatch`). Jobs statiques (+ une suite `unittest` pa
|
||||
| `check-artifacts` | `ci/check_artifacts.sh` | Reproductibilité : chaque `out/*.json` versionné == build frais | ✅ oui |
|
||||
| `check-regression` | `ci/check_regression.sh` | Fraîcheur : `qa/regression/out/regression_run.json` (`run`) == run frais + verdict PASS | ✅ oui |
|
||||
| `check-ci-integrity` | `ci/check_ci_integrity.sh` | Intégrité du câblage : `gate.needs` == tous les jobs non-manuels · chaque `ci/*.sh` câblé au gate | ✅ oui |
|
||||
| `check-readme-claims` | `ci/check_readme_claims.sh` | Intégrité des chiffres des docs d'entrée : chaque nombre de `README.md` « État courant », de la fiche QA « Verdict agrégé » **et** de la colonne « Tests » par suite des tables de fiches **et** des agrégats en prose (Total CRM / RBAC / e-CF) **et** des comptes par workspace des portails (cartes/liens/rôles, ×2 docs) **et** des comptes RBAC des 3 volets (table Nb rôles/profil, ligne agrégée apply_plan, ventilation userperm) **et** des comptes de mots-clés SEO (total + fr/en/es, ×2 docs) **et** du pipeline vente CRM (états/transitions, ×2 docs + énumération des transitions à séparation des pouvoirs `{action | allow_self_approval=0}` recomputée de `workflow.json`) **et** de l'app mobile Expo (onglets/rôles/langues/identifiants a_confirmer + énumération ordonnée des onglets recomputée de `role_navigation`, bijection onglet⇔portail) **et** du DocType CONFOTUR (champs/données/sections/rôles/évènements de dépôt, ×2 docs) **et** de l'audit 5D (contrôles/dimensions ×2 docs + ventilation verdict pass/fail/à-confirmer + énumération des open items `control→dimension→propriétaire` recomputée de `audit_report.open_items`) **et** du run-book de déploiement VPS (phases ×2 dans la fiche devops + confirmations préalables count & énumération dans le README) **et** du run-sheet de démo (nombre de modules cités dans le diagramme du README) **et** du montage Chat OTOIA par portail (`Custom Block`/configs runtime/portails, tous = 5 aujourd'hui, ×2 docs) **et** du module de recette `qa/acceptance` (couple livrables de sprint + métriques succès MVP, ×2 docs de module au-delà du README d'entrée) **et** du barème de l'auditeur 4Big (nombre de critères en prose + poids par critère de la table + « generator (N critères) », recomputés de `quality_report.criteria`) **et** de la carte de renormalisation par archétype de l'auditeur 4Big (critères EXCLUS de `data_room`/`parser`/`contract`, recomputés des `checks` par archétype de `quality_report.modules`) **et** du contrat de format de l'e-NCF fiscal (`E + tipoeCF(2) + secuencia(10) = 13` : préfixe/longueurs des segments/longueur totale, ×3 README + fiche `erpnext_backend`, recomputés du bloc `e_ncf` d'`ecf_plan.json` + cohérences croisées `1+tipo+seq==longueur` & `|regex digits|==tipo+seq`) **et** de la cross-cohérence du barème de commissions `crm/commissions` (états brouillon exclus recomputés de `{doc_status=0}` de `workflow.json` + champs de base recomputés de `{base_field}` de `commission_plan.json` + invariant 3 « commissionne seulement des états soumis ») == artefact cité (#6) | ✅ oui |
|
||||
| `check-readme-claims` | `ci/check_readme_claims.sh` | Intégrité des chiffres des docs d'entrée : chaque nombre de `README.md` « État courant », de la fiche QA « Verdict agrégé » **et** de la colonne « Tests » par suite des tables de fiches **et** des agrégats en prose (Total CRM / RBAC / e-CF) **et** des comptes par workspace des portails (cartes/liens/rôles, ×2 docs) **et** des comptes RBAC des 3 volets (table Nb rôles/profil, ligne agrégée apply_plan, ventilation userperm) **et** des comptes de mots-clés SEO (total + fr/en/es, ×2 docs) **et** du pipeline vente CRM (états/transitions, ×2 docs + énumération des transitions à séparation des pouvoirs `{action | allow_self_approval=0}` recomputée de `workflow.json`) **et** de l'app mobile Expo (onglets/rôles/langues/identifiants a_confirmer + énumération ordonnée des onglets recomputée de `role_navigation`, bijection onglet⇔portail) **et** du DocType CONFOTUR (champs/données/sections/rôles/évènements de dépôt, ×2 docs) **et** de l'audit 5D (contrôles/dimensions ×2 docs + ventilation verdict pass/fail/à-confirmer + énumération des open items `control→dimension→propriétaire` recomputée de `audit_report.open_items`) **et** du run-book de déploiement VPS (phases ×2 dans la fiche devops + confirmations préalables count & énumération dans le README) **et** du run-sheet de démo (nombre de modules cités dans le diagramme du README) **et** du montage Chat OTOIA par portail (`Custom Block`/configs runtime/portails, tous = 5 aujourd'hui, ×2 docs) **et** du module de recette `qa/acceptance` (couple livrables de sprint + métriques succès MVP, ×2 docs de module au-delà du README d'entrée) **et** du barème de l'auditeur 4Big (nombre de critères en prose + poids par critère de la table + « generator (N critères) », recomputés de `quality_report.criteria`) **et** de la carte de renormalisation par archétype de l'auditeur 4Big (critères EXCLUS de `data_room`/`parser`/`contract`, recomputés des `checks` par archétype de `quality_report.modules`) **et** du contrat de format de l'e-NCF fiscal (`E + tipoeCF(2) + secuencia(10) = 13` : préfixe/longueurs des segments/longueur totale, ×3 README + fiche `erpnext_backend`, recomputés du bloc `e_ncf` d'`ecf_plan.json` + cohérences croisées `1+tipo+seq==longueur` & `|regex digits|==tipo+seq`) **et** de la cross-cohérence du barème de commissions `crm/commissions` (états brouillon exclus recomputés de `{doc_status=0}` de `workflow.json` + champs de base recomputés de `{base_field}` de `commission_plan.json` + invariant 3 « commissionne seulement des états soumis ») **et** du catalogue RBAC `rbac/fixtures_gen` (DocTypes `custom` à créer énumérés == `MANIFEST.custom_doctypes_a_confirmer` + séparation des pouvoirs : le rôle unique porteur de `set_user_permissions` == `custom_docperm.json`) == artefact cité (#6) | ✅ oui |
|
||||
| `gate` | — | Agrégat vert = gate qualité 4Big franchi | ✅ oui |
|
||||
|
||||
Aucune dépendance réseau/marketplace hors `actions/checkout`. Tout tourne avec
|
||||
@@ -422,6 +422,31 @@ l'**invariant 3** du module, non vide. 5 morsures vérifiées : échange brouill
|
||||
(`reservation→lead`, invariant 3 cassé) · promotion de l'état `abandonne` en soumis
|
||||
dans l'artefact (draft set change, « en trop » dans la prose) ; restauré = vert.
|
||||
|
||||
Même classe enfin sur le **catalogue RBAC** (livrable `rbac/fixtures_gen`) — deux
|
||||
faits data-derived transcrits **à la main** dans le README. (1) La liste des DocTypes
|
||||
`custom` à créer avant import « (`Faisabilité`, `Publiciste Log`, `CONFOTUR
|
||||
Application`, `API Access`) » (README §« Application sur VPS ») == l'ensemble
|
||||
`custom_doctypes_a_confirmer` d'`rbac/fixtures_gen/out/MANIFEST.json` (les DocTypes
|
||||
`custom: true` du contrat RBAC). (2) La **séparation des pouvoirs** — « le flag
|
||||
`set_user_permissions` n'est émis que pour le rôle **RBAC Admin** » (README:48) ==
|
||||
l'ensemble `{role | set_user_permissions == 1}` d'`out/custom_docperm.json`. Le bloc
|
||||
racine ne gate que le **compte** (« 50 rôles / 116 DocPerm » via l'agrégat RBAC de
|
||||
l'apply_plan) — jamais l'**identité** de ces deux ensembles. AJOUTER un DocType
|
||||
`custom` au contrat, RENOMMER/ÉCHANGER l'un des 4 ou PROMOUVOIR un 2ᵉ rôle porteur du
|
||||
flag (élévation de privilège) ferait dériver la prose en silence pendant que
|
||||
l'artefact byte-gaté dit autre chose — dérive qu'aucune suite `tests/` (qui teste des
|
||||
FONCTIONS de mapping, pas la prose du README) n'attrape. On RECOMPUTE chaque ensemble
|
||||
depuis SON artefact (zéro duplication du contrat du générateur · #6) et on exige que
|
||||
la prose l'énumère/le nomme **exactement** (absent ET en trop mordus via set-diff ·
|
||||
accents/casse normalisés). Cohérences croisées en bonus : le catalogue est **non
|
||||
vide, sans doublon et trié** (byte-déterminisme du générateur) et la séparation des
|
||||
pouvoirs est un **singleton** (ni vide — garde vacante — ni multiple — élévation de
|
||||
privilège). 6 morsures vérifiées : échange d'un nom de DocType (`Faisabilité →
|
||||
Faisabilite2`) · sous-ensemble (retrait `API Access`) · rôle nommé faux (`RBAC Admin
|
||||
→ Ventes Conseiller`) · énumération supprimée (INTROUVABLE) · 2ᵉ rôle promu au flag
|
||||
dans l'artefact (singleton cassé) · catalogue MANIFEST non trié (byte-déterminisme) ;
|
||||
restauré = vert.
|
||||
|
||||
Un claim **absent** échoue aussi (la dérive de formulation qui ferait
|
||||
disparaître un chiffre est elle-même une régression de traçabilité). stdlib pur
|
||||
(bash/git/python3), zéro réseau.
|
||||
|
||||
Reference in New Issue
Block a user