feat: port app to Uno Platform and move CI/CD to GitHub Actions - #5
Merged
Conversation
Replace the Xamarin.Forms app with the Uno Platform single-project head (migrated from DailyReflection-ports, excluding the MAUI and Avalonia heads) and update the shared projects to the ported versions. - DailyReflection/: Uno single project (Android, iOS, Desktop/Skia) - Core/Data/Presentation/Services: ported implementations - Replace DailyReflection.sln with DailyReflection.slnx
- specs/: numbered design specs for the port - docs/: ANALYSIS.md and ios-launch-experience.md - prompt.md: original porting brief - CLAUDE.md: adapted to the Uno-only layout of this branch - DailyReflection-uno.slnf: solution filter for Uno head + shared projects
- Reflection page date picker: pass the picked date into GetDailyReflectionCommand instead of setting Date and re-fetching with null, which reset the view to today (selecting a past date never worked). - Settings notification-time row: show a TimePickerFlyout on tap (previously a collapsed inline TimePicker was made visible, which never opened a flyout) and initialize it to the saved time. - Settings sober-date picker: initialize Date to the saved date before opening the calendar flyout.
- ApplicationId flipped back to com.kazo0.dailyreflection so the Uno binary upgrades the existing Xamarin app in place; version bumped to 4.0 (35) to exceed the current 3.4 (34) store release (spec 011 §E). - MigrateOldPreferences() now imports the legacy values from the real platform stores left behind by the Xamarin app instead of round-tripping LocalSettings: Android reads the default and DR_Settings SharedPreferences, iOS reads the standard defaults and the DR_Settings NSUserDefaults suite (spec 001). With build 35 the existing StartupMigrationRunner predicate fires on first launch after upgrade, imports all five preference keys, and re-schedules the daily notification. - Resolution recorded in specs/001, specs/011, and README.md.
NSUserDefaults.ObjectForKey is not public in the .NET iOS bindings; use the string indexer instead. Caught by building the net10.0-ios target — all three targets (android, ios, desktop) now compile clean.
- Reflection tab rendered blank on all platforms: DailyReflectionPage is the default route, so it is created during NavigateAsync in App.OnLaunched — before App.Host is assigned — and its constructor's App.GetService<T>() call threw, leaving the region empty. The page now attaches its VM lazily on first Loaded (DataContextChanged when the navigator supplies one, otherwise the service locator once Host exists); PageBase gains an OnBeforeActivate hook and tolerates a null ActiveViewModel. - Reflection text leaked raw HTML: the DB wraps Reading content in <p class="textitalic"> (plus span/sup/a/table tags) which the deliberately-minimal parser preserved verbatim. HtmlInlineParser now treats <p> as a paragraph break (collapsing runs, trimming edges) and strips unsupported tags while keeping inner text. - Settings CalendarDatePicker MaxDate binding failed at runtime (DateTime -> DateTimeOffset conversion unsupported by Uno's binding engine); MaxDate and Date are now set in code-behind before the calendar opens. - Notification-time row used IsEnabled on a Grid, which does not exist in WinUI/Uno; replaced with IsHitTestVisible (the Tapped guard still enforces the Android-always-tappable rule). Verified on the Android emulator (Pixel 9 Pro XL, API 36) and the Skia desktop build: reflection page renders with chrome, time and date pickers open initialized to saved values, all three targets compile, 27 + 23 tests pass.
- Migrated DailyReflectionPage and SettingsPage from MAUI to WinUI/Uno Platform. - Replaced PageBase inheritance with direct Page inheritance. - Updated XAML to utilize Uno Toolkit components for navigation and layout. - Removed unnecessary code-behind for ViewModel activation and property bindings. - Implemented two-way bindings for settings and reflection data. - Enhanced error handling and loading indicators using FeedView. - Updated global.json to use Uno.Sdk version 6.6.29.
Uno.Sdk 6.6.29's Hosting feature pulls Microsoft.Extensions.Logging.Console 10.0.10, which requires Configuration.Binder >= 10.0.10; the 10.0.2 CPM pins fail any clean restore with NU1605 (masked locally by cached restores). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Aa78QCQKu3byUH6Xo5raQF
Replace the stale Xamarin-era azure-pipelines.yml with two workflows: - ci.yml: PR/master merge gate (unit tests, desktop build, unsigned Android build, iOS simulator build). - release.yml: any push to release/* builds signed .aab/.apk, signed .ipa, and self-contained desktop zips, then waits on the production environment approval before uploading to Google Play, uploading and submitting to App Store Connect (fastlane deliver), and creating a GitHub release that pushes the vX.Y.Z tag. workflow_dispatch inputs allow dry runs (Play test track, skip review submission). Versions come from Nerdbank.GitVersioning (version.json at the repo root; cut release branches with `nbgv prepare-release`). NBGV's built-in mobile targets map the computed version onto ApplicationVersion / ApplicationDisplayVersion (Android versionCode = major<<24 | minor<<16 | height, i.e. >= 67108864 for 4.x, always above the Xamarin app's 34). Declare ITSAppUsesNonExemptEncryption=false so automated App Store Connect uploads do not stall on the Missing Compliance prompt. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Aa78QCQKu3byUH6Xo5raQF
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Aa78QCQKu3byUH6Xo5raQF
Two independent fixes plus the doc reconciliation they imply. SQLite (GHSA-2m69-gcr7-jv3q / CVE-2025-6965): sqlite-net-pcl pulls lib.e_sqlite3 2.1.2 transitively via bundle_green, which is inside the vulnerable <= 2.1.11 range. Pin bundle_e_sqlite3 3.0.4 + lib.e_sqlite3 3.50.3 in both the head and DailyReflection.Data; 3.50.x is a shim over SourceGear.sqlite3, which ships the patched native SQLite. lib.e_sqlite3 must be pinned directly because the 3.x bundle no longer references it, so green's 2.1.2 would otherwise win. On the mobile TFMs the .android / .ios packages are pinned to 2.1.12 with ExcludeAssets="all" — version pin only, contributing no files, so the native binary still comes from SourceGear. Verified: a forced restore across all TFMs emits no NU1903 and the vulnerable 2.1.2 is absent from the graph entirely. Android targetSdk 21/33 -> 21/36: matches the .NET 10 Android build SDK (silences XA1006) and clears Google Play's requirement that updates target API 35+, which docs/RELEASE-SETUP.md called out as a release blocker. minSdk stays 21. Verified: Android release build is clean and the generated manifest reads minSdkVersion=21 targetSdkVersion=36 with NBGV's versionCode 67108866, above the shipped Xamarin app's 34. Docs updated to match: the stale "fixed at 33" csproj comment, the now-resolved RELEASE-SETUP blocker, and supersession notes on spec 009 (targetSdk) and spec 011 (hardcoded ApplicationVersion, removed when Nerdbank.GitVersioning landed). Also fixes the .vscode launch config, which named a preLaunchTask ("Uno: android | Debug | android-x64") that no longer exists. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GhNe28zDm5naMj8SnYS2we
Contributor
There was a problem hiding this comment.
Pull request overview
Ports Daily Reflection to an Uno Platform single-project head (WinUI-based, multi-targeting Android/iOS/Desktop) and modernizes the solution/tooling around that port (MVUX models, Uno.Extensions.Navigation regions, versioning, and CI migration away from Azure Pipelines).
Changes:
- Introduces a new
DailyReflection.Uno.csprojhead with Uno.Toolkit + Uno.Extensions.Navigation + MVUX, replacing the Xamarin.Forms heads and Shell-based navigation. - Reworks settings/notifications/share/version-tracking into service interfaces + per-platform implementations, and adds a version-gated
StartupMigrationRunnerfor upgrade-in-place behavior. - Adds Nerdbank.GitVersioning (
version.json) + Uno SDK pinning (global.json) and removes the Azure Pipelines definition in favor of GitHub Actions (per PR description).
Reviewed changes
Copilot reviewed 207 out of 270 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| version.json | Adds Nerdbank.GitVersioning configuration for 4.0-alpha and release branch refs. |
| README.md | Documents the Uno port and upgrade-in-place behavior. |
| prompt.md | Adds migration brief/reference prompt content (repo docs). |
| global.json | Pins Uno.Sdk version via MSBuild SDK resolution. |
| docs/ios-launch-experience.md | Documents iOS minimum version, splash, plist substitution, and orientation decisions. |
| DailyReflection/Views/MainPage.xaml | New Uno TabBar shell using region-based navigation. |
| DailyReflection/Views/MainPage.xaml.cs | Code-behind stub for the main tab host page. |
| DailyReflection/Views/DailyReflectionPage.xaml.cs | Code-behind for reflection date picking (writes MVUX state). |
| DailyReflection/Views/SobrietyTimePage.xaml.cs | Code-behind stub for sober time page. |
| DailyReflection/Views/SettingsPage.xaml.cs | Code-behind for settings flyouts and picker interactions (writes MVUX state). |
| DailyReflection/Styles/Styles.xaml | Adds WinUI ResourceDictionary styles including implicit Page/TextBlock styles. |
| DailyReflection/Styles/ColorPaletteOverride.xaml | Overrides Uno Material palette to preserve legacy branding. |
| DailyReflection/ReadMe.md | Uno template “Getting Started” readme (project-local). |
| DailyReflection/Properties/launchSettings.json | Adds launch profiles for desktop and WSL2. |
| DailyReflection/PlatformServices/VersionTrackingService.cs | Implements LocalSettings-backed VersionTracking surface. |
| DailyReflection/PlatformServices/VersionTrackingService.Android.cs | Android version/build lookup via PackageManager. |
| DailyReflection/PlatformServices/VersionTrackingService.iOS.cs | iOS version/build lookup via NSBundle InfoDictionary. |
| DailyReflection/PlatformServices/VersionTrackingService.Desktop.cs | Desktop fallback to assembly metadata by returning null native version/build. |
| DailyReflection/PlatformServices/ShareService.cs | Implements sharing via DataTransferManager, with clipboard fallback on unsupported platforms. |
| DailyReflection/PlatformServices/SettingsService.cs | Implements settings storage in ApplicationData.LocalSettings + migration hook. |
| DailyReflection/PlatformServices/SettingsService.Android.cs | Mirrors writes to SharedPreferences and imports legacy Android prefs on upgrade. |
| DailyReflection/PlatformServices/SettingsService.iOS.cs | Imports legacy iOS NSUserDefaults settings from standard + suite stores. |
| DailyReflection/PlatformServices/NotificationService.cs | Desktop notification scheduling implementation (non-Android/iOS). |
| DailyReflection/PlatformServices/NotificationService.Windows.cs | Windows-specific toast/logging implementation hook. |
| DailyReflection/Platforms/iOS/Main.iOS.cs | iOS entry point using UnoPlatformHostBuilder. |
| DailyReflection/Platforms/iOS/Info.plist | New iOS plist aligned with Uno build substitutions and orientation rules. |
| DailyReflection/Platforms/iOS/Entitlements.plist | Normalizes entitlements plist formatting. |
| DailyReflection/Platforms/iOS/PrivacyInfo.xcprivacy | Adds Apple privacy manifest (accessed API reasons). |
| DailyReflection/Platforms/iOS/Media.xcassets/LaunchImages.launchimage/Contents.json | Carries launch image asset catalog content (legacy). |
| DailyReflection/Platforms/Desktop/Program.cs | Desktop entry point hosting X11/FrameBuffer/macOS/win32 via Uno host builder. |
| DailyReflection/Platforms/Android/MainActivity.Android.cs | Android activity entry point with AndroidX splashscreen install. |
| DailyReflection/Platforms/Android/Main.Android.cs | Android Application class for Uno NativeApplication setup. |
| DailyReflection/Platforms/Android/AndroidManifest.xml | Defines Android SDK levels and required permissions (incl. boot + notifications). |
| DailyReflection/Platforms/Android/environment.conf | Adds Mono GC parameters (Android). |
| DailyReflection/Platforms/Android/BroadcastReceivers/WakeUpAlarmReceiver.cs | Reschedules alarms on boot / exact-alarm permission state changes. |
| DailyReflection/Platforms/Android/Resources/AboutResources.txt | Updates Android resources guidance text. |
| DailyReflection/Platforms/Android/Resources/values/Styles.xml | Adds Android theme + splash style definitions. |
| DailyReflection/Platforms/Android/Resources/values/Strings.xml | Adds Android ApplicationName string resource. |
| DailyReflection/Platforms/Android/Resources/drawable/notif_icon.png | Adds notification icon asset. |
| DailyReflection/Platforms/Android/Assets/AboutAssets.txt | Updates Android assets guidance text. |
| DailyReflection/Package.appxmanifest | Adds Windows packaging manifest (full trust capability, dependencies). |
| DailyReflection/app.manifest | Adds Windows DPI awareness settings for unpackaged app scenarios. |
| DailyReflection/App.xaml | Adds Uno MaterialToolkitTheme + app resource dictionaries and converters. |
| DailyReflection/appsettings.json | Adds embedded config with DatabaseFileName and logging defaults. |
| DailyReflection/Assets/SharedAssets.md | Documents Uno asset conventions for the shared project. |
| DailyReflection/Assets/Icons/icon.svg | Adds app icon SVG source. |
| DailyReflection/GlobalUsings.cs | Adds head-project global usings and an activation alias. |
| DailyReflection/Extensions/StringExtensions.cs | Adds StripHtml helper using GeneratedRegex in the head project. |
| DailyReflection/Directory.Build.props | Enables implicit usings/nullable + central package mgmt + NBGV reference for head. |
| DailyReflection/Directory.Build.targets | Adds (empty) targets file placeholder for head directory. |
| DailyReflection/Directory.Packages.props | Centralizes package versions (sqlite pins, NBGV, config packages). |
| DailyReflection/DependencyInjection/Dependencies.cs | Registers platform services and StartupMigrationRunner in DI. |
| DailyReflection/Converters/BoolToVisibilityConverter.cs | Adds bool→Visibility converter for WinUI bindings. |
| DailyReflection/Converters/DateFormatConverter.cs | Adds configurable DateTime formatting converter for classic bindings. |
| DailyReflection/Converters/DateSetToVisibilityConverter.cs | Adds DateTime-set check → Visibility converter. |
| DailyReflection/Converters/HtmlEx.cs | Adds attached property to render inline HTML into TextBlock.Inlines. |
| DailyReflection/Converters/IntToBoolConverter.cs | Adds int→Visibility/bool converter for WinUI bindings. |
| DailyReflection/Converters/IsDisplayPreferenceToBoolConverter.cs | Adds enum match → Visibility converter with XAML-parsed preference. |
| DailyReflection/Converters/NullToBoolConverter.cs | Adds null check converter supporting Visibility targets. |
| DailyReflection/Converters/PluralityConverter.cs | Adds pluralization converter for numeric values. |
| DailyReflection/Converters/SoberTimeDisplayEnumConverter.cs | Adds enum→display string converter for sober time preference. |
| DailyReflection/Converters/TimePickerLabelEnabledConverter.cs | Restores Xamarin behavior for time row tappability on Android vs others. |
| DailyReflection.slnx | Replaces solution with .slnx including new projects and test projects. |
| DailyReflection.Services/Notification/INotificationService.cs | Adds IsSupported to notification service contract and modernizes namespace. |
| DailyReflection.Services/Settings/ISettingsService.cs | Splits settings interface into its own file-scoped namespace. |
| DailyReflection.Services/Share/IShareService.cs | Splits share interface into its own file-scoped namespace. |
| DailyReflection.Services/Startup/StartupMigrationRunner.cs | Ports Xamarin startup migrations (settings import + DB refresh) behind version gates. |
| DailyReflection.Services/VersionTracking/IVersionTrackingService.cs | Adds VersionTracking abstraction for startup migrations. |
| DailyReflection.Services/DependencyInjection/Dependencies.cs | Simplifies service DI: keeps data + daily reflection service registration. |
| DailyReflection.Services/DailyReflection/DailyReflectionService.cs | Moves IDailyReflectionService to file scope and modernizes formatting. |
| DailyReflection.Services/DailyReflection.Services.csproj | Retargets services project to net10.0 with nullable enabled. |
| DailyReflection.Services.Tests/AutomationConstantsCoverageTests.cs | Adds lint test ensuring automation IDs are referenced in Uno view XAML. |
| DailyReflection.Services.Tests/ServiceTestBase.cs | Fixes nullable initialization for ServiceUnderTest. |
| DailyReflection.Services.Tests/DailyReflection/DailyReflectionServiceTests.cs | Updates to nullable-safe fields and modern NUnit assertions. |
| DailyReflection.Services.Tests/DailyReflection.Services.Tests.csproj | Retargets tests to net10.0 and updates test package versions. |
| DailyReflection.Presentation/Models/DailyReflectionModel.cs | Adds MVUX model for reflections (Date state → reflection feed, Share command). |
| DailyReflection.Presentation/Models/SobrietyTimeModel.cs | Adds MVUX model projecting sober time feeds from SettingsModel state. |
| DailyReflection.Presentation/DependencyInjection/Dependencies.cs | Registers MVUX models + generated bindables as singletons to preserve shared state. |
| DailyReflection.Presentation/Extensions/StringExtensions.cs | Modernizes StripHtml helper to file-scoped namespace. |
| DailyReflection.Presentation/Extensions/ReflectionExtenisons.cs | Modernizes reflection display-string helper formatting (keeps behavior). |
| DailyReflection.Presentation/DailyReflection.Presentation.csproj | Retargets to net10.0 and adds Uno.Extensions.Reactive packages. |
| DailyReflection.Presentation.Tests/Models/ModelTestBase.cs | Adds MVUX-oriented test base with Eventually polling helper. |
| DailyReflection.Presentation.Tests/Models/DailyReflectionModelTests.cs | Adds MVUX model tests for reflection loading and share behavior. |
| DailyReflection.Presentation.Tests/Models/SobrietyTimeModelTests.cs | Adds MVUX sober time model tests (projection + recompute behavior). |
| DailyReflection.Presentation.Tests/ShareClosureCaptureTests.cs | Adds concurrency test for share closure-capture pattern. |
| DailyReflection.Presentation.Tests/DailyReflection.Presentation.Tests.csproj | Retargets tests to net10.0 and updates test package versions. |
| DailyReflection.Data/Databases/DailyReflectionDatabase.cs | Modernizes DB abstraction + implementation and keeps embedded DB extraction logic. |
| DailyReflection.Data/DependencyInjection/Dependencies.cs | Updates DI extension to file-scoped namespace style. |
| DailyReflection.Data/Models/Reflection.cs | Modernizes Reflection model declaration style (table/PK metadata preserved). |
| DailyReflection.Data/Models/SoberTimeDisplayPreference.cs | Modernizes enum declaration style. |
| DailyReflection.Data/DailyReflection.Data.csproj | Retargets data project to net10.0 and pins SQLite packages for security advisory fix. |
| DailyReflection.Core/Extensions/ServiceCollectionExtensions.cs | Modernizes DI helper extension to file-scoped namespace style. |
| DailyReflection.Core/Extensions/StringExtensions.cs | Modernizes StripHtml helper to file-scoped namespace style. |
| DailyReflection.Core/Constants/AutomationConstants.cs | Adds/adjusts automation ID constants used by Uno views and lint test. |
| DailyReflection.Core/Constants/ConfigurationConstants.cs | Modernizes constants style (file-scoped namespace). |
| DailyReflection.Core/Constants/PreferenceConstants.cs | Modernizes constants style (file-scoped namespace). |
| DailyReflection.Core/Constants/VersionConstants.cs | Modernizes constants style and adds VersionNumber constant. |
| DailyReflection.Core/DailyReflection.Core.csproj | Retargets core project to net10.0, enables nullable, updates extensions package versions. |
| CLAUDE.md | Adds pointer doc directing agents to AGENTS.md. |
| azure-pipelines.yml | Removes Azure Pipelines CI definition. |
| .mcp.json | Adds MCP server configuration (UnoApp devserver + UnoDocs). |
| .vscode/tasks.json | Adds VS Code tasks for desktop build/publish. |
| .vscode/launch.json | Adds VS Code launch configs for Uno desktop/mobile debugging. |
| .vscode/settings.json | Adds file nesting and file association settings. |
| .vscode/extensions.json | Adds Uno VS Code extension recommendation. |
| .run/DailyReflection.Uno.run.xml | Adds Rider/IDEA run configs for desktop target. |
Comments suppressed due to low confidence (1)
DailyReflection/Platforms/iOS/PrivacyInfo.xcprivacy:41
- The privacy manifest needs to close the NSPrivacyAccessedAPITypes array and the root dict before ; otherwise the plist remains invalid.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…and add sample override props
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Enables /steve-ops backport <branch> and /steve-ops prepare-release as PR comments. Calls the reusable workflow in the private kazo0/steve-ops repo. Must live on the default branch — GitHub always runs issue_comment workflows from there, which is also what stops a PR branch from altering what the bot does. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QuvnD4UizJeQGJSe4ME6rK
Owner
Author
|
/steve-ops help |
Owner
Author
|
/steve-ops-bot help |
Owner
Author
|
/steve-ops help |
|
steve-ops — comment commands on a pull request.
Only repository owners, members, and collaborators can run commands. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ports Daily Reflection from Xamarin.Forms to Uno Platform (WinUI-based), and replaces the Azure Pipelines build with GitHub Actions.
The app keeps its store identity (
com.kazo0.dailyreflection) so existing installs upgrade in place rather than appearing as a new listing.Port
DailyReflection.Android/DailyReflection.iOSheads collapse into a single multi-targetedDailyReflection.Uno.csproj(net10.0-desktop,-android,-ios). Platform-specific code moves toPlatforms/and partialPlatformServices/*.{Android,iOS,Windows,Desktop}.cs.ViewModels/are replaced by feed/stateModels/(DailyReflectionModel,SettingsModel,SobrietyTimeModel); the MVVM messenger types drop out in favour of MVUX state.AppShell, withMainPagehosting a ToolkitTabBar.SettingsService/ShareService/NotificationService/VersionTrackingServicesplit into interfaces inDailyReflection.Serviceswith per-platform implementations in the head. AddsStartupMigrationRunnerfor the Xamarin→Uno settings migration.DailyReflection.sln→DailyReflection.slnx; addsglobal.json(Uno.Sdk 6.6.29) and central package management underDailyReflection/.CI/CD
Replaces
azure-pipelines.ymlwith two workflows:ci.yml— PR/master gate. Unit tests, desktop (Skia), unsigned Android, and iOS simulator builds. No secrets required.release.yml— triggered by pushes torelease/**. Builds signed Android/iOS/desktop packages, then parks at aproductionenvironment approval gate before publishing to Google Play, App Store Connect, and a GitHub release (which pushes the version tag).workflow_dispatchinputs allow a dry run against a Play test track with the App Store review submission skipped.Versioning moves to Nerdbank.GitVersioning (
version.json), which derivesApplicationVersion/ApplicationDisplayVersionfrom git height. The computed AndroidversionCode(67108866 for 4.0.x) stays above the shipped Xamarin app's 34.docs/RELEASE-SETUP.mddocuments the one-time credential, environment, and branch-protection setup the repo owner must do before the first release.Fixes folded in
sqlite-net-pclpulled vulnerablelib.e_sqlite32.1.2 transitively; pinned to the patched 3.50.3 / bundle 3.0.4.targetSdkVersion33 → 36 — clears Google Play's API 35+ requirement for updates.minSdkVersionstays 21.Verification
Run locally on this branch:
DailyReflection.Presentation.Tests(Release)DailyReflection.Services.Tests(Release)DailyReflection.Uno.csproj-f net10.0-desktop -c ReleaseAndroid and iOS heads were not built locally — those are covered by the
Build Android (unsigned)andBuild iOS (simulator)CI jobs, which run here for the first time.One known non-blocking warning:
CS8604(possible null argument) inAutomationConstantsCoverageTests.cs:30.Before merging
CI has never run in this repo, so the four check names don't exist yet and can't be added to branch protection in advance. Suggested order: let CI go green on this PR → add Unit tests, Build desktop (Skia), Build Android (unsigned), Build iOS (simulator) as required status checks on
master→ merge.Not in this PR
No release credentials are configured yet (no secrets, no variables, no
productionenvironment). Those gaterelease.ymlonly, not this merge — seedocs/RELEASE-SETUP.md§1–3 before cuttingrelease/v4.0.🤖 Generated with Claude Code