Same plan, two clients, six weeks: 100% different
18 July 2026
Every training app claims it adapts to you. It's an easy claim — nobody ever checks. Granite's entire pitch is that the engine rewrites a client's programme around what actually happened, so before trusting it with your own roster, I built a test designed to embarrass it.
The setup
Two simulated clients. Identical profile, identical twelve-week programme — byte-for-byte the same starting week. Then six weeks of very different lives, logged session by session, with the engine drafting each week from what came before, exactly as it does for a real client.
Client one thrives. Hits every prescription with reps to spare, effort comfortable, energy high, nothing else competing for recovery.
Client two has life fall on them. Misses reps, grinds at high effort on low energy, trains their sport hard four times a week on top of the lifting, and flags a knee that's started complaining.
If the adaptation is real, those two people should be on different programmes by October. If it's decoration, they'll end up in roughly the same place, and the adaptive story is marketing.
The first metric was flattering, and wrong
My first instinct was to measure divergence from the original static plan. The struggling client's programme diverged from it almost completely — great headline. Then I measured the thriving client, expecting a low number, and got well over half.
The reason is mundane: the engine rebases next week on what was actually logged, rather than following the projection drawn up on day one. Anyone who logs anything drifts from the original plan. So “diverges from static” measures that the engine recomputes — a bar every spreadsheet clears — not that it responds. A metric everyone passes is not evidence of adapting, and I nearly shipped it as proof.
The metric that matters
Compare the two clients to each other. They started identical, so whatever separates them after six weeks is attributable to one thing: what happened to them.
The result: 100% of main-lift prescriptions differed between the two clients by week six. Different loads everywhere; around the flagged knee, different movements entirely. And the direction was right — the struggling client's programme moved substantially further from the original projection than the thriving client's, which is what “responding” has to mean: more went wrong, more got rewritten.
What this doesn't prove
These are simulated clients — scripted behaviour, not humans. The test proves the engine responds; it can't prove the responses are what a good coach would choose. That next question needs real coaches judging real calls, so the next step is exactly that: putting the engine's drafted weeks in front of experienced coaches, blind, and counting how often they'd have made the same call.
The part I like most: this test now runs in the build pipeline. If a future change ever makes the engine stop responding to what a client logged, the build fails. The central claim of the product is an assertion in the test suite, not a line of marketing.
The same engine drafts every client's week on Granite for coaches — this is the sort of thing it does every Monday. Start coaching and see it on your own roster.