Methodology — v1 integrity score

Methodology v1 — calibrating. Last updated 2026-04-22.

KarbonLens scores Indonesian carbon projects on a 0–100 integrity scale. The score is a transparent, configurable framework — not a final formula — and every weight, bucket threshold, and override is reviewed periodically. Weights and overrides below reflect the v0.1 calibration; the canonical implementation lives in lib/score.ts.

The composite is a weighted sum of four sub-scores: reversal risk (35%), validation recency (25%), community flags (20%), and transparency (20%). Sections below specify each sub-score's inputs, bucket thresholds, and rationale, followed by the composite formula and clamping rules.

Reversal risk — 35%

Satellite deforestation alerts from Global Forest Watch over the prior 90 days, intersected with the project buffer. Reversal is the single highest-weighted sub-score because a standing-forest project that has already been cleared cannot deliver its claimed carbon benefit.

Conditions evaluated top-to-bottom; first match wins.

50 — no GFW coverage (unknown-neutral)
Project has no gfw_geostore_id; we cannot confirm or deny alerts, so we award a neutral midpoint rather than penalise.
100 — zero alerts in 90 days
Has GFW coverage and recorded no alerts of any confidence.
85 — zero high-confidence alerts and fewer than 10 total
Minor low/nominal-confidence noise; no elevated concern.
70 — fewer than 5 high-confidence alerts
Localised disturbance; warrants monitoring.
45 — fewer than 20 high-confidence alerts
Material deforestation signal inside the project buffer.
20 — 20 or more high-confidence alerts
Severe, sustained clearing.

Validation recency — 25%

Years elapsed since the project's most recent validation audit. Older validations mean more elapsed time for baseline, methodology, or on-the-ground conditions to drift. See Known limitations below for the PDD-vs-registration-date caveat.

Years since validationScore
Unknown50 — unknown-neutral
< 3 years100
< 5 years85
< 8 years70
< 12 years50
≥ 12 years30

Community flags — 20%

Default 75 for every project. A small hardcoded override list downgrades projects with documented community tension per third-party reports. Community override list will expand in v0.2 based on validated third-party reports.

75 — default (no documented community concern)
Applies to all projects absent from the override list.
45 — Rimba Raya Biodiversity Reserve Project
Slug rimba-raya-biodiversity-reserve-project; documented land-rights and revenue-share disputes.

Transparency — 20%

Registry cross-listings and active status. Projects listed on multiple registries with at least one active listing are the most auditable; unlisted projects are the least.

Registry statusScore
≥ 2 registries and ≥ 1 active85
Exactly 1 registry and 1 active70
≥ 1 registry (none active)55
No registry listings40

Composite score and clamping rules

The integrity score is the weighted sum of the four sub-scores, rounded and clamped to [0, 100]:

integrity = round(
    0.35 * reversal_risk
  + 0.25 * validation_recency
  + 0.20 * community_flags
  + 0.20 * transparency
)

Additional rules:

  • Zero-data trap (cap 60). If registry_count === 0, the composite is capped at 60 regardless of the other sub-scores. A project with no registry listing cannot be independently verified, so it should not reach a high score.
  • No satellite coverage (50 neutral). When gfw_geostore_id IS NULL, reversal_risk defaults to 50 so that an absence of monitoring data is not treated as either a clean record or a red flag.

Known limitations

  • Validation date proxy.Verra's OData API does not expose the PDD validation date directly; we use the project's registry registration date as a proxy. Registration is typically weeks-to-months after on-the-ground validation, so this score is a close but imperfect estimate.
  • Community flags are hardcoded. Until a news sentiment scraper lands in v0.2, only projects on an curator-maintained override list are downgraded. Most projects therefore sit at the 75 default regardless of real-world community standing.
  • Transparency leans on raw Verra status strings. After T06.1 normalised projects.status to the canonical enum, most projects land in the single-registry path (score 70 or 55). v0.2 adds SRN-PPI cross-references so more projects can reach the multi-registry path (85).
  • No automated TS↔Python cross-check. lib/score.ts and scrapers/scoring/weights.py are hand-verified on each change; any drift will surface as a UI vs DB inconsistency.

v0.2 roadmap

v0.2 will re-weight the composite based on calibration against known good and known bad projects, add SRN-PPI cross-references to the transparency sub-score, and introduce additional community signals (news sentiment, land-rights filings) to replace the hardcoded override list.