change-detection — Claude Code skill: what it does, how to install
Guides satellite and vector change detection workflows on comparable observations. Separates true land surface dynamics from phenology, registration jitter, and sensor drift.
npx skills add muend/geoai-skills --skill change-detection -a claude-codeWhat change-detection does
The skill instructs the agent on detecting surface changes across comparable raster and vector layers. It targets bi-temporal comparisons, urban expansion, deforestation tracking, disaster impact mapping, and parcel boundary audits. Workflows cover continuous index differencing like ΔNDVI or ΔNBR, multivariate change vector analysis (CVA), dense time-series break detection via BFAST, CCDC, or LandTrendr, and SAR calibrated backscatter log-ratios.
Preconditions govern the workflow. Observations must share matching phenology, sub-pixel co-registration, identical radiometric processing levels, and mutually intersected cloud masks. Half a pixel of misalignment produces phantom change edges across every boundary. The skill forbids guessing thresholds visually, demanding histogram cutoffs like μ ± k·σ or Otsu, accompanied by sensitivity checks at k ± 0.5.
Post-classification comparison requires generating a complete transition matrix to flag impossible category swaps. To prevent biased totals, reported change areas must never rely on direct pixel counts. The agent reports error-adjusted area estimates with confidence intervals following the Olofsson stratified sampling protocol.
What it helps with
- isolate true surface changes from phenological and atmospheric noise
- compute statistical thresholds on index difference rasters
- pinpoint break dates in dense satellite time series via BFAST or CCDC
- audit geometry and attribute shifts between parcel vector vintages
- calculate error-adjusted change area estimates using stratified sampling
Example prompts for the agent
- Calculate ΔNBR between pre-fire and post-fire scenes and apply an Otsu threshold to map burn extent.
- Build a transition matrix between the two land cover rasters and check for implausible class shifts.
- Run break detection on this vegetation index time series and extract the exact clearing dates.
How to install change-detection
1Skills CLI (Vercel)
npx skills add muend/geoai-skills --skill change-detection -a claude-code2Manually: put the files in place
~/.claude/skills/change-detection/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/change-detection/
1Skills CLI (Vercel)
npx skills add muend/geoai-skills --skill change-detection -a codex2Manually: put the files in place
.agents/skills/change-detection/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add muend/geoai-skills --skill change-detection -a cursor2Manually: put the files in place
.cursor/skills/change-detection/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install muend/geoai-skills change-detection2Manually: put the files in place
.github/skills/change-detection/SKILL.md1Skills CLI (Vercel)
npx skills add muend/geoai-skills --skill change-detection -a gemini-cli2Platform CLI
gemini skills install https://github.com/muend/geoai-skills --path skills/change-detectionManually: put the files in place
.devin/skills/change-detection/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add muend/geoai-skills --skill change-detection -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about change-detection
How do I install change-detection in Claude Code?
Run npx skills add muend/geoai-skills --skill change-detection -a claude-code.
What does change-detection do?
It guides agents through detecting bi-temporal and time-series changes in geospatial data while controlling for misregistration, seasonal shifts, and sensor differences.
Why does the skill reject raw pixel counts for area estimation?
Direct pixel summation yields biased area estimates due to classification error. The skill enforces stratified sampling with error-adjusted intervals based on the Olofsson protocol.
Source text
SKILL.md · MIT
--- 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. license: MIT metadata: author: Muhammed Enes Duran --- # Change Detection & Spatio-temporal Analysis Purpose: separate real surface change from the four great impostors — misregistration, radiometric drift, phenology, and classification error. Every method below exists to control one of them; skipping the controls produces confident maps of nothing. ## Preconditions (where change detection is won or lost) Preconditions 1 and 2 are *checked* here but *established* elsewhere. When either fails, the owning skill leads and this skill resumes once comparable observations exist. Precondition 3 is this skill's own problem and is never a reason to route away. 1. **Co-registration**: sub-pixel alignment between dates (AROSICS or manual tie-points). Half a pixel of shift creates edge-shaped phantom change everywhere. Verify: flicker-compare crisp features. For elevation surfaces or point clouds, vertical datum agreement, co-registration and the vertical-accuracy budget belong to `point-cloud-lidar` — a datum offset is not subsidence. 2. **Radiometric consistency**: same processing level (surface reflectance), same sensor, same processing baseline. If any of the three differ, this is a harmonization problem, not a thresholding one: hand it to `remote-sensing-analysis` (HLS for Landsat↔Sentinel-2, relative normalization with PIFs, `BOA_ADD_OFFSET` across the Sentinel-2 2022 baseline change). 3. **Same season / phenological stage** for bi-temporal work — a May vs September pair "detects" summer. If season can't be matched, use composites or time-series methods instead. 4. **Cloud/shadow masks intersected across dates**; analyze only mutually valid pixels and report that coverage %. ## Method selection | Situation | Method | |---|---| | Two dates, continuous "how much" | Index differencing (ΔNDVI, ΔNBR...) with statistical thresholding | | Two dates, categorical "from-what-to-what" | Post-classification comparison (only with strong classifiers) | | Two dates, multivariate robust | Change vector analysis (CVA); MAD/iMAD for sensor-robust detection | | Dense stack, gradual + abrupt | Trend + break analysis (BFAST/LandTrendr/CCDC family; at archive scale → `google-earth-engine`) | | Structure change (buildings) | DL bi-temporal segmentation (siamese U-Net) → `geo-deep-learning` | | SAR pairs (clouds, disasters) | Log-ratio of calibrated backscatter + speckle handling | | Vector vintages (parcels, buildings) | Geometry+attribute diff with tolerance (below) | ## Thresholding — never eyeball it Difference images need a defensible threshold: μ ± k·σ on the difference histogram (report k), Otsu when bimodal, or supervised thresholds calibrated on labeled change/no-change samples. Deliver the histogram with the chosen cut marked. Sensitivity: report changed-area at k-0.5 and k+0.5; if the story flips, the detection is fragile — say so. ## Post-classification comparison (PCC) — handle with care PCC error compounds: two 90%-accurate maps yield ≤ ~81% change accuracy, and biased errors create systematic false transitions. Rules: - Use ONE classifier trained on both dates' imagery (same legend, same features) rather than two independent legacy maps. - Build the full **transition matrix** (from-class → to-class areas), not just a change/no-change binary — impossible transitions (water→forest in 1 year) are your error detector. - Apply a minimum mapping unit consistent across dates before differencing. ## Time-series (dense stack) analysis - Build a gap-filled, cloud-masked index stack (xarray, time dimension). - Decompose trend + seasonality + breaks; per-pixel linear trends need significance testing (Mann-Kendall + Sen's slope for monotonic trends — and FDR correction across millions of pixels, or your "greening map" is noise). - Label break DATES, not just presence — timing is usually the analytic payload (when did clearing start?). - Validate detected breaks against known events (fires, construction permits, disaster dates) wherever records exist. ## Vector change audit (two vintages of the same layer) - Match features by stable ID if it exists; else spatial matching with IoU threshold (report it). - Classify: added / removed / geometry-changed (area delta > tolerance) / attribute-changed. Tolerances absorb digitization jitter — 1-2 m for cadastre-grade, more for digitized-from-imagery. - Sum area deltas by class and reconcile totals; unexplained residual = matching bugs. ## Accuracy assessment (the deliverable's spine) Change is rare, so random sampling wastes effort on stable pixels — use **stratified sampling** (strata: change/no-change or per-transition) with good-practice area estimation (Olofsson et al. protocol): report user's/producer's accuracy per stratum AND **area estimates with confidence intervals** adjusted for map error. A raw pixel count of the change map is a biased area estimate — always say the adjusted number. ## Reporting template ``` ## Change: <phenomenon>, <T1> → <T2 or period> - Data: <sensor/level>, co-registration RMSE: <px>, valid overlap: <%> - Method: <...> threshold/params: <...> (sensitivity: <stable/fragile>) - Transitions: <matrix or top-5 list with areas ± CI> - Accuracy: stratified n=<>, UA/PA per class, adjusted areas ± CI - Impostor controls: season <matched?>, radiometry <harmonized?> ``` ## Pitfalls checklist - Phantom edge-change from misregistration. - Seasonal difference sold as land cover change. - PCC with two independently produced legacy maps. - Threshold chosen "because it looked right", no sensitivity. - Raw changed-pixel counts reported as area (no error-adjusted estimate). - Trend maps without multiple-testing control. - SAR change on unfiltered linear-power images. ## Execution contract - **Workflow:** define the change question; harmonize extent, season, radiometry, resolution, and registration; select method; estimate change; validate; report uncertainty. - **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. - **Verification protocol:** quantify co-registration, valid overlap, threshold sensitivity, transition accounting, and accuracy-adjusted area with confidence intervals. - **Failure modes:** reject causal change claims when season, sensor, clouds, registration, or independent map errors can explain the signal. - **Deliverables:** change map, transition or trend table, parameter record, validation sample and metrics, adjusted-area estimate, and limitations. - **Source freshness:** consult [the authoritative source registry](references/authoritative-sources.md) before using version-sensitive products or APIs and record the checked date.
© Muhammed Enes Duran · MIT · muend/geoai-skills