id: CORE-001D2B title: Options Chain and Expiration Boundary Normalization status: done priority: P1 effort: S depends_on: - CORE-001D2A tags: - core - decimal - options - cache - provider summary: Option expirations and options-chain payloads now use explicit cache/provider normalization boundaries with malformed cached payload discard rules. completed_notes: - Added named normalization adapters for option expirations and options-chain payloads in `app/services/data_service.py`. - Cached payload symbol mismatches are discarded instead of being silently reused. - Malformed cached list-shape payloads are discarded and refreshed rather than being treated as valid empty results. - Fresh provider payloads are normalized before caching. - Added focused coverage in `tests/test_options_normalization.py`. - Validated with focused pytest coverage, `make build`, and a targeted browser-visible `/options` check on `main`.