← Back to updates

Reads the room — plateau detection, retest vs. graduate, and a weekly reflection

Last release, ZenMotion started reflecting your session back at you. This release, it starts acting on what it notices — spotting when you've plateaued and telling you specifically how to break through, surfacing your week even if you missed the Sunday push, and softening its own advice when the numbers say it shouldn't over-promise.

Three related pieces, one theme: the app that watches carefully and answers honestly.

Plateau detection with a prescription

If you've hit the same target three sessions running on a specific movement, and that target is at the numeric ceiling — 20 reps, 90-second hold — a new card appears at the top of Home. Not a warning. A prompt with two paths:

  • Retest this movement. Deep-links straight into the calibration test that covers it. You've been steady; verify what your ceiling actually is now. It's how the rung system catches up when auto-progression has frozen.
  • Try [next variant]. When the app knows a graduation path — Push-Up → Diamond Push-Up, Wall Handstand → L-Shape — that button shows up too. Tapping it drops you into the target movement's Stats view where you can see its history and which programs include it.

You can also tap Not now and the card stands down for that specific movement until next Home load. If the plateau persists past a fresh retest, it'll come back — but per-movement, not the same nudge on repeat.

Two prescriptions instead of one. The coach's move: "here are two vettiga vägar framåt" instead of just flagging the problem.

Weekly rollup on Home

Every Sunday evening, ZenMotion sends a push notification summarizing your week — sessions logged, rung bumps that fired, best hold and its delta from last week. That's been in the app since v1.13. But if you missed the push, you missed the reflection.

New this release: the same summary now shows up as a card on Home, rendered until you tap "Got it" or the next ISO week rolls over. Same three-priority copy the push uses:

  • Rung bump → "🎉 You leveled up on [movement]."
  • Best hold delta → "Best hold up 2s."
  • Steady week → "Nice work this week."

A recurring touchpoint on rest days, embedded where you'd actually look for one.

Post-workout intelligence, quieter about the future

The session intelligence pane that shipped in v1.18 had one behavior we want to fix: on solid steady sessions (target hit, no bump), the closing copy sometimes read "next one will bump." Well-meaning. But three sessions of the same message when the bump didn't happen looked like the app was either flattering you or blind. Both bad reads.

Now the pane splits that state in two:

  • First one or two solid sessions at a target → "Steady session. Consistency is the base." No prediction about timing.
  • Three or more solid sessions at the same target → "You've hit steady ground. Time to push." Copy tells you exactly what triggers a bump: reaching the top of the rep range across all sets, not just the minimum.

Same signal that drives the plateau card on Home; different surface, different framing. The session intelligence pane gives you the tactical next-session move; the plateau card gives you the "should you retest or graduate?" branch. Both fire from the same underlying observation: you've been steady for a while.

Under the hood

The sessionsAtSameTarget signal is computed server-side from UserMovementRung.sessionsOnRung (for skill split and Foundations sessions) and UserExerciseTarget.consecutiveCleanCompletions (for catalog programs), returned as one number on the /complete response. Threshold to escalate: 3, same value the plateau detector uses on Home. iOS branches the LLM prompt from solid to solid_plateau; the hallucination guard's integer whitelist extends to accept the new counter so real numbers don't trigger a fallback.

Backend also grew a graduation_exercise_id lookup: for any movement in a plateau signal, the detector checks whether any authored ProgramExercise in the catalog carries a graduation link. If yes, the target Movement's name comes back with the plateau payload and iOS renders the "Try [Name]" button. First-match wins; graduations across the catalog for a given movement should point at the same variant (Push-Up → Diamond Push-Up) so the disagreement case is theoretical.

Three new analytics events wire up the plateau surface: plateau_nudge_shown, plateau_nudge_retest_tapped, plateau_nudge_graduate_tapped, plus plateau_nudge_dismissed. Two more for the rollup card: weekly_rollup_card_shown (keyed by ISO week + workout count) and weekly_rollup_card_dismissed. When both cards start showing in production we'll be able to measure retest-vs-graduate tap ratio per movement, and whether the persistent rollup card actually shifts return rate on rest days.

The arc so far

  • v1.17 — Guided First Workout. Server picks your very first session based on tier + focus.
  • v1.18 — Session Intelligence Pane. After each session, three lines of synthesis.
  • v1.19 — Plateau + Weekly Rollup. The app spots patterns and gives specific answers.
  • v1.20 — HealthKit readiness. HRV + sleep feeding into adaptive periodization. Coming next.

The through-line: the same rung system, adaptive periodization, and rich session state that's been building since v1.7 is now visible as concrete moments — "you're stuck on push-ups, retest or graduate", "here's your week", "you've been steady, aim for the top of the range next time." The intelligence isn't new. Making it show up in specific moments is.

Also in this release

  • Session Intelligence copy tuned. The "solid" template no longer promises imminent bumps — that language moves entirely into the new solid_plateau shape where it actually applies.
  • endedByUser fix follow-up. Continued hardening of the Continue-workout banner logic that started in v1.10.1 (#644) — now covered by the plateau signal flow too, so the banner never conflicts with a persisted plateau card.

Bug reports and feature ideas: support@zenmotion.app.

Train well.