v3.3.1 — Hotfix: upgraded installs could lose workout matching
If you upgraded to v3.3.0 and your plan suddenly filled with identical "Z2 steady" placeholder sessions, or Rematch kept saying "no candidate" — this release is for you, and it repairs the damage automatically.
The root cause
v3.3.0's app package was missing one internal helper the workout-analysis step needs. Fresh installs never noticed (they ship with the analysis pre-computed), but on upgraded installs with an existing workout folder the app tried to re-analyze the library, failed for every file, and recorded "unusable" for all 4,000+ workouts — permanently. From that moment the planner couldn't match ANY workout: every reshuffle failed, and the next automatic recalculation rebuilt your future weeks as empty Z2 placeholders.
Fixed
- The missing helper is back in the package, and the analysis step now treats "the helper itself is broken" as an installation problem instead of a verdict on your workouts: it keeps the previous analysis and never marks the whole library unusable in one sweep.
- Poisoned installs heal themselves. On first launch, wrongly-blacklisted workouts are re-analyzed. No manual steps.
- Plans can no longer be flattened. If the workout pool ever comes back empty, the automatic recalculation refuses to rebuild and keeps your existing plan, telling you why.
- The mid-plan FTP test is only ever scheduled the day after a rest or easy day — a test on cooked legs reads low and poisons every target built on it. It now also counts as a hard day itself, so the 48-hour spacing rule and the weekly hard-day limit protect the days around it in both directions.
- The "adjusted" day card tells one story — chart, targets and label all describe the session you'll actually ride.
- Reshuffle on a thin day retries properly and, when there's genuinely nothing, says the day keeps its zone targets instead of "failed".
- Manually changing a day's workout type now updates your intervals.icu calendar, and sync errors are logged with the actual reason so a stuck sync is diagnosable.
- "Download ZWO" works on manually-changed days in the desktop app.
- Implausible automatic FTP updates are rejected (one tester's profile hit 122W with a real FTP of ~258 — every power target scaled off it). Anything you type yourself is always respected.
Also in this release
- Send any workout to your intervals.icu calendar. Every workout detail view (planner and library) has a send-to-calendar button — planned sessions go to their day in one click; library workouts get a date picker and stay permanently. Garmin/Wahoo/Hammerhead and MyWhoosh pull the workout with full targets.
- Help popovers are readable again (they were transparent).
For the tester who hit this
Update, launch once (the library re-analyzes itself), then open the Training Plan tab and press Generate Plan once to rebuild the flattened weeks. Your ride history and settings are untouched. If your FTP shows a wrong low number, correct it once in Settings.
macOS DMG is notarized by Apple — no security prompts.