# 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](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: 1. Replace mock worker with real STAC + ML pipeline 2. Deploy tiler 3. Build frontend 4. Add quotas + caching This SRS defines execution boundaries for Roo Code.