Module 4
Deforestation Risk Assessment
Purpose#
Classifies each farm against forest cover change data since 31 December 2020 — the EUDR cutoff date. Every farm must have a risk status before the EUDR Compliance module can compute a compliance record for the owning farmer.
Risk levels#
| Level | EUDR implication |
|---|---|
| low | No deforestation detected. Farm is EUDR-eligible. |
| medium | Minor change; below non-compliance threshold. Farm is EUDR-eligible with monitoring note. |
| high | Significant forest loss. Farm is non-compliant until remediated. |
| critical | Confirmed deforestation. Farm is non-compliant. DDS cannot include this farm. |
| pending | Assessment requested; awaiting provider response. |
| unavailable | Provider could not assess (e.g. cloud cover, missing geometry). |
Assessment triggers#
| Trigger | Notes |
|---|---|
| Farm creation | Assessment is automatically requested when a farm polygon is first saved. |
| Farm polygon edit | Any geometry change re-triggers an assessment (polygon snapshot is stored). |
| Periodic schedule | Default: annual re-assessment. Configurable per organisation. |
| Manual request | Sustainability Officer or District Manager can request a fresh assessment at any time. |
Polygon snapshot#
Each assessment record stores an immutable snapshot of the exact geometry that was evaluated. This means historical assessments are accurate even if the farm polygon is later edited. The audit trail shows geometry version alongside risk result.
Deforestation data provider#
Phase 1 uses the Global Forest Watch (GFW) API to compare farm polygons against the Hansen Global Forest Change dataset. The provider is abstracted behind a ProviderAdapter interface, so the data source can be swapped without changing the risk assessment service.
// Conceptual ProviderAdapter interface
interface DeforestationProviderAdapter {
assess(polygon: GeoJSON.Polygon, cutoffDate: Date): Promise<AssessmentResult>;
}
// Phase 1 implementation
class GlobalForestWatchAdapter implements DeforestationProviderAdapter {
async assess(polygon, cutoffDate) { /* calls GFW API */ }
}
// Injected into the risk assessment service
class RiskAssessmentService {
constructor(private provider: DeforestationProviderAdapter) {}
}Remediation workflow#
Farms with high or critical risk enter a remediation workflow. Two paths are available:
| Path | When to use | Outcome |
|---|---|---|
| Counter-evidence dispute | When the officer believes the assessment is incorrect (e.g. it covers a different farm) | Upload counter-evidence (images, documents) for review by District Manager. Risk may be overridden. |
| Corrective action | When deforestation is confirmed but the organisation is taking action | Record actions taken, expected completion date, and evidence. Risk status updated once verified. |
Risk override#
District Managers and Entity Admins can manually override the effective risk level for a farm. An override requires:
- →Mandatory justification text (minimum 50 characters).
- →Selection of the new effective risk level.
- →Confirmation that the override will be recorded in the immutable audit trail.
Packages#
| Package | Type | Key exports |
|---|---|---|
@repo/feature-deforestation-risk | Backend | Services: risk-assessment, remediation, risk-override, notification, risk-summary; ProviderAdapter interface |
@repo/feature-deforestation-risk-web | Frontend | Risk override UI, remediation workflow, notifications panel |
API routes#
| Route | Notes |
|---|---|
| /api/assessments | CRUD and request new assessments. |
| /api/remediations | Create and manage remediation records. |
| /api/risk-overrides | Apply and view risk overrides. |
| /api/risk-summary | Aggregate risk stats by org/region/district. |
| /api/notifications | Deforestation risk notifications. |