Commit History
-
fix: sanitize NaN/inf floats to prevent JSON serialization crashes
KSvend +1: Claude Opus 4.6 (1M context)SAR (and potentially other EO products) produce NaN/inf from nanmean on empty pixel slices. These values crash json.dumps() in both the database write path and the API response path. Adds sanitize_for_json() utility that recursively replaces NaN/inf with 0.0, applied at three levels: - ProductResult model_validator (catches on construction) - Database save_job_result (catches on storage) - API get_job endpoint (catches on response) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>2850a7e -
fix: accept legacy indicator_id/indicator_ids from old database records
KSvend +1: Claude Opus 4.6 (1M context)The rename to product_id/product_ids broke deserialization of existing jobs stored in SQLite. Add model_validators to accept both old and new field names. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>09fc02d
-
refactor: rename "indicators" to "EO products" throughout
KSvend +2: Claude, HappyFull 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>df6bf75 -
feat: add anomaly, hotspot, confidence fields to IndicatorResult; add CompoundSignal model
KSvend87be95e -
fix: use MAX_AOI_KM2 from config instead of hardcoded 10,000 km² in models
KSvend +2: Claude, HappyBackend now enforces the same 500 km² limit shown in config.py. Previously models.py had its own MAX_AREA_KM2 = 10,000 constant that was never connected to the configurable value. 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>31cdc2e -
feat: add ANTHROPIC_API_KEY config and AoiAdviceRequest model
KSvend7534962 -
refactor: strip to 4 real EO indicators, remove all tests and mock fallbacks
KSvend +2: Claude, HappyKeep only NDVI, Water (MNDWI), SAR, and Built-up — the four indicators with full openEO batch pipelines. Remove 8 unused indicators, all test files, and every placeholder/fallback path. Failures now propagate as errors instead of silently returning synthetic data. - Delete: cropland, fires, food_security, lst, nightlights, no2, rainfall, vegetation - Delete: entire tests/ directory - Remove _fallback() from all indicators — process() raises on failure - Remove harvest() fallback-to-placeholder on current data failure - Worker no longer falls back to process() when batch submit fails - Remove placeholder caveat from narrative engine and PDF report - Re-weight overview scores for 4 indicators (ndvi 0.30, sar 0.25, water 0.25, buildup 0.20) - Remove build_lst_graph from openeo_client 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>c42be1f
-
feat: add season_start/season_end to JobRequest with wrap support
KSvend +2: Claude, HappyGenerated 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>1b15a5f
-
feat: fix nightlights with real VIIRS data + placeholder data warnings
KSvend +2: Claude, HappyNightlights indicator now reads real radiance from Planetary Computer HREA light-composite COGs (no auth), with NASA Black Marble VNP46A4 as a second source (free Earthdata creds), falling back to synthetic. All 9 indicators now report whether they used real satellite data or placeholder values via a new data_source field on IndicatorResult. The frontend shows an amber "Placeholder data" badge on result cards, and the PDF report includes a per-indicator warning when placeholder data was used. 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>619edca -
Initial commit: Aperture platform (extracted from SR4S)
KSvendae74af5