geoai-skills
Measured Agent Skills for geospatial AI — 18 skills that stop when the data cannot support the claim. Routing benchmark, held-out split, and known defects published.
Documentation
GeoAI Skills

The correctness layer for geospatial AI agents
Stop silent CRS, spatial-leakage, validity, unit, and uncertainty failures before they ship.
GeoAI Skills is a vendor-neutral collection of 18 Agent Skills that turns a general-purpose AI agent into a more defensible geospatial collaborator. It covers the full workflow—from STAC search and PostGIS to spatial statistics, Earth observation, LiDAR, cartography, and guarded ArcGIS Pro automation—while making verification and limitations part of the deliverable.
These figures describe the shipped tree, on one runtime/model pair —
Claude Code 2.1.214 with claude-sonnet-5, 167-case suite efe27d8c1736…,
2026-08-05 — and are not universal or model-independent claims. Routing measures
which skill activates, not whether the answer is correct; answer quality has
never been measured. The run that produced these numbers also recorded one
false positive and two cases that moved from pass to fail without an
established cause. See BENCHMARK.md for the full card, the
reviewed failures, and what the run does not show.
A plausible shortcut is not a defensible result.
Watch the short MP4
·
View the static verdict
·
Install
·
Inspect the evidence
The demo uses a public, synthetic prompt. It shows the intended guardrail behavior, not a claim that every model or runtime will produce identical wording.
Quick start
Install the complete suite for Codex:
npx skills add muend/geoai-skills --skill '*' -a codex
Or install one specialist for Claude Code:
npx skills add muend/geoai-skills \
--skill remote-sensing-analysis \
-a claude-code
Then ask naturally:
Can May 2024 and September 2025 Sentinel-2 scenes support a defensible changed-hectares claim?
The relevant skills should activate automatically. Instead of blindly subtracting two rasters, the agent is instructed to test comparability, identify the phenological mismatch, withhold an unsupported area claim, and specify the evidence needed to proceed.
What changes when the skills are present
| A plausible shortcut | GeoAI Skills guardrail |
|---|---|
| Measure area in EPSG:4326 because the operation returns a number. | Select and record an appropriate projected CRS; verify units before reporting area or distance. |
| Randomly split spatial samples and report a high validation score. | Audit spatial and group leakage; use blocked validation and show geographic error structure. |
| Count changed pixels from two convenient dates. | Check season, sensor, processing level, registration, mutual masks, threshold sensitivity, and error-adjusted area uncertainty. |
| Sum overlapping spatial intersections. | Dissolve or deduplicate overlap before measurement and preserve an auditable accounting path. |
| Render a map and assume it communicates honestly. | Check projection, classification, palette accessibility, legend semantics, uncertainty, and export metadata. |
| Run a destructive local GIS mutation immediately. | Inspect first, plan the mutation, require an explicit gate, verify outputs, and retain recovery evidence. |
These skills complement MCP servers, GIS libraries, and hosted tools. They are the method and verification layer that tells an agent when not to trust an apparently successful operation.
Why this exists
Spatial bugs are unusually quiet:
- a buffer computed in degrees still returns numbers;
- a random spatial train/test split still produces a beautiful learning curve;
- a misregistered change map still shows crisp-looking boundaries;
- overlapping polygons can silently inflate an area total;
- an attractive choropleth can still encode the wrong class semantics.
General-purpose models often know the APIs. The harder problem is knowing which preconditions, controls, and refusal conditions make a geospatial claim defensible. GeoAI Skills encodes that discipline:
- CRS and units are explicit.
- Spatial leakage is treated as a default risk.
- Every stage ends with numeric and visual verification.
- Uncertainty and sensitivity are outputs, not optional footnotes.
- Missing evidence narrows or blocks the claim instead of being guessed.
Evidence with boundaries
The current source tree contains two deliberately separate evaluation layers:
| Evidence layer | Current coverage | What it supports |
|---|---|---|
| Native skill suite | 167 cases across 18 skills; 105 development and 62 held-out | Routing boundaries, negative activation, collisions, interaction modes, and artifact requirements |
| GeoAnalystBench-derived external subset | 5 executable cases with deterministic synthetic fixtures and artifact validators | Transfer checks for network analysis, facility coverage, vegetation change, urban heat/kriging, and spatial regression |
| Platform verification | Windows, macOS, and Linux CI; clean installs for Codex, Claude, Skills CLI, and GitHub Copilot | Packaging, portability, runtime-file isolation, and deterministic archives |
The external subset is independently authored and reported separately. It does not
copy upstream datasets, prompts, or reference implementations, and its outcomes must
not be pooled with native routing metrics. Its five-case v1 source population is
frozen under suite hash c99563100cac…; a separate v2 contract freeze distinguishes
semantic correctness, evidence sufficiency, and exact representation compliance
without changing those cases. Frozen producer interface v1 preserves the first
shape-only condition; v2 adds answer-safe method, serialization, UTF-8, and
workspace execution guidance after observed cross-runtime ambiguities, without
exposing reference values. The separately frozen v3 condition pairs a semantic
validator with fully disclosed nested output structures, bounded floating-point
tolerance, exact inventory checks, and representation-independent map checks;
historical v1/v2 evidence remains unchanged. Every deterministically rendered
prompt is hashed.
Results follow the
offline run and result protocol,
which reports skill activation, runtime completion, artifact-contract compliance,
and overall success as separate measures.
An 18-skill, 167-case Claude Code run recorded 99.17% routing precision,
96.77% routing recall, and 96.41% full-route accuracy on suite
efe27d8c1736… under Claude Code 2.1.214 with claude-sonnet-5 (2026-08-05).
The paired skills-disabled control produced zero activations across all 167
cases. All four false negatives, the one false positive, and all eleven
max_turns execution errors were inspected; every enabled error had its
activation recovered from the raw trace, none lost, so the enabled routing
metrics are unaffected. Behavior quality remains unclaimed until
independent-family judging and the manual-review protocol are complete.
This run was bought to test a published defect, and it also found new ones.
The previous card attributed four of its nine false negatives to one clause in
the change-detection description and shipped the fix as a hypothesis. All four
of those cases now route correctly, both over-correction guards held, and the
control arm is clean. Against that: one boundary probe still misroutes, and two
cases that previously passed now fail without a cause the diff can explain —
run-to-run variance and a real regression are indistinguishable from a single
run. The suites are also different populations (158 → 167 cases), so the
figures above are not a before/after ratio; the honest comparison is
case-level and is in the card.
Read BENCHMARK.md for the full result card and EVALUATION.md for the provider-neutral protocol, suite hashes, split rules, judge boundaries, and publication gates.
The 18-skill stack
| Stage | Skills | What they protect |
|---|---|---|
| Route and acquire | geoai-orchestrator, geo-data-engineering, google-earth-engine | Problem decomposition, provenance, formats, CRS, scale, and server-side execution |
| Sense and prepare | remote-sensing-analysis, point-cloud-lidar, terrain-hydrology, movement-trajectory | Sensor/processing-level comparability, masks, elevation surfaces, point-cloud semantics, and trajectory cleaning |
| Model and detect | geo-deep-learning, change-detection, ml-experiment-standards | Leakage, chipping, imbalance, registration, threshold sensitivity, spatial validation, and reproducibility |
| Analyze and decide | spatial-statistics, geostatistics-interpolation, mcda-suitability-analysis, network-accessibility-analysis, postgis-spatial-sql | Weights, inference, multiple testing, kriging uncertainty, AHP consistency, routing barriers, overlap, SQL correctness, and performance |
| Deliver and operate | cartography-geoviz, swe-devops-standards, arcgis-pro-automation | Honest visual encoding, production code, test/transaction discipline, and gated local ArcGIS mutations |
Install the full suite for cross-skill routing, or cherry-pick a specialist. Every skill must remain safe and useful alone; sibling references are advisory and critical safeguards have local fallbacks.
Installation
Choose the surface you already use.
| Surface | Recommended path |
|---|---|
| OpenAI Codex | npx skills add muend/geoai-skills --skill '*' -a codex |
| Claude Code | claude plugin marketplace add muend/geoai-skills then claude plugin install geoai@geoai-skills |
| GitHub Copilot | gh skill install muend/geoai-skills remote-sensing-analysis |
| Skills CLI / compatible agents | npx skills add muend/geoai-skills |
| ChatGPT | Install GeoAI Skills from the OpenAI Plugins Directory |
| Claude.ai / Claude desktop | Upload one or more release ZIP files from the latest GitHub Release |
Skills CLI and skills.sh
Browse the collection on skills.sh or inspect it without installing:
npx skills add muend/geoai-skills --list
Install all 18 skills for Claude Code:
npx skills add muend/geoai-skills --skill '*' -a claude-code
Install all 18 skills for Codex:
npx skills add muend/geoai-skills --skill '*' -a codex
Run npx skills add muend/geoai-skills without flags for the interactive agent
and skill picker.
OpenAI Codex / ChatGPT plugin
Version 0.2.0 is published in the OpenAI Plugins Directory as GeoAI Skills.
The repository is a skills-only plugin: it adds no hosted service, authentication
flow, or MCP server.
Build the deterministic upload archive:
python tools/build_openai_plugin_bundle.py
The ignored dist/ output contains only the plugin manifest, public policy pages,
logo, and runtime skill files. Evaluation cases, benchmark traces, repository
automation, and private development material are excluded.
Claude Code and Claude Cowork
From a terminal:
claude plugin marketplace add muend/geoai-skills
claude plugin install geoai@geoai-skills
From an interactive Claude Code session:
/plugin marketplace add muend/geoai-skills
/plugin install geoai@geoai-skills
Installed skills use the stable geoai namespace, for example:
/geoai:remote-sensing-analysis
GitHub Copilot
GitHub Copilot can load project skills from .github/skills, .claude/skills,
or .agents/skills. With GitHub CLI 2.90.0 or later, preview before installing:
gh skill preview muend/geoai-skills remote-sensing-analysis
gh skill install muend/geoai-skills remote-sensing-analysis
The Skills CLI also provides an explicit Copilot target:
npx skills add muend/geoai-skills \
--skill remote-sensing-analysis \
-a github-copilot
See GitHub's Agent Skills documentation for supported locations, pinning, provenance, and security guidance.
Claude.ai ZIP files and generic Agent Skills runtimes
For Claude.ai or Claude desktop, download individual skill ZIP files and
SHA256SUMS from the latest GitHub Release, then upload them through
Customize → Skills → Create skill → Upload a skill.
To build the same deterministic archives locally:
python tools/build_skill_archives.py
Any Agent-Skills-compatible runtime can instead copy directories from skills/
into its skills directory. Real arcgis-pro-automation execution additionally
requires Windows, licensed ArcGIS Pro, and a configured local
arcgis-mcp-bridge.
Release maintainers should use RELEASING.md for the non-publishing candidate workflow, clean-install matrix, evidence requirements, publication gate, and rollback procedure.
Try these prompts
Reject an invalid change claim
Plan a defensible two-date Sentinel-2 forest-loss workflow. One scene is from May 2024 and the other from September 2025. Decide whether this comparison can support a changed-hectares claim.
Expected intervention: identify the phenology mismatch; withhold the hectare claim; request matched-season imagery or a season-aware time series; require registration, mutual masks, sensitivity analysis, and error-adjusted area uncertainty.
Make spatial SQL measurable and index-safe
Design production-safe PostGIS SQL to return flooded area in hectares per parcel for two large EPSG:4326 polygon tables. Include invalid-geometry handling and an EXPLAIN verification plan.
Expected intervention: select a suitable projected measurement CRS, avoid transforming indexed columns inside predicates, repair derived working geometry, deduplicate overlaps, and verify the query plan.
Refuse inconsistent suitability weights
Use this AHP pairwise matrix to build a solar-suitability map. Its consistency ratio is 0.19.
Expected intervention: reject the weights before mapping, identify discordant judgments, require revision, and preserve sensitivity analysis as a deliverable.
How it works
- Trigger narrowly. Specialist descriptions identify the domain decision that owns the task; negative and collision cases test over-triggering.
- Load progressively. The agent reads only the relevant
SKILL.md, then loads references or scripts when required. - Enforce invariants. CRS, validity, leakage, units, uncertainty, provenance, verification, and failure behavior travel across the workflow.
- Route across specialists. The orchestrator coordinates genuine multi-stage work without replacing specialist judgment.
- Fail loudly. Missing inputs produce a narrower claim, provisional plan, clarification, or refusal—not invented evidence.
Design principles
- Fail-loud spatial computing. Successful execution is not proof of a valid geographic result.
- Methodological honesty. Uncertainty, multiple-testing correction, sensitivity, and error-adjusted estimates are first-class outputs.
- Anti-leakage by default. Spatial and grouped validation replace random splits whenever geographic generalization is claimed.
- Tool-pragmatic, vendor-neutral guidance. Open Python, PostGIS/DuckDB, Earth Engine, ArcGIS, and other backends are selected by evidence and scale.
- Progressive disclosure. Long references and scripts cost no context until the task actually needs them.
- Measured, not assumed. Source cases, run evidence, suite hashes, errors, costs, limitations, and superseded results are kept distinguishable.
Repository structure
geoai-skills/
├── skills/<skill-name>/
│ ├── SKILL.md
│ ├── agents/openai.yaml
│ ├── scripts/
│ └── references/
├── evals/cases/<skill>/ # native development-only cases
├── evals/external/ # separately reported transfer suites
├── tools/ # validators, adapters, builders, and gates
├── benchmarks/ # immutable published evidence packages
├── .codex-plugin/ # OpenAI skills-only plugin manifest
├── .claude-plugin/ # Claude marketplace and plugin manifests
├── BENCHMARK.md # published result card and limitations
├── EVALUATION.md # provider-neutral evaluation protocol
├── CASE_STUDIES.md # evidence policy and accepted cases
└── RELEASING.md # release and rollback runbook
Contributing
Contributions are welcome. Start with CONTRIBUTING.md. A skill change should:
- pass the structural and link validators;
- add or update evaluation cases;
- avoid duplicating canonical cross-cutting rules;
- define verification and failure behavior; and
- keep runtime packages free of benchmark and private development material.
Real-world catches belong in CASE_STUDIES.md only when they include a dated, privacy-safe reproducer, comparison evidence, verification method, and limitations.
License
MIT — use it, fork it, and ship it. If GeoAI Skills prevented a silent spatial failure, a ⭐ helps the next practitioner find it.