Module 4
Deforestation Risk Assessment
Purpose#
Classifies each farm plot against forest cover change data since 31 December 2020 — the EUDR cutoff date. Every plot 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. Plot is EUDR-eligible. |
| medium | Minor change; below non-compliance threshold. Plot is EUDR-eligible with monitoring note. |
| high | Significant forest loss. Plot is non-compliant until remediated. |
| critical | Confirmed deforestation. Plot is non-compliant. DDS cannot include this plot. |
| pending | Assessment requested; awaiting provider response. |
| unavailable | Provider could not assess (e.g. cloud cover, missing geometry). |
Assessment triggers#
| Trigger | Notes |
|---|---|
| Plot creation | Assessment is automatically requested when a plot polygon is first saved. |
| Plot 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 plot 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 plot 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#
Plots 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 plot) | 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 plot. 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. |