id: CORE-001D title: External Boundary and Persistence Cleanup for Decimal Unit Types status: done priority: P2 effort: M depends_on: - CORE-001B - CORE-001C tags: - core - decimal - persistence summary: The remaining Decimal/unit-safe boundary cleanup slices have been completed across persistence, provider/cache adapters, alerts/settings, historical-provider boundaries, and historical scenario service entrypoints. completed_notes: - `CORE-001D1` made the portfolio/workspace persistence seam explicit with strict unit-aware schema validation and atomic saves. - `CORE-001D2A` and `CORE-001D2B` normalized quote, option-expiration, and options-chain provider/cache boundaries in `DataService`. - `CORE-001D2C` normalized `PriceFeed` cache/provider payloads through explicit adapters aligned with `CacheService`. - `CORE-001D2D` normalized historical provider rows and synthetic option quote construction in `app/services/backtesting/historical_provider.py`. - `CORE-001D3A` tightened alerts and settings save-status service entrypoints with named normalization adapters. - `CORE-001D3B` turned corrupt alert-history storage into an explicit degraded state with logging and route-visible notices. - `CORE-001D3C` normalized historical scenario inputs for backtests and event comparison through a shared adapter. - Remaining raw-float dataclasses such as `LombardPortfolio`, `PriceData`, and MVP backtest result models are now treated as intentional edge-facing compatibility surfaces rather than undocumented internal seams. - Validated through focused pytest coverage, browser-driven local Docker checks on the affected routes, and repeated `make build` runs across the shipped slices.