Assessments Overview
Every staged location goes through a pipeline of independent assessments. Each one answers a different question about the location and writes its result into its own row, surfaced under relationships.assessments.attributes.{group} in API responses. This page explains what each assessment actually does โ its purpose, the signals it uses, and when to opt in.
For the field-by-field reference (what keys each row carries), see assessment-fields.md. For the API contract โ read/refresh URL surface, slug map, filter matrix, refresh semantics, and the DDS audit-log interaction โ see Assessments API. For the request-level toggle shape, see Ingest Assets.
| Assessment | Scope | Default | Enables |
|---|---|---|---|
core | ingestion | off | Confidence score, geometric checks, facility plausibility |
hazard | ingestion | off | Natural hazard risk (fire, flood, drought, pest) |
biodiversity | ingestion | off | Landscape integrity, fragmentation, protected-area proximity |
water | ingestion | off | Climatic water stress + seasonal water deficit |
luc_emissions | ingestion | off | Land-cover change and the emissions it implies |
infrastructure | ingestion | off | Water / port / road distances |
art9 | DDS create | off | Isochrone deforestation analysis |
art10 | DDS create | off | Legality risk screening + EUDR country tier |
Where to opt in:
- Ingestion-scope (
core,hazard,biodiversity,water,luc_emissions,infrastructure,deforestation_screen) โ drive via theassessmentsblock onPOST /ingestions/assets(upload) orPUT /ingestions/assets(post-hoc, filter-scoped).biodiversity/wateropt in viainclude_biodiversity/include_water(EPO-1810),luc_emissionsviainclude_luc_emissions;deforestation_screenviainclude_deforestation(see the next bullet). - Ingestion-scope deforestation / legality โ
include_deforestation(validation-time commodity-mask check) andinclude_legality(AI legality screen) are also set on the ingestionassessmentsblock. Both writeart9-group columns (deforestation_value,legality_*);include_deforestationadditionally writes thecoreconfidence_levelthat themetric_confidence_levelsgate reads, and produces thedeforestation_screenrow and itsby_assessmententry. It is the flag to use for that group on upload โ the separableinclude_deforestation_screenreaches the same sco2api primitive but is honoured only on the reprocessPUT, undereudr:write. Strict opt-in like everything else. - EUDR-scope (
art9,art10) โ drive independently at upload viainclude_art9/include_art10on theassessmentsblock (EPO-1808), or together viainclude_legality. The two groups share one legality worker server-side, so either alone costs the same as both; the independence is in what gets reported and persisted. The full Article 9 / 10 assessments also force-run on the DDS create path. Theinclude_eudrshorthand remains DDS-only โ the ingestion endpoints silently strip it rather than 400'ing.
โถcore โ confidence + geometric validity
core โ confidence + geometric validityQuestion: Does this location look real, and how confident are we?
core produces a single confidence score by combining three families of signals:
- Geometric pillars (plot uploads): 15 independent checks on the polygon โ area, vertex precision, self-intersection, neighbour overlap, triangular shape, sub-resolution segments, etc. See location-validation.md ยง Plot Validation.
- Facility plausibility (facility uploads): is the named producer present at the coordinates? Are there matching points of interest (mill, silo, warehouse) nearby? Is there building density / road / water / port access?
- Protected-area overlap: does the geometry intersect a WDPA protected area?
Output (key fields, full list in assessment-fields.md):
confidence_score(0โ1) +confidence_level(low | medium | high)- Per-check counts (
area_too_small_count,self_intersection_count, etc.) plot_validity/overallaggregate summaries withinvestigate[]lists
When to enable: any time you want to flag bad geometry or implausible producer locations before downstream metrics run. include_core defaults to false โ opt in explicitly.
โถart9 โ isochrone deforestation (EUDR Article 9)
art9 โ isochrone deforestation (EUDR Article 9)Question: How much deforestation has happened inside this producer's catchment area, not just the declared plot?
EUDR Article 9 requires due diligence on the supply shed โ the area that materially feeds a facility โ not only the registered plot. art9 runs a separate analysis that:
- Builds an isochrone around the location (a travel-time / distance buffer that approximates the catchment).
- Runs the deforestation pipeline over that buffer.
- Reports the deforestation footprint inside the isochrone polygon.
This is a distinct computation from the plot-level deforestation metric. The plot metric tells you what was lost on the registered field; art9 tells you what was lost in the surrounding region the producer plausibly draws from.
Output: deforestation_value (0โ1 index), deforestation_area_ha, shed_geo (the isochrone polygon; absent on live reads, still present on audit-trail plots and in artifact exports, and read live from /ingestions/assets/{id}/screened-areas).
When to enable: any EUDR DDS submission. Skip for non-EUDR use cases โ it's the most expensive of the assessments. Driven on the DDS create path, not on ingestion.
โถart10 โ legality + country risk (EUDR Article 10)
art10 โ legality + country risk (EUDR Article 10)Question: Is this commodity, from this location, likely to be illegally sourced?
Article 10 requires assessing legality risk along seven dimensions: deforestation/degradation, land rights & indigenous peoples, environmental law, labour & human rights, corruption, sanctions, and supply-chain integrity. art10 produces this assessment by:
- Running a grounded legality search scoped to the commodity and the producer/location, with conservative scoring, source verification, and post-2021 dates only. Both negative (violations) and positive (certifications, compliance) sources are recorded; only negative sources contribute to the risk score.
- Looking up the EUDR country risk tier (
high | standard | low) โ the European Commission's published benchmarking that drives the depth of due diligence required. - Pulling the Transparency International Corruption Perception Index for the country.
Natural events (fires, pests, drought) are explicitly not counted as legality risks โ those belong to hazard.
Output: legality_risk_score (0โ1) + legality_risk_level, a free-text legality_summary, an array of cited legality_sources (title / URL / snippet / sentiment / lat-lon), eudr_country_risk_tier, corruption_perception_index.
When to enable: EUDR DDS, or any compliance workflow that needs documented legality due diligence. Driven on the DDS create path, not on ingestion.
โถhazard โ natural hazard risk
hazard โ natural hazard riskQuestion: What natural events have caused, or are causing, forest cover loss or commodity damage at this location?
Where art10 looks at human-caused risks, hazard looks at the natural ones โ and only those that affect tree cover or commodity production:
- Wildfires that destroyed standing forest or plantations
- Pest & disease outbreaks (bark beetle, emerald ash borer, sudden oak death) causing tree mortality
- Windthrow & storm damage flattening or breaking standing trees
- Drought-induced mortality with visible canopy browning / dieback
Urban infrastructure damage, farmland flooding, and pre-2021 events are excluded. Contained / legacy events are scored conservatively rather than treated as active risk.
This assessment is about distinguishing natural forest loss from human-caused deforestation. If a plot shows significant tree-cover loss but hazard flags an active wildfire in the same area, the loss is more likely a natural disturbance than illegal clearing.
Output: natural_hazard_risk_score (0โ1), natural_hazard_risk_level, free-text natural_hazard_summary, and natural_hazard_sources with cited reports. Each source carries a hazard_type (wildfire | pest_disease | windthrow | drought_mortality | storm) and lat/lon.
Note on scoring: the displayed hazard tier is computed deterministically from satellite/dataset metrics (fire radiative power, flood-zone overlap, water stress, extreme heat, precipitation trend). The narrative score is recorded for transparency but does not drive that tier.
When to enable: when investigating deforestation alerts and you need a way to attribute loss to natural vs human causes; or when underwriting commodity supply for climate-exposed regions.
โถbiodiversity โ landscape-integrity screen
biodiversity โ landscape-integrity screenQuestion: How much intact nature is at stake around this location?
A lightweight screen (no Earth Engine solve) computed from the commodity / natural-forest masks over each location's vicinity: natural-cover fraction, fragmentation (patch count), Rao's Q structural diversity, and โ for hard commodities โ proximity to WDPA protected areas and Intact Forest Landscapes. Enable with include_biodiversity (wire: include_landscape_integrity).
Output: landscape_integrity_score (0โ1, higher = more at stake), landscape_integrity_level (low | moderate | high | severe), landscape_natural_cover_fraction, landscape_patch_count, landscape_rao_q, landscape_wdpa_km, landscape_ifl_km.
When to enable: when screening suppliers for nature-related exposure (e.g. TNFD-style risk columns) alongside the deforestation checks.
โถwater โ climatic water-budget screen
water โ climatic water-budget screenQuestion: How water-stressed is this location's climate?
The fast climatic arm of the water budget: 1 โ P/PET aridity plus the seasonal climatic water deficit, computed from CHIRPS / MOD16 / CHELSA clips. Distinct from the hazard group's water_stress_score (a different worker's baseline signal). Enable with include_water (wire: include_water_budget).
Output: water_budget_score (0โ1, higher = more stressed), water_budget_level (low | moderate | high | severe, aridity-class aligned), water_budget_cwd_mm (seasonal climatic water deficit, mm/yr).
When to enable: when screening for water-stress exposure across a supplier base, or to pair with the biodiversity screen for the full nature-risk column set.
โถluc_emissions โ land-use-change emissions screen
luc_emissions โ land-use-change emissions screenQuestion: What land was converted here, and what does that conversion emit?
Detects land-cover conversion over the assessment window (20 years, or a tree crop's longer cycle) and translates it into tCO2e/yr: conversion emissions plus peat oxidation and fertiliser N2O. For a facility it screens the supply-shed catchment, so it also runs the isochrone. Runs on Earth Engine. Enable with include_luc_emissions.
Output: the change (converted_area_ha, split forest / non-forest, main_lc_transition, lc_transitions) and its emissions equivalent (luc_tco2eyear, intensity_tco2e_ha_year, annual_lc), banded as luc_risk_level (low | medium | high). The band is null when the screen could not attribute the conversion to the commodity (commodity_basis: unscoped) or had no area to measure against. Check factor_basis: global_default means the figure underestimates forest conversion.
When to enable: when a buyer needs the emissions side of land-use change per supplier location. This is the cheap per-location screen; the heavy batch emissions metric is GET /metrics/{type}/emissions.
โถinfrastructure โ distance enrichments
infrastructure โ distance enrichmentsQuestion: How accessible is this location, in kilometres?
The infrastructure row is the numeric companion to the boolean access flags on core: core gets water_access / port_proximity / road_access as booleans; infrastructure gets the underlying distances in km.
The three checks are opt-in via check_* flags (top-level on assessments, not nested):
| Check | Boolean on core | Distance on infrastructure |
|---|---|---|
check_water_access | water_access | nearest_water_km |
check_port_proximity | port_proximity | nearest_port_km |
check_road_access | road_access | nearest_road_km |
Distances are great-circle to the nearest matching feature.
Output: nearest_water_km, nearest_port_km, nearest_road_km โ only the keys whose check_* flag was set. The port check also emits port_road_km (road-routed driving distance), nearest_port_name / nearest_port_address, and GeoJSON nearest_port_point / nearest_water_point.
When to enable: when you need numeric proximity for supply-chain analytics (e.g. ranking facilities by export-port reach), or when downstream consumers want the distance value rather than the boolean.
โถHow they compose
- Standalone โ turn on only what you need. A "geometric sanity check + nothing else" workflow is
include_core: trueand nothing else. - EUDR DDS โ
art9andart10are driven on the DDS create path (plot-scope, async). Pair with ingestion-scopeinclude_core: trueat upload time so the confidence score lands on the same locations. - Re-run later โ ingestion-scope assessments can be added post-hoc via
PUT /ingestions/assets(filter-scoped), and EUDR-scopeart9/art10are produced by (re)creating an audit-trail record viaPOST /regulations/eudr/audit-trail. Each group is its own row, so addinghazardlater doesn't disturb other rows.
โถResponse surfaces
- Ingestion-scope rows (
core,hazard,biodiversity,water,luc_emissions,infrastructure,deforestation_screen) appear on the assets / locations response underrelationships.assessments.attributes.{group}wheninclude=assessment[s]is requested โ underingestions:read/locations:read. - EUDR-scope rows (
art9,art10,eudr_profile) are surfaced on the same response, gated behindassessments:read(this reverses the earlier split that kept them on the audit-trail surface only). Without that scope the three slots come backnull. The headlinelegality_risk_level/article10_risk_levelare promoted onto the relationship and stay ungated. The same rows are also exposed through the audit-trail record endpoints (GET /regulations/eudr/audit-trail/:recordId/plots).
For the full include contract โ request shape, the nested partition envelope, the scope gate, and field references โ see Including assessments on ingestion responses.