Boutons d'App Intent (iOS 17+) pour l'eau et le café : ils s'exécutent dans l'extension, écrivent dans l'App Group et rafraîchissent la timeline. Aucun appel réseau — une extension n'a ni session authentifiée ni droit de tenir une requête. Photo et code-barres OUVRENT l'application, par `coachapp://meals?photo=1` et `?scan=1` : la caméra exige le premier plan, aucun widget ne peut y échapper. Le widget économise les navigations, pas le lancement. `CoachQuickLog` : file d'attente partagée app ↔ widget ↔ montre. Les saisies partent au serveur à la prochaine ouverture de l'app, et sont retirées PAR IDENTIFIANT — vider la file perdrait une saisie faite pendant la synchronisation, sans laisser de trace. Le widget affiche son propre total du jour : les boissons déjà connues du serveur (nouveaux champs `waterMlToday` / `coffeeCountToday` du snapshot, tous deux optionnels pour rester lisibles depuis une version antérieure) PLUS ce qui attend dans la file. Sans cela, il afficherait un total périmé juste après une saisie et l'utilisateur douterait de ce qu'il vient de faire. Ce qui n'est pas encore parti est signalé par une flèche, pas masqué. Un échec d'écriture de l'App Group remonte en erreur d'intent : afficher « ajouté » sur une saisie perdue est pire que ne rien afficher. Runbook Mac complété — Target Membership, enregistrement dans le WidgetBundle, schéma d'URL, iOS 17 minimum, et le câblage de synchronisation restant. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
6.8 KiB
6.8 KiB