fix: aspect ratio, confidence factors, GREEN trend alignment, compound signal gating
KSvend+1: Claude Opus 4.6 (1M context)
b0128ec
- maps: geographic aspect (cos-lat) replaces aspect="auto" that caused skewed rendering
- report: PIL-based _fit_image preserves PNG aspect ratio in PDF layout
- report: coordinate-derived AOI display name when name is missing
- report: drop headline truncation in summary table
- report: 4-factor confidence breakdown incl. anomaly consistency
- narrative: drift/gating-aware interpretations via get_interpretation_for_result
- confidence: continuous scoring, new anomaly_consistency factor, expected_months
- base: status-aware trend (GREEN -> STABLE), evidence-gated classification
- worker: skip GREEN and baseline-drift indicators before compound signal detection
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
refactor: rename "indicators" to "EO products" throughout
KSvend+2: Claude, Happy
df6bf75
Full rename across codebase:
- app/indicators/ → app/eo_products/
- IndicatorResult → ProductResult, IndicatorMeta → ProductMeta
- IndicatorRegistry → ProductRegistry, BaseIndicator → BaseProduct
- NdviIndicator → NdviProduct (and Water, SAR, Buildup)
- indicator_id → product_id in models, APIs, and frontend
- /api/indicators → /api/eo-products
- All user-facing text updated
- Frontend page/element IDs updated
- 27 tests passing
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Critical fixes:
- Memory: compute_seasonal_stats_pixel uses Welford's online algorithm
instead of stacking all bands in RAM (prevents OOM at native res)
- Memory: worker releases z-score rasters from indicators after
compound signal detection via release_rasters()
Important fixes:
- Extract _compute_spatial_completeness, _classify_zscore,
_compute_trend_zscore to BaseIndicator (was copy-pasted 4x)
- Remove fake mean_obs_per_composite=5.0 — confidence model is now
3-factor (temporal, baseline depth, spatial completeness)
- overview.py factors anomaly_months into composite score penalty
- Worker zoom: order=1 (bilinear) and upsample to finest resolution
instead of downsampling to coarsest
- Water chart: compute baseline from water fractions directly instead
of misleadingly scaling raw MNDWI values
- Buildup _compute_stats docstring consistency
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthrop…
feat: add cross-indicator compound signal detection
KSvend+1: Claude Opus 4.6 (1M context)
ae4c60c
Implements compound signal module with 4 detection patterns:
- land_conversion: NDVI decline + settlement growth
- flood_event: SAR backscatter decrease + water increase
- drought_stress: NDVI decline + water decline + SAR increase
- displacement_pressure: settlement growth adjacent to vegetation loss
Includes overlap calculation, confidence tagging, and comprehensive tests.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat: add four-factor confidence scoring model
KSvend
cbe084f
feat: add pixel-level change detection with z-scores and hotspot clustering
KSvend+1: Claude Opus 4.6 (1M context)
aa09e0b
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat: add seasonal baseline computation module
KSvend+1: Claude Opus 4.6 (1M context)
03db879
Implements core seasonal baseline functionality for EO anomaly detection:
- group_bands_by_calendar_month: Maps multi-year band indices to calendar months
- compute_seasonal_stats_aoi: Computes per-month AOI-level stats from baseline raster
- compute_seasonal_stats_pixel: Computes per-pixel statistics across bands
- compute_zscore: Computes z-scores with std-floor to avoid division-by-zero
All 6 tests pass.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>