Commit History
-
feat: show real indicator overlay on dashboard map + fix downloadsβ
KSvend +1: Claude Opus 4.6 (1M context)The results dashboard map was only tinting the AOI box because the frontend had no handler for map_type="raster" β all four indicators use raster spatial data, so nothing ever rendered. Map overlay: - new app/outputs/spatial_web.raster_to_grid_dict() downsamples the product raster (using NaN-aware block mean) to ~96x96, flips rows to match the frontend's ascending-lat grid convention, and emits explicit matplotlib-colormap hex stops so the browser does not need to know RdYlGn, Blues, PiYG, etc. - _save_spatial_json() converts raster SpatialData through the helper before writing, so indicators return a grid-format payload the existing _renderGrid() already understands - _renderGrid() now prefers backend-provided color stops and fits the map view to the grid extent so the overlay is always visible Download fixes: - authDownload(): anchor is appended to the DOM before .click() and objectURL revocation is deferred β the old synchronous teardown broke in Safari/Firefox aβ¦d2a9a16
-
feat: rich results dashboard with inline sparklines and overviewβ
KSvend +1: Claude Opus 4.6 (1M context)Previously the results page showed only a map and tiny cards with a single headline, so users had to download the PDF to see any actual findings. Every ProductResult already contained chart_data, z-scores, confidence factors, summary text, and limitations β they were just being thrown away by the frontend. Backend: - new GET /api/jobs/{id}/overview serves overview_score.json + compound_signals.json (both already written at job-complete time) Frontend: - new getJobOverview() helper in api.js - results.js rewritten to render: - Overview header: composite score ring, plain-language headline, clickable per-indicator chip strip, compound signals banner - Rich indicator cards with: - name + question, status badge, trend glyph, confidence dot - inline SVG sparkline (baseline envelope, mean line, current line, anomaly markers) β no external chart library - z-score / anomaly months / hotspot % metrics row - full summary paragraph (no truncation) - 4-factor β¦57ba197
-
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 getAoiAdvice API wrapper
KSvend61feaac
-
feat: frontend renders spatial overlays natively in MapLibreβ
KSvend +2: Claude, HappyReplace PNG image overlay with native MapLibre rendering: spatialUrl() added to api.js, map.js gains renderSpatialOverlay/clearSpatialOverlay supporting points (circle layers), choropleth (fill), grid (polygon fill), and status color fallback. results.js updated to fetch JSON from /spatial/ endpoint. 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>337d9e1 -
fix: downloads and map overlays fail auth β use fetch with headersβ
KSvend +2: Claude, HappyDownload links were plain <a href> which don't send auth headers. Map overlay images were passed as URLs to MapLibre which also skips auth. Now all file fetches go through authenticated fetch() calls: - Downloads use blob URLs triggered via buttons - Map overlays fetched as blobs, then passed as blob URLs to MapLibre 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>f37d8a6 -
fix: Content-Type header dropped when authenticated, causing 422 on job submitβ
KSvend +2: Claude, HappyThe spread { ...defaults, ...opts } overwrote the merged headers with opts.headers (which only had Authorization). Now headers are built once and passed as the final 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>73c5feb -
fix: display actual validation error messages instead of [object Object]β
KSvend +2: Claude, HappyFastAPI returns validation errors as an array of objects in detail. Now extracts the msg field from each error for readable display. 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>e8c214d
-
feat: add auth header to API calls, add login and listJobs API functionsβ
KSvend +1: Claude Opus 4.6 (1M context)Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>4f2f97a
-
feat: wire up indicator map layers on results dashboardβ
KSvend +2: Claude, HappySpatial indicators (cropland, vegetation, water) now cache their 2D raster data after processing. The worker generates styled PNG maps via render_indicator_map(), served through a new API endpoint. The frontend overlays these on the results map when clicking indicator cards. - Add SpatialData dataclass and get_spatial_data() to BaseIndicator - Cache NDVI/MNDWI grids in cropland, vegetation, water indicators - Worker generates map PNGs alongside charts during job processing - New GET /api/jobs/{job_id}/maps/{indicator_id} endpoint - Frontend: MapLibre image overlay with graceful fallback for non-spatial indicators - Fix setuptools package discovery in pyproject.toml 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>85f7c19 -
Initial commit: Aperture platform (extracted from SR4S)
KSvendae74af5