7.0 KiB
Software Requirements Specification (SRS) & Development Context
Project: GeoCrop Platform Format: Modified IEEE Std 830-1998 (Optimized for AI Agent / Roo Code Initialization) Date: February 2026
1. Introduction
1.1 Purpose
This document defines the Software Requirements Specification (SRS) for the GeoCrop Platform.
⚠️ This document also serves as the master initialization and execution context for Roo Code (AI agent). It explicitly states:
- What infrastructure already exists and must NOT be rebuilt
- What services are live and working
- What remains to be implemented
- Architectural constraints that must be respected
Roo must treat the infrastructure layer as stable and focus on application-layer implementation.
1.2 Scope
GeoCrop is a cloud-native web application designed to generate refined Land Use and Land Cover (LULC) maps for regions in Zimbabwe.
The system:
- Uses satellite imagery from the Digital Earth Africa (DEA) STAC API
- Uses Dynamic World (DW) seasonal baselines
- Applies custom ML models for crop refinement
- Is geographically restricted to Zimbabwe only
- Is spatially restricted to maximum 5km AOI radius
- Is deployed on a self-managed K3s Kubernetes cluster
Outputs are delivered as:
- Refined LULC GeoTIFF (10m resolution)
- Optional supporting rasters (DW baseline, indices, true color)
2. Current System State (Already Built — Do Not Rebuild)
⚠️ ATTN ROO CODE: Infrastructure is complete and running. Do NOT recreate cluster, ingress, TLS, or storage.
2.1 Infrastructure & Networking
-
K3s cluster (1 control plane, 2 workers)
-
NGINX Ingress Controller active
-
cert-manager with Let’s Encrypt Production ClusterIssuer
-
All domains operational over HTTPS:
- portfolio.techarvest.co.zw
- api.portfolio.techarvest.co.zw
- minio.portfolio.techarvest.co.zw
- console.minio.portfolio.techarvest.co.zw
2.2 Live Services (Namespace: geocrop)
MinIO (minio)
-
S3-compatible object storage
-
Buckets (planned/partially used):
- geocrop-baselines
- geocrop-models
- geocrop-results
- geocrop-datasets
Redis (redis)
- Used as message broker for asynchronous ML tasks
- Queue name: geocrop_tasks
FastAPI Backend (geocrop-api)
- Live and publicly accessible
- JWT authentication functional
- Accepts AOI payload (Lat, Lon, Radius)
- Pushes async tasks to Redis
- Returns job_id
Python RQ Worker (geocrop-worker)
- Live and listening to Redis queue
- Currently runs mock inference using time.sleep()
- Returns hardcoded JSON result
Dynamic World Baselines
- DW seasonal GeoTIFFs successfully migrated from Google Drive
- Converted to Cloud Optimized GeoTIFFs (COGs)
- Stored locally and ready for MinIO upload
3. Development Objectives for Roo Code
Primary Objective: Replace mock pipeline with real geospatial + ML processing.
Phase 1 — Real Worker Pipeline
3.1 STAC Integration
Worker must:
-
Query DEA STAC endpoint: https://explorer.digitalearth.africa/stac/search
-
Filter by:
- AOI geometry (circle polygon)
- Date range: Summer Cropping Season = Sept 1 – May 30 (must match model training window exactly)
- Year range: 2015 – Present
-
Use Sentinel-2 L2A collection (initial version)
⚠️ Correct seasonal window: Sept 1 – May 30 (not Sept–May)
3.2 Feature Engineering
Worker must compute:
- True Color composite
- NDVI
- EVI
- SAVI
- Peak NDVI/EVI/SAVI (seasonal max)
Feature consistency must match training feature_list.json.
3.3 ML Inference
Worker must:
-
Load selected model from MinIO (geocrop-models bucket)
-
Load:
- model.pkl
- feature_list.json
- scaler.pkl (if used)
- label_encoder.json
-
Validate feature alignment
-
Run inference
3.4 Neighborhood Smoothing
Implement configurable majority filter:
- Default: 3x3 kernel
- Optional: 5x5
Rule: If pixel class confidence is low AND surrounded by strong majority → flip to majority.
3.5 Output Generation
Worker must:
- Export refined output as Cloud Optimized GeoTIFF (COG)
- Save to MinIO under: geocrop-results/jobs/{job_id}/refined.tif
Optional outputs:
- truecolor.tif
- ndvi_peak.tif
- dw_clipped.tif
Phase 2 — Tile Service (TiTiler)
Deploy geocrop-tiler service:
- Reads COGs from MinIO
- Serves XYZ tiles
- Exposed via tiles.portfolio.techarvest.co.zw
Requirement:
- Sub-second tile latency
Phase 3 — React Frontend
Frontend must:
- Implement JWT login
- AOI selection via Leaflet
- Radius limit 5km
- Zimbabwe boundary validation
- Year dropdown (2015–present)
- Model dropdown
- Submit job to API
- Poll status endpoint
- Render layers via tile server
- Download GeoTIFF via signed URL
Map Layers:
- Refined ML LULC
- Dynamic World baseline
- True Color
- Peak NDVI/EVI/SAVI
Legend required.
4. Functional Requirements
4.1 Authentication & Quotas
REQ-1.1: JWT authentication required. REQ-1.2: Standard users limited to 5 jobs per 24 hours. REQ-1.3: Global concurrency cap = 2 running jobs cluster-wide. REQ-1.4: Admin users bypass quotas.
4.2 AOI Validation
REQ-2.1: AOI must fall strictly within Zimbabwe boundary (GeoJSON boundary file required). REQ-2.2: Radius must be ≤ 5km. REQ-2.3: Reject complex polygons exceeding vertex threshold.
4.3 Job Pipeline
REQ-3.1: API queues job in Redis. REQ-3.2: Worker processes job asynchronously. REQ-3.3: Worker saves COG outputs to MinIO. REQ-3.4: API generates signed URL for download. REQ-3.5: Deterministic cache key must be implemented:
Hash(year + season + model_version + lat + lon + radius)
If identical request exists → return cached result.
4.4 Admin Operations
REQ-4.1: Admin upload dataset to geocrop-datasets bucket. REQ-4.2: Admin trigger retraining via Kubernetes Job. REQ-4.3: Model registry must store:
- model_name
- version
- training_date
- features_used
- class_mapping
5. External Interfaces
5.1 DEA STAC API
HTTPS-based STAC search queries.
5.2 MinIO S3 API
All object storage via signed S3 URLs.
5.3 Optional Historical Weather API
Used to enrich metadata (not required for MVP).
6. Performance & Security Attributes
- GET /jobs/{id} response < 500ms
- ML job timeout = 25 minutes
- Tile latency < 1 second
- All traffic via HTTPS
- MinIO private
- Signed URLs only
- Secrets stored as Kubernetes Secrets
7. Architectural Clarifications for Roo
- Namespace: geocrop
- Ingress class: nginx
- ClusterIssuer: letsencrypt-prod
- Do NOT rebuild cluster
- Do NOT expose MinIO publicly
- Do NOT bypass quota logic
8. Future Enhancements (Post-MVP)
- Postgres for persistent user/job storage
- Confidence raster layer
- Area statistics panel
- Model comparison mode
- Side-by-side DW vs Refined slider
Summary
Infrastructure is complete.
Next focus:
- Replace mock worker with real STAC + ML pipeline
- Deploy tiler
- Build frontend
- Add quotas + caching
This SRS defines execution boundaries for Roo Code.