---
issueRef: "#118"
version: 3
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedAt: 1785137390315
---

## #118 — Contrôles score +/- sur montre (UX, 2026-07-26)

Statut : **cadrage UX exploitable, prêt pour Architect (#119) et implémentation**, pas de blocage.

### Principe directeur
La montre est un **satellite d'affichage et de commande**, jamais une source de vérité ([[gametime-watch-companion-implementation]] : « la montre n'applique JAMAIS une commande localement, recalage sur projection confirmée »). Les contrôles score doivent rendre ce principe visible à l'utilisateur pour éviter toute confusion en cas de latence, sans jamais donner l'impression d'un mode local/offline.

### Emplacement et affordance
- Sur l'écran "séance active" de la montre (refonte DA, cf. [[gametime-ux-score-chrono]] pour le vocabulaire "Score"/"Score chrono"), le bloc score reprend la même hiérarchie que le compteur de série actuel côté téléphone ([[gametime-ux-series-counter]]) : grande valeur numérique Anton, couleur primaire or, au centre du cadran.
- Deux zones tactiles larges de part et d'autre de la valeur : `−` à gauche, `+` à droite. Cibles tactiles ≥ 48dp (cadran rond, appui au doigt, pas de precision souris) — priorité absolue à éviter l'appui accidentel du bouton opposé plutôt qu'à la densité d'info.
- Rotation de la couronne physique (si le boîtier en a une) acceptée comme entrée alternative +/- si le device la supporte, en complément des zones tactiles — pas un remplacement, car tous les boîtiers Wear OS n'ont pas de couronne rotative.
- Si l'exercice n'a **pas** de score configuré : le bloc est simplement absent de l'écran (pas de placeholder grisé, pas de "score non disponible") — l'écran affiche seulement les mesures actives de l'exercice (reps/temps), cohérent avec « le vide se conçoit, mais ici il n'y a rien à dire ».

### Prévention des erreurs d'appui
- **Debounce visuel immédiat, confirmation serveur différée** : au tap, la valeur affichée s'incrémente/décrémente instantanément en local (feedback optimiste, indispensable pour un contrôle répété rapide) mais passe dans un **état visuellement "en attente"** (valeur légèrement atténuée / opacité réduite) jusqu'à confirmation de la projection téléphone → montre. Dès la confirmation reçue, retour à l'opacité pleine. Ceci rend le principe "téléphone source de vérité" visible sans bloquer l'usage.
- Pas de confirmation modale par tap (casserait l'usage répété typique d'un score qui s'incrémente vite, ex. compte de points) — la prévention passe par la taille des cibles et le split gauche/droite, pas par une friction supplémentaire.
- Bouton `−` désactivé (grisé, non actionnable) si le score est déjà à son minimum autorisé (0, ou borne définie par l'exercice) — évite un appui qui ne ferait rien et qui interrogerait l'utilisateur.
- Pas de "annuler le dernier appui" dédié sur la montre : la correction se fait avec les mêmes boutons +/-, symétriques. Une correction plus lourde (erreur de plusieurs points) se fait sur le téléphone, source de vérité complète.

### Comportement si connexion lente
- Au-delà d'un délai perçu (repère : > 1,5-2s sans confirmation, valeur à affiner par Architect selon la latence réelle mesurée du bridge), la valeur "en attente" affiche un indicateur discret supplémentaire (petit point pulsé sous la valeur) signalant que la synchronisation est toujours en cours — jamais de message d'erreur intrusif, jamais de blocage des taps suivants (cohérent avec [[gametime-online-layer-philosophy]] : pas de popup, pas d'interruption).
- Si la commande finit par échouer (timeout définitif, perte de connexion Data Layer) : la montre **se recale silencieusement** sur la dernière valeur confirmée par le téléphone (peut donc "reculer" visuellement si des taps optimistes n'ont pas abouti) — pas de message d'erreur sur la montre. Un état de connexion perdue générique doit déjà couvrir ce cas au niveau écran (cf. #115, variante "connexion perdue"), pas la peine de dupliquer un message spécifique au score.
- Aucune mention "hors ligne" ou "mode local" nulle part sur cet écran : le contrat visuel est "j'affiche ce que dit le téléphone, avec un délai le cas échéant", jamais "je fonctionne seul".

### Hors périmètre MVP
- Saisie d'une valeur exacte au clavier depuis la montre (le téléphone reste l'endroit pour une correction lourde).
- Undo dédié / historique des taps sur la montre.
- Haptique différenciée par valeur (un retour haptique simple par tap suffit, cohérent avec l'existant #91-F).
