{
  "version": "1.0.0",
  "roadmap_ref": "04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md · Sprint 5 l.56-57 « Mobile : Rebuild Expo 54 + submit App Store #32 + Play Store »",
  "generated_from": "rbac_50_roles.json (portails métier + rôles) · frontend/portails/portails_spec.json (labels + icônes) · seo/seo_spec.json (langues FR/EN/ES) · CLAUDE.md #4 (tokens de marque) / #10 (devises)",
  "description": "Spec machine-lisible de la config de l'app mobile compagnon OTO Enterprise OS (Expo/EAS). Ce fichier ne porte QUE les choix de configuration non dérivables d'une source (nom d'app, slug, scheme, profils EAS, ordre des onglets). La source de vérité des ONGLETS reste les portails métier RBAC (rbac_50_roles.json) ; les labels/icônes viennent de portails_spec.json ; les langues de seo_spec.json ; les tokens de marque de CLAUDE.md #4. Tout identifiant de store/build (bundleIdentifier, package, projectId EAS, version, credentials, appleId, ascAppId) reste `null · a_confirmer` — jamais fabriqué (#6) car déposé hors repo lors des builds/submissions (VPS/stores · #8).",
  "app": {
    "name": "OTO Enterprise OS",
    "name_source": "CLAUDE.md · titre « OTO Enterprise OS · Digital Twin Platform (DTP) »",
    "slug": "oto-enterprise-os",
    "scheme": "otoos",
    "expo_sdk_major": 54,
    "expo_sdk_source": "roadmap Sprint 5 l.56 « Rebuild Expo 54 »",
    "orientation": "portrait",
    "user_interface_style": "dark"
  },
  "eas": {
    "app_version_source": "remote",
    "build_profiles": ["development", "preview", "production"]
  },
  "portail_order": ["ventes", "construction", "achat", "compta", "direction"],
  "a_confirmer": [
    {"champ": "app_config.expo.version", "raison": "version de l'app (release) — déposée hors repo au build (#8)"},
    {"champ": "app_config.expo.ios.bundleIdentifier", "raison": "identité App Store #32 — jamais fabriquée (#6/#8)"},
    {"champ": "app_config.expo.ios.buildNumber", "raison": "auto-incrément côté EAS au build (#8)"},
    {"champ": "app_config.expo.android.package", "raison": "identité Play Store — jamais fabriquée (#6/#8)"},
    {"champ": "app_config.expo.android.versionCode", "raison": "auto-incrément côté EAS au build (#8)"},
    {"champ": "app_config.expo.icon", "raison": "asset image binaire — hors repo texte (#8)"},
    {"champ": "app_config.expo.splash.image", "raison": "asset image binaire — hors repo texte (#8)"},
    {"champ": "app_config.expo.extra.eas.projectId", "raison": "identifiant projet EAS — créé au premier build (#8)"},
    {"champ": "eas_build.cli.version", "raison": "version CLI EAS — épinglée à l'installation runner (#8)"},
    {"champ": "eas_build.submit.production.ios.appleId", "raison": "credential App Store Connect — hors repo (#6/#8)"},
    {"champ": "eas_build.submit.production.ios.ascAppId", "raison": "identifiant app App Store #32 — hors repo (#6/#8)"},
    {"champ": "eas_build.submit.production.ios.appleTeamId", "raison": "identifiant équipe Apple — hors repo (#6/#8)"},
    {"champ": "eas_build.submit.production.android.serviceAccountKeyPath", "raison": "clé de service Google Play — secret hors repo (#6/#8)"}
  ],
  "notes": [
    "L'app mobile ne réplique AUCUNE logique métier : elle est la surface mobile des 5 portails rôle ERPNext (mêmes rôles que les Workspaces / le Chat OTOIA).",
    "Sécurité : un onglet n'est visible que pour les rôles RBAC du portail correspondant (roles_allowed = surface RBAC exacte, ancrée sur le contrat).",
    "Le build Expo 54 et les soumissions App Store #32 / Play Store sont exécutés hors de ce worker (agent Mobile · #8) : ce livrable ne produit que la CONFIG versionnable."
  ]
}
