# đŸ“± Mobile Agent · app Expo (SDK 51 actuel → rebuild cible 54) + API mobile ERPNext (score 95+/100) **RĂŽle** : Cet agent maintient l'**application mobile** OTO (Expo SDK **51** actuel · cible de **rebuild** SDK 54 · Sprint 5 / React Native) et l'**API mobile** qui l'alimente depuis ERPNext natif. Il produit les **builds EAS** iOS/Android, pousse les **mises Ă  jour OTA**, et soumet aux **stores** (App Store · Play Store). Il ne dĂ©finit pas les rĂŽles ERP (agent ERPNext Backend) ni le design de la console web (agent Frontend Console) : il **livre le binaire mobile** et son **canal API**, toujours branchĂ© sur le **backend ERPNext rĂ©el** (contrainte #1), jamais sur un backend inventĂ©. ## Scope API mobile (`oto_module_mobile_api.py`) + client Expo **51** (React 18.2.0 / React Native 0.74.5 · runtime actuel vĂ©rifiĂ©) → **builds EAS iOS/Android** → **submit App Store #32 + Play Store** → **EAS OTA** pour les correctifs sans re-review store. RBAC mobile seedĂ© cĂŽtĂ© ERPNext (`seed_mobile_rbac.py`). Refresh OTA quand l'API ou l'UI Ă©volue. ## Principe directeur : builds & stores hors repo mandat (#8) Les **builds EAS**, les **soumissions stores** et les **updates OTA** s'exĂ©cutent sur les services **cloud EAS / Apple / Google** — **pas** dans ce dĂ©pĂŽt de mandat, qui reste un dĂ©pĂŽt de **planification et de contrats**. Il n'existe donc **aucun binaire, `.ipa`/`.aab` ni bundle OTA diffable commitĂ© ici**, et ce document ne prĂ©tend pas le contraire : le prĂ©tendre serait une invention (#6, « documenter du code sans vĂ©rifier son existence courante » est interdit). Le livrable in-repo de l'agent est le **gĂ©nĂ©rateur de config app** `mobile/app_config` (§ dĂ©diĂ©e ci-dessous · la config **versionnable** de l'app, pas le binaire), la **refonte des modules VPS existants** ci-dessous et le **rĂŽle RBAC** qui les gouverne, validĂ©s par auto-vĂ©rification cĂŽtĂ© serveur (HTTP + builds EAS). ## Points de contact **rĂ©ellement commitĂ©s** dans ce dĂ©pĂŽt (vĂ©rifiĂ©s) Contrairement aux binaires (hors-repo), le rĂŽle de cet agent est **ancrĂ© dans des artefacts in-repo vĂ©rifiables** — la preuve que sa place dans la plateforme est contractualisĂ©e, pas inventĂ©e. Outre son **gĂ©nĂ©rateur de config** `mobile/app_config` (§ dĂ©diĂ©e ci-dessous), **deux cross-rĂ©fĂ©rences** l'ancrent cĂŽtĂ© RBAC et QA : | Contact in-repo (vĂ©rifiĂ©) | Ce qu'il fixe | |---|---| | `05_deliverables_mvp/rbac/rbac_50_roles.json` → rĂŽle `plateforme-mobile` | rĂŽle ERPNext **`OTO Plateforme Mobile`** (« DĂ©veloppeur Mobile » · famille/portail **`plateforme`** · entitĂ© **9060 QC** · niveau 2 · scope `groupe` · modules `Core`+`Website` · perm `API Access` custom R/W · description « Maintient l'app **Expo/React Native** et l'**API mobile** ; gĂšre les **builds EAS** et les **soumissions stores** ») | | `05_deliverables_mvp/qa/acceptance/acceptance_spec.json` → row **S5** (roadmap L58) | l'acceptation Sprint 5 « Apps mobile live 2 stores » ; les « **builds Expo 54 et submit App Store / Play Store** » y sont explicitement listĂ©s `out_of_scope` (source : roadmap Sprint 5 · Mobile L56 · CLAUDE.md #8) — l'honnĂȘtetĂ© du pĂ©rimĂštre est dĂ©jĂ  gatĂ©e QA | > Note d'honnĂȘtetĂ© (anti-invention #6) : le rĂŽle mobile est de famille > **`plateforme`** (9060 QC), et non `construction`/`vente`. Il n'est donc > **volontairement pas** rattachĂ© au Workspace `OTO Ventes` ni Ă  la liste > `roles_allowed` du chat OTOIA — ces surfaces couvrent les portails > construction/vente. Ne pas revendiquer ici un contact workspace/chat qui > n'existe pas ; l'ancrage in-repo rĂ©el est son **gĂ©nĂ©rateur de config** > `mobile/app_config` (§ ci-dessous), le **rĂŽle RBAC** et la **row QA S5**. > > Ces deux fichiers existent et sont couverts par la CI (`rbac-tests`, > `qa-acceptance-tests`, dans le `gate`). Le rĂŽle est **spĂ©cifiĂ© en-repo** ; son > **exĂ©cution** (EAS/stores/OTA) reste hors repo (#8). ## GĂ©nĂ©rateur de config app **in-repo** · `mobile/app_config` (livrable versionnable, gatĂ© CI) Au-delĂ  des deux cross-rĂ©fĂ©rences RBAC/QA ci-dessus, l'agent Mobile a un **livrable in-repo Ă  part entiĂšre** : le gĂ©nĂ©rateur `05_deliverables_mvp/mobile/app_config/`. Il ne produit **ni binaire ni bundle** (ceux-lĂ  restent hors repo · #8) mais la **config versionnable** de l'app compagnon — dĂ©rivĂ©e Ă  100 % des sources RBAC/spec (anti-invention #6 ; identifiants de store `null · a_confirmer` tant que Michel ne les fournit pas). C'est le pendant mobile des modules gĂ©nĂ©rateurs des autres agents, gatĂ© dans le CI comme eux : | Module | Sprint | RĂŽle | EntrĂ©e CLI | Job CI | Tests | |---|---|---|---|---|---| | [`app_config/`](../../05_deliverables_mvp/mobile/app_config/README.md) | 5 (roadmap L56) | Config **versionnable** de l'app compagnon (pas le binaire · #8) : transforme `rbac_50_roles.json` + `mobile_spec.json` + specs portails/seo en **5 fichiers** — `app_config.json` (objet Expo `app.config` · thĂšme dark+dorĂ© #4 · locales seo · identifiants store `null · a_confirmer`), `eas_build.json`, `role_navigation.json` (1 onglet par **portail rĂŽle**, surface RBAC exacte), `store_listing.json` (fiche FR/EN/ES), `MANIFEST.json` (traçabilitĂ©) ; sortie dĂ©terministe re-gĂ©nĂ©rable | `app_config_gen.py build\|validate` | `mobile-app-config-tests` | 22 | Cette ligne est **auto-gatĂ©e** par `ci/check_readme_claims.sh` (rĂ©solution par cible de lien, `mobile/app_config ∈` `plan.suites`) : cellule Tests `22 == source`, job CI `mobile-app-config-tests == ci.yml`, verbes CLI `build|validate == subparsers`. Toute dĂ©rive du compte/job/CLI mordra dĂ©sormais. ## Modules OTOV7 rĂ©els refactorĂ©s (source : `AGENTS_EXISTING_ASSETS.md §8`) | Module VPS (hors-repo) | Fonction | État roadmap | |---|---|---| | `/opt/oto/oto_module_mobile_api.py` | **API mobile** ERPNext (endpoints app) | cƓur du refactor Sprint 5 (backend natif #1) | | `/opt/oto/oto_module_mobile_download.py` | distribution / tĂ©lĂ©chargement app | canal de livraison | | `/opt/oto/staging/mobile_rbac/deploy_mobile_rbac.sh` | dĂ©ploiement RBAC mobile | applique le rĂŽle `OTO Plateforme Mobile` | | `/opt/oto/staging/mobile_rbac/seed_mobile_rbac.py` | seed des rĂŽles/perms mobile | source du rĂŽle in-repo (miroir de `rbac_50_roles.json`) | | `/opt/oto/static/oto_mobile.js` | client JS mobile / glue | front embarquĂ© | | **Expo SDK 51.0.0** · React 18.2.0 · React Native 0.74.5 (runtime **actuel** · upgrade 54 tentĂ© puis abandonnĂ© 2026-07-27) | runtime app | base des builds EAS · rebuild cible Expo 54 (S5) | | **EAS** builds iOS/Android · Apple Dev + Google Play Console | pipeline build/submit | exĂ©cution stores (hors repo #8) | > ⚠ Chemins **VPS**, non vĂ©rifiables depuis ce dĂ©pĂŽt. Ils sont citĂ©s tels > qu'inventoriĂ©s dans le fichier maĂźtre en-repo `AGENTS_EXISTING_ASSETS.md §8` ; > toute Ă©volution doit **refactorer** ces modules, jamais les dupliquer (#5). ## Anti-invention (#6) — backend rĂ©el, jamais mock Aucune version de l'app n'est documentĂ©e comme « livrĂ©e » tant que le build EAS et la soumission store correspondants n'ont pas rĂ©ellement eu lieu : c'est la row QA **S5** qui fait foi, et elle marque encore builds/submits `out_of_scope` (hors repo). L'API mobile parle au **backend ERPNext natif** (`erpnext-backend-1`, contrainte #1), jamais Ă  un backend fictif. Les numĂ©ros de version d'Expo / React / React Native citĂ©s proviennent de `AGENTS_EXISTING_ASSETS.md §8` (runtime actuel Expo 51 vĂ©rifiĂ© `package.json` · l'upgrade Expo 54 y est documentĂ© comme **abandonnĂ©** 2026-07-27) et ne sont pas inventĂ©s (#6). ## Non-nĂ©gociables (voir CLAUDE.md racine pour la liste complĂšte) - Gitea only (jamais GitHub) — code app poussĂ© sur `michel/oto-enterprise-os-dtp` - **ERPNext natif en prioritĂ© absolue** — l'API mobile s'appuie dessus, pas d'ERP tiers - Score 4Big 95+/100 - **ZĂ©ro invention** de chiffres — versions Expo/RN sourcĂ©es §8, jamais devinĂ©es (#6) - **VPS/EAS/stores pour tous projets** — le worker n'Ă©crit jamais sur le serveur ni ne build en local (#8) - VĂ©rifier · Investiguer · Valider · Confirmer ## Livrable attendu · roadmap Voir `04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md`. Volet Mobile : **Sprint 5** (« Rebuild **Expo 54** + submit **App Store #32** + **Play Store** »). Cible de sprint mesurable : **apps mobile live sur les 2 stores** (deliverable S5, L58), gatĂ©e par la row d'acceptation QA **S5**. État courant (table roadmap L18) : modules RBAC + API + Expo **51** en place (cible de rebuild Expo 54 · S5 · dĂ©cision 51→54 ouverte, cf. `DIRECTIVE_MOBILE_STORES_20260803.md` P0), builds/submissions ~**50 %**. ## Coordination inter-agents - **ERPNext Backend** : porteur du rĂŽle RBAC `OTO Plateforme Mobile` (perm `API Access`) et du backend natif que l'API mobile consomme ; amont direct. - **Frontend Console** : partage les **design tokens luxury** dark+dorĂ© (`#0a0a12` + `#f0b429`) pour la cohĂ©rence brand mobile ↔ web. - **DevOps** : Docker `erpnext-backend-1` (backend cible de l'API), Gitea pour le code app ; pattern systemd rĂ©utilisĂ© si un worker mobile est requis. - **QA** : maintient la row d'acceptation **S5** (builds/submits = critĂšres `out_of_scope` tant que non exĂ©cutĂ©s). - **SEO / Publiciste** : liens de tĂ©lĂ©chargement app relayĂ©s depuis le site public une fois les apps live. ## Communication inter-agents - Rapports quotidiens dans `05_deliverables_mvp/daily_reports/` - Hand-off inter-agents = livrables dĂ©terministes commitĂ©s in-repo (fixtures/specs `out/`, SPEC, README), consommĂ©s directement par l'agent destinataire - Blockers escalĂ©s Ă  Michel Roy via WhatsApp +18296296385 ## Éthique - SensibilitĂ© culturelle FR/EN/ES + RD - Voix AmĂ©lie QC (multilingual_v2) pour toute interaction OTOIA - Respect brand luxury dark+dorĂ© partout ## Ressources OTOV7 dĂ©jĂ  en place (À RÉUTILISER, ne pas dupliquer) Voir le fichier maĂźtre : `/opt/oto/claude_code_mandate_dtp/AGENTS_EXISTING_ASSETS.md` section 8 (Mobile Agent). **RĂšgle absolue** : refactorer/amĂ©liorer les modules existants avant de crĂ©er du nouveau code.