Deux corrections au fichier qui sert de canal entre le dev Linux et le Mac.
1. Le chantier IntervalEngine (f2fa3cc, ce matin) n'y figurait pas — or c'est
par ce fichier que le poste Mac apprend ce qu'il y a à faire. Ajouté avec
l'étape bloquante : le fichier n'est PAS membre de la cible CoachWatch
(grep rend 0), donc Xcode l'ignore et le projet compile très bien sans lui.
Même piège que VmaTestView.swift.
Noté aussi que les 42 tests Swift passent sur Linux (./tests-linux/run.sh),
dont les 17 du moteur : la logique est validée, seule l'intégration reste.
2. La procédure de build disait `open ios/App/App.xcworkspace`. Ce fichier
n'existe pas : le dépôt ne contient que App.xcodeproj, Capacitor 8 étant
passé à SPM. La commande échouait telle quelle.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Aucun .widgetURL ne ramenait dans l'app : la Live Activity, les deux widgets
iPhone et les deux complications Watch pointent sur des URL https, mais sans
entitlement associated-domains ni fichier d'association servi, iOS ouvrait
Safari — où le cookie d'auth de la WKWebView n'existe pas.
Le versant serveur est déjà en prod (coach_sportif 8ec0047 : route AASA +
deeplink.js). Reste la capability à vérifier dans Xcode côté Mac, cf. COWORK.md.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Pendant natif du backend coach_sportif (commit 772385b, déjà en prod).
- CoachRoutineBridge (target App) : pousse blocs + état du jour vers la Watch
via updateApplicationContext, relaie les coches Watch vers /api/routine/day
puis notifie la WebView (event routineUpdated)
- CoachWatch/RoutineStore : état persisté en UserDefaults, reset au changement
de jour. Les blocs viennent de l'iPhone — rien codé en dur côté watchOS, donc
modifier la routine côté web ne demande aucun rebuild
- CoachWatch/RoutineView : liste cochable, progression, haptique, bouton de
renvoi si la synchro a échoué
- ConnectivityManager (watch) : sendRoutine() en sendMessage avec repli
transferUserInfo (coche faite iPhone hors de portée -> livraison différée)
⚠️ CoachLiveBridge touché : routeIfNotLiveSample() aiguille les messages
routineDone vers NotificationCenter. WCSession.delegate est unique côté iPhone,
impossible d'en ajouter un second. Le flux live workout n'est pas modifié mais
doit être re-vérifié au build.
Les 3 nouveaux fichiers sont référencés dans project.pbxproj (bonne target) :
aucun "Add Files" à faire sur le Mac. Runbook : docs/routine-watch-runbook-mac.md
NON COMPILÉ — nécessite une session Xcode sur le Mac mini.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- CoachWidgetBridge : lit le score en NSNumber.intValue (le cast `as? Int`
renvoyait nil quand le web envoie un float → score widget perdu par
intermittence). CoachWidgetStore.save renvoie un Bool ; le plugin fait
call.reject si la sauvegarde échoue au lieu de résoudre ok:true à tort.
- CoachAppleAuth : sur double-tap, rejette l'ancien pendingCall (Promise JS
ne pend plus indéfiniment) ; accès pendingCall confiné au main thread ;
erreur d'annulation testée par domaine ASAuthorizationError (pas rawValue nu).
Swift pur, non compilé ici (pas de Xcode) — à valider au prochain build Mac.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
L'App Group n'étant pas partagé entre appareils, le snapshot transite par
WatchConnectivity : iPhone CoachWidgetBridge.pushToWatch (updateApplicationContext)
-> CoachWatch/ConnectivityManager reçoit -> App Group de la montre + reload des
complications. Nouvelles complications (CoachWatchWidgets/CoachWatchComplications.swift) :
Forme (accessoryCircular/corner, Gauge) + Séance du jour (accessoryRectangular/inline).
⚠️ Reste Mac : créer la target widget watchOS + App Group/capability + Target
Membership. Runbook complet dans docs/widgets-runbook-mac.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>