[DTP-Worker] Sprint 8 · buffer L75 · Domaine Mobile (2e surface) : la ligne récap du README de l'app Expo ÉNUMÉRAIT À LA MAIN ses 5 onglets « (Ventes/Construction/Achat/Compta/Direction) » sans AUCUN gate d'IDENTITÉ. Le bloc mobile existant recompute le QUADRUPLET de la ligne (onglets · rôles couverts · langues · identifiants a_confirmer) depuis MANIFEST.counts, MAIS son patron du compte matche la parenthèse par \([^)]*\) et en IGNORE le contenu — surface data-derived distincte du MÊME README, même ligne. Cette liste dérive de mobile/app_config/out/role_navigation.json (byte-gaté par check_artifacts) : un onglet par portail métier du contrat RBAC (bijection 1 onglet ⇔ 1 portail, plateforme exclu), chaque entrée = son label « OTO <Nom> » ; nom court énuméré = label sans le préfixe « OTO ». Le bloc mobile ne gate QUE le COMPTE (« 5 onglets ») : un ÉCHANGE (Ventes→Marketing) laisse le compte à 5 — le compteur reste AVEUGLE — pendant que l'artefact dit autre chose ; un RETRAIT (Compta absent) fait tomber l'énumération à 4 tandis que « 5 onglets » reste juste ; un RÉORDRE passe aussi — « vert trompeur » qu'aucune suite tests/ (qui teste des FONCTIONS, pas la prose) n'attrape → nouveau bloc dans check_readme_claims recomputant la LISTE ORDONNÉE des noms courts depuis role_navigation (zéro duplication de la navigation du générateur #6) et exigeant que la parenthèse l'énumère EXACTEMENT. Contrôle par ENSEMBLE (absent ET en trop mordus via set-diff), puis ORDRE. Même patron que l'énumération des confirmations DevOps, la carte de renormalisation par archétype 4Big ou la table « Verdict courant » de l'audit 5D. Cohérence croisée en bonus : len(role_navigation) == MANIFEST.counts.onglets == MANIFEST.counts.portails (la bijection du générateur) — mord un compteur du manifeste désynchronisé de sa navigation. Un claim absent échoue AUSSI (4 morsures vérifiées : échange Ventes→Marketing capté là où le compte reste 5 · retrait Compta capté là où « 5 onglets » reste juste · réordre capté « même ensemble, ordre ≠ » · énumération supprimée = INTROUVABLE ; restauré = green : Ventes/Construction/Achat/Compta/Direction == role_navigation · bijection 5==onglets==portails). État courant : aucun onglet 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:
@@ -1,5 +1,65 @@
|
||||
# Activity Log · 2026-07-31 · Claude Code DTP
|
||||
|
||||
## Session `20260731_150110` · Buffer S8 · Domaine Mobile (2e surface) : la ligne récap du README app Expo **énumérait** À LA MAIN ses **5 onglets** (`(Ventes/Construction/Achat/Compta/Direction)`) sans gate d'IDENTITÉ — le bloc mobile existant ne recompute que le COMPTE (« 5 onglets ») et son patron matche la parenthèse par `\([^)]*\)` en **ignorant son contenu**, aveugle à un **échange / retrait / réordre** de nom.
|
||||
|
||||
**Tâche** : **Sprint 8 · buffer L75** (DevOps CI/CD · QA). Roadmap fonctionnellement
|
||||
close ; poursuite de la série anti-dérive (CLAUDE.md #6). Le bloc `mobile` gaté
|
||||
précédemment recompute le **quadruplet** de la ligne récap (`onglets` · `rôles`
|
||||
couverts · `langues` · `identifiants a_confirmer`) depuis `MANIFEST.counts`. Restait,
|
||||
dans la **même ligne du même README**, une surface data-derived distincte : la
|
||||
**parenthèse qui énumère les 5 onglets** — matchée par le patron du compte mais
|
||||
dont le **contenu est ignoré**.
|
||||
|
||||
**Dérive silencieuse fermée** :
|
||||
- `05_deliverables_mvp/mobile/app_config/README.md:66` — « **5 onglets**
|
||||
(Ventes/Construction/Achat/Compta/Direction) · … ». La parenthèse est une **liste
|
||||
ordonnée data-derived** ; le patron du compte (`\*\*(\d+) onglets\*\* \([^)]*\)`)
|
||||
la matche mais IGNORE son contenu.
|
||||
- Source faisant autorité : `mobile/app_config/out/role_navigation.json` (byte-gaté
|
||||
par `check_artifacts`) — un onglet par portail métier du contrat RBAC (bijection
|
||||
1 onglet ⇔ 1 portail · `plateforme` exclu), chaque entrée portant `portail` (id)
|
||||
+ `label` « OTO <Nom> ». Nom court énuméré = le `label` sans le préfixe « OTO ».
|
||||
- Le bloc mobile ne gate QUE le **compte** (« 5 onglets »). Un **échange**
|
||||
(`Ventes → Marketing`), un **retrait** (`Compta` absent — l'énumération tombe à 4
|
||||
tandis que « **5 onglets** » reste juste, aveugle au compte) ou un **réordre**
|
||||
laisse le compte à 5 pendant que l'artefact dit autre chose. « Vert trompeur »
|
||||
qu'aucune suite `tests/` (qui teste des FONCTIONS, pas la prose) n'attrape.
|
||||
- **État courant** : **aucun onglet périmé** — la liste des 5 recoupe l'artefact
|
||||
exactement (anti-invention #6, rien à réécrire). Le défaut est la **surface ungated**.
|
||||
|
||||
**Nouveau bloc dans `ci/check_readme_claims.sh`** : recompute la **liste ordonnée**
|
||||
des noms courts depuis `role_navigation.json` (zéro duplication de la navigation du
|
||||
générateur · #6) et exige que la parenthèse l'énumère **exactement** : contrôle par
|
||||
**ENSEMBLE** (absent ET en trop mordus via set-diff), puis **ordre**. Même patron que
|
||||
l'énumération des confirmations DevOps, la carte de renormalisation par archétype 4Big
|
||||
ou la table « Verdict courant » de l'audit 5D. Cohérence croisée en bonus :
|
||||
`len(role_navigation) == MANIFEST.counts.onglets == MANIFEST.counts.portails` (la
|
||||
bijection du générateur) — mord un compteur du manifeste désynchronisé de sa navigation.
|
||||
|
||||
### Preuve (4 morsures vérifiées + restauration verte)
|
||||
|
||||
| Injection | Résultat |
|
||||
|---|---|
|
||||
| échange `Ventes → Marketing` (compte reste 5 · gate-compte aveugle) | ✗ énumère `[Marketing,…]` MAIS `role_navigation` `[Ventes,…]` · absents=`[Ventes]` · en trop=`[Marketing]` · exit 1 |
|
||||
| retrait `Compta` (énumération=4 · « 5 onglets » reste juste) | ✗ énumère 4 MAIS `role_navigation` 5 · absents=`[Compta]` · exit 1 |
|
||||
| réordre `Construction/Ventes/…` (même ensemble) | ✗ même ensemble, ordre ≠ · exit 1 |
|
||||
| énumération supprimée (claim disparu) | ✗ énumération des onglets INTROUVABLE · exit 1 |
|
||||
| restauré | ✓ `Ventes/Construction/Achat/Compta/Direction` == `role_navigation` · bijection 5==onglets==portails · exit 0 |
|
||||
|
||||
- **`ci/README.md`** — surface ajoutée à la table récap du pipeline + paragraphe
|
||||
descriptif (2ᵉ surface du même README mobile).
|
||||
|
||||
Suite CI complète re-verte (7 gates) : `guard_constraints` · `validate_json` ·
|
||||
`check_docs` · `check_artifacts` · `check_regression` · `check_ci_integrity` ·
|
||||
`check_readme_claims`.
|
||||
|
||||
**Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ;
|
||||
édition **hors** `05_deliverables_mvp` ⇒ 0 dérive d'artefact).
|
||||
|
||||
**Auto-score 4Big** : 96/100.
|
||||
|
||||
---
|
||||
|
||||
## Session `20260731_143104` · Buffer S8 · Domaine QA/Audit 5D (2e surface) : la **table « Verdict courant »** de l'audit de conformité énumérait À LA MAIN ses **4 open items** (`control → dimension → propriétaire`) sans gate d'IDENTITÉ — le bloc existant ne recompute que le COMPTE (« 4 à confirmer »), aveugle à un **échange** d'open item.
|
||||
|
||||
**Tâche** : **Sprint 8 · buffer L75** (DevOps CI/CD · QA). Roadmap fonctionnellement
|
||||
|
||||
Reference in New Issue
Block a user