4.8 KiB
4.8 KiB
issueRef, version, updatedBy, updatedAt
| issueRef | version | updatedBy | updatedAt | ||||
|---|---|---|---|---|---|---|---|
| #173 | 2 |
|
1785272880037 |
#173 — Cadrage Main (2026-07-28)
Décision produit
La direction proposée est retenue :
- le téléphone décide qu'un chrono arrive à 3, 2, 1, 0 ;
- la montre ne dérive pas seule un événement métier "chrono terminé" ;
- la montre reçoit une alerte à jouer et exécute l'haptique localement, même écran éteint si possible.
Périmètre exact
Ce ticket ne remplace pas #164, il le complète architecturalement.
Il faut cadrer :
- le contrat téléphone -> montre d'alerte chrono ;
- la robustesse quand l'écran montre est éteint / ambient ;
- la force/pattern haptique suffisant pour activité physique réelle ;
- l'absence de doublon agressif ou de logique divergente entre téléphone et montre.
Recommandation cible
- téléphone : source des événements
countdownTick(3|2|1)etcountdownFinished; - montre : simple exécution d'un pattern reçu, idempotent et court ;
- support minimal hors écran : foreground/ongoing/session state suffisamment vivant pour que la montre puisse encore vibrer ;
- si une alerte est ratée faute de connectivité, la projection confirmée doit rester cohérente et ne pas faire vibrer en retard plusieurs secondes après.
Risques à cadrer
- latence si l'on transporte chaque tick individuellement ;
- duplication si la montre déclenche aussi localement ;
- vibration faible selon OEM si on reste sur un impact standard ;
- absence de vibration écran éteint si le process n'est pas au bon niveau de foreground/ongoing.
Attendu suite
Créer ensuite le lot d'architecture/implémentation qui tranche :
- événements instantanés vs petits batches d'alertes planifiées ;
- pattern haptique fort mais court ;
- comportement dégradé sans connexion ;
- QA sur montre réelle en mouvement.
Cadrage Architect (2026-07-28)
Statut : cadrage exploitable, prêt pour découpage dev.
Architecture cible minimale
- Le téléphone reste l'autorité unique des événements d'alerte chrono.
- La montre n'infère plus seule une fin de chrono pour décider une vibration ; elle exécute une alerte explicite reçue du téléphone.
- La projection d'état actuelle est conservée pour l'affichage, avec un flux séparé phone -> watch d'alertes éphémères.
- Côté téléphone, une façade
WatchAlertPublishersuffit au point où la logique chrono sait déjà qu'un3/2/1/0/finse produit.
Répartition téléphone / montre
- Téléphone :
- détecte
3,2,1,0,fin chrono,fin repossi retenu ; - joue le son téléphone ;
- publie une alerte structurée vers la montre ;
- décide si une alerte est encore pertinente ou périmée.
- détecte
- Montre :
- reçoit l'alerte ;
- déclenche l'haptique locale forte ;
- peut réveiller brièvement l'écran si faisable natif Wear ;
- ne décide jamais seule qu'un
0est atteint.
Contrat phone -> watch recommandé
- Nouveau DTO
WatchAlertEnvelope,schemaVersion = 5, transporté viaMessageClientsur un path type/gametime/phone/alert. - Champs clés :
alertId,sessionId,revision,kind,timerKind, position courante,scheduledForEpochMs,expiresAtEpochMs,pattern. alertIdsert à la déduplication.scheduledForEpochMs+expiresAtEpochMsservent à ignorer une alerte arrivée trop tard.
Latence / duplication / retard
- Envoi au moment de l'événement métier, pas à intervalle fixe.
- La montre ignore :
- tout
alertIddéjà joué ; - tout
sessionIdnon cohérent avec la séance projetée courante ; - toute alerte reçue après son expiration.
- tout
- TTL recommandé :
3/2/1: ~700 ms ;0/fin: ~2000 ms.
- Pas d'ACK obligatoire en v1 : une alerte manquée n'est pas rejouée après resync.
Foreground / ambient / ongoing
- S'appuyer sur l'existant :
WatchOngoingActivityController;WatchHeartRateForegroundServicependantrunning.
- Ne pas créer un second service d'alerte.
- Si un réveil écran bref est faisable, le réserver à
timerZero|timerFinished, jamais à3/2/1. - En ambient, l'alerte doit rester haptique-first.
Articulation avec #164
#164reste le ticket observable audio/alertes chrono.#173ajoute la prolongation architecturale vers la montre.- Le haptique montre actuel basé sur transition de projection devient au mieux un fallback transitoire ; la cible propre est le nouveau flux d'alertes explicites.
Lots recommandés
B1 [DevBackend] Contrat bridge alertes chrono + publisher téléphoneB2 [DevBackend] Déduplication / TTL / filtrage sessionF1 [DevFrontend] Exécution locale alerte montreF2 [DevFrontend] Intégration foreground/ambientQA1 [QA] Validation alertes chrono phone/watch