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.

AssessmentScopeDefaultEnables
coreingestionoffConfidence score, geometric checks, facility plausibility
hazardingestionoffNatural hazard risk (fire, flood, drought, pest)
biodiversityingestionoffLandscape integrity, fragmentation, protected-area proximity
wateringestionoffClimatic water stress + seasonal water deficit
luc_emissionsingestionoffLand-cover change and the emissions it implies
infrastructureingestionoffWater / port / road distances
art9DDS createoffIsochrone deforestation analysis
art10DDS createoffLegality risk screening + EUDR country tier

Where to opt in:

  • Ingestion-scope (core, hazard, biodiversity, water, luc_emissions, infrastructure, deforestation_screen) โ€” drive via the assessments block on POST /ingestions/assets (upload) or PUT /ingestions/assets (post-hoc, filter-scoped). biodiversity / water opt in via include_biodiversity / include_water (EPO-1810), luc_emissions via include_luc_emissions; deforestation_screen via include_deforestation (see the next bullet).
  • Ingestion-scope deforestation / legality โ€” include_deforestation (validation-time commodity-mask check) and include_legality (AI legality screen) are also set on the ingestion assessments block. Both write art9-group columns (deforestation_value, legality_*); include_deforestation additionally writes the core confidence_level that the metric_confidence_levels gate reads, and produces the deforestation_screen row and its by_assessment entry. It is the flag to use for that group on upload โ€” the separable include_deforestation_screen reaches the same sco2api primitive but is honoured only on the reprocess PUT, under eudr:write. Strict opt-in like everything else.
  • EUDR-scope (art9, art10) โ€” drive independently at upload via include_art9 / include_art10 on the assessments block (EPO-1808), or together via include_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. The include_eudr shorthand remains DDS-only โ€” the ingestion endpoints silently strip it rather than 400'ing.

core โ€” confidence + geometric validity

Question: Does this location look real, and how confident are we?

core produces a single confidence score by combining three families of signals:

  1. 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.
  2. 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?
  3. 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 / overall aggregate summaries with investigate[] 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)

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:

  1. Builds an isochrone around the location (a travel-time / distance buffer that approximates the catchment).
  2. Runs the deforestation pipeline over that buffer.
  3. 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)

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:

  1. 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.
  2. Looking up the EUDR country risk tier (high | standard | low) โ€” the European Commission's published benchmarking that drives the depth of due diligence required.
  3. 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

Question: 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

Question: 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

Question: 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

Question: 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

Question: 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):

CheckBoolean on coreDistance on infrastructure
check_water_accesswater_accessnearest_water_km
check_port_proximityport_proximitynearest_port_km
check_road_accessroad_accessnearest_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: true and nothing else.
  • EUDR DDS โ€” art9 and art10 are driven on the DDS create path (plot-scope, async). Pair with ingestion-scope include_core: true at 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-scope art9/art10 are produced by (re)creating an audit-trail record via POST /regulations/eudr/audit-trail. Each group is its own row, so adding hazard later 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 under relationships.assessments.attributes.{group} when include=assessment[s] is requested โ€” under ingestions:read / locations:read.
  • EUDR-scope rows (art9, art10, eudr_profile) are surfaced on the same response, gated behind assessments:read (this reverses the earlier split that kept them on the audit-trail surface only). Without that scope the three slots come back null. The headline legality_risk_level / article10_risk_level are 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.