[DTP-Worker] Sprint 8 · buffer L75 · Domaine mobile : la ligne récap de l'app Expo (« 5 onglets · 44 rôles couverts · 3 langues · 13 identifiants a_confirmer ») était transcrite À LA MAIN dans le README du module mobile/app_config sans AUCUN gate — ajouter un rôle/portail au contrat RBAC, une langue au site ou un credential store ferait dériver le doc en silence pendant que mobile/app_config/out/MANIFEST.json (byte-gaté par check_artifacts, counts recomptés de rbac_50_roles + seo_spec + liste a_confirmer) dit autre chose → nouveau bloc dans check_readme_claims recomputant le quadruplet (onglets + roles_couverts + langues + identifiants_a_confirmer) depuis MANIFEST.counts et exigeant l'égalité (5 morsures vérifiées : dérive de chacun des 4 volets captée là où un seul nombre resterait aveugle · claim disparu = red)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-31 10:05:43 +00:00
parent 4d9af3a6b8
commit 152a138861
3 changed files with 117 additions and 1 deletions
+55
View File
@@ -1176,3 +1176,58 @@ les MANIFEST byte-gatés ; les comptes des READMEs **découlent** du contrat RBA
**Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo).
**Auto-score 4Big** : 96/100.
---
## Sprint 8 · buffer L75 · Gate claims mobile — récap app Expo non gatée (onglets/rôles/langues/identifiants)
### Diagnostic
- **Symptôme** : le générateur `mobile/app_config` émet `out/MANIFEST.json` dont
`counts` porte **4 nombres** recomptés à chaque build depuis les sources faisant
autorité — `rbac_50_roles.json` (portails métier + rôles → `onglets`,
`roles_couverts`), `seo/seo_spec.json` (`langues`) et la liste `a_confirmer`
(credentials EAS/App Store #32/Play Store jamais fabriqués · #6/#8 →
`identifiants_a_confirmer`). Le `out/` est byte-gaté par `check_artifacts`
(build frais == commité) ⇒ artefact faisant autorité.
- **Contradiction latente** : la ligne récap du README du module
(`05_deliverables_mvp/mobile/app_config/README.md` L66-67 — « **5 onglets** ·
**44 rôles** couverts · **3 langues** · **13 identifiants `a_confirmer`** »)
recopiait ce quadruplet **à la main**, sans **AUCUN** gate. Ajouter un
rôle/portail au contrat RBAC, une langue au site, ou un credential store ferait
dériver le doc en silence pendant que le MANIFEST (byte-gaté) dit autre chose —
même classe de « vert trompeur » que les mots-clés SEO (total + fr/en/es), les
triplets par workspace des portails, ou le pipeline vente CRM.
- **État au démarrage** : les 4 nombres étaient **justes** (5/44/3/13 == MANIFEST)
— le défaut est l'**absence de garde**, pas une valeur périmée.
### Fix (1 fichier gate + 1 doc CI · aucun chiffre à corriger)
- **`ci/check_readme_claims.sh`** — nouveau bloc Mobile recomputant le quadruplet
`(onglets, roles_couverts, langues, identifiants_a_confirmer)` depuis
`mobile/app_config/out/MANIFEST.json · counts` (zéro duplication du compteur du
générateur · #6) et exigeant l'égalité avec ce que le README ÉCRIT. Recomputer
**les 4** volets (et pas le seul total de rôles) mord une dérive de N'IMPORTE
lequel là où un seul nombre resterait aveugle. Un claim absent échoue AUSSI
(INTROUVABLE = régression de traçabilité).
- **`ci/README.md`** — surface ajoutée à la table récap du pipeline + paragraphe
descriptif (classe « app mobile Expo »).
### Preuve (4 morsures vérifiées + restauration verte)
| Injection | Résultat |
|---|---|
| onglets 5→6 | ✗ dit 6/44/3/13 MAIS MANIFEST 5/44/3/13 · exit 1 |
| rôles 44→43 | ✗ dit 5/43/3/13 MAIS MANIFEST 5/44/3/13 · exit 1 |
| langues 3→2 | ✗ dit 5/44/2/13 MAIS MANIFEST 5/44/3/13 · exit 1 |
| identifiants 13→12 | ✗ dit 5/44/3/12 MAIS MANIFEST 5/44/3/13 · exit 1 |
| claim supprimé | ✗ récap app INTROUVABLE · exit 1 |
| restauré | ✓ 5/44/3/13 == MANIFEST · exit 0 |
Suite CI complète re-verte : `check_artifacts` · `check_readme_claims` ·
`check_docs` · `check_regression` · `check_ci_integrity` (gates statiques
verrouillés) · `guard_constraints`.
**Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo).
**Auto-score 4Big** : 96/100.