← GeoAI SkillsCONTENT HISTORY

Update to GeoAI Skills

Snapshot Sep 30, 2026 · 23:13 UTC · version 0.4.0

Collection source: not recorded for this historical snapshot.

WHAT CHANGED · RULE-BASED ANALYSIS

First saved snapshot

No earlier snapshot is available to establish a change.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "name": "change-detection",
  "description": "Change analysis, once the observations are comparable. Not for cases whose blocker is comparability itself: mixed sensors, product levels or processing baselines to remote-sensing-analysis, undocumented vertical datums to point-cloud-lidar, multi-decade archive trends over large areas to google-earth-engine. Matching product level does not prove comparability. Otherwise invoke for what, where or how much changed: two-scene comparison, deforestation, urban growth, disaster damage, parcel-change audits, bi-temporal differencing, post-classification comparison, adjusted area, break detection in a series in hand (BFAST/LandTrendr/CCDC). Seasonal mismatch is this skill's own confounder; a documented datum with a stated accuracy budget is settled comparability. Keep both.",
  "included_files": [
    {
      "relative_path": "agents/openai.yaml",
      "size_in_bytes": 204
    },
    {
      "relative_path": "references/authoritative-sources.md",
      "size_in_bytes": 854
    }
  ],
  "skill_md_contents": "---\nname: change-detection\ndescription: >-\n  Change analysis, once the observations are comparable. Not for cases whose\n  blocker is comparability itself: mixed sensors, product levels or processing\n  baselines to remote-sensing-analysis, undocumented vertical datums to\n  point-cloud-lidar, multi-decade archive trends over large areas to\n  google-earth-engine. Matching product level does not prove comparability.\n  Otherwise invoke for what, where or how much changed: two-scene comparison,\n  deforestation, urban growth, disaster damage, parcel-change audits,\n  bi-temporal differencing, post-classification comparison, adjusted area,\n  break detection in a series in hand (BFAST/LandTrendr/CCDC). Seasonal\n  mismatch is this skill's own confounder; a documented datum with a stated\n  accuracy budget is settled comparability. Keep both.\nlicense: MIT\nmetadata:\n  author: Muhammed Enes Duran\n---\n\n# Change Detection & Spatio-temporal Analysis\n\nPurpose: separate real surface change from the four great impostors —\nmisregistration, radiometric drift, phenology, and classification error.\nEvery method below exists to control one of them; skipping the controls\nproduces confident maps of nothing.\n\n## Preconditions (where change detection is won or lost)\n\nPreconditions 1 and 2 are *checked* here but *established* elsewhere. When\neither fails, the owning skill leads and this skill resumes once comparable\nobservations exist. Precondition 3 is this skill's own problem and is never a\nreason to route away.\n\n1. **Co-registration**: sub-pixel alignment between dates (AROSICS or\n   manual tie-points). Half a pixel of shift creates edge-shaped phantom\n   change everywhere. Verify: flicker-compare crisp features. For elevation\n   surfaces or point clouds, vertical datum agreement, co-registration and\n   the vertical-accuracy budget belong to `point-cloud-lidar` — a datum\n   offset is not subsidence.\n2. **Radiometric consistency**: same processing level (surface\n   reflectance), same sensor, same processing baseline. If any of the three\n   differ, this is a harmonization problem, not a thresholding one: hand it\n   to `remote-sensing-analysis` (HLS for Landsat↔Sentinel-2, relative\n   normalization with PIFs, `BOA_ADD_OFFSET` across the Sentinel-2 2022\n   baseline change).\n3. **Same season / phenological stage** for bi-temporal work — a May vs\n   September pair \"detects\" summer. If season can't be matched, use\n   composites or time-series methods instead.\n4. **Cloud/shadow masks intersected across dates**; analyze only mutually\n   valid pixels and report that coverage %.\n\n## Method selection\n\n| Situation | Method |\n|---|---|\n| Two dates, continuous \"how much\" | Index differencing (ΔNDVI, ΔNBR...) with statistical thresholding |\n| Two dates, categorical \"from-what-to-what\" | Post-classification comparison (only with strong classifiers) |\n| Two dates, multivariate robust | Change vector analysis (CVA); MAD/iMAD for sensor-robust detection |\n| Dense stack, gradual + abrupt | Trend + break analysis (BFAST/LandTrendr/CCDC family; at archive scale → `google-earth-engine`) |\n| Structure change (buildings) | DL bi-temporal segmentation (siamese U-Net) → `geo-deep-learning` |\n| SAR pairs (clouds, disasters) | Log-ratio of calibrated backscatter + speckle handling |\n| Vector vintages (parcels, buildings) | Geometry+attribute diff with tolerance (below) |\n\n## Thresholding — never eyeball it\n\nDifference images need a defensible threshold: μ ± k·σ on the difference\nhistogram (report k), Otsu when bimodal, or supervised thresholds\ncalibrated on labeled change/no-change samples. Deliver the histogram with\nthe chosen cut marked. Sensitivity: report changed-area at k-0.5 and\nk+0.5; if the story flips, the detection is fragile — say so.\n\n## Post-classification comparison (PCC) — handle with care\n\nPCC error compounds: two 90%-accurate maps yield ≤ ~81% change accuracy,\nand biased errors create systematic false transitions. Rules:\n\n- Use ONE classifier trained on both dates' imagery (same legend, same\n  features) rather than two independent legacy maps.\n- Build the full **transition matrix** (from-class → to-class areas), not\n  just a change/no-change binary — impossible transitions (water→forest\n  in 1 year) are your error detector.\n- Apply a minimum mapping unit consistent across dates before differencing.\n\n## Time-series (dense stack) analysis\n\n- Build a gap-filled, cloud-masked index stack (xarray, time dimension).\n- Decompose trend + seasonality + breaks; per-pixel linear trends need\n  significance testing (Mann-Kendall + Sen's slope for monotonic trends —\n  and FDR correction across millions of pixels, or your \"greening map\" is\n  noise).\n- Label break DATES, not just presence — timing is usually the analytic\n  payload (when did clearing start?).\n- Validate detected breaks against known events (fires, construction\n  permits, disaster dates) wherever records exist.\n\n## Vector change audit (two vintages of the same layer)\n\n- Match features by stable ID if it exists; else spatial matching with IoU\n  threshold (report it).\n- Classify: added / removed / geometry-changed (area delta > tolerance) /\n  attribute-changed. Tolerances absorb digitization jitter — 1-2 m for\n  cadastre-grade, more for digitized-from-imagery.\n- Sum area deltas by class and reconcile totals; unexplained residual =\n  matching bugs.\n\n## Accuracy assessment (the deliverable's spine)\n\nChange is rare, so random sampling wastes effort on stable pixels — use\n**stratified sampling** (strata: change/no-change or per-transition) with\ngood-practice area estimation (Olofsson et al. protocol): report\nuser's/producer's accuracy per stratum AND **area estimates with\nconfidence intervals** adjusted for map error. A raw pixel count of the\nchange map is a biased area estimate — always say the adjusted number.\n\n## Reporting template\n\n```\n## Change: <phenomenon>, <T1> → <T2 or period>\n- Data: <sensor/level>, co-registration RMSE: <px>, valid overlap: <%>\n- Method: <...> threshold/params: <...> (sensitivity: <stable/fragile>)\n- Transitions: <matrix or top-5 list with areas ± CI>\n- Accuracy: stratified n=<>, UA/PA per class, adjusted areas ± CI\n- Impostor controls: season <matched?>, radiometry <harmonized?>\n```\n\n## Pitfalls checklist\n\n- Phantom edge-change from misregistration.\n- Seasonal difference sold as land cover change.\n- PCC with two independently produced legacy maps.\n- Threshold chosen \"because it looked right\", no sensitivity.\n- Raw changed-pixel counts reported as area (no error-adjusted estimate).\n- Trend maps without multiple-testing control.\n- SAR change on unfiltered linear-power images.\n\n## Execution contract\n\n- **Workflow:** define the change question; harmonize extent, season, radiometry, resolution, and registration; select method; estimate change; validate; report uncertainty.\n- **Decision rules:** use direct differencing only for comparable continuous signals, post-classification comparison for stable class legends, and time-series methods when a dense temporal stack exists.\n- **Verification protocol:** quantify co-registration, valid overlap, threshold sensitivity, transition accounting, and accuracy-adjusted area with confidence intervals.\n- **Failure modes:** reject causal change claims when season, sensor, clouds, registration, or independent map errors can explain the signal.\n- **Deliverables:** change map, transition or trend table, parameter record, validation sample and metrics, adjusted-area estimate, and limitations.\n- **Source freshness:** consult [the authoritative source registry](references/authoritative-sources.md) before using version-sensitive products or APIs and record the checked date.\n"
}

SHA-256: 75c6d550e0be259964bec900133eb070486e50ccde0d0d8ec146901ed0cf1222