From 57f34f8eb572633eeafbe79fe4040d2add221e6c Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Mon, 3 Aug 2026 17:13:18 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker=2020260803=5F170724]=20Log=20sessio?= =?UTF-8?q?n=20=C2=B7=20directive-vs-impl=C3=A9mentation=202e=20couple=20(?= =?UTF-8?q?DIRECTIVE=5FMOBILE=5FSTORES=20=E2=86=92=20mobile/app=5Fconfig)?= =?UTF-8?q?=20=E2=86=92=20CLEAN=200=20d=C3=A9rive/0=20=C3=A9dition=20?= =?UTF-8?q?=C2=B7=20byte-repro=20+=2015=20invariants=20verts=20=C2=B7=202?= =?UTF-8?q?=20couches=20marque=20distinctes=20(runtime=20OTOV7/com.otov7.a?= =?UTF-8?q?pp/Expo51=20vs=20rebuild=20OTO=20Enterprise=20OS/slug=20oto-ent?= =?UTF-8?q?erprise-os/Expo54)=20NON-d=C3=A9rive=20=C2=B7=20store=20IDs=20n?= =?UTF-8?q?ull=3Dl=C3=A9git=20#8=20=C2=B7=20SIGNAL=20Michel=20:=20bundle?= =?UTF-8?q?=20id=20com.otov7.app=20IMMUABLE/existant=20(App=20Store=20#32)?= =?UTF-8?q?=20=E2=89=A0=20=C2=AB=20jamais=20fabriqu=C3=A9e=20=C2=BB=20?= =?UTF-8?q?=E2=86=92=20rename=20rebuild=20risque=20de=20forker=20une=20NOU?= =?UTF-8?q?VELLE=20fiche=20(continuit=C3=A9=20produit=20=C3=A0=20trancher,?= =?UTF-8?q?=20pas=20=C3=A9dition=20#5)=20=C2=B7=20run=5Fci=2032=20PASS=20C?= =?UTF-8?q?o-Authored-By:=20Claude=20Opus=204.8=20(1M=20context)=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_activity_log/2026-08-03.md | 54 +++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/05_activity_log/2026-08-03.md b/05_activity_log/2026-08-03.md index e54033f..a46a915 100644 --- a/05_activity_log/2026-08-03.md +++ b/05_activity_log/2026-08-03.md @@ -1383,3 +1383,57 @@ critiques (20/30 · 4-conditions · banques) sont déjà transitivement protég + Invariants 2/7). `./run_ci.sh` en clôture = **32 PASS · 0 FAIL · 0 SKIP** (inchangé). Zéro module créé · zéro gate ajouté (#5) · zéro chiffre inventé (#6). Aucune commande VPS (#8) · aucun `git clean` . + +## Session `20260803_170724` · Sprint 8 QA · directive-vs-implémentation, 2e couple (`DIRECTIVE_MOBILE_STORES` → `mobile/app_config`) + +**But.** Étendre la classe d'audit NEUVE [[directive-vs-implementation]] (caractérisée +session `163724` sur `financement_bancaire`) à un second couple directive↔module : la +`DIRECTIVE_MOBILE_STORES_20260803.md` (input-spec daté de Michel) vs le module qu'elle +pilote, `05_deliverables_mvp/mobile/app_config/`. + +**Intégrité gatée d'abord — verte.** `app_config_gen.py build` puis `validate` → +`git status --porcelain out/ mobile_spec.json` **vide** (out/ byte-identique, repro prouvée +par `check-artifacts`) · `✅ Validation OK — 5 onglets, 44 rôles, schéma + 15 invariants +verts`. `./run_ci.sh` = **32 PASS · 0 FAIL · 0 SKIP** (inchangé). Aucune dérive gatée. + +**Deux couches de marque distinctes (existant runtime vs cible rebuild) — PAS une dérive.** +Même dédoublement que [[project-brand-vs-codename-not-drift]] et surtout +[[mobile-runtime-actual-vs-rebuild-target]] : +- Directive = **app EXISTANTE** (`/opt/oto/mobile/native/`, audit runtime) : nom `OTOV7`, + iOS/Android `com.otov7.app`, Expo SDK **51.0.0**. +- Spec = **cible de REBUILD** : `name` « OTO Enterprise OS » (source = titre CLAUDE.md), + `slug` « oto-enterprise-os », `scheme` « otoos », `expo_sdk_major` **54** (source = roadmap + l.56 « Rebuild Expo 54 »). +Les deux couches sont **légitimes et séparées** ; le spec ne prétend nulle part que le runtime +est déjà en 54 / renommé — il porte la CONFIG versionnable de la cible. Décision Expo 51→54 +(directive P0) déjà couverte par [[mobile-runtime-actual-vs-rebuild-target]]. **CLEAN.** + +**Identifiants de store `null · a_confirmer` — par design, pas une dérive.** Le spec null'e +`bundleIdentifier`/`package`/`version`/`projectId`/credentials avec raison #8 (« déposé hors +repo lors des builds/submissions ») — exactement la posture anti-invention #6/#8, même logique +que les `null`+« à confirmer » de `financement_bancaire`. Aucun chiffre fabriqué. ✅ + +**⚠️ SIGNAL à Michel (tension RÉELLE, à SURFACER — pas de réécriture).** Le `a_confirmer` de +`app_config.expo.ios.bundleIdentifier` porte la raison « identité App Store #32 — **jamais +fabriquée** (#6/#8) ». Or la directive documente cet identifiant comme **déjà connu et +existant** : `com.otov7.app` (l.15-16). Sur Apple, le **bundle identifier d'une app publiée +est immuable** : l'« App Store #32 » ciblée par la roadmap l.56 existe déjà sous +`com.otov7.app`. Donc cette valeur n'est pas « à fabriquer / inconnue » — c'est un identifiant +**fixe existant qui DOIT être réutilisé** pour *mettre à jour* l'app #32. Le renommage +`OTOV7` → « OTO Enterprise OS » + le changement de `slug`/`scheme` **compose** ce risque : si +le rebuild adopte un nouveau bundle id, il devient une **NOUVELLE app** (nouvelle fiche), pas +une mise à jour de #32. **Question produit à trancher par Michel** : le rebuild met-il à jour +l'app #32 (⇒ réutiliser `com.otov7.app` + garder la fiche) ou crée-t-il une nouvelle fiche ? + +**Pourquoi ne PAS éditer.** Le spec est la **source d'autorité** du module ; la directive +datée `20260803` est un **snapshot d'intention** (comme `daily_reports/`), pas un oracle +vivant → **aucun gate directive↔spec (#5)**. Garder le bundle id `null` dans la config +versionnable est **légitime (#8** : la valeur concrète est déposée hors repo au build). La +nuance de wording du `raison` (« jamais fabriquée » vs « existant à réutiliser ») est trop +fine pour justifier de figer un spec piloté-par-snapshot ; c'est la **décision de continuité +de fiche** qui mérite l'arbitrage explicite de Michel, pas une réécriture de doc. + +**Résultat : 0 dérive gatée, 0 édition (prod/doc/gate).** Classe [[directive-vs-implementation]] +étendue au **2e couple** (mobile) = **CLEAN** + **1 signal de continuité produit** surfacé à +Michel (bundle id `com.otov7.app` immuable ↔ App Store #32). Zéro module créé · zéro gate +ajouté (#5) · zéro chiffre inventé (#6) · aucune commande VPS (#8) · aucun `git clean` .