## Open
- [ ] Orphaned/duplicate sources left on disk (not in any target): `LocalSkyRadar/RadarFaceView.swift`, `LocalSkyRadar/ThemeTestView.swift`, and the broken View-based widget set in `LocalSkyRadarWidgetExtension/*.swift`. The live widget UI lives in `LocalSkyRadar/Widgets/`. Reconcile or remove once confirmed.
- [ ] Airport DB in `AirportService` is a hardcoded ~40-airport table. Unknown ICAO codes fall back to current location / KSFO. Swap for a real lookup (bundled DB or API) if broader coverage is needed.
- [ ] Widget reads the device location from the App Group, refreshed only while the main app is open (widget extensions can't reliably run their own location session). If the app hasn't run, location-mode widgets default to KSFO until an airport code is set.

## Closed
- [x] Fixed the `CFPrefsPlistSource … Using kCFPreferencesAnyUser with a container is only allowed for System Containers, detaching from cfprefsd` warning: on macOS an App Group ID must begin with the Team ID, but it was the iOS-style `group.com.localsky.radar`, so `UserDefaults(suiteName:)` silently fell back to a process-local store (breaking app↔widget sharing). Changed to `38Z85GV2D8.group.com.localsky.radar` in both entitlements, `SharedStore`, and the round-trip test. Verified: warning gone from the signed app's stderr, the team-prefixed Group Container is created, all tests pass. The `CSInlineDonation`/`SetStoreUpdateService` line is benign CoreSpotlight/AppIntents donation noise (appears in Apple sample code too) — not fixable in app code and harmless.
- [x] Confirmed the widget is editable: the three widgets use `AppIntentConfiguration` with `LocalSkyWidgetIntent` (a `WidgetConfigurationIntent`); `appintentsmetadataprocessor` emits `Metadata.appintents` containing the `airportCode` parameter, and the extension registers with pluginkit as `com.localsky.Radar.WidgetExtension`. Right-click widget → Edit Widget shows the Airport Code (ICAO) field.
- [x] Finished live-data wiring: `RadarDataService.fetchAircraft(center:rangeNM:)` now computes distNM/bearingDeg from the scope center and sorts nearest-first; robust airplanes.live decoding (optional fields + `alt_baro` int-or-"ground"). Verified end-to-end against the real API (117 aircraft at KSFO decoded + sorted correctly). `adaptiveRange` implemented (smallest of 50/75/100 NM holding ≥2 aircraft) — matches AdaptiveRangeTests.
- [x] Added widget configuration: `LocalSkyWidgetIntent` is now a `WidgetConfigurationIntent` with an Airport Code (ICAO) field; widgets use `AppIntentConfiguration` + `AppIntentTimelineProvider`. Long-press → Edit Widget to enter a code; blank = current location.
- [x] Fixed sandbox/network errors: added `com.apple.security.network.client` (+ location) to app and widget entitlements (this was the `networkd_settings_read_from_file_locked` denial — the widget couldn't reach the API). Standardized the App Group to `group.com.localsky.radar` via `SharedStore` (AppIntent.swift previously used the wrong `group.com.yourapp.localsky`). Remaining console lines (`bootstrap_look_up failed`, `CSInlineDonation`/`SetStoreUpdateService`, `Registration timer expired`) are benign macOS dev/WidgetKit noise, not failures.
- [x] Main app now has a real window (`ContentView`) showing location status + setup instructions, requests location on launch, and persists coordinates to the App Group + reloads widget timelines on update.
- [x] CoordinateMath tests corrected to geographically-accurate values (KSFO→KOAK ≈ 9.86 NM at ~52.5°; the build_plan "11.5 NM / 115°" example was wrong). All 4 tests pass.
- [x] Xcode test plan discovers 0 tests — real test files were never added to the test target; added them + TEST_HOST/BUNDLE_LOADER/DEVELOPMENT_TEAM so the host-app bundle loads.
- [x] Project would not build: malformed `.xcscheme` crashed xcodebuild (infinite recursion); `SWIFT_LANGUAGE` vs `SWIFT_VERSION`; most files missing from targets; duplicate `Color(hex:)`/`AircraftMarker`; pervasive `.padding(.x: n)`/unbalanced-paren errors; widget views used as Widgets; bad `import LocalSkyRadar`; self-referential typealias; missing widget Info.plist bundle keys; widget bundle id not prefixed by the app's; extension now embeds in the app.

## Notes
- The product is the WidgetKit widgets (Medium/Large/Extra Large) in `LocalSkyRadar/Widgets/`; the app exists mainly to grant location and keep the shared location fresh.
