diff --git a/.planning/STATE.md b/.planning/STATE.md
index cc96739..b249afd 100644
--- a/.planning/STATE.md
+++ b/.planning/STATE.md
@@ -5,16 +5,16 @@
See: .planning/PROJECT.md (updated 2026-02-09)
**Core value:** Reliable, lag-free GPS speed display that coexists politely with other Android apps
-**Current focus:** Phase 2 - Provider Migration (next)
+**Current focus:** Phase 2 - Provider Migration (planned, ready to execute)
## Current Position
-Phase: 1 of 4 (Foundation)
-Plan: 2 of 2 complete (01-02)
-Status: Phase complete
-Last activity: 2026-02-09 — Completed 01-02-PLAN.md
+Phase: 2 of 4 (Provider Migration)
+Plan: 0 of 2 complete
+Status: Planned — research, context, and 2 plans created and verified
+Last activity: 2026-02-10 — Completed /gsd:plan-phase 2
-Progress: [██████████] 100% (Phase 1: 2/2 plans)
+Progress: [░░░░░░░░░░] 0% (Phase 2: 0/2 plans)
## Performance Metrics
@@ -64,10 +64,11 @@ Recent decisions affecting current work:
- [ ] Verify speed display, theme/unit cycling, overlay launch/close, landscape mode
- [ ] Confirm Logger output format in debug console
-**Phase 2 Pre-work:**
-- [ ] Create manual regression testing checklist before provider migration
-- [ ] Audit 5+ async patterns in SpeedometerScreen for provider compatibility
-- [ ] Design GpsDataManager singleton disposal strategy
+**Phase 2 Planning Complete:**
+- [x] Research completed (02-RESEARCH.md) — Provider v6.1.5+1, 7 pitfalls identified
+- [x] Context gathered (02-CONTEXT.md) — user decisions locked
+- [x] Plans created and verified (02-01-PLAN.md, 02-02-PLAN.md)
+- [x] GpsDataManager singleton disposal strategy decided: extends ChangeNotifier, singleton removed, _isDisposed guard
### Blockers/Concerns
@@ -77,10 +78,10 @@ Recent decisions affecting current work:
- LOW: Logger severity level guidelines should be documented for contributors
- INFO: Phase 1 functionality testing deferred to user-initiated session (non-blocking checkpoint)
-**Phase 2 (Provider Migration):**
-- HIGH RISK: Async lifecycle complexity — 5+ async patterns must be audited before migration
-- Must create manual regression testing checklist before starting Phase 2
-- GpsDataManager singleton disposal strategy needs design decision
+**Phase 2 (Provider Migration) — Planned:**
+- MITIGATED: Async lifecycle complexity addressed via _isDisposed guards on all providers
+- RESOLVED: GpsDataManager singleton removal planned — public constructor, Provider-managed lifecycle
+- NOTE: Trip tracking code confirmed absent from codebase — no removal needed
**Phase 3 (Overlay Refactor):**
- MEDIUM RISK: flutter_overlay_window 0.5.0 has known communication issues
@@ -93,7 +94,7 @@ Recent decisions affecting current work:
## Session Continuity
-Last session: 2026-02-09 (Phase 1 execution complete)
-Stopped at: Phase 1 fully complete and verified (9/9 must-haves). Ready for Phase 2.
-Resume file: .planning/phases/01-foundation/.continue-here.md
-Next action: /gsd:discuss-phase 2 or /gsd:plan-phase 2
+Last session: 2026-02-10 (Phase 2 planning complete)
+Stopped at: Phase 2 fully planned and verified. Ready for execution.
+Resume file: .planning/phases/02-provider-migration/.continue-here.md
+Next action: /gsd:execute-phase 2
diff --git a/.planning/phases/02-provider-migration/.continue-here.md b/.planning/phases/02-provider-migration/.continue-here.md
new file mode 100644
index 0000000..cf6a2c4
--- /dev/null
+++ b/.planning/phases/02-provider-migration/.continue-here.md
@@ -0,0 +1,61 @@
+---
+phase: 02-provider-migration
+task: 0
+total_tasks: 5
+status: planned
+last_updated: 2026-02-10
+---
+
+
+Phase 2 planning is COMPLETE. All planning artifacts (research, context, 2 plans) are written and verified. No execution has started yet. Ready to execute.
+
+
+
+
+- /gsd:discuss-phase 2 — Context gathered, user decisions locked in 02-CONTEXT.md
+- /gsd:plan-phase 2 — Research completed (02-RESEARCH.md), 2 plans created and checker-verified
+ - 02-01-PLAN.md: Provider infrastructure (Wave 1, 3 tasks) — GpsDataManager ChangeNotifier refactor, SettingsProvider, OverlayProvider
+ - 02-02-PLAN.md: MultiProvider wiring + screen migration (Wave 2, 2 tasks) — main.dart rewrite, SpeedometerScreen full migration
+- Checker passed after 1 revision (trip tracking absence acknowledged, verification concretized)
+
+
+
+
+- Execute Plan 02-01 (Wave 1): Add provider/shared_preferences deps, refactor GpsDataManager, create SettingsProvider, create OverlayProvider
+- Execute Plan 02-02 (Wave 2): Wire MultiProvider in main.dart, migrate SpeedometerScreen from setState to Consumer/Selector
+- Verify phase completion against success criteria
+
+
+
+
+- GpsDataManager extends ChangeNotifier directly (stays in services/, not moved to providers/)
+- Singleton pattern removed — all access via Provider BuildContext
+- SettingsProvider = theme + units combined (not separate providers)
+- OverlayProvider centralizes ALL overlay management (show/close, messaging, status checking)
+- OverlayProvider uses ChangeNotifierProxyProvider2 depending on GpsDataManager + SettingsProvider
+- GPS stream subscription in OverlayProvider: listens continuously, skips sends via if-check when inactive
+- Heartbeat/polling stripped to simple boolean — Phase 3 builds proper detection
+- Big bang migration — no temporary setState/Provider coexistence
+- Trip tracking code: confirmed absent from codebase, no removal needed
+- SharedPreferences pre-initialized in async main() before runApp()
+- Permission handling kept procedural in GpsDataManager.initialize()
+
+
+
+None. Plans are verified and ready for execution.
+
+
+
+This is a Provider migration for a GPS speedometer Flutter app. The app has a single main screen (SpeedometerScreen) with 11 setState calls that need replacing with Consumer/Selector widgets. The overlay runs in a separate isolate and communicates via FlutterOverlayWindow.shareData — it cannot access Provider, so overlay_screen.dart is unchanged.
+
+Key architectural insight: GpsDataManager already has broadcast streams, so adding ChangeNotifier is additive (notifyListeners alongside existing stream). OverlayProvider subscribes to the stream directly. The screen uses Selector widgets for granular rebuilds (speed display independent of theme changes).
+
+The research identified 7 pitfalls, most critical being "ChangeNotifier after dispose" from async GPS callbacks — all providers use _isDisposed guards.
+
+
+
+Run: /gsd:execute-phase 2
+
+This will execute Wave 1 (02-01-PLAN.md) first, then Wave 2 (02-02-PLAN.md).
+Wave 1 creates provider infrastructure. Wave 2 wires it all together and migrates the screen.
+