One more block
Some days you finish a Foundations session — 15 minutes, three families, done — and you're barely warm. You wanted the workout to be more. Not double, just... one more block.
This release adds an offer for those moments. It also renames a thing that new users kept squinting at, makes the Foundations Home surface a little more useful, and quietly fixes half a dozen small annoyances that showed up in TestFlight.
Add another block
When you save a workout, the Home screen now sometimes shows a small card offering one more block. Same programming rules that apply to your regular sessions — nothing more than 60 minutes of total training in a day, and only if the app knows the combined effort actually fits your pace.
The math accounts for you personally. If your Foundations day is estimated at 15 minutes but you usually take 25, the second block gets sized against 25, not 15. If your combined actual would blow past an hour, the card doesn't appear at all.
Tap a suggestion → straight into the session. Tap "Not now" → the card is done for that finish. It never nags. It only asks once, right when the feeling is there.
The stacked session skips its warmup automatically. You're already warm from the previous one.
"Calibration" was the wrong word
The first thing a new user saw on Home used to be a card titled Strength Calibration. Then they'd get subtitle "Find your level". Then a big Start button.
Half of them tapped. The other half wondered what "calibration" meant — was it a test? A tutorial? A settings thing? Was the app broken?
The answer, of course, is "it's a 5-minute strength check that shapes your training." So that's what it's called now. Strength Check. Handstand Calibration is Handstand Check. Same 11 checks across every skill family — the naming just doesn't require a decoder ring anymore.
Your progression, one tap away
The Foundations Home shows a little "Your progression" section under today's workout — Push · Desk Push-up · Next: Bench Push-up · Rung 3 of 12, and so on for each family in today's session.
Those rows are now tappable. Tap one and you land on the full ladder for that family — every rung, where you are, what's next, what's at the top. Same view the Athlete Profile family rows have used since v1.12. Now consistent across the app: any time you see a family badge with a rung count, tapping it takes you to the ladder.
Smaller things that add up
- The first onboarding workout used to display as "Foundations Movement Library" (the catalog name). Now it reads as the actual first session's name: **Upper body**.
- The rung-bump celebration sheet used to size at 45% of the screen, which cut the "You crushed this rung twice. Next session steps up to a harder variant." copy at "steps up to a harder v..." Now it sizes to the content — no truncation, no dead space at the bottom.
- SkillRoadmap active-rung descriptions wrap freely instead of getting a two-line cap.
- Stack-suggestion cards use a compact teal-outline layout to sit below the main NextWorkoutCard without stealing focus.
Watch analytics quieter, more honest
If your Watch is paired but off your wrist, or the Bluetooth link sleeps mid-workout, the iPhone-side timer sends payloads via a fallback channel that lands on the next Watch wake. Users don't see a thing — the payload gets there. But our analytics used to log a `watch_sync_failed` every time the direct-send timed out, even though the fallback worked fine.
Result: 273 "failed" events per week across 19 users, mostly noise. Now we only log a failure when both the direct send AND the fallback fail. `not_reachable` errors (Watch off wrist, app backgrounded) get filtered because they aren't actionable — they're just Bluetooth being Bluetooth. What's left is the real signal.
Under the hood
- Backend: new `GET /v1/api/session/stack-suggestions?justCompletedRunId=
` endpoint. Pure-function curation logic + prisma wrapper, 33 unit tests. - 11 program renames: `Strength Calibration` → `Strength Check`, `Planche Calibration` → `Planche Check`, and so on. Backend `category: "calibration"` enum stays the same — internal identifier, invisible to users.
- iOS: new `StackSuggestionsService` slice, `PostWorkoutInbox.pendingStackSuggestions` state, `StackSuggestionCard` view. Three new analytics events for stack card funnel measurement.
- Universal family roadmap navigation destination reachable from both Athlete Profile and Foundations Home.
Small offer, cleaner name, a couple of shortcuts.