Skip to content

Phoenix v1.0.3

Choose a tag to compare

@9thLevelSoftware 9thLevelSoftware released this 25 Sep 20:28
c437d62

Phoenix v1.0.3

Release notes for v1.0.3. Updated September 28, 2026.

Bug Fixes

  • Accept a proven current-set rep when Echo re-targets mid-set, so a changed wire target cannot drop the rep or let a stale stall countdown end the set (#918)
  • Stop sync hard-blocking on duplicate push payload keys; reconcile identity to portal F335 so distinct PR UUIDs stay distinct and conflicts stay retryable. (#919)
  • Fix for issue #712 (#712)
  • Production-helper-level RCA for #882: Active Recovery skips even positively loaded exercises when catalogue classification derives bodyweight; rows with PR/stored baseline scale from 1RM but rows without those records scale from scalar programmed weight, and per-set-only loads with zero scalar can collapse to 0.5 kg. Mixed routine reproduces 60→40, 50→25, 10→10, 40→0.5 at selected 50%. Reporter-specific exercise IDs/weights and Android UI path are unverified; catalogue ID churn causing their PR miss is hypothetical. (#888)
  • High-confidence code-path RCA at mobile 9f87519: CSV v1 lacks advanced routine configuration; RoutineCsvCodec.encode deliberately blocks Friday Lower on eight setting predicates before file generation, and only Ready invokes the saver. Separate Compose resource backslash-apostrophe escaping defect is visible in compiled strings and the screenshot. Host repro matched all eight bullets and a plain-routine control exported; no fresh device tap. (#898)
  • Reopened iOS sync failure is a mobile push-preflight 400 before the Edge Function request. SyncManager rejects a colliding payload without safe PR/cycle recovery; PR validator omits workoutMode and UUID versus local index/wire identity, allowing a false positive. TrainingCycle.id is a local primary key, so the screenshot does not prove duplicate persisted identical cycle rows. Device-specific PR/cycle payload origins and reported build provenance remain unknown. RCA: #634 (comment) (#919)
  • Conditional production-engine defect confirmed on main@224dc2e: RepNotificationFreshnessGate rejects an armed current Echo rep with changed repsSetTotal as TARGET_MISMATCH before RepCounterFromMachine and PR #654's completed-rep stall reset. This can undercount reps and let a velocity stall timer expire into STALL_FAILURE. Three synthetic production-engine characterizations were RED; physical iPhone/firmware trigger and actual stop reason remain unverified. TestFlight submission-to-build mapping is inferred, not attested. Issue remains open; no blanket target-mismatch bypass or stall-disable is justified. (#918)
  • High-confidence nested vertical-scroll measurement regression in Android v1.0.3 Resting UI: PR #787 (6cb3bf0, ancestor of v1.0.3 dd042be) added RestTimerCard body verticalScroll inside WorkoutTab's already vertically scrolling Column. Inner ScrollNode receives infinite maxHeight and throws the issue #893 IllegalStateException. Compose 1.11.1 equivalent modifier-chain harness reproduced exact failure; live Android device app path not run (SDK/device unavailable). RCA posted at issue comment 5833788812. (#894)
  • Historical mixed pale-editor/dark-card surface on explicit Dark + Material You, plus a later SYSTEM lock latch that made the UI lighter. Both seams are already fixed on main 530540d (#678, #691, #696). Current v1.0.2 and diagnostic acceptance did not reproduce the mix. Issue #677 is CLOSED. No further product change. (#677)
  • fix(workout): make RestTimerCard honour its unbounded scroll host (#893) (#943)
  • fix(sync): reconcile push payload identity instead of hard-blocking the sync (Issue #634) (#919)
  • fix(workout): accept proven current rep progress on mid-set wire re-target (#652) (#918)
  • fix(ios): open Settings with the modern openURL API (#912)
  • fix(ios): resolve security-scoped bookmarks for session backups (#911)
  • fix(android): request microphone permission before safe-word listening (#910)
  • fix(ci): run iOS release builds on the free standard macos-26-intel runner (#900)
  • fix(routine): lossless CSV v2 export for advanced settings; fix Compose apostrophe escapes (#896) (#898)
  • fix(ci): give TestFlight iOS linker enough memory (#895)
  • fix(workout): drop nested rest-timer verticalScroll crashing Resting measure (#893) (#894)
  • fix(ci): give iOS release linker enough memory (#892)
  • cleanup: retire iOS beta icon scripts and fix launch assets (#891)
  • fix(exercises): restore belt squat seed and reconcile equipment chips (#883) (#890)
  • fix(routines): consistent Active Recovery weight scaling for every loaded exercise (#882) (#888)
  • fix(routines): CSV import/export review follow-ups (#772) (#884)
  • cleanup: drop unused SQLDelight queries and fix external-exercise INSERT (#876)
  • fix(startup): recover the lossless dual-database cases and stop sending users to public issues (#764) (#874)
  • fix(session): show Set Summary only after the completed set is committed (#869) (#873)
  • fix(picker): stop blank exercise names and early Add Set taps from crashing (#774) (#872)
  • fix(reps): baseline V-Form legacy rep packets once per set (#712) (#870)
  • fix(session): never save or push a 1970 start time or an epoch-sized duration (#867)
  • Resolve startup dependencies off the main thread and stop rebuilding indexes on every open (#865)
  • fix(exercise): surface One_Leg_Barbell_Squat as Bulgarian Split Squat (#857) (#858)
  • normalize cycle 1RM totals per cable (#852)
  • stop asserting Dependabot artifact version comments in release workflow tests (#843)

Enhancements

  • Added a high-fidelity in-app prototype for the resistance-band two-dial Equipment Rack UX (#580)
  • Prototype: choose Handles, Short Bar, Long Bar, Rope, Belt, or Ankle Strap when creating a custom cable exercise (#970)
  • Prototype: edit or clear completed Just Lift exercise labels (#972)
  • Custom exercise equipment picker (#970): choose Handles, Short Bar, Long Bar, Rope, Belt, or Ankle Strap when creating/editing custom exercises; chosen accessory shows in the exercise list; Short Bar/Rope/Ankle Strap picker chips restored (#973)
  • Custom exercises can now choose cable equipment (Handles, Short Bar, Long Bar, Rope, Belt, or Ankle Strap) instead of always defaulting to Handles. (#973)
  • CSV routine import/export: preview-then-commit import with copies/overwrite handling and per-routine CSV export (#772) (#881)