Files
Claude Code DTP Worker a8342e97e2 [DTP-Worker 20260806_004414] FIX docstring↔code — help argparse de la sous-commande build (mobile/app_config_gen.py) omettait store_listing.json
Chasse adversariale ciblée (classe RECURRING docstring↔code, scopée aux modules non balayés
la veille) → 1 vrai défaut ungaté. Le help= de sub.add_parser("build") énumérait 4 sorties
(app_config/eas_build/role_navigation/MANIFEST) alors que cmd_build() en écrit 5 : store_listing.json
(l.243) était omis. Docstring (l.15 « les 5 fichiers ci-dessus ») + README (l.56/68) listent bien
les 5. Nouvelle sous-classe help-text argparse du motif docstring↔code (2e surface prose dans le code,
distincte des open('w') vs docstring déjà balayés). Fix = ajout store_listing.json à sa position
canonique. Aucun gate/test ne fige la chaîne (grep -rn = 0 hit externe) → pas d'oracle à réaligner,
pas de gate ajouté (#5). Non-régression : help n'affecte aucune sortie, artefacts byte-identiques,
run_ci 33 PASS·0 FAIL·0 SKIP avant/après. Reste de l'audit (audit_5d/acceptance/regression/
deploy_runbook/commissions/dossier_vente/ecf/portails/faisabilite) CLEAN. 0 artefact rebuild, 0 VPS (#8).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-06 00:51:55 +00:00
..

Config app mobile OTO Enterprise OS · Sprint 5 · Mobile

Roadmap 04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md · Sprint 5 l.56-57 — « Mobile : Rebuild Expo 54 + submit App Store #32 + Play Store ».

Générateur de la config versionnable de l'app mobile compagnon OTO Enterprise OS (Expo/EAS). L'app est la surface mobile des 5 portails rôle ERPNext : elle ne réplique aucune logique métier — mêmes rôles que les Workspaces (../../frontend/portails) et que le Chat OTOIA (../../frontend/chat_otoia).

Périmètre worker vs hors-repo (#8)

Le worker ne build ni ne submit (VPS + App Store #32 / Play Store · #8). Il produit uniquement la config que l'agent Mobile consomme sur le poste/CI EAS :

Produit ici (versionné) Exécuté hors repo (agent Mobile · VPS/stores)
app.config Expo (thème, locales, navigation) eas build (Expo 54)
eas.json (profils build/submit) eas submit App Store #32 / Play Store
navigation par rôle (gating RBAC) credentials / signing / assets binaires
workflow CI/CD .gitea/workflows/mobile-build.yml (Sprint 5 P1) exécution eas build sur runner EAS

CI/CD Mobile (Sprint 5 P1 · directive DIRECTIVE_MOBILE_STORES_20260803.md). Le workflow Gitea Actions .gitea/workflows/mobile-build.yml invoque eas build iOS + Android (profil production) depuis les profils versionnés d'out/eas_build.json. Il est désactivé sans effet (jobs de build SKIP · CI jamais rouge) tant que Michel n'a pas fourni le secret EAS_TOKEN et la variable MOBILE_NATIVE_REPO (dépôt Gitea du code natif Expo) — aucun credential n'est fabriqué (#6/#8).

Zéro invention (#6)

Ce livrable ne fabrique aucun fait :

Donnée Source (jamais inventée)
Onglets (5 portails métier) rbac_50_roles.json · portails_business
roles_allowed par onglet rbac_50_roles.json (rôles du portail) = Has Role des Workspaces
Labels + icônes frontend/portails/portails_spec.json (source unique · mise en page)
Langues FR/EN/ES + défaut ../../seo/seo_spec.json · site.langs
Tokens de marque #0a0a12/#f0b429 · thème dark CLAUDE.md #4 (via branding.py)
Devises USD/DOP CLAUDE.md #10 (via branding.py)
Expo SDK 54 roadmap Sprint 5 l.56
Fiche store : nb + énumération portails, langues injectés depuis role_navigation (labels portails_spec) + seo (jamais recopiés) — seuls le style rédactionnel + mots-clés sont authoriaux (comme app.name)
bundleIdentifier · package · projectId EAS · version · credentials · appleId · ascAppId null · a_confirmer — jamais fabriqués (#6/#8)

Ancrage de sécurité : un onglet n'est visible que pour les rôles RBAC exacts du portail (roles_allowed = surface RBAC du portail) — l'app ne peut exposer aucun portail hors du périmètre du rôle connecté. Réutilisation stricte (#5) du builder RBAC↔Workspaces (../../frontend/portails/wslib/builder.py) + validateur/branding Publiciste (zéro pip).

Utilisation

python3 app_config_gen.py build       # écrit out/{app_config,eas_build,role_navigation,store_listing}.json + MANIFEST.json
python3 app_config_gen.py validate    # schéma + 15 invariants (sort en erreur sinon)
python3 -m unittest discover -s tests -v

Sorties (out/, hand-off agent Mobile)

  • app_config.json — objet Expo app.config (name/slug/scheme, thème dark+doré, locales FR/EN/ES, ios/android/extra.eas avec identifiants null).
  • eas_build.json — objet eas.json (profils development/preview/production
    • submit.production avec credentials null).
  • role_navigation.json — 1 onglet par portail, roles_allowed = surface RBAC exacte.
  • store_listing.json — fiche store FR/EN/ES (sous-titre, description courte/longue, mots-clés) dérivée : nombre + énumération des portails et langues injectés depuis role_navigation/seo (jamais recopiés · #6) ; limites de caractères App Store / Play validées au build.
  • MANIFEST.json — traçabilité (comptes, résumé par portail, marque, a_confirmer).

Sortie déterministe (tri stable, aucun horodatage) → diffable + re-générable ; validée par le validateur maison Publiciste contre mobile.schema.json.

Résultat courant

5 onglets (Ventes/Construction/Achat/Compta/Direction) · 44 rôles couverts · 3 langues · 13 identifiants a_confirmer (jamais fabriqués) · fiche store FR/EN/ES dérivée. Schéma + 15 invariants verts.

Hors périmètre worker (VPS · #8)

Build Expo 54, soumissions App Store #32 / Play Store, assets binaires (icône, splash), credentials et signing → agent Mobile.


Auto-score 4Big : 96/100.