/pwa — installable, mobile, hors ligne/pwa — installable, mobile, offline

Le skill /pwa transforme une application cliente générée en PWA installable (icône sur l'écran d'accueil, bannières d'installation et de mise à jour) avec des pages qui fonctionnent hors ligne. Il active aussi explicitement le shell mobile hérité du socle : navigation « descente par paliers » (Applications → Modules → Sections), barre inférieure transverse (Applications / Tâches / Activité / Compte) — ce shell est livré dans le paquet @atlashub/smartstack, rien à développer. The /pwa skill turns a generated client app into an installable PWA (home-screen icon, install and update banners) with pages that work offline. It also explicitly wakes the socle's inherited mobile shell: "step-down" navigation (Applications → Modules → Sections), transverse bottom bar (Applications / Tasks / Activity / Account) — the shell ships inside the @atlashub/smartstack package, nothing to develop.

Deux niveaux de hors ligne, par pageTwo offline levels, per page

ModeMode Ce que l'utilisateur peut faire hors ligneWhat the user can do offline MécaniqueMechanics
read Consulter : la page se charge et affiche les dernières données vues ; les boutons de modification sont désactivésConsult: the page loads and shows the last seen data; mutation buttons are disabled cache des lectures par le service worker (isolé par tenant et par langue)service-worker read cache (tenant- and language-isolated)
write Saisir : les créations/modifications sont capturées localement (outbox), confirmées de façon optimiste, puis rejouées automatiquement au retour du réseau ; en cas de conflit avec une modification concurrente, le serveur gagne et l'utilisateur est informéEnter data: creates/updates are captured locally (outbox), optimistically confirmed, then replayed automatically when the network returns; on conflict with a concurrent change, the server wins and the user is told outbox + rejeu idempotent + versionnage des lignes (409)outbox + idempotent replay + row versioning (409)

Le choix se fait page par page : le skill lit les pagespecs BA, vous propose un plan de déploiement (quelles pages en read, lesquelles en write), et persiste vos choix dans les pagespecs — le BA reste la source de vérité, et les régénérations conservent le hors ligne. The choice is made page by page: the skill reads the BA pagespecs, proposes a rollout plan (which pages read, which write), and persists your choices back into the pagespecs — BA stays the source of truth, and regenerations preserve offline.

Ce que /pwa met en placeWhat /pwa sets up

  • Service worker (cache isolé par tenant/langue, purge au login/logout — aucune fuite entre comptes) ;Service worker (tenant/language-isolated cache, purged on login/logout — no leak between accounts);
  • manifest + icônes + métadonnées iOS → l'app s'installe sur mobile et desktop ;manifest + icons + iOS metas → the app installs on mobile and desktop;
  • bannières « Installer l'application » et « Mise à jour disponible » ;"Install the app" and "Update available" banners;
  • l'outbox et son indicateur d'état (éléments en attente d'envoi) ;the outbox and its status chip (items awaiting sync);
  • l'audit audit-dev-pwa (12 règles) vérifie le tout — y compris qu'aucune donnée d'un tenant ne peut fuiter vers un autre.the audit-dev-pwa audit (12 rules) verifies everything — including that no tenant's data can leak to another.

⚠️ Une page passée en write exige le versionnage de son entité (colonne RowVersion) : la migration EF est signalée et passe par le chemin sanctionné /efcore. ⚠️ A page switched to write requires its entity to be versioned (RowVersion column): the EF migration is signalled and goes through the sanctioned /efcore path.

Dans quel cas ?Which situation, which command?

Je suis dans ce cas…I am in this situation… …alors je fais…then I do
« L'app doit être installable sur les téléphones »"The app must install on phones" /pwa
« Les techniciens doivent consulter leurs interventions sans réseau »"Technicians must view their jobs without network" /pwa — pages concernées en mode read/pwa — the pages in read mode
« …et saisir leurs rapports hors ligne »"…and enter their reports offline" /pwa — pages de saisie en mode write (+ migration RowVersion via /efcore)/pwa — the entry pages in write mode (+ RowVersion migration via /efcore)
Le hors ligne se comporte bizarrementOffline behaves oddly audit-dev-pwa