Putting the coach's plan on my wristproject

Giving my health coach a memory ended with a promise: Coach should push the day’s workout onto my watch, behind a button only I can press. That button exists now. It closes the last analog step in the whole system: the coach wrote a precise prescription into Discord every morning, and I carried it to the garage in my head, checking my phone between sets like a student sneaking glances at notes. Garmin watches can run a structured workout natively (the watch walks you through it set by set, timing your rests), but building one by hand in their app takes nearly as long as the workout. I realize fitness experiences have become an AI meme, but I’m proud of this one.

The button in question: the morning brief announces the day’s workout is ready for the watch, and one press, wired to my account alone, schedules it.

The design follows the house contract: joint planning, the AI drafts, a human enacts. The morning brief now carries its prescription as structured data, and a button under the Discord message, wired to my account alone, hands it to a builder that turns it into a Garmin workout and schedules it on today’s calendar. Drafting stays autonomous; acting stays human-gated. The point of the whole pipe is data quality in both directions (garbage in, garbage out): a precise prescription flowing onto the wrist, a clean recording flowing back. This was also the first time the system wrote to a device I wear, so writes sit behind a flag and the first one waited for my explicit go.

The push pipeline: the brief emits a structured prescription, the identity-gated button hands it to a builder, the builder speaks Garmin’s undocumented format onto the calendar, and the watch runs the session and records it back.

Then Garmin’s API spent two days educating me.

The first workout to reach the watch was a shapeless slab: one long timed block per movement, no sets, no rep targets. I hadn’t started from Garmin’s documentation, because for this API there effectively isn’t any; I started from an open-source reference implementation and recorded its behavior as the spec. But the reference only ever emitted timed blocks, and its simplifications had hardened, in my notes, into “what Garmin supports.” Probing the live API directly (upload a test workout, fetch it back, delete it) showed the format preserves far more: per-set repeat groups, rep-count finish conditions, exercises named by catalog category-and-name pairs. The builder was rewritten around what the API actually keeps, not what one client happened to use.

Another lesson only exists mid-workout. On paper the rest math was exact; every movement topped up to the same three-and-a-half-minute transition. In the garage it meant two rest timers running back to back at every movement boundary, a stutter no desk check could catch, because pacing is not a property of the payload; it’s a property of standing around while the watch counts. The builder now ends each movement on its final work set and runs one flat transition timer, and its self-check asserts that no two recovery steps ever touch.

The strangest lesson came from the recordings. Followed workouts record themselves, and for the first time in years of tracking, my activity log showed sets with real names attached; automatic movement detection rarely identified movements correctly and required ~5 minutes after every workout to correct. That magic was short-lived, however, because every rest period was being logged as a phantom set of an “Unknown” exercise. Fixable.

The deeper trap came when I attempted to patch one mislabeled set over the API: the fix stored, read back correct, but the app still displayed “Unknown.” The app, it turns out, filters on a probability field my payload never set. I only found it by diffing my test payload against one the official app produced when I hand-corrected a set; the vendor’s own client was the Rosetta stone. Credit where due: an open-source project that fought this API before me had documented half these traps. What an API stores and what its screen shows are two different promises, and read-back verification only tests the first. I’m half considering documenting all this and sending it to Garmin to publish.

Last Sunday was the first real session off the button: press, lift, done, and the activity wrote itself down with real exercise names, no curation required. Manual correction is now only for the days I go off-script. The brief already knows what it prescribed; the watch now records what actually happened; tomorrow’s coach should read the difference. Adherence is the number every commercial training app guesses at. Mine is about to measure it.