olsch01 2c595876f1 Pivot to fully client-side architecture — remove backend dependency
- Add Services/YahooFinanceClient.swift: Swift actor wrapping Yahoo Finance
  unofficial APIs (price history, option chain, expirations, earnings date)
  with 15-min in-memory cache
- Add Services/SignalEngine.swift: on-device IV Rank (rolling HV), SMA-50/200,
  swing-level pivot support/resistance, Black-Scholes delta/theta, signal
  strength scoring, and SHA-256 signal hash for change detection
- Add Services/RecommendationEngine.swift: strike selection (delta 0.15–0.40
  target 0.25), expiration mapping per horizon (0DTE/1DTE/weekly/monthly),
  rationale builder
- Add Services/DataStore.swift: @MainActor ObservableObject persisting all app
  state as JSON files in the documents directory (UUID-keyed, no server IDs)
- Add Services/BackgroundRefreshManager.swift: BGAppRefreshTask registration +
  foreground 15-min Timer; runs signal check per open position and fires local
  notifications when hash changes or delta/profit thresholds are crossed
- Add Services/NotificationService.swift: UNUserNotificationCenter local
  notification helper + badge count management
- Rewrite all 5 ViewModels to use DataStore + local services (no APIClient)
- Update Models to use UUID ids; remove snake_case CodingKeys (no network layer)
- Simplify AppDelegate: remove APNs, register BGTaskScheduler, start/stop timer
- Simplify NotificationPermissions/Handler: local notifications only, UUID
  position deep-link
- Update Info.plist: replace remote-notification with fetch+processing background
  modes, add BGTaskSchedulerPermittedIdentifiers
- Gut APIClient.swift and Endpoints.swift (no longer used)
- Update all Views to match new sync/async patterns and UUID-based models

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 16:13:20 -04:00
Description
No description provided
220 KiB
Languages
Swift 70%
Python 30%