@@ -125,22 +125,6 @@ OpenFarm **Phase 5 (Historical Data Backfill) is complete**. The platform delive
125125- [x] Alembic migrations for detected boundaries, nullable job field_id, updated_at
126126- [x] i18n translations (English + Spanish) for all detection UI
127127
128- ## Milestone 9 — Historical Data Backfill ✅
129-
130- - [x] Backfill orchestrator task — splits 24-month range into 90-day chunks, dispatches one job per (chunk × index) with staggered countdowns
131- - [x] Chunk-level and index-level deduplication — skips chunks/indices where raster data already exists
132- - [x] Alert suppression — backfill pipeline runs do not create alerts (` is_backfill ` flag in ` params_json ` )
133- - [x] Auto-trigger on field creation — new fields automatically get 24 months of all 4 vegetation indices
134- - [x] Weekly auto-compute Celery Beat schedule (` schedule_weekly_index_compute ` ) — Monday 06:00 UTC, skips fresh fields
135- - [x] Manual backfill API: ` POST /fields/{id}/backfill-indices ` (admin/owner, rate-limited 1/min)
136- - [x] Backfill status API: ` GET /fields/{id}/backfill-status ` — pending, running, completed job counts
137- - [x] Endpoint-level deduplication — 409 Conflict if backfill already in progress
138- - [x] Sentinel job pattern — synchronous placeholder job before async dispatch to prevent race conditions
139- - [x] Batch backfill task (` backfill_all_existing_fields ` ) for retroactive backfill of all org fields
140- - [x] Backfill History button on Indices tab with active-backfill detection and progress banner
141- - [x] Config settings: ` index_backfill_months ` (24), ` index_backfill_chunk_days ` (90)
142- - [x] i18n translations (English + Spanish) for all backfill UI strings
143-
144128## Milestone 8 — Weather Data Integration ✅
145129
146130- [x] ` weather_daily ` table with 18 raw variables + 5 derived indices + metadata
@@ -163,6 +147,22 @@ OpenFarm **Phase 5 (Historical Data Backfill) is complete**. The platform delive
163147- [x] Config settings: Open-Meteo URLs, backfill days, batch size, GDD base temp, heat stress threshold
164148- [x] i18n translations (English + Spanish) for all weather UI strings
165149
150+ ## Milestone 9 — Historical Data Backfill ✅
151+
152+ - [x] Backfill orchestrator task — splits 24-month range into 90-day chunks, dispatches one job per (chunk × index) with staggered countdowns
153+ - [x] Chunk-level and index-level deduplication — skips chunks/indices where raster data already exists
154+ - [x] Alert suppression — backfill pipeline runs do not create alerts (` is_backfill ` flag in ` params_json ` )
155+ - [x] Auto-trigger on field creation — new fields automatically get 24 months of all 4 vegetation indices
156+ - [x] Weekly auto-compute Celery Beat schedule (` schedule_weekly_index_compute ` ) — Monday 06:00 UTC, skips fresh fields
157+ - [x] Manual backfill API: ` POST /fields/{id}/backfill-indices ` (admin/owner, rate-limited 1/min)
158+ - [x] Backfill status API: ` GET /fields/{id}/backfill-status ` — pending, running, completed job counts
159+ - [x] Endpoint-level deduplication — 409 Conflict if backfill already in progress
160+ - [x] Sentinel job pattern — synchronous placeholder job before async dispatch to prevent race conditions
161+ - [x] Batch backfill task (` backfill_all_existing_fields ` ) for retroactive backfill of all org fields
162+ - [x] Backfill History button on Indices tab with active-backfill detection and progress banner
163+ - [x] Config settings: ` index_backfill_months ` (24), ` index_backfill_chunk_days ` (90)
164+ - [x] i18n translations (English + Spanish) for all backfill UI strings
165+
166166---
167167
168168## Future Ideas (Post-MVP)
0 commit comments