Contrainte posée aujourd'hui : coach → la montre, sans TrainingPeaks, sans Polar Flow, sans Intervals.icu. Toutes les autres voies passent par un tiers ; celle-ci est la seule qui reste, et elle était déjà prouvée en USB le 17/08. Manquait le transport qui la rende utilisable — brancher la montre au Mac cinq minutes avant de sortir n'est pas un usage. `CoachPolarBLE` ne fait que transporter. Les octets viennent du serveur (GET /api/plan/polar-target), produits par un encodeur verrouillé octet pour octet contre des fichiers relus sur la montre. Rien n'est réencodé ici : le faire perdrait la seule garantie que le firmware acceptera le fichier. La chaîne SDK a été vérifiée sur les sources avant d'écrire une ligne, et elle est entièrement publique — CBDeviceListenerImpl, search, openSessionDirect, fetchGattClient(PSFTP_SERVICE), waitPsFtpReady, write(header:data:). Ni fork, ni symbole interne. Le morceau qui compte vraiment est ailleurs. `PolarPftpStep` est séparé du plugin et n'importe que Foundation, pour être exécuté sur Linux : il porte l'en-tête PbPFtpOperation et les deux règles qui décident si une requête part. Le 17/08, un PUT de 174 octets vers un chemin terminé par « / » a bloqué la montre — écran noir, appui long sur OK pour la récupérer. Le firmware ne refuse pas, il s'effondre, et le Bluetooth utilise le même protocole. Ces règles ne peuvent donc pas être vérifiées « à la relecture » : 12 tests les exécutent, dont celui qui interdit de reporter ici le cadrage série [0x05, taille, taille] de la version USB — en BLE c'est le SDK qui cadre, l'ajouter produirait précisément une requête malformée. L'en-tête produit par Swift a été comparé à celui de polar_ftp.py sur trois chemins, dont un de 205 caractères pour le varint sur deux octets : mêmes octets. 69 tests au vert sur tests-linux. Un mode dryRun construit et décrit chaque requête sans rien émettre — le --dry-run qui manquait le jour du plantage. Le runbook Mac dit de s'en servir au premier essai, et liste les trois inconnues qui ne se lèveront que montre en main, la première étant : la V3 accepte-t-elle une connexion BLE tierce pendant qu'elle est appairée à Flow ? Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
5.2 KiB
5.2 KiB