[DTP-Worker 20260806_141554] VÉRIF axe NEUF « accord numérique INTER-artefacts d'un concept-singleton partagé » (out/*.json ↔ out/*.json, distinct de l'intra-artefact et du code/prose↔artefact) → CLEAN · 0 édition de prod

Question neuve : quand un même concept-singleton plateforme apparaît comme scalaire dans deux out/*.json indépendants, les valeurs s'accordent-elles ? Une divergence silencieuse ship verte car aucun gate ne compare deux artefacts entre eux. Détecteur teeth-prouvé (57 fichiers ; position GLOBALE sans indice [i] = singleton vs PER-ROW = compte-de-ligne) : mutation cible_rbac_roles 50→49 dans un manifest → MORD. Résultat CLEAN : tous les singletons plateforme s'accordent (cible_rbac_roles=50, ci_modules_count/modules/suites=24, portails=5, doctypes_uniques=45, custom_docperm=116, role_profiles=6, min_score=100, pass_score=95).

TRAP documenté : « même nom = même concept » sur-signale — fields/data_fields/permissions/roles/sections/pass divergent car chacun décrit SON propre DocType/suite (per-module-local, pas un singleton). Seul nom SURCHARGÉ divergent = roles_couverts 50 (tous les role-profiles) vs 44 (rôles des 5 portails business = 50 − 6 plateforme) = by-design, les deux re-dérivés de rbac_50_roles.json.

0 gate ajouté (#5, occurrence-zéro rejouable), 0 commande VPS (#8), run_ci 33 PASS 0 FAIL 0 SKIP. Canal stakeholder daily_reports porté 3710253→HEAD.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-06 14:22:46 +00:00
parent 04f4c21778
commit 5d5e986fa6
2 changed files with 70 additions and 0 deletions
+44
View File
@@ -1,5 +1,49 @@
# Activity Log · 2026-08-06 · Claude Code DTP Worker
## Session `20260806_141554` — VÉRIF · axe NEUF « accord numérique INTER-artefacts d'un concept-singleton partagé » → CLEAN · 0 édition de production
**Choix de tâche.** `./run_ci.sh` au démarrage = **33 PASS · 0 FAIL · 0 SKIP**, arbre propre, roadmap
`ROADMAP_8_WEEKS_OR_LESS.md` intégralement livrée/gatée (Sprints 1→7 ; prod VPS / builds EAS / dépôts
ONAPI hors périmètre worker · #8). `OPEN_DECISIONS_REGISTER.md` = 3 arbitrages produit de Michel
(non éditables). Objectif : un **axe teeth encore jamais balayé**.
**Axe NEUF (absent de la mémoire).** Les axes numériques existants sont soit **intra-artefact**
(`[[manifest-count-field-payload-rederivation]]` : chaque `MANIFEST.nb_*` re-calculé depuis SON payload
voisin), soit **code/prose ↔ artefact** (`[[doc-numeric-claims-gate]]`, `[[prose-facts-vs-numeric-drift]]`).
Angle orthogonal jamais couvert : **artefact ↔ artefact** — quand un même *concept-singleton* plateforme
apparaît comme scalaire dans **deux `out/*.json` indépendants**, les deux valeurs s'accordent-elles ?
Une divergence silencieuse (un manifest dit 50, un autre 44) *ship* verte car aucun gate ne compare deux
artefacts entre eux.
**Détecteur (teeth-prouvé).** Balayage des **57 `out/*.json`** : collecte des clés-scalaires int en
**position GLOBALE** (chemin sans indice de liste `[i]` = concept singleton, ≠ position PER-ROW dans un
`[i]` = compte-de-ligne légitimement variable). Une clé globale partagée par >1 fichier avec valeurs
divergentes = candidat-conflation. **Preuve de dents** : mutation `cible_rbac_roles` 50→49 dans un seul
manifest en mémoire → le détecteur **signale** aussitôt la divergence (BITES).
**Résultat empirique → CLEAN.** Les concepts-singletons plateforme s'accordent tous cross-fichier :
`cible_rbac_roles`=50 (4 fichiers), `ci_modules_count`/`modules`/`suites`=24 (3), `portails`=5,
`doctypes_uniques`=45, `custom_docperm`=116, `user_permission_templates`=28, `role_profiles`=6,
`min_score`=100, `pass_score`=95 — zéro divergence.
**TRAP documenté (comme les KEY-traps de `[[manifest-count-field-payload-rederivation]]`).** L'heuristique
naïve « même nom de clé = même concept » **sur-signale** : `fields`/`data_fields`/`permissions`/`roles`/
`sections`/`pass` divergent entre modules (`dossier_vente` 30 fields vs `confotur` 18 ; `audit_4big`
pass=24 vs `audit_5d` pass=13) — mais chacun décrit **son propre DocType/suite** = per-module-local, PAS
un singleton plateforme. Le seul **nom SURCHARGÉ** portant deux sens cross-famille est `roles_couverts`
(**50** dans `rbac/roleprofile_gen` vs **44** dans `frontend/portails`, `frontend/chat_otoia`,
`mobile/app_config`) — et c'est **by-design**, les DEUX re-dérivés du canonique `rbac_50_roles.json` :
- **50** = tous les rôles reçoivent un role-profile (`len(roles)`=50) ;
- **44** = rôles surfacés dans les **5 portails business** (ventes 12 · construction 10 · compta 8 ·
direction 9 · achat 5) = 50 **6** rôles `plateforme` (`devops`, `rbac-admin`, `qa`, `otoia`,
`mobile`, `bi`) sans portail business. Cohérent avec `[[role-portail-referential-integrity-sweep]]`,
`[[roles-couverts-transitively-single-sourced]]`, `[[roadmap-7-dashboards-not-drift]]` (les 6 `plateforme`).
**Décision.** **Aucune édition de production** (l'axe est CLEAN) · **aucun gate ajouté** (#5
occurrence-zéro d'une vraie conflation ; détecteur rejouable, non-déterministe-safe) · aucune commande
VPS (#8). `run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP**. Canal stakeholder `daily_reports/2026-08-06.md`
porté au HEAD (currency `3710253``04f4c21` + cette session).
## Session `20260806_134554` — VÉRIF · axe NEUF « l'artefact COMMITÉ sur disque conforme à son schéma ? » (fichier réel vs oracle, pas l'objet en-mémoire) → CLEAN 57/57 · 0 édition de production
**Choix de tâche.** `./run_ci.sh` au démarrage = **33 PASS · 0 FAIL · 0 SKIP**, arbre propre, roadmap