| P1 |
Repair the MAUI workload and capture the pre-migration mobile baseline |
2026-09-10 |
Repair the inconsistent Android workload manifests, select the current SDK explicitly, then restore/build Windows and Android and record Apple-platform validation requirements. |
Depends on a usable MAUI toolchain and authoritative consumer source control. The current workload reports a missing microsoft-net-runtime-android-net9 extension; Apple builds require a compatible Mac/Xcode environment. |
| P1 |
Upgrade SacsMobileMaui and its consumers from unsupported .NET MAUI 8/9 to .NET MAUI 10 |
2026-09-10 |
Replace MAUI 9 compatibility APIs, align and validate consumer projects, then retarget to net10.0 and the current MAUI 10 servicing release. |
MAUI 9.0.120 is the final MAUI 9 patch, but MAUI 9 support ended on 2026-05-12. Sandalwood and Sandtrap still target MAUI 8 while referencing the net9.0 shared project. The shared library also uses removed/deprecated compatibility layouts, Frame, MainPage, and popup APIs. |
| P1 |
Make SamThreadUtil and form dialogs genuinely asynchronous and deadlock-safe |
2026-09-10 |
Replace synchronous UI-thread bridges with Task-returning APIs, update the Sandtrap caller, and add focused tests. |
The void InvokeOnMainThreadSync overload never waits; the generic overload and DisplayConfirmSync block on Task.Result and can deadlock on the UI thread. DisplayAlertSync also passes an async lambda to Action, producing async void behavior. |
| P2 |
Correct MAUI native handler type checks |
2026-09-10 |
Use SamEditor in editor mappings and SamPicker in picker mappings; validate each platform-specific option. |
Several editor and every picker option currently cast to the wrong custom control type, so configured native styling is silently skipped. |
| P2 |
Fix SamDatePicker.AllowInvalid state transition |
2026-09-10 |
Change the assignment in the equality guard, verify both transitions, and add tests for display and reset behavior. |
Setting AllowInvalid to true returns before refreshing the control; the guard uses allowInvalidDate = value. |
| P3 |
Remove unused resource-stream enumeration |
2026-09-10 |
Return null immediately after a failed named lookup or implement an intentional lookup strategy that disposes rejected streams. |
GetResourceStream opens every manifest resource, discards each stream, and returns null. |