How much rope we give the AI
Every time we add an AI feature, we have to decide how loose or locked-down its output should be. Four options were on the whiteboard:
- Free-form chat. The AI just talks. The user reads the reply. Warm and simple, but the app can’t actually do anything with prose.
- Structured output (JSON). The AI fills in a fixed form — no chat, just fields. The app reads the fields and acts. Predictable, but cold.
- Tool calls. The AI chats normally, and when it wants to do something (log a set, tweak your plan), it picks from a menu we defined. Feels like a conversation; the app stays in control.
- Split endpoints. Some flows are chat (coaching you through a session). Others aren’t (working out what kind of athlete you are from your last 30 sessions). Same model, different harness.
Where we landed:
- Coach = tool calls. It suggests, never silently changes your plan.
- Behind-the-scenes stuff (profiling, grading its own advice) = structured output on a separate endpoint.
- Pure free-form? Almost never. An AI with no rails either makes things up or rambles.
The rule we wrote down: give the AI rope where conversation is the point. Rails everywhere else.