Most "AI coaching" demos ask a model to look at something and tell you what it sees.
I wanted a harder boundary.
In xCycleForm, the model never measures the cyclist. MediaPipe identifies landmarks. Deterministic geometry calculates joint angles. A hysteresis state machine identifies pedal stroke cycles and biomechanical extremes. Only then does a vision-language model receive the measurements and selected video frames. Its job is to interpret what they might mean.
That distinction matters. The generative model can reason about evidence. It cannot manufacture the evidence itself.

The pipeline
The measurement pipeline runs entirely in the browser. No server-side ML infrastructure is required until the evidence package reaches the generative interpretation layer. The pipeline has six stages, and the boundary between deterministic and generative falls between stages five and six.
Stages three through five are deterministic given the estimated landmarks. Given the same pose model output, they produce the same measurements. Stage two (pose estimation) is the source of measurement uncertainty; accuracy of every downstream angle depends on the quality of those landmark estimates. Stage six is generative. Given the same evidence package, it may produce different interpretations. That is by design. Interpretation is where generative models are useful. Measurement is not.
What interpretation adds
The VLM received 23 complete pedal stroke cycles, per-cycle BDC and TDC angles, cadence data, and six video frames captured at biomechanical extremes. It produced a coaching analysis that was genuinely useful in several respects.
It correctly identified that the average BDC angle (161.3 degrees) was above the reference range of 140 to 150 degrees. It noted the known 10 to 15 degree inflation from 2D pose estimation, which places the corrected estimate at roughly 146 to 151 degrees. That overlaps the upper end of the reference range rather than clearly exceeding it. The model treated the value as definitively elevated, but the corrected range makes the finding less conclusive than the raw number suggests. It recognized the limited range of motion (64.3 degrees versus the reference of 70 to 75) as consistent with the BDC observation.
More importantly, it used the captured frames. It visually corroborated the near-straight leg at bottom dead center. It identified hand placement on the hoods. It assessed trunk posture, elbow tension, head and neck position, and the absence of lateral sway. These are observations the geometric pipeline cannot currently make. The VLM earned its place in the architecture by seeing things the measurement layer does not measure.
Where the model went past its evidence
This is the more interesting result.
The deterministic system says: BDC angle = 161.3 degrees.
The model can reasonably say: this appears unusually extended relative to the provided reference range.
But the coaching output crossed several increasingly weak inference boundaries beyond that observation.
Each step is weaker than the last. The angle is measured. The comparison to reference ranges is well-supported. The inference about saddle height is plausible but assumes the measurement bias is well-characterized, which it is not. The specific 1 to 2 cm recommendation requires a calibrated relationship between angle and seat post position that does not exist in this system. The causal claim about cadence has no supporting evidence at all. 149 RPM could be real cadence, a transient, or an artifact. The injury risk claim extends beyond what any single observation session can establish.
This is not a failure of the prototype. This is the finding.
The system made the inference gradient visible. You can see exactly where the model transitions from reporting evidence to generating increasingly unsupported claims. And that visibility is what makes the architecture useful rather than just impressive.
What comes next: attribution
The obvious next step is not adding more measurements. It is requiring the model to show which evidence supports each claim.
Imagine the coaching output structured differently:
Mean: 161.3 degrees
Landmark confidence: 0.94
Frames: BDC-19, BDC-21, BDC-23
That is no longer an AI answer. It is an inspectable coaching claim.
Every recommendation identifies the observations supporting it. If the model claims cadence variation is caused by saddle height but cannot point to evidence establishing that relationship, the interface can label that portion as inference rather than presenting it alongside measured facts.
This is the architectural pattern I am most interested in building. Not just for cycling. For any domain where something can be measured deterministically, the measurement should happen first. Retrieve it or calculate it. Then give the model the resulting evidence and let it do what generative systems are good at: synthesis, explanation, and reasoning about what the evidence means.
The model should be allowed to interpret evidence. It should not be allowed to invent it.
New build notes, occasionally.
RSS