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 validation | Score |
|---|---|
| Unknown | 50 — unknown-neutral |
| < 3 years | 100 |
| < 5 years | 85 |
| < 8 years | 70 |
| < 12 years | 50 |
| ≥ 12 years | 30 |
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 status | Score |
|---|---|
| ≥ 2 registries and ≥ 1 active | 85 |
| Exactly 1 registry and 1 active | 70 |
| ≥ 1 registry (none active) | 55 |
| No registry listings | 40 |
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.statusto 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.tsandscrapers/scoring/weights.pyare 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.