← Back to updates

The honest fallback — v1.22's activation fix, followed to its logical end

v1.22 fixed the "picked Press to Handstand, got Wall Push-Ups" bug by routing skill-focus users to their skill's own calibration test. Good in the general case. But it left a gap: what if the user completes the calibration honestly and can't do any of the tests? Zero pike presses, zero negatives, no pancake mobility. Their skill-rung stays at 0. The Focus Split's skill slot has nothing to render. The recommendation engine just quietly gave up and dropped them on a strength split that's still too advanced.

v1.23 closes that gap. If you picked a skill focus and your calibration honestly returned all zeros, Home now recommends Foundations Library — the rung-based beginner cycle that meets you where you actually are, with your skill roadmap still visible in Programs and Stats for aspirational context.

The three fixes

Foundations fallback for TC 1 users. After you complete the skill's calibration test, Home checks your rung on that skill's ladder. Rung ≥1 → your Focus Split unlocks (skill slot renders correctly). Rung = 0 but calibration is done → Foundations Library, framed as "Building toward Press to Handstand" so the mission stays connected to your original pick. The Focus Split isn't hidden — it's still there in Programs — just not the primary recommendation until your baseline catches up.

Calibration checkmark toggle-off, revisited. v1.21 fixed the "can't commit at 0 reps" bug. v1.22 fixed the "checkmark stays filled after logging 0" bug. v1.23 fixes the last edge case: on calibration, tapping a logged 0-rep set actually clears it now. Both directions of the toggle work. This is the last known bug in the calibration set-row flow.

Auto-advance on onboarding completion. Between the last onboarding question and your first workout prompt, v1.22 still made you tap "Go to Home 🏠" on a celebration screen that didn't really celebrate anything. v1.23 removes that tap. After you finish the diagnostic, ZenMotion shows a clean "Setting up your plan…" loading beat while the network write completes, then goes straight to your first workout prompt with the correct Start CTA. One less tap in the onboarding-to-first-workout funnel.

Under the hood

The Home focusMission logic (routes/home/index.ts) got a new fallback branch. When the picked skill's Focus Split prereqs aren't met AND the user has a completed calibration run for that skill with rung 0, the resolver hands back Foundations Library (id 100) with goalSkillName still pointing at the picked skill. iOS renders it exactly as it renders every other Foundations recommendation, so no client change was needed — the backend just started sending the right pointer.

A new start_program_shown analytics event fires on StartProgramView.onAppear, carrying a source breadcrumb (onboarding, home, programs, or unknown). Combined with the existing first_workout_prompt_started and first_workout_started events, this pins down exactly where users drop off in the onboarding-to-workout funnel — is it before StartProgramView (navigation issue?) or after (the preview screen is a friction point?). 48 hours of data will tell us which.

The calibration set-row uncheck path now branches on isCalibration. Non-calibration exercises stay on the existing "write 0" path (which flips isLogged false via the arr[idx] > 0 check). Calibration branches to a new clearSet(for:set:) helper that truncates both the reps and weight arrays back to set - 1. The truncation is what lets calibration distinguish "user committed 0 as a legitimate answer" from "user cleared this set" — length becomes the signal instead of value.

Feedback

Same channel: support@zenmotion.app. If you saw the onboarding flow this week and it still doesn't fit, we want to hear about it — activation is the only number we're actively working on right now.

Train well.