Replace closed, Level-II-only product assumptions with one descriptor and identity contract consumed by acquisition, caching, selection, legends, and rendering.
Scope
- Identify a product by source/family, product code, and schema/recipe version rather than an unversioned display string.
- Describe geometry, angular coverage, units, value encoding/sentinels, elevation applicability, palette/legend, and supported view/analysis capabilities.
- Include source and derivation provenance plus input identities in cache keys and invalidation.
- Drive product availability in the selector from acquired/source capabilities.
- Resolve the current Clutter Filter Power fallback by implementing its real identity or hiding it when unavailable.
- Migrate existing Level II base moments without changing supported behavior or persisted data incorrectly.
Non-goals
- Decoding Level III data or executing derived-product recipes.
- Adding arbitrary user code.
Acceptance criteria
- Existing Level II moments are represented by descriptors and retain acquisition, cache, selection, legend, and rendering behavior.
- Unsupported products cannot be selected or silently interpreted as another product.
- Cache identities distinguish source, schema/recipe version, geometry, and dependencies.
- Rendering and UI capabilities are derived from descriptors rather than exhaustive product-name matches where practical.
- Persisted selections migrate or fall back deterministically.
- Descriptor, availability, cache-identity, migration, and unsupported-product decisions have pure tests.
Parent: #35; follows #168; blocks #166 and #167.
Replace closed, Level-II-only product assumptions with one descriptor and identity contract consumed by acquisition, caching, selection, legends, and rendering.
Scope
Non-goals
Acceptance criteria
Parent: #35; follows #168; blocks #166 and #167.