From 97235f036e9a687d837437468f1da72a9bb9463c Mon Sep 17 00:00:00 2001 From: Devil Date: Fri, 21 Aug 2026 12:18:55 -0400 Subject: [PATCH 1/9] =?UTF-8?q?refactor:=20remove=20all=20Vitruvian=20refe?= =?UTF-8?q?rences=20=E2=80=94=20legal=20rebrand=20to=20Phoenix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename iOS project: VitruvianPhoenix → PhoenixApp (directory, xcodeproj, scheme, swift, entitlements) - Rename Android: VitruvianApp → PhoenixApp, VitruvianTheme → PhoenixTheme - Rename SQLDelight: VitruvianDatabase.sq → PhoenixDatabase.sq - Update settings.gradle.kts root project name: ProjectPhoenix - Update AndroidManifest: Theme.PhoenixProject, .PhoenixApp - Replace all icon assets with new Phoenix logo - Scrub all Vitruvian/vitphoe references from source, tests, docs, CI workflows - Verified: grep -ri vitruvian = 0, grep -ri vitphoe = 0 - Builds verified: SQLDelight interface gen, Kotlin Android/iOS, Xcode device build --- .../skills/update-phoenix-version/SKILL.md | 6 +- .../scripts/update_version.py | 4 +- .almanac/pages/data-backup-and-repair.md | 4 +- .almanac/pages/data.md | 4 +- .almanac/pages/external-provider-sync.md | 2 +- .almanac/pages/frontend.md | 2 +- .almanac/pages/getting-started.md | 4 +- .almanac/pages/local-data-model.md | 6 +- .almanac/pages/machine-diagnostics.md | 8 +- ...le-protocol.md => phoenix-ble-protocol.md} | 6 +- .almanac/pages/platform-hosts.md | 8 +- .almanac/pages/profiles.md | 2 +- .almanac/pages/project-phoenix.md | 10 +- .../pages/routines-and-training-cycles.md | 2 +- .almanac/pages/supabase.md | 4 +- .almanac/pages/theme-mode.md | 8 +- .almanac/pages/workout-engine.md | 2 +- .almanac/pages/workouts.md | 10 +- .github/FUNDING.yml | 2 +- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .github/scripts/agent-quality-gate.ps1 | 2 +- .github/scripts/agent-quality-gate.sh | 2 +- .github/scripts/validate-ios-schema.sh | 8 +- .github/workflows/ci-tests.yml | 2 +- .github/workflows/ios-release-ipa.yml | 18 +- .github/workflows/ios-testflight-internal.yml | 26 +-- .github/workflows/ios-testflight.yml | 26 +-- .github/workflows/release-all.yml | 2 +- .gitignore | 10 +- .phoenix-review/BUG-FIX-PLAN.md | 8 +- .phoenix-review/CONSOLIDATED-REPORT.md | 8 +- .phoenix-review/android-app-main.md | 4 +- .phoenix-review/data---ble-part-1.md | 4 +- .phoenix-review/data---ble-part-2.md | 2 +- .phoenix-review/ui-theme-&-styling.md | 2 +- .phoenix-review/utilities-part-2.md | 4 +- .superpowers/sdd/task-3.7-report.md | 2 +- ANDROID_INSTALL.md | 20 +-- CLAUDE.md | 8 +- README.md | 20 +-- .../phoenixproject/qa/ProfileQaDebugApp.kt | 8 +- .../phoenixproject/qa/ProfileQaSeeder.kt | 8 +- androidApp/src/main/AndroidManifest.xml | 6 +- .../{VitruvianApp.kt => PhoenixApp.kt} | 6 +- .../service/WorkoutForegroundService.kt | 2 +- .../phoenixproject/ui/theme/AndroidTheme.kt | 8 +- .../phoenix_logo_foreground.png | Bin 0 -> 151356 bytes .../vitphoe_logo_foreground.png | Bin 876947 -> 0 bytes .../res/drawable/ic_launcher_foreground.xml | 2 +- .../res/drawable/ic_launcher_monochrome.xml | 2 +- .../src/main/res/values-night/themes.xml | 2 +- androidApp/src/main/res/values/themes.xml | 2 +- androidApp/src/main/res/xml/backup_rules.xml | 14 +- .../main/res/xml/data_extraction_rules.xml | 26 +-- .../auth/OAuthIosUrlSchemeConfigTest.kt | 2 +- .../qa/Schema42FixtureContractTest.kt | 6 +- .../phoenixproject/qa/ProfileQaSeederTest.kt | 4 +- build.gradle.kts | 2 +- .../424-suggest-weight-increase.md | 2 +- docs/enhancement-plans/448-equipment-rack.md | 6 +- .../478-system-default-theme.md | 10 +- docs/feature-graphic.html | 2 +- docs/index.html | 12 +- docs/phoenix_logo.png | Bin 0 -> 714721 bytes docs/privacy-policy.html | 2 +- ...references.xml => phoenix_preferences.xml} | 0 .../profile-release-readiness-2026-07-12.md | 4 +- docs/qa/profile-schema42-fixture.md | 20 +-- ...6-26-velocity-1rm-phase3-percent-of-1rm.md | 10 +- .../2026-06-26-velocity-1rm-phase4-badges.md | 6 +- ...2026-06-26-velocity-1rm-phase5-backfill.md | 6 +- ...026-06-26-velocity-based-1rm-foundation.md | 36 ++-- .../2026-07-10-release-workflow-separation.md | 2 +- ...-11-profile-preferences-data-foundation.md | 38 ++-- ...-07-11-profile-preferences-sync-backend.md | 34 ++-- .../2026-07-11-profile-tab-ui-navigation.md | 28 +-- ...7-12-profile-release-readiness-fixtures.md | 10 +- ...26-08-13-issue-673-drop-set-retry-index.md | 4 +- ...026-08-13-issue-673-pr1-set-end-reasons.md | 6 +- ...026-08-13-issue-673-pr2-drop-set-engine.md | 8 +- ...08-13-issue-673-pr3-product-integration.md | 6 +- ...6-06-16-official-weight-handling-design.md | 2 +- .../2026-06-26-velocity-based-1rm-design.md | 2 +- ...26-07-11-profile-tab-preferences-design.md | 4 +- docs/terms-of-service.html | 2 +- docs/vitphoe_logo.png | Bin 876947 -> 0 bytes iOS_INSTALL.md | 22 +-- iosApp/AppIcon1024.png | Bin 494242 -> 714721 bytes iosApp/GITHUB_ACTIONS_SETUP.md | 6 +- .../Config/Supabase.xcconfig.example | 0 .../Config/SupabaseBase.xcconfig | 0 .../PhoenixApp.xcodeproj}/project.pbxproj | 54 +++--- .../xcschemes/PhoenixApp.xcscheme} | 18 +- .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/AppIcon1024.png | Bin 0 -> 714721 bytes .../AppIcon.appiconset/Contents.json | 0 .../PhoenixApp}/Assets.xcassets/Contents.json | 0 .../Contents.json | 0 .../PhoenixApp}/ContentView.swift | 0 .../PhoenixApp}/Info.plist | 4 +- .../PhoenixApp/PhoenixApp.entitlements} | 0 .../PhoenixApp/PhoenixApp.swift} | 4 +- .../Sounds/absolute_domination.caf | Bin .../PhoenixApp}/Sounds/absolute_unit.caf | Bin .../Sounds/another_milestone_crushed.caf | Bin .../PhoenixApp}/Sounds/beast_mode.caf | Bin .../PhoenixApp}/Sounds/beep.caf | Bin .../PhoenixApp}/Sounds/beepboop.caf | Bin .../PhoenixApp}/Sounds/boopbeepbeep.caf | Bin .../PhoenixApp}/Sounds/chirpchirp.caf | Bin .../PhoenixApp}/Sounds/discomode.caf | Bin .../PhoenixApp}/Sounds/dominatrix_01.caf | Bin .../PhoenixApp}/Sounds/dominatrix_02.caf | Bin .../PhoenixApp}/Sounds/dominatrix_03.caf | Bin .../PhoenixApp}/Sounds/dominatrix_04.caf | Bin .../PhoenixApp}/Sounds/dominatrix_05.caf | Bin .../PhoenixApp}/Sounds/dominatrix_06.caf | Bin .../PhoenixApp}/Sounds/dominatrix_07.caf | Bin .../PhoenixApp}/Sounds/dominatrix_08.caf | Bin .../PhoenixApp}/Sounds/dominatrix_09.caf | Bin .../PhoenixApp}/Sounds/dominatrix_10.caf | Bin .../PhoenixApp}/Sounds/dominatrix_11.caf | Bin .../PhoenixApp}/Sounds/dominatrix_12.caf | Bin .../PhoenixApp}/Sounds/dominatrix_unlock.caf | Bin .../PhoenixApp}/Sounds/encouragement_01.caf | Bin .../PhoenixApp}/Sounds/encouragement_02.caf | Bin .../PhoenixApp}/Sounds/encouragement_03.caf | Bin .../PhoenixApp}/Sounds/encouragement_04.caf | Bin .../PhoenixApp}/Sounds/encouragement_05.caf | Bin .../PhoenixApp}/Sounds/encouragement_06.caf | Bin .../PhoenixApp}/Sounds/encouragement_07.caf | Bin .../PhoenixApp}/Sounds/encouragement_08.caf | Bin .../PhoenixApp}/Sounds/encouragement_09.caf | Bin .../PhoenixApp}/Sounds/encouragement_10.caf | Bin .../PhoenixApp}/Sounds/encouragement_11.caf | Bin .../PhoenixApp}/Sounds/encouragement_12.caf | Bin .../PhoenixApp}/Sounds/encouragement_13.caf | Bin .../PhoenixApp}/Sounds/encouragement_14.caf | Bin .../PhoenixApp}/Sounds/encouragement_15.caf | Bin .../PhoenixApp}/Sounds/insane_performance.caf | Bin .../PhoenixApp}/Sounds/maxed_out.caf | Bin .../PhoenixApp}/Sounds/new_peak_achieved.caf | Bin .../Sounds/new_personal_record.caf | Bin .../Sounds/new_personal_record_2.caf | Bin .../PhoenixApp}/Sounds/new_record_secured.caf | Bin .../Sounds/no_ones_stopping_you_now.caf | Bin .../PhoenixApp}/Sounds/power.caf | Bin .../PhoenixApp}/Sounds/pr.caf | Bin .../Sounds/pressure_create_greatness.caf | Bin .../PhoenixApp}/Sounds/record.caf | Bin .../PhoenixApp}/Sounds/rep_01.caf | Bin .../PhoenixApp}/Sounds/rep_02.caf | Bin .../PhoenixApp}/Sounds/rep_03.caf | Bin .../PhoenixApp}/Sounds/rep_04.caf | Bin .../PhoenixApp}/Sounds/rep_05.caf | Bin .../PhoenixApp}/Sounds/rep_06.caf | Bin .../PhoenixApp}/Sounds/rep_07.caf | Bin .../PhoenixApp}/Sounds/rep_08.caf | Bin .../PhoenixApp}/Sounds/rep_09.caf | Bin .../PhoenixApp}/Sounds/rep_10.caf | Bin .../PhoenixApp}/Sounds/rep_11.caf | Bin .../PhoenixApp}/Sounds/rep_12.caf | Bin .../PhoenixApp}/Sounds/rep_13.caf | Bin .../PhoenixApp}/Sounds/rep_14.caf | Bin .../PhoenixApp}/Sounds/rep_15.caf | Bin .../PhoenixApp}/Sounds/rep_16.caf | Bin .../PhoenixApp}/Sounds/rep_17.caf | Bin .../PhoenixApp}/Sounds/rep_18.caf | Bin .../PhoenixApp}/Sounds/rep_19.caf | Bin .../PhoenixApp}/Sounds/rep_20.caf | Bin .../PhoenixApp}/Sounds/rep_21.caf | Bin .../PhoenixApp}/Sounds/rep_22.caf | Bin .../PhoenixApp}/Sounds/rep_23.caf | Bin .../PhoenixApp}/Sounds/rep_24.caf | Bin .../PhoenixApp}/Sounds/rep_25.caf | Bin .../Sounds/rep_complete_strong.caf | Bin .../PhoenixApp}/Sounds/restover.caf | Bin .../PhoenixApp}/Sounds/shattered.caf | Bin .../PhoenixApp}/Sounds/strenght_unlocked.caf | Bin .../Sounds/that_bar_never_stood_a_chance.caf | Bin .../Sounds/that_was_a_demolition.caf | Bin .../PhoenixApp}/Sounds/that_was_god_mode.caf | Bin .../Sounds/that_was_monster_level.caf | Bin .../Sounds/that_was_next_tier_strenght.caf | Bin .../Sounds/that_was_pure_savagery.caf | Bin .../Sounds/the_grind_continues.caf | Bin .../PhoenixApp}/Sounds/the_grind_is_real.caf | Bin .../this_is_what_champions_are_made.caf | Bin .../PhoenixApp}/Sounds/unchained_power.caf | Bin .../PhoenixApp}/Sounds/unstoppable.caf | Bin .../PhoenixApp}/Sounds/victory.caf | Bin .../PhoenixApp}/Sounds/vulgar_mild_01.caf | Bin .../PhoenixApp}/Sounds/vulgar_mild_02.caf | Bin .../PhoenixApp}/Sounds/vulgar_mild_03.caf | Bin .../PhoenixApp}/Sounds/vulgar_mild_04.caf | Bin .../PhoenixApp}/Sounds/vulgar_mild_05.caf | Bin .../PhoenixApp}/Sounds/vulgar_mild_06.caf | Bin .../PhoenixApp}/Sounds/vulgar_mild_07.caf | Bin .../PhoenixApp}/Sounds/vulgar_mild_08.caf | Bin .../PhoenixApp}/Sounds/vulgar_mild_09.caf | Bin .../PhoenixApp}/Sounds/vulgar_mild_10.caf | Bin .../PhoenixApp}/Sounds/vulgar_mild_11.caf | Bin .../PhoenixApp}/Sounds/vulgar_mild_12.caf | Bin .../PhoenixApp}/Sounds/vulgar_strong_01.caf | Bin .../PhoenixApp}/Sounds/vulgar_strong_02.caf | Bin .../PhoenixApp}/Sounds/vulgar_strong_03.caf | Bin .../PhoenixApp}/Sounds/vulgar_strong_04.caf | Bin .../PhoenixApp}/Sounds/vulgar_strong_05.caf | Bin .../PhoenixApp}/Sounds/vulgar_strong_06.caf | Bin .../PhoenixApp}/Sounds/vulgar_strong_07.caf | Bin .../PhoenixApp}/Sounds/vulgar_strong_08.caf | Bin .../PhoenixApp}/Sounds/vulgar_strong_09.caf | Bin .../PhoenixApp}/Sounds/vulgar_strong_10.caf | Bin .../PhoenixApp}/Sounds/vulgar_strong_11.caf | Bin .../PhoenixApp}/Sounds/vulgar_strong_12.caf | Bin .../PhoenixApp}/Sounds/you_crushed_that.caf | Bin .../Sounds/you_dominated_that_set.caf | Bin .../Sounds/you_just_broke_your_limits.caf | Bin .../Sounds/you_just_destroyed_that_weight.caf | Bin .../Sounds/you_just_levelled_up.caf | Bin .../Sounds/you_went_full_throttle.caf | Bin iosApp/README.md | 41 ++--- iosApp/SETUP_ASSETS.md | 8 +- iosApp/TESTFLIGHT_NOTES.txt | 6 +- .../AppIcon.appiconset/AppIcon1024.png | Bin 494242 -> 0 bytes iosApp/convert_sounds.sh | 6 +- iosApp/generate_icons.sh | 2 +- iosApp/prepare_ios_beta.sh | 2 +- iosApp/setup_launch_assets.sh | 2 +- new_phoenix_icon.png | 144 +++++++++++++++ settings.gradle.kts | 2 +- shared/build.gradle.kts | 12 +- .../local/LegacySchemaReconciliationTest.kt | 14 +- .../data/local/SchemaManifestTest.kt | 4 +- .../data/local/SchemaParityTest.kt | 32 ++-- .../data/migration/MigrationManagerTest.kt | 52 +++--- .../ProfilePreferencesMigrationTest.kt | 6 +- .../ActiveWorkoutRuntimeCodecInvariantTest.kt | 8 +- ...lightActiveWorkoutRuntimeRepositoryTest.kt | 12 +- .../SqlDelightAssessmentRepositoryTest.kt | 6 +- .../SqlDelightCompletedSetRepositoryTest.kt | 26 +-- .../SqlDelightExerciseRepositoryTest.kt | 62 +++---- .../SqlDelightGamificationRepositoryTest.kt | 6 +- .../SqlDelightPersonalMvtRepositoryTest.kt | 8 +- .../SqlDelightPersonalRecordRepositoryTest.kt | 22 +-- ...DelightProfilePreferencesRepositoryTest.kt | 14 +- .../SqlDelightProgressionRepositoryTest.kt | 4 +- ...qlDelightSmartSuggestionsRepositoryTest.kt | 6 +- .../SqlDelightSyncRepositoryTest.kt | 74 ++++---- .../SqlDelightTrainingCycleRepositoryTest.kt | 8 +- .../SqlDelightUserProfileRepositoryTest.kt | 164 +++++++++--------- ...lDelightVelocityOneRepMaxRepositoryTest.kt | 8 +- ...ightWorkoutRepositoryRoutineScalingTest.kt | 2 +- .../SqlDelightWorkoutRepositoryTest.kt | 18 +- ...ightWorkoutRepositoryVelocityPointsTest.kt | 12 +- ...ightProfilePreferenceSyncRepositoryTest.kt | 22 +-- ...tiveWorkoutRuntimeRepositoryBindingTest.kt | 4 +- .../Issue673SetEndReasonSqlIntegrationTest.kt | 2 +- .../theme/Issue677WindowThemeContractTest.kt | 4 +- .../viewmodel/ExerciseConfigViewModelTest.kt | 14 +- .../testutil/TestDatabaseFactory.android.kt | 8 +- .../theme/MaterialYouDarkClampContractTest.kt | 4 +- .../util/BackupJsonNavigatorTest.kt | 50 +++--- ...BackupManagerRoutineExerciseDropSetTest.kt | 2 +- .../util/DataBackupManagerRoutineNameTest.kt | 104 +++++------ .../integration/HealthIntegration.android.kt | 8 +- .../data/local/DriverFactory.android.kt | 10 +- .../di/PlatformModule.android.kt | 4 +- .../BlePermissionHandler.android.kt | 4 +- .../presentation/screen/WorkoutTabPreviews.kt | 8 +- .../util/CsvExporter.android.kt | 2 +- .../util/DataBackupManager.android.kt | 18 +- .../phoenixproject/util/DeviceInfo.android.kt | 2 +- .../util/ScreenUtils.android.kt | 2 +- .../drawable/phoenix_logo.png | Bin 0 -> 714721 bytes .../drawable/vitphoe_logo.png | Bin 876947 -> 0 bytes .../composeResources/values-de/strings.xml | 2 +- .../composeResources/values-es/strings.xml | 2 +- .../composeResources/values-fr/strings.xml | 2 +- .../composeResources/values-nl/strings.xml | 2 +- .../composeResources/values/strings.xml | 2 +- .../kotlin/com/devil/phoenixproject/App.kt | 8 +- .../data/ble/BleCompatibilityMode.kt | 2 +- .../phoenixproject/data/ble/BleExceptions.kt | 2 +- .../phoenixproject/data/ble/BleExtensions.kt | 2 +- .../data/ble/BleOperationQueue.kt | 2 +- .../data/ble/DiagnosticFaultDecoder.kt | 8 +- .../phoenixproject/data/ble/DiscoMode.kt | 2 +- .../data/ble/KableBleConnectionManager.kt | 74 ++++---- .../data/ble/MetricPollingEngine.kt | 2 +- .../phoenixproject/data/ble/ProtocolParser.kt | 10 +- .../SqlDelightExternalActivityRepository.kt | 6 +- ...lDelightExternalIntegrationRepositories.kt | 22 +-- .../data/local/DatabaseFactory.kt | 4 +- .../data/local/ExerciseImporter.kt | 8 +- .../data/local/LegacyCatalogueIdMap.kt | 2 +- .../data/local/SchemaManifest.kt | 8 +- .../data/migration/MigrationManager.kt | 8 +- .../data/repository/BiomechanicsRepository.kt | 6 +- .../data/repository/BleRepository.kt | 6 +- .../repository/ConnectionLogRepository.kt | 2 +- .../data/repository/KableBleRepository.kt | 8 +- .../data/repository/PersonalMvtRepository.kt | 6 +- .../ProfilePreferencesRepository.kt | 6 +- .../repository/ProfileScopedDataMerger.kt | 6 +- .../data/repository/RepMetricRepository.kt | 6 +- .../repository/SmartSuggestionsRepository.kt | 6 +- ...qlDelightActiveWorkoutRuntimeRepository.kt | 8 +- .../SqlDelightAssessmentRepository.kt | 8 +- .../SqlDelightCompletedSetRepository.kt | 6 +- .../SqlDelightExerciseRepository.kt | 6 +- .../SqlDelightGamificationRepository.kt | 6 +- .../SqlDelightPersonalRecordRepository.kt | 6 +- .../SqlDelightProgressionRepository.kt | 6 +- .../repository/SqlDelightSyncRepository.kt | 6 +- .../SqlDelightTrainingCycleRepository.kt | 6 +- .../repository/SqlDelightWorkoutRepository.kt | 6 +- .../data/repository/UserProfileRepository.kt | 6 +- .../repository/VelocityOneRepMaxRepository.kt | 6 +- .../sync/ProfilePreferenceSyncRepository.kt | 6 +- .../com/devil/phoenixproject/di/KoinInit.kt | 2 +- .../domain/model/EccentricLoadLabels.kt | 10 +- .../phoenixproject/domain/model/Exercise.kt | 4 +- .../phoenixproject/domain/model/Models.kt | 8 +- .../phoenixproject/domain/model/Routine.kt | 2 +- .../domain/premium/RpgAttributeEngine.kt | 6 +- .../domain/usecase/RepCounterFromMachine.kt | 4 +- .../components/AnimatedRepCounter.kt | 10 +- .../components/AutoStopOverlay.kt | 4 +- .../components/BadgeCelebrationDialog.kt | 4 +- .../components/BulkWeightAdjustDialog.kt | 6 +- .../components/CircularForceGauge.kt | 2 +- .../components/ConnectingOverlay.kt | 6 +- .../components/ConnectionErrorDialog.kt | 4 +- .../components/ConnectionLostDialog.kt | 6 +- .../components/ConnectionStatusBanner.kt | 8 +- .../components/CreateExerciseDialog.kt | 4 +- .../components/DateRangePickerDialog.kt | 4 +- .../presentation/components/DayStrip.kt | 4 +- .../components/DestructiveConfirmDialog.kt | 4 +- .../components/EchoLevelPillSelector.kt | 4 +- .../components/EmptyStateComponent.kt | 4 +- .../components/EquipmentRackSelectionCard.kt | 16 +- .../components/ExerciseConfigModal.kt | 12 +- .../components/ExerciseNavigator.kt | 4 +- .../presentation/components/ExercisePicker.kt | 14 +- .../components/ExerciseRowWithConnector.kt | 4 +- .../components/ForceCurveMiniGraph.kt | 4 +- .../presentation/components/InsightCards.kt | 2 +- .../components/MiniExercisePickerDialog.kt | 6 +- .../presentation/components/ModeSelector.kt | 12 +- .../components/PRCelebrationAnimation.kt | 4 +- .../presentation/components/ProfileDialogs.kt | 46 ++--- .../components/ProfileExerciseInsights.kt | 2 +- .../components/ProfileListItem.kt | 4 +- .../components/ProfilePreferenceComponents.kt | 2 +- .../components/ProfileSafetyDialogs.kt | 2 +- .../components/ProfileSwitcherSheet.kt | 6 +- .../components/ProgressionSuggestion.kt | 4 +- .../components/RestTimePickerDialog.kt | 4 +- .../components/ResumeRoutineDialog.kt | 4 +- .../components/RoutineModifierDialog.kt | 16 +- .../components/RoutinePickerDialog.kt | 4 +- .../presentation/components/RpeSlider.kt | 4 +- .../components/RpgAttributeCard.kt | 4 +- .../components/SelectionActionBar.kt | 4 +- .../components/SliderWithButtons.kt | 6 +- .../presentation/components/SupersetHeader.kt | 4 +- .../components/SupersetPickerDialog.kt | 4 +- .../presentation/components/ThemeToggle.kt | 4 +- .../presentation/components/UpNextWidget.kt | 4 +- .../components/WeightRecommendationCard.kt | 14 +- .../presentation/components/WeightStepper.kt | 4 +- .../components/WorkoutStartGateNotice.kt | 10 +- .../components/charts/AreaChart.kt | 4 +- .../components/charts/CircleChart.kt | 4 +- .../components/charts/ComboChart.kt | 4 +- .../components/charts/GaugeChart.kt | 4 +- .../components/charts/RadarChart.kt | 4 +- .../charts/WorkoutMetricsDetailChart.kt | 4 +- .../cycle/ProgressionSettingsSheet.kt | 4 +- .../components/cycle/RestDayRow.kt | 4 +- .../cycle/UnifiedCycleCreationSheet.kt | 4 +- .../components/cycle/WorkoutDayRow.kt | 4 +- .../exercisepicker/AlphabetStrip.kt | 4 +- .../exercisepicker/ExerciseFilterShelf.kt | 4 +- .../exercisepicker/ExerciseRowContent.kt | 4 +- .../exercisepicker/GroupedExerciseList.kt | 4 +- .../manager/ActiveSessionEngine.kt | 2 +- .../manager/BleConnectionManager.kt | 2 +- .../manager/DefaultWorkoutSessionManager.kt | 2 +- .../presentation/navigation/NavGraph.kt | 6 +- .../screen/ActiveWorkoutScreen.kt | 22 +-- .../presentation/screen/AnalyticsScreen.kt | 4 +- .../screen/AssessmentWizardScreen.kt | 4 +- .../presentation/screen/AuthScreen.kt | 14 +- .../presentation/screen/BadgesScreen.kt | 4 +- .../screen/ConnectionLogsScreen.kt | 30 ++-- .../presentation/screen/CycleEditorScreen.kt | 4 +- .../screen/DailyRoutinesScreen.kt | 4 +- .../presentation/screen/DiagnosticsScreen.kt | 40 ++--- .../presentation/screen/EnhancedMainScreen.kt | 24 +-- .../screen/EquipmentRackScreen.kt | 54 +++--- .../presentation/screen/EulaScreen.kt | 2 +- .../screen/ExerciseDetailScreen.kt | 4 +- .../screen/ExerciseEditBottomSheet.kt | 26 +-- .../screen/ExternalActivitiesScreen.kt | 6 +- .../presentation/screen/HistoryTab.kt | 32 ++-- .../presentation/screen/HomeScreen.kt | 8 +- .../presentation/screen/IntegrationsScreen.kt | 8 +- .../presentation/screen/JustLiftScreen.kt | 40 ++--- .../presentation/screen/LinkAccountScreen.kt | 34 ++-- .../screen/ModeConfirmationScreen.kt | 4 +- .../screen/ModeSubSelectorDialog.kt | 4 +- .../screen/OneRepMaxInputScreen.kt | 4 +- .../presentation/screen/ProfileScreen.kt | 2 +- .../presentation/screen/RestTimerCard.kt | 84 ++++----- .../screen/RoutineCompleteScreen.kt | 4 +- .../screen/RoutineEditorScreen.kt | 36 ++-- .../screen/RoutineOverviewScreen.kt | 20 +-- .../presentation/screen/RoutinesTab.kt | 62 +++---- .../presentation/screen/SetReadyScreen.kt | 36 ++-- .../presentation/screen/SetSummaryCard.kt | 6 +- .../presentation/screen/SettingsTab.kt | 142 +++++++-------- .../screen/SingleExerciseScreen.kt | 6 +- .../presentation/screen/SmartInsightsTab.kt | 52 +++--- .../presentation/screen/SplashScreen.kt | 8 +- .../screen/TrainingCyclesScreen.kt | 38 ++-- .../presentation/screen/WorkoutHud.kt | 2 +- .../presentation/screen/WorkoutSetupDialog.kt | 4 +- .../presentation/screen/WorkoutTab.kt | 72 ++++---- .../presentation/screen/WorkoutUiState.kt | 2 +- .../viewmodel/AssessmentViewModel.kt | 2 +- .../viewmodel/DiagnosticsViewModel.kt | 2 +- .../presentation/viewmodel/ThemeViewModel.kt | 2 +- .../ui/theme/AccessibilityColors.kt | 4 +- .../ui/theme/ClampedDynamicDarkScheme.kt | 2 +- .../devil/phoenixproject/ui/theme/Theme.kt | 2 +- .../devil/phoenixproject/util/BleConstants.kt | 10 +- .../phoenixproject/util/BlePacketFactory.kt | 2 +- .../phoenixproject/util/DataBackupManager.kt | 8 +- .../phoenixproject/util/HardwareDetection.kt | 16 +- ...itruvianDatabase.sq => PhoenixDatabase.sq} | 2 +- .../phoenixproject/database/migrations/4.sqm | 2 +- .../data/ble/DiagnosticFaultDecoderTest.kt | 12 +- .../data/ble/ProtocolParserTest.kt | 26 +-- .../data/integration/HealthDataMappingTest.kt | 2 +- .../data/sync/ConflictResolutionTest.kt | 74 ++++---- .../data/sync/Issue591SyncLwwTest.kt | 14 +- .../data/sync/PortalMappingsWeightTest.kt | 2 +- .../domain/model/WorkoutStateTest.kt | 16 +- .../domain/premium/ReadinessEngineTest.kt | 2 +- .../premium/SmartSuggestionsEngineTest.kt | 2 +- .../usecase/RepCounterFromMachineTest.kt | 2 +- .../testutil/TestDatabaseFactory.kt | 4 +- .../util/BlePacketFactoryTest.kt | 4 +- .../data/local/DriverFactory.ios.kt | 8 +- .../devil/phoenixproject/di/KoinInitIos.kt | 2 +- .../components/BlePermissionHandler.ios.kt | 4 +- .../phoenixproject/ui/theme/Theme.ios.kt | 8 +- .../util/DataBackupManager.ios.kt | 8 +- .../phoenixproject/util/DeviceInfo.ios.kt | 2 +- .../testutil/TestDatabaseFactory.ios.kt | 8 +- .../kable-core-android-patched/README.md | 2 +- .../src/androidMain/BluetoothGatt.kt | 2 +- 465 files changed, 1945 insertions(+), 1800 deletions(-) rename .almanac/pages/{vitruvian-ble-protocol.md => phoenix-ble-protocol.md} (84%) rename androidApp/src/main/kotlin/com/devil/phoenixproject/{VitruvianApp.kt => PhoenixApp.kt} (96%) create mode 100644 androidApp/src/main/res/drawable-xxxhdpi/phoenix_logo_foreground.png delete mode 100644 androidApp/src/main/res/drawable-xxxhdpi/vitphoe_logo_foreground.png create mode 100644 docs/phoenix_logo.png rename docs/qa/fixtures/profile-schema42/{vitruvian_preferences.xml => phoenix_preferences.xml} (100%) delete mode 100644 docs/vitphoe_logo.png rename iosApp/{VitruvianPhoenix => PhoenixApp}/Config/Supabase.xcconfig.example (100%) rename iosApp/{VitruvianPhoenix => PhoenixApp}/Config/SupabaseBase.xcconfig (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix.xcodeproj => PhoenixApp/PhoenixApp.xcodeproj}/project.pbxproj (88%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix.xcodeproj/xcshareddata/xcschemes/VitruvianPhoenix.xcscheme => PhoenixApp/PhoenixApp.xcodeproj/xcshareddata/xcschemes/PhoenixApp.xcscheme} (83%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Assets.xcassets/AccentColor.colorset/Contents.json (100%) create mode 100644 iosApp/PhoenixApp/PhoenixApp/Assets.xcassets/AppIcon.appiconset/AppIcon1024.png rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Assets.xcassets/Contents.json (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Assets.xcassets/LaunchScreenBackground.colorset/Contents.json (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/ContentView.swift (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Info.plist (91%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix/VitruvianPhoenix.entitlements => PhoenixApp/PhoenixApp/PhoenixApp.entitlements} (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix/VitruvianPhoenixApp.swift => PhoenixApp/PhoenixApp/PhoenixApp.swift} (95%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/absolute_domination.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/absolute_unit.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/another_milestone_crushed.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/beast_mode.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/beep.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/beepboop.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/boopbeepbeep.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/chirpchirp.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/discomode.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/dominatrix_01.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/dominatrix_02.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/dominatrix_03.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/dominatrix_04.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/dominatrix_05.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/dominatrix_06.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/dominatrix_07.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/dominatrix_08.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/dominatrix_09.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/dominatrix_10.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/dominatrix_11.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/dominatrix_12.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/dominatrix_unlock.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/encouragement_01.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/encouragement_02.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/encouragement_03.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/encouragement_04.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/encouragement_05.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/encouragement_06.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/encouragement_07.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/encouragement_08.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/encouragement_09.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/encouragement_10.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/encouragement_11.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/encouragement_12.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/encouragement_13.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/encouragement_14.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/encouragement_15.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/insane_performance.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/maxed_out.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/new_peak_achieved.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/new_personal_record.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/new_personal_record_2.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/new_record_secured.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/no_ones_stopping_you_now.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/power.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/pr.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/pressure_create_greatness.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/record.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_01.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_02.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_03.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_04.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_05.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_06.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_07.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_08.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_09.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_10.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_11.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_12.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_13.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_14.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_15.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_16.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_17.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_18.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_19.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_20.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_21.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_22.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_23.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_24.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_25.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/rep_complete_strong.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/restover.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/shattered.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/strenght_unlocked.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/that_bar_never_stood_a_chance.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/that_was_a_demolition.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/that_was_god_mode.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/that_was_monster_level.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/that_was_next_tier_strenght.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/that_was_pure_savagery.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/the_grind_continues.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/the_grind_is_real.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/this_is_what_champions_are_made.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/unchained_power.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/unstoppable.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/victory.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_mild_01.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_mild_02.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_mild_03.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_mild_04.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_mild_05.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_mild_06.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_mild_07.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_mild_08.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_mild_09.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_mild_10.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_mild_11.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_mild_12.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_strong_01.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_strong_02.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_strong_03.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_strong_04.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_strong_05.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_strong_06.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_strong_07.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_strong_08.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_strong_09.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_strong_10.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_strong_11.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/vulgar_strong_12.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/you_crushed_that.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/you_dominated_that_set.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/you_just_broke_your_limits.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/you_just_destroyed_that_weight.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/you_just_levelled_up.caf (100%) rename iosApp/{VitruvianPhoenix/VitruvianPhoenix => PhoenixApp/PhoenixApp}/Sounds/you_went_full_throttle.caf (100%) delete mode 100644 iosApp/VitruvianPhoenix/VitruvianPhoenix/Assets.xcassets/AppIcon.appiconset/AppIcon1024.png create mode 100644 new_phoenix_icon.png create mode 100644 shared/src/commonMain/composeResources/drawable/phoenix_logo.png delete mode 100644 shared/src/commonMain/composeResources/drawable/vitphoe_logo.png rename shared/src/commonMain/sqldelight/com/devil/phoenixproject/database/{VitruvianDatabase.sq => PhoenixDatabase.sq} (99%) diff --git a/.agents/skills/update-phoenix-version/SKILL.md b/.agents/skills/update-phoenix-version/SKILL.md index 69df1d6b9..1a89c42be 100644 --- a/.agents/skills/update-phoenix-version/SKILL.md +++ b/.agents/skills/update-phoenix-version/SKILL.md @@ -15,13 +15,13 @@ The four app-version values to keep aligned are: - `androidApp/build.gradle.kts`: Android `versionName`. - `shared/src/commonMain/kotlin/com/devil/phoenixproject/util/Constants.kt`: `Constants.APP_VERSION`, used by Android `DeviceInfo`, Settings display, and backup metadata. -- `iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj/project.pbxproj`: Debug `MARKETING_VERSION`. -- `iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj/project.pbxproj`: Release `MARKETING_VERSION`. +- `iosApp/PhoenixApp/PhoenixApp.xcodeproj/project.pbxproj`: Debug `MARKETING_VERSION`. +- `iosApp/PhoenixApp/PhoenixApp.xcodeproj/project.pbxproj`: Release `MARKETING_VERSION`. The helper can also update build-number fields near those values: - `androidApp/build.gradle.kts`: default `versionCode = injectedVersionCode ?: ...` when `--android-code` is supplied. -- `iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj/project.pbxproj`: both `CURRENT_PROJECT_VERSION` entries when `--ios-build` is supplied. +- `iosApp/PhoenixApp/PhoenixApp.xcodeproj/project.pbxproj`: both `CURRENT_PROJECT_VERSION` entries when `--ios-build` is supplied. Do not edit `shared/src/commonMain/composeResources/*/strings.xml` for a version bump. `settings_version` is only the localized label template. Do not edit `androidApp/release/output-metadata.json`; it is generated release output. diff --git a/.agents/skills/update-phoenix-version/scripts/update_version.py b/.agents/skills/update-phoenix-version/scripts/update_version.py index e609109da..b54e90b94 100644 --- a/.agents/skills/update-phoenix-version/scripts/update_version.py +++ b/.agents/skills/update-phoenix-version/scripts/update_version.py @@ -122,7 +122,7 @@ def make_targets(args: argparse.Namespace) -> list[Target]: ), Target( label="iOS MARKETING_VERSION", - relative_path=Path("iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj/project.pbxproj"), + relative_path=Path("iosApp/PhoenixApp/PhoenixApp.xcodeproj/project.pbxproj"), pattern=re.compile(r"^(\s*MARKETING_VERSION\s*=\s*)([^;]+)(;.*)$", re.MULTILINE), expected_matches=2, replacement_value=version, @@ -147,7 +147,7 @@ def make_targets(args: argparse.Namespace) -> list[Target]: targets.append( Target( label="iOS CURRENT_PROJECT_VERSION", - relative_path=Path("iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj/project.pbxproj"), + relative_path=Path("iosApp/PhoenixApp/PhoenixApp.xcodeproj/project.pbxproj"), pattern=re.compile(r"^(\s*CURRENT_PROJECT_VERSION\s*=\s*)([0-9]+)(;.*)$", re.MULTILINE), expected_matches=2, replacement_value=args.ios_build, diff --git a/.almanac/pages/data-backup-and-repair.md b/.almanac/pages/data-backup-and-repair.md index 982345e12..bb704aaa2 100644 --- a/.almanac/pages/data-backup-and-repair.md +++ b/.almanac/pages/data-backup-and-repair.md @@ -45,7 +45,7 @@ sources: note: Defines the persisted default-versus-custom destination model and iOS bookmark storage. - id: app-startup type: file - path: androidApp/src/main/kotlin/com/devil/phoenixproject/VitruvianApp.kt + path: androidApp/src/main/kotlin/com/devil/phoenixproject/PhoenixApp.kt note: Shows that startup migration and repair runs immediately after Koin initialization on Android. - id: backup-routing-test type: file @@ -82,7 +82,7 @@ Pruning behavior is also platform-specific. Android queries Downloads entries an ## Startup repair -Startup repair is part of normal app boot. Android calls `migrationManager.checkAndRunMigrations()` during `VitruvianApp.onCreate()`, and the migration manager then refreshes profiles, strips fabricated `legacy_session_` routine session IDs, normalizes legacy workout-mode names, backfills bad routine names on old workout rows, repairs PRs from workout history, audits profile-scoped data, and checks for orphaned records [@app-startup] [@migration-manager] [@migration-tests]. +Startup repair is part of normal app boot. Android calls `migrationManager.checkAndRunMigrations()` during `PhoenixApp.onCreate()`, and the migration manager then refreshes profiles, strips fabricated `legacy_session_` routine session IDs, normalizes legacy workout-mode names, backfills bad routine names on old workout rows, repairs PRs from workout history, audits profile-scoped data, and checks for orphaned records [@app-startup] [@migration-manager] [@migration-tests]. Profile-scope repair can become interactive when old default-profile rows and current active-profile rows both exist. `ProfileScopeRepairState.NeedsChoice` carries both row counts plus the active profile identity so the app can either move legacy `default`-scoped data into the active profile or switch back to the default profile without moving rows [@migration-state] [@migration-manager]. Read [[profiles]] with this page when the symptom is "data disappeared after I changed profiles" rather than a failed restore or broken file export. diff --git a/.almanac/pages/data.md b/.almanac/pages/data.md index 661e149fa..9769f3e81 100644 --- a/.almanac/pages/data.md +++ b/.almanac/pages/data.md @@ -9,7 +9,7 @@ sources: note: Defines the SQLDelight database version and schema-manifest validation task. - id: schema-file type: file - path: shared/src/commonMain/sqldelight/com/devil/phoenixproject/database/VitruvianDatabase.sq + path: shared/src/commonMain/sqldelight/com/devil/phoenixproject/database/PhoenixDatabase.sq note: Defines the broad shared schema, including profile-scoped workout, routine, sync, and analytics tables. - id: migration-manager type: file @@ -48,7 +48,7 @@ Phoenix has one shared persistence cluster, but future tasks usually hit it thro Read this hub when the symptom is about where state lives, why rows moved, or why one feature is seeing data produced by another. The data cluster spans [[local-data-model]] for schema and repair mechanics, [[profiles]] for active-profile visibility and deletion reassignment, [[data-backup-and-repair]] for backup, restore, auto-backup, and import-time adoption rules, [[routines-and-training-cycles]] for persisted workout-programming state, [[strength-assessment-and-insights]] for stored 1RM and Smart Insights state, [[gamification]] for badges, streaks, and RPG-summary state, [[equipment-rack]] for settings-backed accessory inventory plus per-session rack snapshots, and [[csv-workout-import-export]] or [[external-provider-sync]] for external data that eventually lands in local tables [@schema-file] [@profile-repo] [@backup-manager] [@csv-importer] [@sync-manager] [@gamification-page]. -The key boundary is that Phoenix data is shared even when features are not. `VitruvianDatabase.sq` keeps workout, routine, assessment, badge, streak, sync, and external-activity entities in one schema; `MigrationManager` then runs startup repair across that shared space; and `DataBackupManager` exports and imports nearly all of it as one backup surface [@schema-file] [@migration-manager] [@backup-manager]. +The key boundary is that Phoenix data is shared even when features are not. `PhoenixDatabase.sq` keeps workout, routine, assessment, badge, streak, sync, and external-activity entities in one schema; `MigrationManager` then runs startup repair across that shared space; and `DataBackupManager` exports and imports nearly all of it as one backup surface [@schema-file] [@migration-manager] [@backup-manager]. ## Default read order diff --git a/.almanac/pages/external-provider-sync.md b/.almanac/pages/external-provider-sync.md index 436d816c4..5a18669fb 100644 --- a/.almanac/pages/external-provider-sync.md +++ b/.almanac/pages/external-provider-sync.md @@ -37,7 +37,7 @@ sources: note: Shows activity storage, provider status storage, and provider-scoped deletes. - id: db-schema type: file - path: shared/src/commonMain/sqldelight/com/devil/phoenixproject/database/VitruvianDatabase.sq + path: shared/src/commonMain/sqldelight/com/devil/phoenixproject/database/PhoenixDatabase.sq note: Defines integration status and cursor tables and the provider-scoped local schema surface. status: active verified: 2026-06-25 diff --git a/.almanac/pages/frontend.md b/.almanac/pages/frontend.md index e63776cbe..11f9ca18b 100644 --- a/.almanac/pages/frontend.md +++ b/.almanac/pages/frontend.md @@ -29,7 +29,7 @@ sources: note: Defines the routine-editor and training-cycle programming boundary that can surface through shared Compose screens without being part of the live session engine. - id: ios-content type: file - path: iosApp/VitruvianPhoenix/VitruvianPhoenix/ContentView.swift + path: iosApp/PhoenixApp/PhoenixApp/ContentView.swift note: Shows that iOS hosts the shared Compose controller rather than a parallel SwiftUI screen tree. - id: android-host type: file diff --git a/.almanac/pages/getting-started.md b/.almanac/pages/getting-started.md index 6eff16375..143e615c4 100644 --- a/.almanac/pages/getting-started.md +++ b/.almanac/pages/getting-started.md @@ -170,8 +170,8 @@ Keep [[app-architecture]] nearby when the remaining question is which manager, r - New shared-UI feature where the owning feature boundary is still unclear: [[frontend]] -> [[app-architecture]] -> [[workouts]] or [[integrations]] [@frontend-page] [@architecture-page] [@workouts-page] [@integrations-page] - Shared screen or route bug where the owning feature is still unclear: [[frontend]] -> [[app-architecture]] -> [[workouts]] or [[integrations]] - Settings-tab issue that could still be auth, integration, backup, or workout-preference state: [[settings-surface]] -> [[auth]] or [[integrations]] or [[data-backup-and-repair]] or [[workout-safety-and-feedback]] [@settings-page] -- BLE bug or machine-behavior mismatch: [[project-phoenix]] -> [[workouts]] -> [[vitruvian-ble-protocol]] -- Diagnostics fault codes or crash snapshots: [[workouts]] -> [[machine-diagnostics]] -> [[vitruvian-ble-protocol]] [@diagnostics-page] +- BLE bug or machine-behavior mismatch: [[project-phoenix]] -> [[workouts]] -> [[phoenix-ble-protocol]] +- Diagnostics fault codes or crash snapshots: [[workouts]] -> [[machine-diagnostics]] -> [[phoenix-ble-protocol]] [@diagnostics-page] - Voice stop or cue playback mismatch: [[workouts]] -> [[workout-safety-and-feedback]] -> [[platform-hosts]] [@workout-safety-page] [@hosts-page] - Routine editor or training-cycle bug before live execution starts: [[workouts]] -> [[routines-and-training-cycles]] -> [[profiles]] or [[strength-assessment-and-insights]] [@routines-page] [@profiles-page] [@assessment-page] - 1RM assessment or Smart Insights issue: [[workouts]] -> [[strength-assessment-and-insights]] -> [[local-data-model]] [@assessment-page] diff --git a/.almanac/pages/local-data-model.md b/.almanac/pages/local-data-model.md index 2d81115da..ae23ea495 100644 --- a/.almanac/pages/local-data-model.md +++ b/.almanac/pages/local-data-model.md @@ -9,7 +9,7 @@ sources: note: Defines SQLDelight schema versioning and the schema manifest validation task. - id: schema-file type: file - path: shared/src/commonMain/sqldelight/com/devil/phoenixproject/database/VitruvianDatabase.sq + path: shared/src/commonMain/sqldelight/com/devil/phoenixproject/database/PhoenixDatabase.sq note: Defines the current database schema and many migration-added columns. - id: migration-manager type: file @@ -38,7 +38,7 @@ The shared database uses SQLDelight, but numbered migrations are not the whole p ## Persistence contract -The schema itself is broad and profile-aware. `VitruvianDatabase.sq` persists workout sessions, metric samples, PRs, routines, supersets, routine groups, training cycles, completed sets, progressions, gamification state, connection logs, diagnostics snapshots, sync metadata, and external integration entities, with many tables carrying `profile_id`, `updatedAt`, `serverId`, and `deletedAt` fields [@schema-file]. Read [[profiles]] alongside this page when the bug is really about active-profile filtering, delete-time reassignment, or why the same local database can show different slices of data after a profile switch. +The schema itself is broad and profile-aware. `PhoenixDatabase.sq` persists workout sessions, metric samples, PRs, routines, supersets, routine groups, training cycles, completed sets, progressions, gamification state, connection logs, diagnostics snapshots, sync metadata, and external integration entities, with many tables carrying `profile_id`, `updatedAt`, `serverId`, and `deletedAt` fields [@schema-file]. Read [[profiles]] alongside this page when the bug is really about active-profile filtering, delete-time reassignment, or why the same local database can show different slices of data after a profile switch. ## Repair layers @@ -52,7 +52,7 @@ This makes database safety here more about idempotent repair than about trusting Backup, restore, and startup-repair behavior are first-class parts of this persistence layer, but they now have their own retrieval page. Read [[data-backup-and-repair]] when the task is about streamed export or import, auto-backup timing, profile-scope repair, or other user-visible data recovery behavior [@backup-manager] [@migration-manager]. -`DiagnosticsHistory` is currently reserved schema, not an active feature path. `VitruvianDatabase.sq` and `SchemaManifest.kt` still define the table plus recent or fault-only queries, but the live diagnostics flow in `KableBleRepository` only updates the in-memory `BleRepository.diagnostics` state and connection-log stream, and `DiagnosticsViewModel` renders directly from that live state instead of reading SQLDelight history rows [@schema-file] [@kable-repo] [@diagnostics-vm]. Read [[machine-diagnostics]] with this in mind when a future task proposes persisting diagnostic snapshots, because the schema surface already exists but the current product path is live-only. +`DiagnosticsHistory` is currently reserved schema, not an active feature path. `PhoenixDatabase.sq` and `SchemaManifest.kt` still define the table plus recent or fault-only queries, but the live diagnostics flow in `KableBleRepository` only updates the in-memory `BleRepository.diagnostics` state and connection-log stream, and `DiagnosticsViewModel` renders directly from that live state instead of reading SQLDelight history rows [@schema-file] [@kable-repo] [@diagnostics-vm]. Read [[machine-diagnostics]] with this in mind when a future task proposes persisting diagnostic snapshots, because the schema surface already exists but the current product path is live-only. ## Reading boundary diff --git a/.almanac/pages/machine-diagnostics.md b/.almanac/pages/machine-diagnostics.md index b47cbdda6..eff396ad5 100644 --- a/.almanac/pages/machine-diagnostics.md +++ b/.almanac/pages/machine-diagnostics.md @@ -41,7 +41,7 @@ sources: note: Defines the shared diagnostic packet and crash payload models. - id: schema-file type: file - path: shared/src/commonMain/sqldelight/com/devil/phoenixproject/database/VitruvianDatabase.sq + path: shared/src/commonMain/sqldelight/com/devil/phoenixproject/database/PhoenixDatabase.sq note: Defines the reserved DiagnosticsHistory table and diagnostic snapshot queries in the local schema. - id: diagnostics-tests type: file @@ -54,7 +54,7 @@ Machine diagnostics is a shared troubleshooting workflow for a connected trainer The screen is driven by live BLE state. `BleRepository` exposes `diagnostics` as a `StateFlow`, `DiagnosticsViewModel` combines that stream with connection state, and `DiagnosticsScreen` renders one of three states: disconnected with no snapshot, connected but waiting for the characteristic to answer, or a populated packet with sections for uptime, faults, temperatures, crash data, and warnings [@ble-repo] [@diagnostics-vm] [@diagnostics-screen]. -The binary contract is broader than just four fault words. `parseDiagnosticPacket()` accepts an empty payload as a valid zero snapshot, rejects non-empty payloads shorter than `18` bytes, then decodes uptime seconds, four unsigned `16-bit` fault words, six required temperatures, two optional extra temperatures, an optional `52`-byte crash block, and an optional `32-bit` warnings field [@protocol-parser] [@protocol-models]. [[vitruvian-ble-protocol]] is the neighboring page for the broader scan, rep, monitor, and command surface around this diagnostic characteristic. +The binary contract is broader than just four fault words. `parseDiagnosticPacket()` accepts an empty payload as a valid zero snapshot, rejects non-empty payloads shorter than `18` bytes, then decodes uptime seconds, four unsigned `16-bit` fault words, six required temperatures, two optional extra temperatures, an optional `52`-byte crash block, and an optional `32-bit` warnings field [@protocol-parser] [@protocol-models]. [[phoenix-ble-protocol]] is the neighboring page for the broader scan, rep, monitor, and command surface around this diagnostic characteristic. Fault decoding is intentionally category-specific. `DiagnosticFaultDecoder` always projects the packet into four display slots named `Vee`, `Other`, `Motor A`, and `Motor B`, then maps bitmasks to labels such as `TI restarted`, `Over voltage`, `Encoder`, or `Motor overtemp` instead of exposing only raw integers [@fault-decoder]. The view-model tests pin that labeling contract and verify that the export text includes both the human label and the raw hex code [@diagnostics-tests]. @@ -62,6 +62,6 @@ The export contract is deliberately narrow. `buildDiagnosticsExportText()` prepe Live publication and logging happen below the UI. `KableBleRepository.publishDiagnostics()` stamps packets with `receivedAtMillis` when needed, publishes them to the shared diagnostics flow, and emits a diagnostic log entry only when the fault-word set changes so repeated identical snapshots do not spam the log stream [@kable-repo]. -The current workflow is live-only even though the schema already reserves a history table. `VitruvianDatabase.sq` still defines `DiagnosticsHistory` plus recent and fault-only queries, but the present code path does not write packets into that table or read it back into `DiagnosticsViewModel`; the user-facing diagnostics screen is driven by the current BLE packet and the export text derived from it [@schema-file] [@kable-repo] [@diagnostics-vm]. +The current workflow is live-only even though the schema already reserves a history table. `PhoenixDatabase.sq` still defines `DiagnosticsHistory` plus recent and fault-only queries, but the present code path does not write packets into that table or read it back into `DiagnosticsViewModel`; the user-facing diagnostics screen is driven by the current BLE packet and the export text derived from it [@schema-file] [@kable-repo] [@diagnostics-vm]. -Read [[workouts]] first when the bug source is still unclear, [[vitruvian-ble-protocol]] when the question is whether the packet itself is being parsed or delivered correctly, [[local-data-model]] when the task is about turning the reserved diagnostics schema into a real persistence feature, and [[platform-hosts]] when Android and iOS disagree about the conditions under which a connected machine reaches this screen. +Read [[workouts]] first when the bug source is still unclear, [[phoenix-ble-protocol]] when the question is whether the packet itself is being parsed or delivered correctly, [[local-data-model]] when the task is about turning the reserved diagnostics schema into a real persistence feature, and [[platform-hosts]] when Android and iOS disagree about the conditions under which a connected machine reaches this screen. diff --git a/.almanac/pages/vitruvian-ble-protocol.md b/.almanac/pages/phoenix-ble-protocol.md similarity index 84% rename from .almanac/pages/vitruvian-ble-protocol.md rename to .almanac/pages/phoenix-ble-protocol.md index c655a7bca..18ffcf342 100644 --- a/.almanac/pages/vitruvian-ble-protocol.md +++ b/.almanac/pages/phoenix-ble-protocol.md @@ -1,5 +1,5 @@ --- -title: Vitruvian BLE Protocol +title: Phoenix BLE Protocol summary: BLE control is centered on a Kable-based connection manager, parser utilities that normalize multiple firmware packet formats, and shared command semantics built around per-cable loads. topics: [systems, ble, stack] sources: @@ -24,7 +24,7 @@ verified: 2026-06-25 --- `KableBleConnectionManager` owns the live `Peripheral` reference exclusively. The class comment says it was extracted from `KableBleRepository` so connection lifecycle code, notification subscriptions, readiness checks, and command sending all live in one place while repository-facing flows remain in the façade layer [@ble-manager]. [[workouts]] is the right cluster hub when the symptom might still be in routine flow, persistence, or platform behavior rather than in BLE itself. -Scan filtering is conservative and hardware-specific. The manager accepts advertisement names starting with `Vee_`, `VIT`, or `Vitruvian`, which matches the supported hardware naming patterns documented in the README and keeps the scan UI from filling with unrelated devices [@ble-manager]. +Scan filtering is conservative and hardware-specific. The manager accepts advertisement names starting with `Vee_`, `VIT`, or `Phoenix`, which matches the supported hardware naming patterns documented in the README and keeps the scan UI from filling with unrelated devices [@ble-manager]. The parser layer treats byte handling as a correctness boundary. `ProtocolParser.kt` calls out signed Kotlin bytes as a recurring hazard and masks every byte with `and 0xFF` before assembling integers, so changes to parser code need the same discipline to avoid sign-extension bugs [@protocol-parser]. @@ -38,4 +38,4 @@ Command semantics in shared code still distinguish mode families. `ProtocolConst The common BLE tests intentionally cover only what is stable without real hardware. `KableBleConnectionManagerTest` verifies opcode routing, disconnect cleanup, and empty-packet handling, while the test header explicitly says connection, scanning, and auto-reconnect behavior still need manual BLE validation [@ble-tests]. -Read [[project-phoenix]] before changing scan filters or packet compatibility rules because those branches preserve support for older Vitruvian hardware and firmware instead of optimizing for a narrower current-device contract. Read [[machine-diagnostics]] when the BLE symptom is specifically about fault decoding, diagnostic snapshots, or the troubleshooting export built on top of this parser. Read [[platform-hosts]] when Android and iOS disagree about BLE permissions, reconnects, or background workout continuity around the same shared protocol code. +Read [[project-phoenix]] before changing scan filters or packet compatibility rules because those branches preserve support for older Phoenix hardware and firmware instead of optimizing for a narrower current-device contract. Read [[machine-diagnostics]] when the BLE symptom is specifically about fault decoding, diagnostic snapshots, or the troubleshooting export built on top of this parser. Read [[platform-hosts]] when Android and iOS disagree about BLE permissions, reconnects, or background workout continuity around the same shared protocol code. diff --git a/.almanac/pages/platform-hosts.md b/.almanac/pages/platform-hosts.md index 9936855eb..f0a5ed4fb 100644 --- a/.almanac/pages/platform-hosts.md +++ b/.almanac/pages/platform-hosts.md @@ -13,7 +13,7 @@ sources: note: Defines Android secure storage, BLE, health, backup, and foreground service bindings. - id: ios-app type: file - path: iosApp/VitruvianPhoenix/VitruvianPhoenix/VitruvianPhoenixApp.swift + path: iosApp/PhoenixApp/PhoenixApp/PhoenixApp.swift note: Shows iOS boot sequence and migration timing. - id: ios-platform type: file @@ -21,7 +21,7 @@ sources: note: Defines iOS secure storage, Supabase config loading, and native service bindings. - id: ios-content type: file - path: iosApp/VitruvianPhoenix/VitruvianPhoenix/ContentView.swift + path: iosApp/PhoenixApp/PhoenixApp/ContentView.swift note: Shows that SwiftUI only hosts the shared Compose view controller. - id: android-safe-word type: file @@ -56,7 +56,7 @@ verified: 2026-06-27 --- Android and iOS are thin hosts around the shared Compose core, but they still define boot order, secure token storage, native auth and health adapters, cue and voice integrations, and workout background behavior. Future work that only reads shared code can miss real platform constraints here even when the feature logic itself lives in common Kotlin [@main-activity] [@android-platform] [@ios-app] [@ios-platform]. -Android applies the stored locale before `setContent {}` runs. `MainActivity.applyStoredLocaleBeforeComposition()` reads `vitruvian_preferences` directly and updates the platform locale so non-English users do not see an English first frame during cold start [@main-activity]. +Android applies the stored locale before `setContent {}` runs. `MainActivity.applyStoredLocaleBeforeComposition()` reads `phoenix_preferences` directly and updates the platform locale so non-English users do not see an English first frame during cold start [@main-activity]. Android gates the shared UI behind `RequireBlePermissions { AndroidAppHost() }`, sets `STREAM_MUSIC` as the volume control stream, and enables edge-to-edge layout in the native activity [@main-activity]. Workout background continuity is Android-only in this repo because the platform module binds `WorkoutServiceController` to `AndroidWorkoutServiceController` [@android-platform]. @@ -68,7 +68,7 @@ Health permission flow is another real host asymmetry. Android launches the Heal The same host boundary applies to [[workout-safety-and-feedback]]. Android workout cues route through `SoundPool` on `STREAM_MUSIC` with `MediaPlayer` fallback, and Android voice stop uses offline `SpeechRecognizer` plus transient audio focus [@android-haptics] [@android-safe-word]. iOS workout cues route through `AVAudioSession`, `AVAudioPlayer`, and UIKit haptics, while iOS voice stop depends on on-device `SFSpeechRecognizer`, separate speech and microphone permission flow, and interruption recovery after foreground or audio-session changes [@ios-haptics] [@ios-safe-word]. -iOS boot starts in Swift, not Kotlin. `VitruvianPhoenixApp` initializes Koin through `KoinInitIosKt.doInitKoin()`, runs migrations immediately afterward through `KoinInitKt.runMigrations()`, and then loads a SwiftUI `ContentView` that only wraps the shared Compose `UIViewController` [@ios-app] [@ios-content]. +iOS boot starts in Swift, not Kotlin. `PhoenixAppEntry` initializes Koin through `KoinInitIosKt.doInitKoin()`, runs migrations immediately afterward through `KoinInitKt.runMigrations()`, and then loads a SwiftUI `ContentView` that only wraps the shared Compose `UIViewController` [@ios-app] [@ios-content]. iOS secure storage uses two stores with different roles. General preferences stay in `NSUserDefaultsSettings`, while portal auth tokens are migrated into `KeychainSettings` under `com.devil.phoenixproject.auth` [@ios-platform]. Unlike Android, failed Keychain migration logs an error but does not crash the app, so re-authentication is the fallback path [@ios-platform]. diff --git a/.almanac/pages/profiles.md b/.almanac/pages/profiles.md index d2794d8a4..a30f655ab 100644 --- a/.almanac/pages/profiles.md +++ b/.almanac/pages/profiles.md @@ -9,7 +9,7 @@ sources: note: Defines the `UserProfile` model, default-profile bootstrap, active-profile state, Supabase linking, subscription fields, and delete-time reassignment behavior. - id: schema-file type: file - path: shared/src/commonMain/sqldelight/com/devil/phoenixproject/database/VitruvianDatabase.sq + path: shared/src/commonMain/sqldelight/com/devil/phoenixproject/database/PhoenixDatabase.sq note: Defines the `UserProfile` table, the `profile_id` columns that partition many tables, and the backup-sync query that exports profile rows. - id: migration-manager type: file diff --git a/.almanac/pages/project-phoenix.md b/.almanac/pages/project-phoenix.md index 269d60417..603cd1e92 100644 --- a/.almanac/pages/project-phoenix.md +++ b/.almanac/pages/project-phoenix.md @@ -1,6 +1,6 @@ --- title: Project Phoenix -summary: Project Phoenix is a Kotlin Multiplatform rescue app that restores local-first control of Vitruvian Trainer hardware after the original company's shutdown. +summary: Project Phoenix is a Kotlin Multiplatform rescue app that restores local-first control of Phoenix Trainer hardware after the original company's shutdown. topics: [product, systems] sources: - id: repo-readme @@ -22,11 +22,11 @@ sources: - id: ble-scan type: file path: shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/KableBleConnectionManager.kt - note: Defines the BLE discovery filters Phoenix uses to recognize Vitruvian devices in practice. + note: Defines the BLE discovery filters Phoenix uses to recognize Phoenix devices in practice. status: active verified: 2026-06-20 --- -Project Phoenix is a community-maintained control app for Vitruvian V-Form and Trainer+ machines after the original company closure. The repo positions the app as a way to keep the hardware usable instead of turning it into e-waste, and it ships for both Android and iOS [@repo-readme]. +Project Phoenix is a community-maintained control app for Phoenix V-Form and Trainer+ machines after the original company closure. The repo positions the app as a way to keep the hardware usable instead of turning it into e-waste, and it ships for both Android and iOS [@repo-readme]. The app is a Kotlin Multiplatform codebase with a shared `shared` module and thin `androidApp` and `iosApp` hosts. The shared module uses Compose Multiplatform, Koin, SQLDelight, Ktor, Kable, and multiplatform settings so most behavior lives once in shared code [@shared-build]. @@ -38,7 +38,7 @@ That local-first contract is why the remote pages in [[sync]] are framed as opti ## Hardware contract -Phoenix only claims support for two hardware families in current project memory: V-Form machines advertised as `Vee_*` and Trainer+ machines advertised as `VIT*` [@repo-readme]. The BLE scanner first accepts `Vee_*`, `VIT*`, and `Vitruvian*` names, then falls back to advertisements that expose the `0000fef3` service UUID, the Nordic UART service UUID, or non-empty `0000fef3` service data so devices can still be discovered when the advertisement is incomplete or nameless [@ble-scan]. +Phoenix only claims support for two hardware families in current project memory: V-Form machines advertised as `Vee_*` and Trainer+ machines advertised as `VIT*` [@repo-readme]. The BLE scanner first accepts `Vee_*`, `VIT*`, and `Phoenix*` names, then falls back to advertisements that expose the `0000fef3` service UUID, the Nordic UART service UUID, or non-empty `0000fef3` service data so devices can still be discovered when the advertisement is incomplete or nameless [@ble-scan]. The hardware contract in this repo is per-cable weight, not total machine weight. `Constants` caps the default safe UI limit at `100 kg` per cable, carries a separate `110 kg` per-cable ceiling for Trainer+, and keeps the rest of the app's stored values and calculations in per-cable units rather than total machine load [@app-constants]. @@ -55,7 +55,7 @@ The fastest rule is that most coding work should not start here. Open this page The fastest way into the code still starts from the cluster hubs unless the symptom is already narrow enough for a leaf page: - Shared app structure and screen boundaries: [[app-architecture]] -- BLE, routine flow, diagnostics, or trainer communication: [[workouts]] then [[vitruvian-ble-protocol]] if the issue is already clearly in the transport layer +- BLE, routine flow, diagnostics, or trainer communication: [[workouts]] then [[phoenix-ble-protocol]] if the issue is already clearly in the transport layer - Workout lifecycle and routine orchestration: [[workouts]] - Persistence, migrations, backups, or profile-scoped visibility: [[data]] then [[local-data-model]] if the issue is already structural - Supabase project configuration, redirect allowlists, or Edge Function surface: [[supabase]] diff --git a/.almanac/pages/routines-and-training-cycles.md b/.almanac/pages/routines-and-training-cycles.md index f51d237ed..569f966b4 100644 --- a/.almanac/pages/routines-and-training-cycles.md +++ b/.almanac/pages/routines-and-training-cycles.md @@ -9,7 +9,7 @@ sources: note: Defines active-profile-scoped routine loading, group handling, superset traversal, and routine-specific lifecycle hooks. - id: db-schema type: file - path: shared/src/commonMain/sqldelight/com/devil/phoenixproject/database/VitruvianDatabase.sq + path: shared/src/commonMain/sqldelight/com/devil/phoenixproject/database/PhoenixDatabase.sq note: Defines Routine, RoutineExercise, Superset, RoutineGroup, TrainingCycle, and related persistence columns. - id: cycle-models type: file diff --git a/.almanac/pages/supabase.md b/.almanac/pages/supabase.md index a42aa7a4d..3084b137d 100644 --- a/.almanac/pages/supabase.md +++ b/.almanac/pages/supabase.md @@ -21,7 +21,7 @@ sources: note: Shows Android build-time credential injection and the fail-fast check for missing Supabase URL or anon key. - id: android-app type: file - path: androidApp/src/main/kotlin/com/devil/phoenixproject/VitruvianApp.kt + path: androidApp/src/main/kotlin/com/devil/phoenixproject/PhoenixApp.kt note: Shows Android runtime injection of SupabaseConfig into the shared Koin graph. - id: ios-platform type: file @@ -54,7 +54,7 @@ Mobile OAuth is constrained by Supabase project configuration. `PortalAuthReposi ## Platform configuration inputs -Android and iOS inject Supabase config differently into the same shared graph. Android reads `supabase.url` and `supabase.anon.key` from `local.properties`, falls back to `SUPABASE_URL` and `SUPABASE_ANON_KEY` environment variables for CI, and refuses app builds unless values are present or `-Pskip.supabase.check=true` is set for test-only work [@android-build]. `VitruvianApp` then binds those values into Koin as `SupabaseConfig` [@android-app]. +Android and iOS inject Supabase config differently into the same shared graph. Android reads `supabase.url` and `supabase.anon.key` from `local.properties`, falls back to `SUPABASE_URL` and `SUPABASE_ANON_KEY` environment variables for CI, and refuses app builds unless values are present or `-Pskip.supabase.check=true` is set for test-only work [@android-build]. `PhoenixApp` then binds those values into Koin as `SupabaseConfig` [@android-app]. iOS loads the same values from `SUPABASE_URL` and `SUPABASE_ANON_KEY` entries in the app bundle and throws during Koin setup if either value is missing [@ios-platform]. The tracked `SupabaseBase.xcconfig` can include a local ignored `Supabase.xcconfig`, and the iOS README says GitHub Actions writes that ignored file from repository secrets during CI builds [@ios-readme]. diff --git a/.almanac/pages/theme-mode.md b/.almanac/pages/theme-mode.md index fe10bc144..8e2aedcdd 100644 --- a/.almanac/pages/theme-mode.md +++ b/.almanac/pages/theme-mode.md @@ -37,7 +37,7 @@ sources: note: Shows the legacy boolean Android wrapper is deprecated because it coerces ThemeMode.SYSTEM into light or dark. - id: ios-content type: file - path: iosApp/VitruvianPhoenix/VitruvianPhoenix/ContentView.swift + path: iosApp/PhoenixApp/PhoenixApp/ContentView.swift note: Shows SwiftUI only hosts the shared Compose controller and does not own separate theme preference state. - id: theme-plan type: file @@ -46,7 +46,7 @@ sources: status: active verified: 2026-06-22 --- -Theme selection in [[project-phoenix]] is a shared runtime setting, not a platform-host preference. `ThemeMode` is a three-state enum with `SYSTEM`, `LIGHT`, and `DARK`, and the shared `VitruvianTheme` maps `SYSTEM` to `isSystemInDarkTheme()` so the app can follow OS appearance changes without a separate Android or iOS settings model [@theme-model]. +Theme selection in [[project-phoenix]] is a shared runtime setting, not a platform-host preference. `ThemeMode` is a three-state enum with `SYSTEM`, `LIGHT`, and `DARK`, and the shared `PhoenixTheme` maps `SYSTEM` to `isSystemInDarkTheme()` so the app can follow OS appearance changes without a separate Android or iOS settings model [@theme-model]. ## Source of truth @@ -56,9 +56,9 @@ Dynamic color is a separate preference. The same view model stores `dynamic_colo ## Shared propagation path -`AppContent` is the point where theme state becomes runtime UI state. It collects `themeMode` and `dynamicColorEnabled` from `ThemeViewModel`, passes both into `VitruvianTheme`, and also passes `themeMode` plus `onThemeModeChange` into `EnhancedMainScreen` so shared settings and toolbar affordances mutate the same source of truth [@app-content]. +`AppContent` is the point where theme state becomes runtime UI state. It collects `themeMode` and `dynamicColorEnabled` from `ThemeViewModel`, passes both into `PhoenixTheme`, and also passes `themeMode` plus `onThemeModeChange` into `EnhancedMainScreen` so shared settings and toolbar affordances mutate the same source of truth [@app-content]. -The shared theme function is the load-bearing API. The older Android and iOS overloads that accept only `darkTheme: Boolean` are both marked deprecated because converting a platform signal into a boolean destroys `ThemeMode.SYSTEM` as a persisted user choice before the shared theme sees it [@android-theme-wrapper] [@ios-theme-wrapper]. Future theming work should stay on the common `VitruvianTheme(themeMode = ..., dynamicColorEnabled = ...)` path even when the change starts from a host-specific file. +The shared theme function is the load-bearing API. The older Android and iOS overloads that accept only `darkTheme: Boolean` are both marked deprecated because converting a platform signal into a boolean destroys `ThemeMode.SYSTEM` as a persisted user choice before the shared theme sees it [@android-theme-wrapper] [@ios-theme-wrapper]. Future theming work should stay on the common `PhoenixTheme(themeMode = ..., dynamicColorEnabled = ...)` path even when the change starts from a host-specific file. ## UI contract diff --git a/.almanac/pages/workout-engine.md b/.almanac/pages/workout-engine.md index 32961879a..30c22305d 100644 --- a/.almanac/pages/workout-engine.md +++ b/.almanac/pages/workout-engine.md @@ -38,4 +38,4 @@ The common characterization tests document several runtime contracts. `startWork Stopping a workout is also intentionally asymmetric. `stopWorkout(exitingWorkout = true)` returns to `Idle`, while `stopWorkout(exitingWorkout = false)` enters `SetSummary`, and a guard flag makes a second stop request a no-op while the first is still in progress [@lifecycle-tests]. -Read [[workouts]] first if the failure could still belong to the broader workout cluster instead of live session orchestration alone. Read [[routines-and-training-cycles]] next if the task is about programming workouts, [[vitruvian-ble-protocol]] if it is about trainer commands, rep counting, or packet shape changes, [[equipment-rack]] if the behavior changes with accessory load context, [[local-data-model]] if live-session behavior looks corrupted by stored routine or history state, [[gamification]] if the bug starts after workout completion rather than during a live set, or [[platform-hosts]] if Android and iOS diverge around foreground service or native lifecycle behavior. +Read [[workouts]] first if the failure could still belong to the broader workout cluster instead of live session orchestration alone. Read [[routines-and-training-cycles]] next if the task is about programming workouts, [[phoenix-ble-protocol]] if it is about trainer commands, rep counting, or packet shape changes, [[equipment-rack]] if the behavior changes with accessory load context, [[local-data-model]] if live-session behavior looks corrupted by stored routine or history state, [[gamification]] if the bug starts after workout completion rather than during a live set, or [[platform-hosts]] if Android and iOS diverge around foreground service or native lifecycle behavior. diff --git a/.almanac/pages/workouts.md b/.almanac/pages/workouts.md index 2dd3a7799..e6875bd4b 100644 --- a/.almanac/pages/workouts.md +++ b/.almanac/pages/workouts.md @@ -45,7 +45,7 @@ sources: note: Defines workout cue playback, voice-stop gating, and platform safety-feedback behavior. - id: ble-page type: file - path: .almanac/pages/vitruvian-ble-protocol.md + path: .almanac/pages/phoenix-ble-protocol.md note: Defines trainer communication, packet parsing, and command semantics. - id: diagnostics-page type: file @@ -78,15 +78,15 @@ Phoenix workout behavior is one cluster, but the code and wiki split it into nin ## Cluster map -The page links map directly onto those code boundaries: [[vitruvian-ble-protocol]] explains the BLE layer under `KableBleConnectionManager`, [[workout-engine]] explains the session state and control layer under `DefaultWorkoutSessionManager`, [[routines-and-training-cycles]] explains the editable programming layer above those runtime managers, [[machine-diagnostics]] explains the fault-snapshot and troubleshooting export path, [[workout-safety-and-feedback]] explains cue playback and voice-stop behavior around active workouts, [[strength-assessment-and-insights]] explains the local analytics layer that both consumes and informs workout data, [[equipment-rack]] explains accessory-load defaults and saved rack context, [[gamification]] explains workout-derived PR celebrations and badge state, and [[data-backup-and-repair]] explains the backup, restore, and startup-repair layer that can change workout-visible history without touching the session managers [@ble-page] [@workout-engine-page] [@routines-page] [@diagnostics-page] [@safety-page] [@assessment-page] [@rack-page] [@gamification-page] [@backup-repair-page]. +The page links map directly onto those code boundaries: [[phoenix-ble-protocol]] explains the BLE layer under `KableBleConnectionManager`, [[workout-engine]] explains the session state and control layer under `DefaultWorkoutSessionManager`, [[routines-and-training-cycles]] explains the editable programming layer above those runtime managers, [[machine-diagnostics]] explains the fault-snapshot and troubleshooting export path, [[workout-safety-and-feedback]] explains cue playback and voice-stop behavior around active workouts, [[strength-assessment-and-insights]] explains the local analytics layer that both consumes and informs workout data, [[equipment-rack]] explains accessory-load defaults and saved rack context, [[gamification]] explains workout-derived PR celebrations and badge state, and [[data-backup-and-repair]] explains the backup, restore, and startup-repair layer that can change workout-visible history without touching the session managers [@ble-page] [@workout-engine-page] [@routines-page] [@diagnostics-page] [@safety-page] [@assessment-page] [@rack-page] [@gamification-page] [@backup-repair-page]. -Read [[project-phoenix]] before this cluster when the task depends on supported hardware, per-cable load assumptions, or the repo's preservation goals after the original Vitruvian shutdown. Those product constraints explain why backward-compatible firmware handling and local-first workout behavior are treated as design requirements rather than legacy baggage. +Read [[project-phoenix]] before this cluster when the task depends on supported hardware, per-cable load assumptions, or the repo's preservation goals after the original Phoenix shutdown. Those product constraints explain why backward-compatible firmware handling and local-first workout behavior are treated as design requirements rather than legacy baggage. Read [[frontend]] before this cluster when the symptom is clearly in shared screen ownership, route placement, or Compose state projection and you still do not know which workout leaf page owns the underlying behavior. ## Default read order -Read this cluster in dependency order when the bug source is unclear. [[vitruvian-ble-protocol]] explains what the machine sends and accepts, [[workout-engine]] explains how shared runtime state reacts to that data, [[machine-diagnostics]] explains the live fault and crash snapshot branch under the same BLE connection, [[workout-safety-and-feedback]] explains cue and safe-stop behavior wrapped around that session runtime, [[routines-and-training-cycles]] explains how pre-authored plans feed the live session, [[equipment-rack]] explains how accessory context modifies or annotates that flow, [[gamification]] explains how saved workouts turn into PR or badge state, and [[strength-assessment-and-insights]] explains the local 1RM and analytics layer that feeds percentage-based programming and exercise detail history [@ble-page] [@workout-engine-page] [@diagnostics-page] [@safety-page] [@routines-page] [@rack-page] [@gamification-page] [@assessment-page]. +Read this cluster in dependency order when the bug source is unclear. [[phoenix-ble-protocol]] explains what the machine sends and accepts, [[workout-engine]] explains how shared runtime state reacts to that data, [[machine-diagnostics]] explains the live fault and crash snapshot branch under the same BLE connection, [[workout-safety-and-feedback]] explains cue and safe-stop behavior wrapped around that session runtime, [[routines-and-training-cycles]] explains how pre-authored plans feed the live session, [[equipment-rack]] explains how accessory context modifies or annotates that flow, [[gamification]] explains how saved workouts turn into PR or badge state, and [[strength-assessment-and-insights]] explains the local 1RM and analytics layer that feeds percentage-based programming and exercise detail history [@ble-page] [@workout-engine-page] [@diagnostics-page] [@safety-page] [@routines-page] [@rack-page] [@gamification-page] [@assessment-page]. `MainViewModel` is the UI entry point, not the system boundary. [[app-architecture]] explains that screens mostly talk to one shared façade, but `MainViewModel` itself composes manager-owned flows instead of implementing workout behavior directly, so debugging usually belongs in one of the lower pages in this cluster rather than in the screen tree [@app-architecture-page] [@main-viewmodel] [@workout-engine-page]. @@ -94,7 +94,7 @@ Read this cluster in dependency order when the bug source is unclear. [[vitruvia ## Choose the leaf page -Use [[vitruvian-ble-protocol]] first for scan behavior, reconnects, packet parsing, mode IDs, command formats, or trainer firmware mismatches [@ble-page]. +Use [[phoenix-ble-protocol]] first for scan behavior, reconnects, packet parsing, mode IDs, command formats, or trainer firmware mismatches [@ble-page]. Use [[workout-engine]] first for countdowns, stop-state transitions, set-ready behavior, rest timers, active session state, and command timing [@workout-engine-page]. diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index bdaa75adb..487d1a29f 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -3,7 +3,7 @@ github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username -ko_fi: vitruvianredux +ko_fi: phoenixredux tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index e5ca2d3a6..858a42c62 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -28,7 +28,7 @@ body: id: app-version attributes: label: App Version - description: What version of Vitruvian Phoenix are you using? + description: What version of Phoenix Phoenix are you using? placeholder: "e.g., 1.0.0" validations: required: true diff --git a/.github/scripts/agent-quality-gate.ps1 b/.github/scripts/agent-quality-gate.ps1 index 5dc9c949f..a506e6dd6 100644 --- a/.github/scripts/agent-quality-gate.ps1 +++ b/.github/scripts/agent-quality-gate.ps1 @@ -29,7 +29,7 @@ if (-not (Test-AndroidSdkConfigured)) { "-Pskip.supabase.check=true" ` "spotlessCheck" ` "validateSchemaManifest" ` - ":shared:verifyCommonMainVitruvianDatabaseMigration" ` + ":shared:verifyCommonMainPhoenixDatabaseMigration" ` ":shared:testAndroidHostTest" ` "--console=plain" ` "--no-daemon" diff --git a/.github/scripts/agent-quality-gate.sh b/.github/scripts/agent-quality-gate.sh index 129991d87..045a5e8b7 100644 --- a/.github/scripts/agent-quality-gate.sh +++ b/.github/scripts/agent-quality-gate.sh @@ -16,7 +16,7 @@ gradle_args=( -Pskip.supabase.check=true spotlessCheck validateSchemaManifest - :shared:verifyCommonMainVitruvianDatabaseMigration + :shared:verifyCommonMainPhoenixDatabaseMigration :shared:testAndroidHostTest --console=plain --no-daemon diff --git a/.github/scripts/validate-ios-schema.sh b/.github/scripts/validate-ios-schema.sh index 267dd3b32..9e186f14c 100644 --- a/.github/scripts/validate-ios-schema.sh +++ b/.github/scripts/validate-ios-schema.sh @@ -2,11 +2,11 @@ # # Schema Manifest Validator # ========================= -# Validates that SchemaManifest.kt table definitions match VitruvianDatabase.sq +# Validates that SchemaManifest.kt table definitions match PhoenixDatabase.sq # # Background: SchemaManifest.kt provides cross-platform schema reconciliation # (Layer 4 defense against migration gaps). The table schemas in SchemaManifest.kt -# MUST exactly match VitruvianDatabase.sq, otherwise fresh installs will crash with +# MUST exactly match PhoenixDatabase.sq, otherwise fresh installs will crash with # SQLiteException when SQLDelight queries try to access columns that don't exist. # # This script validates: @@ -23,7 +23,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Go up two levels from .github/scripts to project root PROJECT_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")" -SQ_FILE="$PROJECT_ROOT/shared/src/commonMain/sqldelight/com/devil/phoenixproject/database/VitruvianDatabase.sq" +SQ_FILE="$PROJECT_ROOT/shared/src/commonMain/sqldelight/com/devil/phoenixproject/database/PhoenixDatabase.sq" MANIFEST_FILE="$PROJECT_ROOT/shared/src/commonMain/kotlin/com/devil/phoenixproject/data/local/SchemaManifest.kt" echo "Schema Manifest Validator" @@ -205,7 +205,7 @@ if errors: print(f" ERROR: {error}") print("") print("To fix: Update shared/src/commonMain/kotlin/.../SchemaManifest.kt") - print(" to match shared/src/commonMain/sqldelight/.../VitruvianDatabase.sq") + print(" to match shared/src/commonMain/sqldelight/.../PhoenixDatabase.sq") print("") print("See archived planning notes for issue-223 iOS fresh-install SQLite crash if needed") sys.exit(1) diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index a12567677..1200d3fe3 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -65,7 +65,7 @@ jobs: ${{ runner.os }}-gradle- - name: Verify SQLDelight migrations - run: ./gradlew :shared:verifyCommonMainVitruvianDatabaseMigration --continue -Pskip.supabase.check=true + run: ./gradlew :shared:verifyCommonMainPhoenixDatabaseMigration --continue -Pskip.supabase.check=true - name: Run shared module unit tests run: ./gradlew :shared:testAndroidHostTest --continue -Pskip.supabase.check=true diff --git a/.github/workflows/ios-release-ipa.yml b/.github/workflows/ios-release-ipa.yml index d1fe4e0ca..542da914a 100644 --- a/.github/workflows/ios-release-ipa.yml +++ b/.github/workflows/ios-release-ipa.yml @@ -25,8 +25,8 @@ concurrency: env: BUNDLE_ID: com.devil.phoenixproject.projectphoenix - SCHEME: VitruvianPhoenix - PROJECT_PATH: iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj + SCHEME: PhoenixApp + PROJECT_PATH: iosApp/PhoenixApp/PhoenixApp.xcodeproj GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx8g -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g" jobs: @@ -44,7 +44,7 @@ jobs: SUPABASE_URL: ${{ secrets.SUPABASE_URL }} SUPABASE_ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY }} run: | - mkdir -p iosApp/VitruvianPhoenix/Config + mkdir -p iosApp/PhoenixApp/Config # xcconfig treats `//` as an inline comment, so URLs like `https://foo` # must be written as `https:/$()/foo` (empty xcconfig substitution) or # the value gets truncated to `https:` at parse time. Apply to both @@ -54,7 +54,7 @@ jobs: { echo "SUPABASE_URL = $url_escaped" echo "SUPABASE_ANON_KEY = $key_escaped" - } > iosApp/VitruvianPhoenix/Config/Supabase.xcconfig + } > iosApp/PhoenixApp/Config/Supabase.xcconfig - name: Verify target release env: @@ -88,10 +88,10 @@ jobs: # Update Xcode project with new build number sed -i '' "s/CURRENT_PROJECT_VERSION = [0-9][0-9]*/CURRENT_PROJECT_VERSION = $BUILD_NUM/g" \ - iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj/project.pbxproj + iosApp/PhoenixApp/PhoenixApp.xcodeproj/project.pbxproj # Show what was set - grep "CURRENT_PROJECT_VERSION" iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj/project.pbxproj | head -2 + grep "CURRENT_PROJECT_VERSION" iosApp/PhoenixApp/PhoenixApp.xcodeproj/project.pbxproj | head -2 - name: Build shared framework and resources run: | @@ -117,7 +117,7 @@ jobs: # directory to prevent auto-inclusion that flattens locale folders and # causes .cvr filename collisions. A Run Script Build Phase copies them # to the bundle preserving directory structure. - RESOURCE_DST="iosApp/VitruvianPhoenix/compose-resources" + RESOURCE_DST="iosApp/PhoenixApp/compose-resources" rm -rf "$RESOURCE_DST" mkdir -p "$RESOURCE_DST" @@ -201,7 +201,7 @@ jobs: -scheme "$SCHEME" \ -configuration Release \ -destination 'generic/platform=iOS' \ - -archivePath $RUNNER_TEMP/VitruvianPhoenix.xcarchive \ + -archivePath $RUNNER_TEMP/PhoenixApp.xcarchive \ DEVELOPMENT_TEAM="${{ secrets.TEAM_ID }}" \ CODE_SIGN_STYLE=Manual \ CODE_SIGN_IDENTITY="Apple Distribution" \ @@ -210,7 +210,7 @@ jobs: - name: Export .ipa run: | xcodebuild -exportArchive \ - -archivePath $RUNNER_TEMP/VitruvianPhoenix.xcarchive \ + -archivePath $RUNNER_TEMP/PhoenixApp.xcarchive \ -exportPath $RUNNER_TEMP/export \ -exportOptionsPlist iosApp/ExportOptions.plist diff --git a/.github/workflows/ios-testflight-internal.yml b/.github/workflows/ios-testflight-internal.yml index 490229ae6..ccb45110a 100644 --- a/.github/workflows/ios-testflight-internal.yml +++ b/.github/workflows/ios-testflight-internal.yml @@ -12,8 +12,8 @@ concurrency: env: BUNDLE_ID: com.devil.phoenixproject.projectphoenix - SCHEME: VitruvianPhoenix - PROJECT_PATH: iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj + SCHEME: PhoenixApp + PROJECT_PATH: iosApp/PhoenixApp/PhoenixApp.xcodeproj GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx8g -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g" jobs: @@ -29,7 +29,7 @@ jobs: SUPABASE_URL: ${{ secrets.SUPABASE_URL }} SUPABASE_ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY }} run: | - mkdir -p iosApp/VitruvianPhoenix/Config + mkdir -p iosApp/PhoenixApp/Config # xcconfig treats `//` as an inline comment, so URLs like `https://foo` # must be written as `https:/$()/foo` (empty xcconfig substitution) or # the value gets truncated to `https:` at parse time. Apply to both @@ -39,7 +39,7 @@ jobs: { echo "SUPABASE_URL = $url_escaped" echo "SUPABASE_ANON_KEY = $key_escaped" - } > iosApp/VitruvianPhoenix/Config/Supabase.xcconfig + } > iosApp/PhoenixApp/Config/Supabase.xcconfig - name: Set up Java 17 uses: actions/setup-java@v4 @@ -69,10 +69,10 @@ jobs: # Update Xcode project with new build number sed -i '' "s/CURRENT_PROJECT_VERSION = [0-9][0-9]*/CURRENT_PROJECT_VERSION = $BUILD_NUM/g" \ - iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj/project.pbxproj + iosApp/PhoenixApp/PhoenixApp.xcodeproj/project.pbxproj # Show what was set - grep "CURRENT_PROJECT_VERSION" iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj/project.pbxproj | head -2 + grep "CURRENT_PROJECT_VERSION" iosApp/PhoenixApp/PhoenixApp.xcodeproj/project.pbxproj | head -2 - name: Build shared framework and resources run: | @@ -95,12 +95,12 @@ jobs: # are lost during static linking. They must be in the app bundle root. # # Resources are placed OUTSIDE the Xcode fileSystemSynchronizedGroups - # directory (at iosApp/VitruvianPhoenix/compose-resources/, not inside - # VitruvianPhoenix/VitruvianPhoenix/) to prevent auto-inclusion that + # directory (at iosApp/PhoenixApp/compose-resources/, not inside + # PhoenixApp/PhoenixApp/) to prevent auto-inclusion that # flattens locale folders and causes .cvr filename collisions. # A Run Script Build Phase in the Xcode project copies them to the # bundle preserving directory structure. - RESOURCE_DST="iosApp/VitruvianPhoenix/compose-resources" + RESOURCE_DST="iosApp/PhoenixApp/compose-resources" rm -rf "$RESOURCE_DST" mkdir -p "$RESOURCE_DST" @@ -187,7 +187,7 @@ jobs: -scheme "$SCHEME" \ -configuration Release \ -destination 'generic/platform=iOS' \ - -archivePath $RUNNER_TEMP/VitruvianPhoenix.xcarchive \ + -archivePath $RUNNER_TEMP/PhoenixApp.xcarchive \ DEVELOPMENT_TEAM="${{ secrets.TEAM_ID }}" \ CODE_SIGN_STYLE=Manual \ CODE_SIGN_IDENTITY="Apple Distribution" \ @@ -196,7 +196,7 @@ jobs: - name: Export .ipa run: | xcodebuild -exportArchive \ - -archivePath $RUNNER_TEMP/VitruvianPhoenix.xcarchive \ + -archivePath $RUNNER_TEMP/PhoenixApp.xcarchive \ -exportPath $RUNNER_TEMP/export \ -exportOptionsPlist iosApp/ExportOptions.plist @@ -210,9 +210,9 @@ jobs: mkdir -p ~/.appstoreconnect/private_keys echo "$APPSTORE_API_KEY" > ~/.appstoreconnect/private_keys/AuthKey_${APPSTORE_API_KEY_ID}.p8 - IPA_PATH="$RUNNER_TEMP/export/VitruvianPhoenix.ipa" + IPA_PATH="$RUNNER_TEMP/export/PhoenixApp.ipa" BUILD_VERSION="${{ steps.build_number.outputs.build_number }}" - MARKETING_VERSION=$(grep 'MARKETING_VERSION' iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj/project.pbxproj | head -1 | sed 's/.*= //;s/;.*//') + MARKETING_VERSION=$(grep 'MARKETING_VERSION' iosApp/PhoenixApp/PhoenixApp.xcodeproj/project.pbxproj | head -1 | sed 's/.*= //;s/;.*//') echo "=== Validating IPA before upload ===" echo "IPA: $IPA_PATH ($(du -h "$IPA_PATH" | cut -f1))" diff --git a/.github/workflows/ios-testflight.yml b/.github/workflows/ios-testflight.yml index 738b2f17c..890c655f2 100644 --- a/.github/workflows/ios-testflight.yml +++ b/.github/workflows/ios-testflight.yml @@ -25,8 +25,8 @@ concurrency: env: BUNDLE_ID: com.devil.phoenixproject.projectphoenix - SCHEME: VitruvianPhoenix - PROJECT_PATH: iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj + SCHEME: PhoenixApp + PROJECT_PATH: iosApp/PhoenixApp/PhoenixApp.xcodeproj GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx8g -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g" jobs: @@ -44,7 +44,7 @@ jobs: SUPABASE_URL: ${{ secrets.SUPABASE_URL }} SUPABASE_ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY }} run: | - mkdir -p iosApp/VitruvianPhoenix/Config + mkdir -p iosApp/PhoenixApp/Config # xcconfig treats `//` as an inline comment, so URLs like `https://foo` # must be written as `https:/$()/foo` (empty xcconfig substitution) or # the value gets truncated to `https:` at parse time. Apply to both @@ -54,7 +54,7 @@ jobs: { echo "SUPABASE_URL = $url_escaped" echo "SUPABASE_ANON_KEY = $key_escaped" - } > iosApp/VitruvianPhoenix/Config/Supabase.xcconfig + } > iosApp/PhoenixApp/Config/Supabase.xcconfig - name: Set up Java 17 uses: actions/setup-java@v4 @@ -85,10 +85,10 @@ jobs: # Update Xcode project with new build number # [0-9][0-9]* requires at least one digit to avoid matching empty strings sed -i '' "s/CURRENT_PROJECT_VERSION = [0-9][0-9]*/CURRENT_PROJECT_VERSION = $BUILD_NUM/g" \ - iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj/project.pbxproj + iosApp/PhoenixApp/PhoenixApp.xcodeproj/project.pbxproj # Show what was set - grep "CURRENT_PROJECT_VERSION" iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj/project.pbxproj | head -2 + grep "CURRENT_PROJECT_VERSION" iosApp/PhoenixApp/PhoenixApp.xcodeproj/project.pbxproj | head -2 - name: Build shared framework and resources run: | @@ -111,12 +111,12 @@ jobs: # are lost during static linking. They must be in the app bundle root. # # Resources are placed OUTSIDE the Xcode fileSystemSynchronizedGroups - # directory (at iosApp/VitruvianPhoenix/compose-resources/, not inside - # VitruvianPhoenix/VitruvianPhoenix/) to prevent auto-inclusion that + # directory (at iosApp/PhoenixApp/compose-resources/, not inside + # PhoenixApp/PhoenixApp/) to prevent auto-inclusion that # flattens locale folders and causes .cvr filename collisions. # A Run Script Build Phase in the Xcode project copies them to the # bundle preserving directory structure. - RESOURCE_DST="iosApp/VitruvianPhoenix/compose-resources" + RESOURCE_DST="iosApp/PhoenixApp/compose-resources" rm -rf "$RESOURCE_DST" mkdir -p "$RESOURCE_DST" @@ -203,7 +203,7 @@ jobs: -scheme "$SCHEME" \ -configuration Release \ -destination 'generic/platform=iOS' \ - -archivePath $RUNNER_TEMP/VitruvianPhoenix.xcarchive \ + -archivePath $RUNNER_TEMP/PhoenixApp.xcarchive \ DEVELOPMENT_TEAM="${{ secrets.TEAM_ID }}" \ CODE_SIGN_STYLE=Manual \ CODE_SIGN_IDENTITY="Apple Distribution" \ @@ -212,7 +212,7 @@ jobs: - name: Export .ipa run: | xcodebuild -exportArchive \ - -archivePath $RUNNER_TEMP/VitruvianPhoenix.xcarchive \ + -archivePath $RUNNER_TEMP/PhoenixApp.xcarchive \ -exportPath $RUNNER_TEMP/export \ -exportOptionsPlist iosApp/ExportOptions.plist @@ -226,9 +226,9 @@ jobs: mkdir -p ~/.appstoreconnect/private_keys echo "$APPSTORE_API_KEY" > ~/.appstoreconnect/private_keys/AuthKey_${APPSTORE_API_KEY_ID}.p8 - IPA_PATH="$RUNNER_TEMP/export/VitruvianPhoenix.ipa" + IPA_PATH="$RUNNER_TEMP/export/PhoenixApp.ipa" BUILD_VERSION="${{ steps.build_number.outputs.build_number }}" - MARKETING_VERSION=$(grep 'MARKETING_VERSION' iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj/project.pbxproj | head -1 | sed 's/.*= //;s/;.*//') + MARKETING_VERSION=$(grep 'MARKETING_VERSION' iosApp/PhoenixApp/PhoenixApp.xcodeproj/project.pbxproj | head -1 | sed 's/.*= //;s/;.*//') echo "=== Validating IPA before upload ===" echo "IPA: $IPA_PATH ($(du -h "$IPA_PATH" | cut -f1))" diff --git a/.github/workflows/release-all.yml b/.github/workflows/release-all.yml index bde6aae16..632e5d131 100644 --- a/.github/workflows/release-all.yml +++ b/.github/workflows/release-all.yml @@ -58,7 +58,7 @@ jobs: run: | set -euo pipefail ANDROID_VERSION="$(sed -nE 's/^[[:space:]]*versionName = "([^"]+)".*/\1/p' androidApp/build.gradle.kts | head -1)" - IOS_VERSIONS="$(sed -nE 's/^[[:space:]]*MARKETING_VERSION = ([^;]+);/\1/p' iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj/project.pbxproj | sort -u)" + IOS_VERSIONS="$(sed -nE 's/^[[:space:]]*MARKETING_VERSION = ([^;]+);/\1/p' iosApp/PhoenixApp/PhoenixApp.xcodeproj/project.pbxproj | sort -u)" if ! [[ "$ANDROID_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+([-.][0-9A-Za-z.]+)?$ ]]; then echo "Invalid Android versionName: '$ANDROID_VERSION'." >&2 exit 1 diff --git a/.gitignore b/.gitignore index fa3599061..3dded7d4b 100644 --- a/.gitignore +++ b/.gitignore @@ -18,10 +18,10 @@ build/ # Local configuration local.properties *.local.properties -# fix(audit): C1 — cover Supabase.xcconfig in any location under VitruvianPhoenix +# fix(audit): C1 — cover Supabase.xcconfig in any location under PhoenixApp # so a stray sibling file doesn't leak the anon key again. -iosApp/VitruvianPhoenix/**/Supabase.xcconfig -iosApp/VitruvianPhoenix/Config/Supabase.xcconfig +iosApp/PhoenixApp/**/Supabase.xcconfig +iosApp/PhoenixApp/Config/Supabase.xcconfig # Kotlin .kotlin/ @@ -39,8 +39,8 @@ iosApp/**/*.xcworkspace/ **/*.xcuserstate **/project.xcworkspace/xcuserdata/ iosApp/**/DerivedData/ -iosApp/VitruvianPhoenix/compose-resources/ -iosApp/VitruvianPhoenix/VitruvianPhoenix/compose-resources/ +iosApp/PhoenixApp/compose-resources/ +iosApp/PhoenixApp/PhoenixApp/compose-resources/ # Desktop /out/ diff --git a/.phoenix-review/BUG-FIX-PLAN.md b/.phoenix-review/BUG-FIX-PLAN.md index 9ba4f91f3..8b41f2f0d 100644 --- a/.phoenix-review/BUG-FIX-PLAN.md +++ b/.phoenix-review/BUG-FIX-PLAN.md @@ -285,7 +285,7 @@ - F297 | impact=265 | Platform | medium / bug | file=shared/src/iosMain/kotlin/com/devil/phoenixproject/util/DeviceInfo.ios.kt | lines= | `toJson()` interpolates bundle/device strings directly into JSON. Device names and bundle values can contain quotes, backslashes, or newlines, producing invalid JSON. | fix: Use kotlinx.serialization or at least a shared JSON string escaping helper for all string values. - F169 | impact=260 | Domain | medium / error | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/domain/usecase/TemplateConverter.kt | lines=116-118 | A non-rest `CycleDayTemplate` with `routine == null` throws via `error("Training day ... has no routine")`. Template conversion is typically user/content driven, so a malformed or partially loaded template can crash the caller instead of returning a warning or partial conversion result. | fix: Treat missing training-day routines as recoverable conversion warnings. Add the day name/number to warnings, skip or create an empty placeholder day, and avoid throwing from normal template validation failures. - F078 | impact=255 | Data | medium / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/sync/PortalTokenStorage.kt | lines=52 and 69-72 | The class documentation says tokens must be stored in secure settings, but the constructor accepts any `Settings` instance and `verifyStorageIntegrity()` only verifies read/write behavior. A future DI/test/wiring mistake can pass plaintext `Settings` and still pass verification, silently storing JWTs and refresh tokens unencrypted. | fix: make the constructor accept a distinct secure-storage wrapper/type (for example an expect/actual `SecureTokenStorage` or qualified provider object), keep direct construction internal, or add platform-specific verification/marker checks so plaintext settings cannot satisfy the token-storage dependency in production. -- F082 | impact=355 | Data | high / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/KableBleConnectionManager.kt | lines=245-297, 469-479 | `startScanning()` recognizes Vitruvian devices by advertised name, service UUID, or FEF3 service data. `scanAndConnect()` only accepts devices with a non-null name beginning with `Vee_` or `VIT`. Devices that are discoverable through the repository's manual scan path can therefore never be found by the auto-connect path. | fix: Extract one shared Vitruvian advertisement predicate and use it in both `startScanning()` and `scanAndConnect()`. Preserve the nameless/service-data fallback when auto-connecting. +- F082 | impact=355 | Data | high / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/KableBleConnectionManager.kt | lines=245-297, 469-479 | `startScanning()` recognizes Phoenix devices by advertised name, service UUID, or FEF3 service data. `scanAndConnect()` only accepts devices with a non-null name beginning with `Vee_` or `VIT`. Devices that are discoverable through the repository's manual scan path can therefore never be found by the auto-connect path. | fix: Extract one shared Phoenix advertisement predicate and use it in both `startScanning()` and `scanAndConnect()`. Preserve the nameless/service-data fallback when auto-connecting. - F083 | impact=255 | Data | medium / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/KableBleConnectionManager.kt | lines=763-850 | `onDeviceReady()` reads `p.services.value` once. If it is null, the code logs a warning but still starts notifications and polling immediately. On platforms where service discovery populates slightly after `State.Connected`, this can attempt characteristic operations before discovery is complete and create intermittent connection/setup failures. | fix: Wait with a bounded timeout for `p.services` to become non-null and to contain required characteristics before starting observers/polling. If readiness fails, surface a retryable initialization error instead of continuing with partially discovered GATT state. - F087 | impact=255 | Data | medium / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/DiagnosticFaultDecoder.kt | lines=84-92 | `decodeFlaggedFault` drops unknown fault bits whenever at least one known bit is also present. For example, a fault word with a known motor bit plus an undocumented high bit will display only the known label, hiding evidence of an additional active fault. | fix: Track the union of known masks, compute `unknownBits = code and knownMask.inv()`, and append an `Unknown bits 0x....` label whenever unknown bits are non-zero. - F089 | impact=255 | Data | medium / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/DiscoMode.kt | lines=76-84 | `stop()` cancels `discoJob` and immediately launches the restore-color command without waiting for the old job to finish. If the old job is in the middle of a BLE write when cancellation occurs, a late disco color write can race with and override the restore command. | fix: Serialize disco writes through the same job or a mutex, and cancel-and-join the cycling job before sending the restore command. @@ -356,7 +356,7 @@ - F310 | impact=220 | Utilities | medium / stub | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/util/HardwareDetection.kt | lines=37-43, 52-62 | `getCapabilities(deviceName)` ignores its input and always returns `HardwareCapabilities.DEFAULT`, which enables Echo and eccentric mode and sets `maxResistanceKg = 200f` for every device. This is placeholder capability logic; it can both over-enable features on unsupported devices and under-represent Trainer+ resistance while giving callers no indication that the result is assumed rather than detected. | fix: Return an explicit unknown/assumed capability state, wire the VERSION/firmware characteristic into capability detection, and make capability consumers handle unknowns conservatively instead of treating defaults as detected hardware facts. - F312 | impact=220 | Utilities | medium / stub | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/util/HealthPermissionSettingsLauncher.kt | lines=6-13 | The common API promises a bridge for opening Phoenix's health-permissions settings, and the KDoc specifically says recovery requires sending the user to the Health Connect app-permissions screen. The API returns `Unit` and has no success/failure callback, so callers cannot tell when the platform implementation cannot open anything. This matters because the iOS actual is currently a no-op and Android settings intents can also fail if the target package/activity is unavailable, leaving the user in the same recovery state with no fallback UI. | fix: Make the contract report whether settings were actually launched, for example `openSettings(): Boolean` or `openSettings(onResult: (Boolean) -> Unit)`, and require unsupported platforms to return/report `false` so the caller can show manual instructions. - F343 | impact=175 | Data | low / bug | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/sync/GoTrueModels.kt | lines=35-38 | `GoTrueUser.displayName` reads `user_metadata["display_name"]` via `JsonElement.toString().trim('"')`. That returns JSON text, not decoded content, so names with escaped quotes, unicode escapes, or non-string values can display incorrectly (for example `Jane \"JJ\" Doe` rather than `Jane "JJ" Doe`). | fix: read `jsonPrimitive.contentOrNull` after checking the element is a primitive string, and ignore or safely stringify non-string metadata. -- F348 | impact=175 | Data | low / bug | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/DiagnosticFaultDecoder.kt | lines=50-55, 87-90 | Vitruvian fault flags `8` and `16` both use the label `Message failure`, and the final `.distinct()` collapses them. If both bits are set, the decoded label reports only one message failure and loses which bit(s) were active. | fix: Give the two flags distinct labels if the protocol differentiates them, or include the bit mask in duplicate labels so combined faults remain diagnosable. +- F348 | impact=175 | Data | low / bug | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/DiagnosticFaultDecoder.kt | lines=50-55, 87-90 | Phoenix fault flags `8` and `16` both use the label `Message failure`, and the final `.distinct()` collapses them. If both bits are set, the decoded label reports only one message failure and loses which bit(s) were active. | fix: Give the two flags distinct labels if the protocol differentiates them, or include the bit mask in duplicate labels so combined faults remain diagnosable. - F350 | impact=175 | Data | low / bug | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/MetricPollingEngine.kt | lines=264-267 | The explicit `TimeoutCancellationException` catch path increments `consecutiveTimeouts` and delays, but it never checks `MAX_CONSECUTIVE_TIMEOUTS` or invokes `onConnectionLost()`. Although the main `withTimeoutOrNull` path handles null timeouts, any timeout exception reaching this catch can avoid the disconnect threshold indefinitely. | fix: Reuse the same threshold check as the null-timeout branch after incrementing `consecutiveTimeouts`, or remove the catch if `withTimeoutOrNull` is the only expected timeout path. - F368 | impact=170 | Domain | low / bug | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/domain/premium/ReadinessEngine.kt | lines=118-122 | The ACWR sweet-spot comment says the 0.8 and 1.3 edges should score around 70, but the formula uses a single divisor of `0.3f`. At ACWR 0.8 the score is about 80, not 70, so low-end readiness is overstated relative to the documented policy. | fix: Use asymmetric scaling from the peak: divide by `0.2f` on the 0.8-1.0 side and by `0.3f` on the 1.0-1.3 side, or update the documented score zones/tests if 80 at 0.8 is intentional. - F370 | impact=170 | Domain | low / bug | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/domain/premium/SmartSuggestionsEngine.kt | lines=263-305 | `TimeOfDayAnalysis.windowVolumes` is populated with `windowAvgIntensity` rather than volume. The model name promises volume, but the engine stores average kg-per-rep intensity, creating a contract mismatch for any future consumer that reads the field as volume. | fix: Rename the model field to `windowAvgIntensity`, or populate `windowVolumes` with actual total volume and add a separate intensity field if needed. @@ -435,12 +435,12 @@ - F397 | impact=135 | Presentation | low / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/presentation/viewmodel/ThemeViewModel.kt | lines=32-45, 62-70 | Theme setters update state before writing settings and do not catch persistence failures. If settings storage throws, the UI can show the new theme/dynamic-color state even though it was not persisted for the next launch. | fix: Persist first or roll back state on failure, and expose a small error event/log path so preference-write problems are not silent. - F398 | impact=135 | Presentation | low / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/ui/theme/Material3Expressive.kt | lines=21, 29, 37 | The exported expressive motion specs are hard-coded as `spring()`, while the comments describe them as reusable for buttons, cards, toggles, and other interactions. Compose animation specs are type-specific, so these values cannot be passed directly to common non-Float animations such as `Dp`, `Offset`, `Int`, or color/shape-driven transitions. This is not currently crashing because the search found no active call sites, but it is a likely integration trap when the shared theme API starts being reused. | fix: Expose generic factory functions such as `fun expressiveSpringDefault(): SpringSpec` or provide explicitly named specs per animated type, and keep the current Float specs private or clearly named `FloatSpringDefault`. - F399 | impact=135 | Presentation | low / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/ui/theme/Theme.kt | lines=68, 74 | `secondaryContainer` and `tertiaryContainer` in the light color scheme are stored as semi-transparent colors via `.copy(alpha = ...)`. Material color scheme roles are consumed globally by components as semantic container colors; making the role itself translucent means the final displayed color depends on whatever surface happens to be behind the component. That can produce inconsistent visuals under nested cards, dialogs, gradients, or future dynamic theme changes even if the current white-background contrast is acceptable. | fix: Pre-composite these colors against the intended light surface/background and store opaque color tokens in the `ColorScheme`, reserving alpha adjustments for local component-level overlays where the backing surface is known. -- F400 | impact=135 | Presentation | low / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/ui/theme/ThemeHelpers.kt | lines=24-35 | `screenBackgroundBrush()` infers dark mode by checking `MaterialTheme.colorScheme.background.luminance() < 0.5f`. This duplicates theme-mode logic indirectly and can choose the wrong gradient if a future dynamic/custom scheme uses an unusually bright dark background, a dim light background, or a transitional/system-provided palette near the threshold. The helper already controls prominent screen backgrounds, so a misclassification would be visible across many screens. | fix: Pass the resolved `useDarkColors`/`ThemeMode` into the helper or provide a `CompositionLocal` for the resolved dark flag from `VitruvianTheme`, rather than deriving it from a single color's luminance. +- F400 | impact=135 | Presentation | low / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/ui/theme/ThemeHelpers.kt | lines=24-35 | `screenBackgroundBrush()` infers dark mode by checking `MaterialTheme.colorScheme.background.luminance() < 0.5f`. This duplicates theme-mode logic indirectly and can choose the wrong gradient if a future dynamic/custom scheme uses an unusually bright dark background, a dim light background, or a transitional/system-provided palette near the threshold. The helper already controls prominent screen backgrounds, so a misclassification would be visible across many screens. | fix: Pass the resolved `useDarkColors`/`ThemeMode` into the helper or provide a `CompositionLocal` for the resolved dark flag from `PhoenixTheme`, rather than deriving it from a single color's luminance. - F403 | impact=135 | Platform | low / stub | file=androidApp/src/main/kotlin/com/devil/phoenixproject/ui/theme/AndroidTheme.kt | lines=17-28 | This Android theme wrapper is deprecated because it collapses `ThemeMode.SYSTEM` into a concrete dark/light boolean before delegating to the shared theme. Although current app entry appears to use the shared `AppContent` path, keeping this wrapper callable leaves a known footgun for future Android UI code. | fix: Remove the deprecated wrapper once callers are migrated, or replace it with an overload that accepts and forwards `ThemeMode` directly so system-theme semantics are preserved. - F424 | impact=132 | Build & CI | low / stub | file=.github/FUNDING.yml | lines=3-15 | The file still contains the generated placeholder funding entries/comments for every platform except Ko-fi. The unused null keys are not harmful YAML, but they are template residue and make the funding configuration look incomplete. | fix: Remove unused placeholder keys and keep only configured funding providers, or fill in the intended accounts/URLs. - F430 | impact=132 | DI & presentation utilities | low / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/presentation/util/WeightDisplayFormatter.kt | lines=52-56 | `formatNumeric()` decides whether to drop decimals using exact float modulo (`display % 1f == 0f`) and then converts to `Int`. Values that are mathematically whole but represented as `54.999996f` will display as `55.0` instead of `55`, and non-finite/out-of-range values would be converted to misleading integer text rather than rejected. | fix: Use finite-value checks and epsilon-based whole-number detection before integer formatting, e.g. round to one decimal first, compare within tolerance, and avoid `toInt()` for non-finite values. - F417 | impact=130 | Utilities | low / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/util/DataBackupManager.kt | lines=2568-2576, 2635-2644 | Auto-backup filenames concatenate raw `sessionId` and `routineSessionId` into filesystem paths. IDs are expected to be generated internally, but restored or externally-sourced IDs can contain path separators or other invalid filename characters. That can make backup creation fail or write outside the intended filename shape. | fix: Sanitize IDs before using them in filenames (allow a conservative `[A-Za-z0-9._-]` set, replace everything else) while preserving the original IDs inside the JSON payload. -- F419 | impact=130 | Utilities | low / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/util/BleConstants.kt | lines=49-51 | The device-name constants are internally inconsistent and stale. `DEVICE_NAME_PREFIX` is `"Vee"`, while `DEVICE_NAME_PATTERN` is `"^Vitruvian.*$"`; the active scanner/hardware detection code also treats `"Vee_"` and `"VIT"` as Vitruvian names. Any future code that relies on `DEVICE_NAME_PATTERN` would reject the same devices that the scanner currently accepts. | fix: Replace the single regex with one canonical matcher shared by scanning and hardware detection, e.g. covering `Vee_`, `VIT`, and `Vitruvian`, or remove unused/stale constants so future filters cannot drift. +- F419 | impact=130 | Utilities | low / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/util/BleConstants.kt | lines=49-51 | The device-name constants are internally inconsistent and stale. `DEVICE_NAME_PREFIX` is `"Vee"`, while `DEVICE_NAME_PATTERN` is `"^Phoenix.*$"`; the active scanner/hardware detection code also treats `"Vee_"` and `"VIT"` as Phoenix names. Any future code that relies on `DEVICE_NAME_PATTERN` would reject the same devices that the scanner currently accepts. | fix: Replace the single regex with one canonical matcher shared by scanning and hardware detection, e.g. covering `Vee_`, `VIT`, and `Phoenix`, or remove unused/stale constants so future filters cannot drift. - F421 | impact=130 | Utilities | low / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/util/HealthPermissionRequester.kt | lines=8-13 | The common declaration still documents iOS as a no-op (`iOS currently no-ops because HealthKit is not wired up yet`), but the current iOS actual implementation injects `HealthIntegration` and calls `requestPermissions()`. This stale contract is a low-level integration hazard: callers and future reviewers can incorrectly assume iOS permission requests never run, add duplicate platform workarounds, or skip handling the real asynchronous iOS permission result. | fix: Update the common KDoc to describe the current platform contract rather than historical implementation status. If platform support can vary, document the expected callback semantics for success, denial, cancellation, and unsupported platforms. - F422 | impact=130 | Utilities | low / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/util/KmpUtils.kt | lines=159-168 | `formatRelativeTimestamp()` does not handle future timestamps. When `timestamp > now`, `diffMs` and `diffMinutes` become negative and the first branch (`diffMinutes < 1`) returns `Just now`. Clock skew, imported external activity data, scheduled records, or server-provided timestamps can therefore be mislabeled instead of shown as future or invalid. | fix: Add an explicit future-time branch before the existing past-time thresholds, such as returning `In Xm`, `In Xh`, or falling back to an absolute date for any negative difference beyond a small clock-skew tolerance. - F423 | impact=130 | Utilities | low / failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/util/Locking.kt | lines=3-7 | The common contract and KDoc imply that the `lock` argument controls the critical section and that Native may fall back to direct execution. Current platform behavior is not that simple: Android uses the supplied monitor, while iOS uses a single global lock and ignores the supplied `lock`. Callers that assume two different lock objects allow independent progress will behave differently across platforms, potentially causing unexpected serialization/jank on iOS or insufficient documentation around lock ordering. | fix: Update the common KDoc to state the exact cross-platform semantics and limitations. If per-object locking is required by callers, introduce a platform abstraction that guarantees per-lock isolation on every target; otherwise rename/document this as a global/native-compatible serialization helper. diff --git a/.phoenix-review/CONSOLIDATED-REPORT.md b/.phoenix-review/CONSOLIDATED-REPORT.md index c1f10bebd..7c8302595 100644 --- a/.phoenix-review/CONSOLIDATED-REPORT.md +++ b/.phoenix-review/CONSOLIDATED-REPORT.md @@ -99,7 +99,7 @@ - F079 | module=Data | category=failure-point | file=shared/src/iosMain/kotlin/com/devil/phoenixproject/data/auth/OAuth.ios.kt | lines=135-138 | description: `PresentationContextProvider` returns the first connected `UIWindowScene` or creates a new `UIWindow()` when none is found. In multi-scene/iPad, background, or cold-start edge cases, the first scene may not be foreground active/key, and a newly-created unattached window is not a valid presentation anchor. `ASWebAuthenticationSession` can fail to start or present behind the wrong scene. | fix: select a foreground-active `UIWindowScene` and its key window, falling back only to an existing visible window. If no presentation anchor exists, fail with a clear error instead of returning a detached `UIWindow()`. - F080 | module=Data | category=bug | file=shared/src/iosMain/kotlin/com/devil/phoenixproject/data/auth/OAuth.ios.kt | lines=50-54 and 106-113 | description: iOS `OAuthLauncher.launch()` allows overlapping launches. A second call overwrites the shared `session` and `presentationProvider` properties while the first coroutine/session may still be active. Unlike Android's `AndroidOAuthBridge.beginFlow()`, there is no cancellation or rejection of the previous flow, so rapid double taps or parallel Google/Apple sign-in requests can produce orphaned sessions or resume the wrong caller. | fix: guard `launch()` with a mutex/in-flight flag. Either reject a second launch with a clear failure or cancel the existing `ASWebAuthenticationSession` before starting a new one, matching Android's single-flight behavior. - F081 | module=Data | category=failure-point | file=Notification observer jobs are untracked and can be duplicated across reconnect/readiness cycles | lines=584-601, 850-955, 882-912, 915-950 | description: `State.Connected` launches `onDeviceReady()`, which calls `startObservingNotifications()`. That method launches REPS, VERSION, and MODE observation coroutines into the long-lived repository scope but does not retain job handles or cancel previous observers before starting new ones. Repeated `Connected` emissions or rapid reconnects can leave duplicate collectors on the same peripheral or stale collectors from prior peripherals. | fix: Store notification observer jobs in the connection manager, cancel them before starting a new observer set, and cancel them during disconnect/cleanup/shutdown. Consider guarding `onDeviceReady()` so each peripheral generation initializes only once. -- F082 | module=Data | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/KableBleConnectionManager.kt | lines=245-297, 469-479 | description: `startScanning()` recognizes Vitruvian devices by advertised name, service UUID, or FEF3 service data. `scanAndConnect()` only accepts devices with a non-null name beginning with `Vee_` or `VIT`. Devices that are discoverable through the repository's manual scan path can therefore never be found by the auto-connect path. | fix: Extract one shared Vitruvian advertisement predicate and use it in both `startScanning()` and `scanAndConnect()`. Preserve the nameless/service-data fallback when auto-connecting. +- F082 | module=Data | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/KableBleConnectionManager.kt | lines=245-297, 469-479 | description: `startScanning()` recognizes Phoenix devices by advertised name, service UUID, or FEF3 service data. `scanAndConnect()` only accepts devices with a non-null name beginning with `Vee_` or `VIT`. Devices that are discoverable through the repository's manual scan path can therefore never be found by the auto-connect path. | fix: Extract one shared Phoenix advertisement predicate and use it in both `startScanning()` and `scanAndConnect()`. Preserve the nameless/service-data fallback when auto-connecting. - F083 | module=Data | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/KableBleConnectionManager.kt | lines=763-850 | description: `onDeviceReady()` reads `p.services.value` once. If it is null, the code logs a warning but still starts notifications and polling immediately. On platforms where service discovery populates slightly after `State.Connected`, this can attempt characteristic operations before discovery is complete and create intermittent connection/setup failures. | fix: Wait with a bounded timeout for `p.services` to become non-null and to contain required characteristics before starting observers/polling. If readiness fails, surface a retryable initialization error instead of continuing with partially discovered GATT state. - F084 | module=Data | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/repository/KableBleRepository.kt | lines=216-233 | description: The repository-level `startWorkout(params)` constructs a 4-byte packet manually (`0x02, mode, weightLow, weightHigh`) and starts active polling on success. Elsewhere the codebase uses `BlePacketFactory.createProgramParams()` / `createEchoControl()` for the full 96-byte/32-byte protocol. Any caller using this interface method can start a workout with an incomplete/legacy packet that does not carry reps, warmup, progression, Echo settings, or current protocol fields. | fix: Either remove/deprecate this interface method if all real starts are routed elsewhere, or implement it by delegating to the same validated packet factory path used by active session code. - F085 | module=Data | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/presentation/manager/BleConnectionManager.kt | lines=160-187 | description: `startScanning()` launches `bleRepository.startScanning()` and ignores its `Result`; `connectToDevice()` launches `bleRepository.connect(device)` and ignores its `Result`. Failures can be logged by the lower layer but never reflected in `_connectionError`, leaving the UI without actionable feedback for scan/connect failures. | fix: Check returned `Result` values in these launched coroutines and update `_connectionError` or route to the existing failure callback path. Also catch non-cancellation exceptions around these non-init launches for Kotlin/Native safety. @@ -368,7 +368,7 @@ - F345 | module=Data | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/BleOperationQueue.kt | lines=44-75 | description: The retry loop is `for (attempt in 0 until maxRetries)`. If a caller passes `maxRetries <= 0`, no BLE write is attempted and the function returns `IllegalStateException("Unknown write error")`, hiding the real configuration problem. | fix: Validate `maxRetries >= 1` at entry and fail fast with an `IllegalArgumentException`, or coerce to at least one attempt. - F346 | module=Data | category=error | file=Polling API/documentation mismatch around heuristic polling during bodyweight/rest mode | lines=225-233 | description: The interface comment says `stopMonitorPollingOnly()` should stop "monitor and heuristic polling" while keeping diagnostic polling and heartbeat running. The implementation path in `MetricPollingEngine.stopMonitorOnly()` cancels only `monitorPollingJob` and leaves heuristic polling active. That mismatch makes it unclear whether heuristic reads are intentionally kept as connection activity or accidentally continue during modes that should not emit workout telemetry. | fix: Decide the intended behavior. If heuristic polling should stop, cancel `heuristicPollingJob` in `stopMonitorOnly()`. If it should continue, update the repository contract comment and any callers/tests that assume heuristic data stops. - F347 | module=Data | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/BleOperationQueue.kt | lines=19, 31, 81-96 | description: The file warns that Kotlin `Mutex` is not reentrant, while also exposing `withLock()` for compound operations plus separate `read()`, `write()`, and `writeSimple()` methods that acquire the same mutex. A future compound operation that calls one of these helpers inside `withLock()` will deadlock. The contract is documented but not enforced. | fix: Keep the compound locked API internal/narrow, add debug owner checks, or provide unlocked lower-level helpers explicitly intended for use inside `withLock()` so nested acquisition is not needed. -- F348 | module=Data | category=bug | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/DiagnosticFaultDecoder.kt | lines=50-55, 87-90 | description: Vitruvian fault flags `8` and `16` both use the label `Message failure`, and the final `.distinct()` collapses them. If both bits are set, the decoded label reports only one message failure and loses which bit(s) were active. | fix: Give the two flags distinct labels if the protocol differentiates them, or include the bit mask in duplicate labels so combined faults remain diagnosable. +- F348 | module=Data | category=bug | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/DiagnosticFaultDecoder.kt | lines=50-55, 87-90 | description: Phoenix fault flags `8` and `16` both use the label `Message failure`, and the final `.distinct()` collapses them. If both bits are set, the decoded label reports only one message failure and loses which bit(s) were active. | fix: Give the two flags distinct labels if the protocol differentiates them, or include the bit mask in duplicate labels so combined faults remain diagnosable. - F349 | module=Data | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/HandleStateDetector.kt | lines=371-394 | description: Baseline-relative grab/release checks only compare `position - baseline` against positive thresholds. A setup or calibration where meaningful handle movement is represented as a negative delta from baseline will not be recognized as grabbed, while release checks may be overly permissive for large negative movement. | fix: Confirm the protocol sign convention for all pulley/cable orientations; if either direction can represent extension, compare `abs(position - baseline)` for relative movement or track direction per handle. - F350 | module=Data | category=bug | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/MetricPollingEngine.kt | lines=264-267 | description: The explicit `TimeoutCancellationException` catch path increments `consecutiveTimeouts` and delays, but it never checks `MAX_CONSECUTIVE_TIMEOUTS` or invokes `onConnectionLost()`. Although the main `withTimeoutOrNull` path handles null timeouts, any timeout exception reaching this catch can avoid the disconnect threshold indefinitely. | fix: Reuse the same threshold check as the null-timeout branch after incrementing `consecutiveTimeouts`, or remove the catch if `withTimeoutOrNull` is the only expected timeout path. - F351 | module=Data | category=stub | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/MonitorDataProcessor.kt | lines=236-250 | description: `calculateRawVelocity()` is now unused after firmware velocity became authoritative. Keeping this stale private implementation increases the chance of future code accidentally reintroducing client-side velocity behavior that contradicts the current parser comments and tests. | fix: Remove the dead function or mark it as test-only/reference documentation outside the production hot path. @@ -420,7 +420,7 @@ - F397 | module=Presentation | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/presentation/viewmodel/ThemeViewModel.kt | lines=32-45, 62-70 | description: Theme setters update state before writing settings and do not catch persistence failures. If settings storage throws, the UI can show the new theme/dynamic-color state even though it was not persisted for the next launch. | fix: Persist first or roll back state on failure, and expose a small error event/log path so preference-write problems are not silent. - F398 | module=Presentation | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/ui/theme/Material3Expressive.kt | lines=21, 29, 37 | description: The exported expressive motion specs are hard-coded as `spring()`, while the comments describe them as reusable for buttons, cards, toggles, and other interactions. Compose animation specs are type-specific, so these values cannot be passed directly to common non-Float animations such as `Dp`, `Offset`, `Int`, or color/shape-driven transitions. This is not currently crashing because the search found no active call sites, but it is a likely integration trap when the shared theme API starts being reused. | fix: Expose generic factory functions such as `fun expressiveSpringDefault(): SpringSpec` or provide explicitly named specs per animated type, and keep the current Float specs private or clearly named `FloatSpringDefault`. - F399 | module=Presentation | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/ui/theme/Theme.kt | lines=68, 74 | description: `secondaryContainer` and `tertiaryContainer` in the light color scheme are stored as semi-transparent colors via `.copy(alpha = ...)`. Material color scheme roles are consumed globally by components as semantic container colors; making the role itself translucent means the final displayed color depends on whatever surface happens to be behind the component. That can produce inconsistent visuals under nested cards, dialogs, gradients, or future dynamic theme changes even if the current white-background contrast is acceptable. | fix: Pre-composite these colors against the intended light surface/background and store opaque color tokens in the `ColorScheme`, reserving alpha adjustments for local component-level overlays where the backing surface is known. -- F400 | module=Presentation | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/ui/theme/ThemeHelpers.kt | lines=24-35 | description: `screenBackgroundBrush()` infers dark mode by checking `MaterialTheme.colorScheme.background.luminance() < 0.5f`. This duplicates theme-mode logic indirectly and can choose the wrong gradient if a future dynamic/custom scheme uses an unusually bright dark background, a dim light background, or a transitional/system-provided palette near the threshold. The helper already controls prominent screen backgrounds, so a misclassification would be visible across many screens. | fix: Pass the resolved `useDarkColors`/`ThemeMode` into the helper or provide a `CompositionLocal` for the resolved dark flag from `VitruvianTheme`, rather than deriving it from a single color's luminance. +- F400 | module=Presentation | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/ui/theme/ThemeHelpers.kt | lines=24-35 | description: `screenBackgroundBrush()` infers dark mode by checking `MaterialTheme.colorScheme.background.luminance() < 0.5f`. This duplicates theme-mode logic indirectly and can choose the wrong gradient if a future dynamic/custom scheme uses an unusually bright dark background, a dim light background, or a transitional/system-provided palette near the threshold. The helper already controls prominent screen backgrounds, so a misclassification would be visible across many screens. | fix: Pass the resolved `useDarkColors`/`ThemeMode` into the helper or provide a `CompositionLocal` for the resolved dark flag from `PhoenixTheme`, rather than deriving it from a single color's luminance. - F401 | module=Platform | category=failure-point | file=androidApp/src/main/kotlin/com/devil/phoenixproject/MainActivity.kt | lines=50-55 | description: The pre-API-33 locale branch mutates `resources.configuration` directly and updates only this activity's resources. This can leave application-context resources and other context wrappers temporarily out of sync during startup, especially because Koin singletons and shared code can resolve resources outside the activity. | fix: Clone the configuration before mutation (`Configuration(resources.configuration)`) and centralize locale application so both activity and application/base contexts use the same locale source. Prefer the AndroidX/AppCompat per-app-locale path if available for API 26-32. - F402 | module=Platform | category=failure-point | file=androidApp/src/main/kotlin/com/devil/phoenixproject/auth/OAuthRedirectActivity.kt | lines=83-99 | description: `routeBackToApp()` runs after every handled intent, including missing-data cancellation and arbitrary explicit launches. This lets any caller foreground `MainActivity` through the exported redirect activity even when no OAuth flow is active. | fix: Route back only when a valid pending OAuth flow was completed or cancelled by this activity. If no flow is pending or the URI is invalid, finish silently after logging. - F403 | module=Platform | category=stub | file=androidApp/src/main/kotlin/com/devil/phoenixproject/ui/theme/AndroidTheme.kt | lines=17-28 | description: This Android theme wrapper is deprecated because it collapses `ThemeMode.SYSTEM` into a concrete dark/light boolean before delegating to the shared theme. Although current app entry appears to use the shared `AppContent` path, keeping this wrapper callable leaves a known footgun for future Android UI code. | fix: Remove the deprecated wrapper once callers are migrated, or replace it with an overload that accepts and forwards `ThemeMode` directly so system-theme semantics are preserved. @@ -439,7 +439,7 @@ - F416 | module=Platform | category=failure-point | file=shared/src/iosMain/kotlin/com/devil/phoenixproject/util/ScreenUtils.ios.kt | lines= | description: `UIApplication.sharedApplication.setIdleTimerDisabled(enabled)` is a UIKit application mutation. If called from a background coroutine/thread, it can violate UIKit main-thread expectations. | fix: Dispatch this call to the main queue or require callers to invoke it from the main thread. - F417 | module=Utilities | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/util/DataBackupManager.kt | lines=2568-2576, 2635-2644 | description: Auto-backup filenames concatenate raw `sessionId` and `routineSessionId` into filesystem paths. IDs are expected to be generated internally, but restored or externally-sourced IDs can contain path separators or other invalid filename characters. That can make backup creation fail or write outside the intended filename shape. | fix: Sanitize IDs before using them in filenames (allow a conservative `[A-Za-z0-9._-]` set, replace everything else) while preserving the original IDs inside the JSON payload. - F418 | module=Utilities | category=error | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/util/DataBackupManager.kt | lines=503-515, 807-820, 859-871, 1621-1644, 1706-1727 | description: Several import counters treat successful execution of `INSERT OR IGNORE` queries as an import even when SQLite ignored the row. `tryImport()` returns `Unit` on both inserted and ignored rows, so duplicate routine groups, earned badges, and session notes can be counted as imported rather than skipped. This produces misleading restore summaries and hides duplicate/conflict conditions from the UI. | fix: Check affected-row counts where available, query for existing IDs before insert, or use insert/upsert APIs that can distinguish inserted vs ignored rows before updating `Imported`/`Skipped` counters. -- F419 | module=Utilities | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/util/BleConstants.kt | lines=49-51 | description: The device-name constants are internally inconsistent and stale. `DEVICE_NAME_PREFIX` is `"Vee"`, while `DEVICE_NAME_PATTERN` is `"^Vitruvian.*$"`; the active scanner/hardware detection code also treats `"Vee_"` and `"VIT"` as Vitruvian names. Any future code that relies on `DEVICE_NAME_PATTERN` would reject the same devices that the scanner currently accepts. | fix: Replace the single regex with one canonical matcher shared by scanning and hardware detection, e.g. covering `Vee_`, `VIT`, and `Vitruvian`, or remove unused/stale constants so future filters cannot drift. +- F419 | module=Utilities | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/util/BleConstants.kt | lines=49-51 | description: The device-name constants are internally inconsistent and stale. `DEVICE_NAME_PREFIX` is `"Vee"`, while `DEVICE_NAME_PATTERN` is `"^Phoenix.*$"`; the active scanner/hardware detection code also treats `"Vee_"` and `"VIT"` as Phoenix names. Any future code that relies on `DEVICE_NAME_PATTERN` would reject the same devices that the scanner currently accepts. | fix: Replace the single regex with one canonical matcher shared by scanning and hardware detection, e.g. covering `Vee_`, `VIT`, and `Phoenix`, or remove unused/stale constants so future filters cannot drift. - F420 | module=Utilities | category=bug | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/util/Constants.kt | lines=69-79 | description: `UnitConverter.formatDecimal()` truncates toward zero rather than formatting to the nearest one decimal place, and it loses the sign for negative fractional values between `-1` and `0`. Verified examples following the implementation: `1.99 -> 1.9`, `0.19 -> 0.1`, `-0.5 -> 0.5`, and `22.0462 -> 22`. This can under-report converted weights and produce misleading display text. | fix: Use a real rounding/formatting path (`round(value * 10) / 10`, locale-stable formatting, or a DecimalFormat/Multiplatform equivalent) and preserve the sign for negative values. - F421 | module=Utilities | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/util/HealthPermissionRequester.kt | lines=8-13 | description: The common declaration still documents iOS as a no-op (`iOS currently no-ops because HealthKit is not wired up yet`), but the current iOS actual implementation injects `HealthIntegration` and calls `requestPermissions()`. This stale contract is a low-level integration hazard: callers and future reviewers can incorrectly assume iOS permission requests never run, add duplicate platform workarounds, or skip handling the real asynchronous iOS permission result. | fix: Update the common KDoc to describe the current platform contract rather than historical implementation status. If platform support can vary, document the expected callback semantics for success, denial, cancellation, and unsupported platforms. - F422 | module=Utilities | category=failure-point | file=shared/src/commonMain/kotlin/com/devil/phoenixproject/util/KmpUtils.kt | lines=159-168 | description: `formatRelativeTimestamp()` does not handle future timestamps. When `timestamp > now`, `diffMs` and `diffMinutes` become negative and the first branch (`diffMinutes < 1`) returns `Just now`. Clock skew, imported external activity data, scheduled records, or server-provided timestamps can therefore be mislabeled instead of shown as future or invalid. | fix: Add an explicit future-time branch before the existing past-time thresholds, such as returning `In Xm`, `In Xh`, or falling back to an absolute date for any negative difference beyond a small clock-skew tolerance. diff --git a/.phoenix-review/android-app-main.md b/.phoenix-review/android-app-main.md index ba3fe0bfc..6cc0b381c 100644 --- a/.phoenix-review/android-app-main.md +++ b/.phoenix-review/android-app-main.md @@ -2,7 +2,7 @@ Scope reviewed: - `androidApp/src/main/kotlin/com/devil/phoenixproject/MainActivity.kt` -- `androidApp/src/main/kotlin/com/devil/phoenixproject/VitruvianApp.kt` +- `androidApp/src/main/kotlin/com/devil/phoenixproject/PhoenixApp.kt` - `androidApp/src/main/kotlin/com/devil/phoenixproject/auth/OAuthRedirectActivity.kt` - `androidApp/src/main/kotlin/com/devil/phoenixproject/service/WorkoutForegroundService.kt` - `androidApp/src/main/kotlin/com/devil/phoenixproject/ui/theme/AndroidTheme.kt` @@ -39,7 +39,7 @@ Category breakdown: - Description: The pre-API-33 locale branch mutates `resources.configuration` directly and updates only this activity's resources. This can leave application-context resources and other context wrappers temporarily out of sync during startup, especially because Koin singletons and shared code can resolve resources outside the activity. - Suggested fix direction: Clone the configuration before mutation (`Configuration(resources.configuration)`) and centralize locale application so both activity and application/base contexts use the same locale source. Prefer the AndroidX/AppCompat per-app-locale path if available for API 26-32. -## `androidApp/src/main/kotlin/com/devil/phoenixproject/VitruvianApp.kt` +## `androidApp/src/main/kotlin/com/devil/phoenixproject/PhoenixApp.kt` No findings in the reviewed file. diff --git a/.phoenix-review/data---ble-part-1.md b/.phoenix-review/data---ble-part-1.md index dd1866b00..a02b7e5cb 100644 --- a/.phoenix-review/data---ble-part-1.md +++ b/.phoenix-review/data---ble-part-1.md @@ -33,8 +33,8 @@ Assigned files reviewed directly when present. Several assigned paths do not exi - Line numbers: 245-297, 469-479 - Category: failure-point - Severity: medium -- Description: `startScanning()` recognizes Vitruvian devices by advertised name, service UUID, or FEF3 service data. `scanAndConnect()` only accepts devices with a non-null name beginning with `Vee_` or `VIT`. Devices that are discoverable through the repository's manual scan path can therefore never be found by the auto-connect path. -- Suggested fix direction: Extract one shared Vitruvian advertisement predicate and use it in both `startScanning()` and `scanAndConnect()`. Preserve the nameless/service-data fallback when auto-connecting. +- Description: `startScanning()` recognizes Phoenix devices by advertised name, service UUID, or FEF3 service data. `scanAndConnect()` only accepts devices with a non-null name beginning with `Vee_` or `VIT`. Devices that are discoverable through the repository's manual scan path can therefore never be found by the auto-connect path. +- Suggested fix direction: Extract one shared Phoenix advertisement predicate and use it in both `startScanning()` and `scanAndConnect()`. Preserve the nameless/service-data fallback when auto-connecting. ### 3. Notification observer jobs are untracked and can be duplicated across reconnect/readiness cycles diff --git a/.phoenix-review/data---ble-part-2.md b/.phoenix-review/data---ble-part-2.md index a49de475d..1a8e51a13 100644 --- a/.phoenix-review/data---ble-part-2.md +++ b/.phoenix-review/data---ble-part-2.md @@ -32,7 +32,7 @@ Scope reviewed from task t_fa884bd4. Repository path on disk is `/Users/christop - Category: bug - Severity: low - Line numbers: 50-55, 87-90 -- Description: Vitruvian fault flags `8` and `16` both use the label `Message failure`, and the final `.distinct()` collapses them. If both bits are set, the decoded label reports only one message failure and loses which bit(s) were active. +- Description: Phoenix fault flags `8` and `16` both use the label `Message failure`, and the final `.distinct()` collapses them. If both bits are set, the decoded label reports only one message failure and loses which bit(s) were active. - Suggested fix direction: Give the two flags distinct labels if the protocol differentiates them, or include the bit mask in duplicate labels so combined faults remain diagnosable. ## shared/src/commonMain/kotlin/com/devil/phoenixproject/data/ble/DiscoMode.kt diff --git a/.phoenix-review/ui-theme-&-styling.md b/.phoenix-review/ui-theme-&-styling.md index 4e1a15f3e..996e4b1a0 100644 --- a/.phoenix-review/ui-theme-&-styling.md +++ b/.phoenix-review/ui-theme-&-styling.md @@ -80,7 +80,7 @@ No findings. - Severity: low - Line numbers: 24-35 - Description: `screenBackgroundBrush()` infers dark mode by checking `MaterialTheme.colorScheme.background.luminance() < 0.5f`. This duplicates theme-mode logic indirectly and can choose the wrong gradient if a future dynamic/custom scheme uses an unusually bright dark background, a dim light background, or a transitional/system-provided palette near the threshold. The helper already controls prominent screen backgrounds, so a misclassification would be visible across many screens. -- Suggested fix direction: Pass the resolved `useDarkColors`/`ThemeMode` into the helper or provide a `CompositionLocal` for the resolved dark flag from `VitruvianTheme`, rather than deriving it from a single color's luminance. +- Suggested fix direction: Pass the resolved `useDarkColors`/`ThemeMode` into the helper or provide a `CompositionLocal` for the resolved dark flag from `PhoenixTheme`, rather than deriving it from a single color's luminance. ## `shared/src/commonMain/kotlin/com/devil/phoenixproject/ui/theme/Type.kt` diff --git a/.phoenix-review/utilities-part-2.md b/.phoenix-review/utilities-part-2.md index 6bba2cfa9..e09e9c5f6 100644 --- a/.phoenix-review/utilities-part-2.md +++ b/.phoenix-review/utilities-part-2.md @@ -26,8 +26,8 @@ Findings: 11 total - Category: failure-point - Severity: low - Line numbers: 49-51 -- Description: The device-name constants are internally inconsistent and stale. `DEVICE_NAME_PREFIX` is `"Vee"`, while `DEVICE_NAME_PATTERN` is `"^Vitruvian.*$"`; the active scanner/hardware detection code also treats `"Vee_"` and `"VIT"` as Vitruvian names. Any future code that relies on `DEVICE_NAME_PATTERN` would reject the same devices that the scanner currently accepts. -- Suggested fix direction: Replace the single regex with one canonical matcher shared by scanning and hardware detection, e.g. covering `Vee_`, `VIT`, and `Vitruvian`, or remove unused/stale constants so future filters cannot drift. +- Description: The device-name constants are internally inconsistent and stale. `DEVICE_NAME_PREFIX` is `"Vee"`, while `DEVICE_NAME_PATTERN` is `"^Phoenix.*$"`; the active scanner/hardware detection code also treats `"Vee_"` and `"VIT"` as Phoenix names. Any future code that relies on `DEVICE_NAME_PATTERN` would reject the same devices that the scanner currently accepts. +- Suggested fix direction: Replace the single regex with one canonical matcher shared by scanning and hardware detection, e.g. covering `Vee_`, `VIT`, and `Phoenix`, or remove unused/stale constants so future filters cannot drift. ### `shared/src/commonMain/kotlin/com/devil/phoenixproject/util/BlePacketFactory.kt` diff --git a/.superpowers/sdd/task-3.7-report.md b/.superpowers/sdd/task-3.7-report.md index c5f693432..1b9812954 100644 --- a/.superpowers/sdd/task-3.7-report.md +++ b/.superpowers/sdd/task-3.7-report.md @@ -84,7 +84,7 @@ Verified zero `ButtonDefaults.` usages remain in the file (grep returned no matc **Strings audit:** - `disconnect_title` = "Disconnect?" already exists and is used in `WorkoutTab.kt`. **Reused** for the title (minor text change: "Disconnect Device?" → "Disconnect?"; functionally equivalent). -- `disconnect_message` = "Are you sure you want to disconnect from the Vitruvian machine?" — lacks a `%1$s` placeholder for `deviceName`, and is in use in `WorkoutTab.kt`. **Not repurposed.** +- `disconnect_message` = "Are you sure you want to disconnect from the Phoenix machine?" — lacks a `%1$s` placeholder for `deviceName`, and is in use in `WorkoutTab.kt`. **Not repurposed.** - **Minted** `disconnect_message_device` = "Are you sure you want to disconnect from %1$s?" in `values/strings.xml` only; 5 locale files fall back to English. **Keys reused:** `disconnect_title` diff --git a/ANDROID_INSTALL.md b/ANDROID_INSTALL.md index 886a640ef..ac87e495e 100644 --- a/ANDROID_INSTALL.md +++ b/ANDROID_INSTALL.md @@ -1,6 +1,6 @@ # Android Installation Guide -This guide explains how to install Vitruvian Phoenix on your Android device. +This guide explains how to install Phoenix Phoenix on your Android device. ## Prerequisites @@ -47,7 +47,7 @@ Android requires permission to install apps from outside the Play Store. 1. Open the downloaded APK file 2. Tap **Install** 3. Wait for installation to complete -4. Tap **Open** or find **Vitruvian Phoenix** in your app drawer +4. Tap **Open** or find **Phoenix Phoenix** in your app drawer --- @@ -56,7 +56,7 @@ Android requires permission to install apps from outside the Play Store. When you first launch the app, you'll be asked to grant permissions: ### Bluetooth Permissions -- **Nearby devices** - Required to scan for and connect to your Vitruvian trainer +- **Nearby devices** - Required to scan for and connect to your Phoenix trainer - Tap **Allow** when prompted ### Location Permission @@ -64,7 +64,7 @@ When you first launch the app, you'll be asked to grant permissions: - This is an Android requirement - the app does not track your location - Tap **Allow** when prompted -**Note:** If you deny permissions, the app cannot connect to your trainer. You can always grant permissions later in Settings > Apps > Vitruvian Phoenix > Permissions. +**Note:** If you deny permissions, the app cannot connect to your trainer. You can always grant permissions later in Settings > Apps > Phoenix Phoenix > Permissions. --- @@ -89,18 +89,18 @@ When a new version is released: - Ensure Bluetooth is enabled on your device - Make sure you granted Bluetooth/Nearby devices permission - On Android 11 and below, ensure Location is enabled (required for BLE scanning) -- Move closer to your Vitruvian trainer +- Move closer to your Phoenix trainer - Try turning your trainer off and on again ### App Crashes on Launch - Make sure your device is running Android 8.0 or later -- Try clearing app data: Settings > Apps > Vitruvian Phoenix > Storage > Clear data +- Try clearing app data: Settings > Apps > Phoenix Phoenix > Storage > Clear data - Report the issue on GitHub with your device model and Android version ### Bluetooth Permission Denied -1. Go to **Settings > Apps > Vitruvian Phoenix > Permissions** +1. Go to **Settings > Apps > Phoenix Phoenix > Permissions** 2. Enable **Nearby devices** (Android 12+) or **Location** (Android 11 and below) 3. Restart the app @@ -137,10 +137,10 @@ A: Yes, as long as it has Bluetooth Low Energy support and runs Android 8.0+. **Q: Why does it need location permission?** A: Android requires location permission for Bluetooth scanning on Android 11 and below. This is a platform limitation, not something we can change. The app never accesses your actual location. -**Q: What Vitruvian devices are supported?** +**Q: What Phoenix devices are supported?** A: -- Vitruvian V-Form Trainer (VIT-200) - devices starting with `Vee_` -- Vitruvian Trainer+ - devices starting with `VIT` +- Phoenix V-Form Trainer (VIT-200) - devices starting with `Vee_` +- Phoenix Trainer+ - devices starting with `VIT` --- diff --git a/CLAUDE.md b/CLAUDE.md index 7116b5bbb..2f32f55da 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -28,7 +28,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Project Overview -Kotlin Multiplatform app for controlling Vitruvian Trainer workout machines via BLE. Community rescue project to keep machines functional after company bankruptcy. +Kotlin Multiplatform app for controlling Phoenix Trainer workout machines via BLE. Community rescue project to keep machines functional after company bankruptcy. ## Build Commands @@ -81,7 +81,7 @@ Nordic UART Service UUIDs in `BleInterfaces.kt`: Device names start with `Vee_` (V-Form) or `VIT` (Trainer+). ### Database Schema -SQLDelight schema at `shared/src/commonMain/sqldelight/.../VitruvianDatabase.sq`: +SQLDelight schema at `shared/src/commonMain/sqldelight/.../PhoenixDatabase.sq`: - **WorkoutSession** - Exercise sessions with mode, weight, reps - **MetricSample** - Real-time metrics (position, velocity, load, power) - **PersonalRecord** - PR tracking with 1RM calculations @@ -108,8 +108,8 @@ Located in `shared/src/commonMain/kotlin/com/devil/phoenixproject/domain/model/` - Coroutines 1.10.2 ## Hardware Support -- **Vitruvian V-Form Trainer** (VIT-200): 200kg max, device name `Vee_*` -- **Vitruvian Trainer+**: 220kg max +- **Phoenix V-Form Trainer** (VIT-200): 200kg max, device name `Vee_*` +- **Phoenix Trainer+**: 220kg max ## Sync Architecture diff --git a/README.md b/README.md index f62ac068a..6c5a558a1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Project Phoenix — Vitruvian Trainer Control App +# Project Phoenix — Phoenix Trainer Control App [![Latest Release](https://img.shields.io/github/v/release/9thLevelSoftware/Project-Phoenix-MP)](https://github.com/9thLevelSoftware/Project-Phoenix-MP/releases/latest) [![License](https://img.shields.io/badge/license-Proprietary-red.svg)](LICENSE) @@ -6,7 +6,7 @@ [![Platform](https://img.shields.io/badge/platform-Android%20%7C%20iOS-green.svg)](https://github.com/9thLevelSoftware/Project-Phoenix-MP/releases) [![DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/9thLevelSoftware/Project-Phoenix-MP) -**Keep your Vitruvian Trainer alive.** This community-developed app restores full functionality to Vitruvian V-Form and Trainer+ machines after the company's closure. Don't let your investment become e-waste. +**Keep your Phoenix Trainer alive.** This community-developed app restores full functionality to Phoenix V-Form and Trainer+ machines after the company's closure. Don't let your investment become e-waste. --- @@ -14,7 +14,7 @@ If Project Phoenix has helped keep your machine running, please consider supporting continued development: -**[☕ Support on Ko-fi](https://ko-fi.com/vitruvianredux)** +**[☕ Support on Ko-fi](https://ko-fi.com/phoenixredux)** Your support helps cover development, testing, and platform costs and keeps this community rescue project going. @@ -95,8 +95,8 @@ Current release: **[v0.9.6](https://github.com/9thLevelSoftware/Project-Phoenix- | Machine | Device Name | Max Resistance | Status | |---------|-------------|----------------|--------| -| **Vitruvian V-Form Trainer** (VIT-200) | `Vee_*` | 200 kg (440 lbs) | ✅ Fully Supported | -| **Vitruvian Trainer+** | `VIT*` | 220 kg (485 lbs) | ✅ Fully Supported | +| **Phoenix V-Form Trainer** (VIT-200) | `Vee_*` | 200 kg (440 lbs) | ✅ Fully Supported | +| **Phoenix Trainer+** | `VIT*` | 220 kg (485 lbs) | ✅ Fully Supported | --- @@ -131,7 +131,7 @@ Recent highlights: ### iOS ```bash ./gradlew :shared:assembleXCFramework -open iosApp/VitruvianPhoenix/VitruvianPhoenix.xcodeproj +open iosApp/PhoenixApp/PhoenixApp.xcodeproj ``` --- @@ -181,7 +181,7 @@ Please open an issue before starting large changes so the approach can be coordi - **Issues**: [GitHub Issues](https://github.com/9thLevelSoftware/Project-Phoenix-MP/issues) - **Discussions**: [GitHub Discussions](https://github.com/9thLevelSoftware/Project-Phoenix-MP/discussions) - **Project Portal**: [phoenix-portal.com](https://phoenix-portal.com) -- **Support Development**: [Ko-fi](https://ko-fi.com/vitruvianredux) +- **Support Development**: [Ko-fi](https://ko-fi.com/phoenixredux) --- @@ -193,12 +193,12 @@ Proprietary License - All Rights Reserved. See [LICENSE](LICENSE) file for detai ## Acknowledgments -- Original [VitruvianProjectPhoenix](https://github.com/DasBluEyedDevil/VitruvianProjectPhoenix) Android app +- Original [ProjectPhoenix](https://github.com/9thLevelSoftware/Project-Phoenix-MP) Android app - Community protocol documentation for the machine BLE interface -- Vitruvian machine owners community for testing and feedback +- Phoenix machine owners community for testing and feedback - JetBrains for Kotlin Multiplatform - All contributors and supporters --- -*Project Phoenix is a community rescue project to keep Vitruvian Trainer machines functional. It is not affiliated with or endorsed by Vitruvian.* +*Project Phoenix is a community rescue project to keep Phoenix Trainer machines functional. It is not affiliated with or endorsed by Phoenix.* diff --git a/androidApp/src/debug/kotlin/com/devil/phoenixproject/qa/ProfileQaDebugApp.kt b/androidApp/src/debug/kotlin/com/devil/phoenixproject/qa/ProfileQaDebugApp.kt index 9825b7c13..d2712c6d5 100644 --- a/androidApp/src/debug/kotlin/com/devil/phoenixproject/qa/ProfileQaDebugApp.kt +++ b/androidApp/src/debug/kotlin/com/devil/phoenixproject/qa/ProfileQaDebugApp.kt @@ -1,6 +1,6 @@ package com.devil.phoenixproject.qa -import com.devil.phoenixproject.VitruvianApp +import com.devil.phoenixproject.PhoenixApp import com.devil.phoenixproject.data.repository.AssessmentRepository import com.devil.phoenixproject.data.repository.ExerciseRepository import com.devil.phoenixproject.data.repository.PersonalRecordRepository @@ -11,11 +11,11 @@ import com.devil.phoenixproject.data.repository.WorkoutRepository import com.devil.phoenixproject.data.sync.PortalApiClient import com.devil.phoenixproject.data.sync.PortalTokenStorage import com.devil.phoenixproject.data.sync.SupabaseConfig -import com.devil.phoenixproject.database.VitruvianDatabase +import com.devil.phoenixproject.database.PhoenixDatabase import org.koin.core.context.loadKoinModules import org.koin.dsl.module -class ProfileQaDebugApp : VitruvianApp() { +class ProfileQaDebugApp : PhoenixApp() { override fun onCreate() { super.onCreate() @@ -31,7 +31,7 @@ class ProfileQaDebugApp : VitruvianApp() { personalRecordRepository = get(), assessmentRepository = get(), velocityOneRepMaxRepository = get(), - database = get(), + database = get(), ) } single { diff --git a/androidApp/src/debug/kotlin/com/devil/phoenixproject/qa/ProfileQaSeeder.kt b/androidApp/src/debug/kotlin/com/devil/phoenixproject/qa/ProfileQaSeeder.kt index 5b522b5d0..a0231eced 100644 --- a/androidApp/src/debug/kotlin/com/devil/phoenixproject/qa/ProfileQaSeeder.kt +++ b/androidApp/src/debug/kotlin/com/devil/phoenixproject/qa/ProfileQaSeeder.kt @@ -8,7 +8,7 @@ import com.devil.phoenixproject.data.repository.UserProfile import com.devil.phoenixproject.data.repository.UserProfileRepository import com.devil.phoenixproject.data.repository.VelocityOneRepMaxRepository import com.devil.phoenixproject.data.repository.WorkoutRepository -import com.devil.phoenixproject.database.VitruvianDatabase +import com.devil.phoenixproject.database.PhoenixDatabase import com.devil.phoenixproject.domain.model.CoreProfilePreferences import com.devil.phoenixproject.domain.model.JustLiftDefaultsDocument import com.devil.phoenixproject.domain.model.LedPreferences @@ -45,9 +45,9 @@ interface ProfileQaFixtureRowCleanup { } private class DatabaseProfileQaFixtureRowCleanup( - database: VitruvianDatabase, + database: PhoenixDatabase, ) : ProfileQaFixtureRowCleanup { - private val queries = database.vitruvianDatabaseQueries + private val queries = database.phoenixDatabaseQueries override fun deletePersonalRecord(id: Long) { queries.deletePersonalRecordById(id) @@ -66,7 +66,7 @@ class ProfileQaSeeder( private val personalRecordRepository: PersonalRecordRepository, private val assessmentRepository: AssessmentRepository, private val velocityOneRepMaxRepository: VelocityOneRepMaxRepository, - database: VitruvianDatabase, + database: PhoenixDatabase, private val fixtureRowCleanup: ProfileQaFixtureRowCleanup = DatabaseProfileQaFixtureRowCleanup(database), ) { diff --git a/androidApp/src/main/AndroidManifest.xml b/androidApp/src/main/AndroidManifest.xml index 499497a83..e01aba1d4 100644 --- a/androidApp/src/main/AndroidManifest.xml +++ b/androidApp/src/main/AndroidManifest.xml @@ -83,7 +83,7 @@ + android:theme="@style/Theme.PhoenixProject"> diff --git a/androidApp/src/main/kotlin/com/devil/phoenixproject/VitruvianApp.kt b/androidApp/src/main/kotlin/com/devil/phoenixproject/PhoenixApp.kt similarity index 96% rename from androidApp/src/main/kotlin/com/devil/phoenixproject/VitruvianApp.kt rename to androidApp/src/main/kotlin/com/devil/phoenixproject/PhoenixApp.kt index 97c4da43b..caec11121 100644 --- a/androidApp/src/main/kotlin/com/devil/phoenixproject/VitruvianApp.kt +++ b/androidApp/src/main/kotlin/com/devil/phoenixproject/PhoenixApp.kt @@ -22,7 +22,7 @@ import org.koin.android.ext.koin.androidContext import org.koin.android.ext.koin.androidLogger import org.koin.dsl.module -open class VitruvianApp : +open class PhoenixApp : Application(), SingletonImageLoader.Factory { @@ -49,7 +49,7 @@ open class VitruvianApp : initKoin { androidLogger() - androidContext(this@VitruvianApp) + androidContext(this@PhoenixApp) modules( module { single { @@ -87,7 +87,7 @@ open class VitruvianApp : override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} }) - Logger.d(tag = "VitruvianApp") { "Application initialized" } + Logger.d(tag = "PhoenixApp") { "Application initialized" } } override fun newImageLoader(context: coil3.PlatformContext): ImageLoader = ImageLoader.Builder(context) diff --git a/androidApp/src/main/kotlin/com/devil/phoenixproject/service/WorkoutForegroundService.kt b/androidApp/src/main/kotlin/com/devil/phoenixproject/service/WorkoutForegroundService.kt index 61683ac02..76a51e0eb 100644 --- a/androidApp/src/main/kotlin/com/devil/phoenixproject/service/WorkoutForegroundService.kt +++ b/androidApp/src/main/kotlin/com/devil/phoenixproject/service/WorkoutForegroundService.kt @@ -23,7 +23,7 @@ import com.devil.phoenixproject.presentation.manager.WorkoutServiceProtocol class WorkoutForegroundService : Service() { companion object { - const val CHANNEL_ID = "vitruvian_workout_channel" + const val CHANNEL_ID = "phoenix_workout_channel" const val NOTIFICATION_ID = 1 private val log = Logger.withTag("WorkoutForegroundService") diff --git a/androidApp/src/main/kotlin/com/devil/phoenixproject/ui/theme/AndroidTheme.kt b/androidApp/src/main/kotlin/com/devil/phoenixproject/ui/theme/AndroidTheme.kt index 3d7267a50..ccb803735 100644 --- a/androidApp/src/main/kotlin/com/devil/phoenixproject/ui/theme/AndroidTheme.kt +++ b/androidApp/src/main/kotlin/com/devil/phoenixproject/ui/theme/AndroidTheme.kt @@ -7,7 +7,7 @@ import androidx.compose.runtime.SideEffect import androidx.compose.ui.platform.LocalView import androidx.core.view.WindowCompat import com.devil.phoenixproject.ui.theme.ThemeMode as SharedThemeMode -import com.devil.phoenixproject.ui.theme.VitruvianTheme as SharedVitruvianTheme +import com.devil.phoenixproject.ui.theme.PhoenixTheme as SharedPhoenixTheme /** * Android-specific theme wrapper. @@ -15,17 +15,17 @@ import com.devil.phoenixproject.ui.theme.VitruvianTheme as SharedVitruvianTheme * Note: enableEdgeToEdge() in MainActivity handles status bar coloring. */ @Deprecated( - message = "Use the shared VitruvianTheme(themeMode = ..., dynamicColorEnabled = ...) overload so ThemeMode.SYSTEM is preserved.", + message = "Use the shared PhoenixTheme(themeMode = ..., dynamicColorEnabled = ...) overload so ThemeMode.SYSTEM is preserved.", ) @Composable -fun VitruvianTheme( +fun PhoenixTheme( darkTheme: Boolean = isSystemInDarkTheme(), dynamicColor: Boolean = false, content: @Composable () -> Unit, ) { val themeMode = if (darkTheme) SharedThemeMode.DARK else SharedThemeMode.LIGHT - SharedVitruvianTheme(themeMode = themeMode, dynamicColorEnabled = dynamicColor) { + SharedPhoenixTheme(themeMode = themeMode, dynamicColorEnabled = dynamicColor) { val view = LocalView.current if (!view.isInEditMode) { diff --git a/androidApp/src/main/res/drawable-xxxhdpi/phoenix_logo_foreground.png b/androidApp/src/main/res/drawable-xxxhdpi/phoenix_logo_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..d20f024ef080b8f0d20de3bdd6c5259f9a07729d GIT binary patch literal 151356 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 yG|Z+(X`L#zqeo1q)VhbldOt9oNTUdL%0^E3X^ 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⋘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�k2rz7`94>zy`}W(8bhNQgqR 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

YbxkN;qM;jeMnd@;)I4c9< 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 U`Gc-4>~Q2DaA*@0Ti@x?zwA)c-~a#s literal 0 HcmV?d00001 diff --git a/androidApp/src/main/res/drawable-xxxhdpi/vitphoe_logo_foreground.png b/androidApp/src/main/res/drawable-xxxhdpi/vitphoe_logo_foreground.png deleted file mode 100644 index eb7c76526aecd2c8f53e104141c0f7297e56a97a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 876947 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 z z^TL8N$q8~=3y1`aHsxO8_#0c@*nug1qP72N6k z+$W)C%(!%F<^38wXhsZ>OBcOt{H&U#9%+3l1n=d*-oqiARMk^gsYzGMXhf1{i=Xqr zpATF@mM$CknNvuhDFP0jgw9_AL?O76_*JuMkqW3qJtvK;&}t{37Q}fZXa^9oN*<&EL@Y=EL6LwSg%-3jBU0?Ov}nE6 z+GLE)-`Io`TknJ>k0I>bgo!PaXX3QAqodj;R<52uNWF*@$(RbD%%U(VEJ;-s3_7e? z9t@E~3t@`ito=dR)>1Yvu#!l?pD-VA5qDO#%6)e zd}@zt6Dau%L?Vz0gdk9f0S@Y3R|zn-YEu0g^G5>w6P#0#E8Ca|H3pj$#PMtAg(wbJ3njhgZ*wia-6n zOK-Yh-C*}$eEi#8WB0}nVW4j(_I`01Efz|vo1-2Cg4sy_;3Akepx%MEHd8!Xtv5h_g;`@Uvz`+v`Pjz8`}1Jq~Mqm?^O*E1>CIeVj(dHWC3D`s|t$kGBCfJR^v$P+;3G2m}}L4 zyeNPcS9CL?yp!1x;s8jg#W8>iq)<}yw^JTCGl01=uz92`yH~c+8~zBXpIg(Sm4R`Y#{qlS1(*J=h}I>i89PoB1#;T75Ne(ArkW-R5jCDaT}ZW& z*6J4@B86BF90K)?D>x0Ifbk2IG$v6>09l2}6WqQs%mob2N6>1m!Sa&^7)e0mYc&DQ zR-`tyKX}`FFSzEm?;cpWb?@}f)+V=A&xu-lbA;iC7Dsch{q6Vu>MO2&-!*IJmbwu9 z#i+#>4l52;3=lB~s!#}&z{&&-AP{iIR?UJ{NEIygxw8!9i7)AdeR&^8(?N*Oer1O| z_NiNWcHhw>)Y*23ySjI%kw=ikTWu^;04In7LQ=~EwFrumVPdCJbYk0?ITVr(INQdA zP6g+fIg~i=L~KhsZ!OTbkoCyZz@8s&LV4tiDCNI{Q#((c$=BpmETtvwa?RoaZimEa z%C&+u5vTywYRq%HoSe6+u;QCP#M~Az*Q!?GzgOCdjY)hMJ1}qkNn^`LWyd{l(&PIs z){9=%PgmYh#IC1B5A6_i6j`GXWUZto?933yKpGU04jH{6ocFF(HV|lP$5E?5On_jp z2$@lA``**|qwPc3_P(p|j@K^1#a)8Wov_$4K{(+QH6{pBzbMK4eyQQji_Ft1BvvIT zF_%ST%Y?>8Evuni5n!(v^>(CWmClJ_Hs}qm5yI6Bs6mdQKeG zL+R9c5`Z*99#Ym^2G;rB#QGi~_A*-XRyt^S(1}fZqs+H14alQZW#k$j*y4VKWZ