← 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": "mcda-suitability-analysis",
  "description": "Always invoke for spatial suitability, site selection, AHP, criteria weights, or weighted-overlay work, including audits of inconsistent pairwise judgments and requests for only a final map. Covers consistency, standardization, constraints, ranked surfaces, shortlists, and sensitivity. Route travel-time placement and location-allocation to network-accessibility-analysis.",
  "included_files": [
    {
      "relative_path": "agents/openai.yaml",
      "size_in_bytes": 229
    },
    {
      "relative_path": "references/authoritative-sources.md",
      "size_in_bytes": 867
    },
    {
      "relative_path": "scripts/ahp_weights.py",
      "size_in_bytes": 2846
    }
  ],
  "skill_md_contents": "---\nname: mcda-suitability-analysis\ndescription: >-\n  Always invoke for spatial suitability, site selection, AHP, criteria\n  weights, or weighted-overlay work, including audits of inconsistent\n  pairwise judgments and requests for only a final map. Covers consistency,\n  standardization, constraints, ranked surfaces, shortlists, and sensitivity.\n  Route travel-time placement and location-allocation to\n  network-accessibility-analysis.\nlicense: MIT\nmetadata:\n  author: Muhammed Enes Duran\n---\n\n# MCDA & Suitability Analysis\n\nPurpose: produce suitability maps whose weights, scales, and assumptions are\nexplicit, consistent, and stress-tested. A suitability map without a\nsensitivity analysis is an opinion with a legend.\n\n## Workflow\n\n1. **Structure**: goal → criteria (factors) → constraints. Constraints are\n   binary masks (legal exclusions, water bodies, slope > threshold) applied\n   at the END by multiplication; factors are continuous and weighted.\n   Keep them apart — encoding a constraint as a heavily-weighted factor is\n   a classic error that lets forbidden areas score \"acceptable\".\n2. **Criteria layers**: each factor as a raster on a COMMON grid (same CRS,\n   extent, cell size, snap). Resample categorical layers with nearest,\n   continuous with bilinear; document each.\n3. **Standardization** to a common suitability scale (0-1 or 0-255):\n   - Linear min-max for monotonic \"more is better/worse\".\n   - Fuzzy membership (sigmoid/linear with control points) when suitability\n     saturates — justify control points from domain knowledge.\n   - Categorical layers: explicit reclass table, shown to the user.\n   Direction check: confirm for EVERY layer whether high raw value means\n   high or low suitability (slope: low=good; distance-to-road: usually\n   low=good). Direction bugs survive to the final map invisibly.\n4. **Weights** (AHP below, or direct/ranked methods with rationale).\n5. **Aggregation**: weighted linear combination (WLC) default; OWA when\n   the decision-maker's risk attitude (AND-like vs OR-like) matters.\n6. **Constraint mask** multiply; classify the result (equal interval or\n   quantiles — say which and why); **sensitivity analysis**; validate\n   against known good/bad sites if any exist.\n\n## AHP with consistency enforcement\n\nPairwise comparisons on Saaty's 1-9 scale; weights from the principal\neigenvector; consistency ratio (CR) must be < 0.10 or the matrix goes back\nfor revision. Run `scripts/ahp_weights.py` to compute weights + CR from a\nreciprocal comparison matrix (it validates reciprocity and reports λ_max).\n\nPractices: elicit comparisons pair by pair with verbal anchors (\"moderately\nmore important\" = 3); with multiple experts, aggregate judgments by\ngeometric mean BEFORE computing weights; report the full matrix, weights,\nλ_max and CR in the deliverable. If CR ≥ 0.10, identify the most\ninconsistent triad and ask the expert to revisit it — do not silently\nmassage numbers.\n\n## Aggregation\n\n```python\nsuit = np.zeros_like(factors[0], dtype=\"float32\")\nfor w_i, f in zip(weights, factors):   # factors already standardized 0-1\n    suit += w_i * f\nsuit *= constraint_mask                 # binary 0/1, applied last\n```\n\nOWA variant: sort factor values per cell and apply order weights — full\nAND (min) to full OR (max) continuum; use when stakeholders disagree on\nrisk tolerance and show 2-3 scenarios.\n\n## Sensitivity analysis — mandatory\n\nA result that flips with a small weight change is not a result:\n\n- **One-at-a-time**: perturb each weight ±20% (renormalize), recompute,\n  report % of area changing suitability class and a stability map (cells\n  that never change class across perturbations).\n- **Scenario**: 2-3 alternative weight sets from different stakeholder\n  priorities; present side-by-side.\n- If a Monte Carlo budget exists: sample weights from Dirichlet around the\n  AHP vector; per-cell probability of \"highly suitable\" is a far stronger\n  product than a single map.\n\n## Deliverable standard\n\nSuitability map (classified + continuous), constraint mask map, weights\ntable with CR, standardization functions per criterion (with direction),\nsensitivity/stability summary, and limitations paragraph (data currency,\nresolution, criteria omitted). Route cartography to `cartography-geoviz`;\nnetwork-access criteria come from `network-accessibility-analysis`.\n\n## Pitfalls checklist\n\n- Direction inversion on a criterion (the silent killer — double-check\n  distance-based factors).\n- Mixing resolutions without declaring the resampling rule.\n- CR ignored or unreported.\n- Constraints blended as weights → forbidden zones scored medium.\n- Classifying with quantiles then reading them as absolute suitability.\n- No sensitivity analysis; single map presented as truth.\n\n## Execution contract\n\n- **Workflow:** define decision and stakeholders; separate constraints from factors; standardize criteria; elicit and validate weights; aggregate; test sensitivity; communicate uncertainty.\n- **Decision rules:** use MCDA for transparent criteria-ranked surfaces, network analysis for route-constrained access, and optimization when discrete placement or capacity decisions dominate.\n- **Verification protocol:** check criterion direction and alignment, AHP consistency, constraint enforcement, weight and threshold perturbations, and stable-versus-fragile areas.\n- **Failure modes:** reject the model when criteria double-count the same construct, weights lack provenance, constraints leak into compensation, or rankings collapse under plausible perturbations.\n- **Deliverables:** continuous and classified suitability maps, constraints, criteria transformations, weights and consistency ratio, sensitivity results, and limitations.\n- **Source freshness:** consult [the authoritative source registry](references/authoritative-sources.md) before applying methods or implementation APIs and record the checked date.\n"
}

SHA-256: 728923e88c7ac47659808b4e8fa9f4ee7f11b4333c86945f6566e2ffcb6b47b9