Route genuinely ambiguous or multi-stage geospatial work across specialist skills while enforcing shared CRS, validity, leakage, units, verification, and reproducibility rules...
The hub of an 18-skill geospatial module. Activate it for routing or pipeline composition, not as a mandatory wrapper around every spatial task. Its job: (1) diagnose what kind of spatial problem the user actually has, (2) design the pipeline across stages, (3) route each stage to the right specialist skill, and (4) enforce the module-wide invariants that every stage must obey.
This orchestrator routes by invoking, never by naming. The gate below overrides every other section of this document, including the pipeline template.
Skill tool in the same response that selects it. Naming a skill in a
table, plan, or prose sentence is not a handoff. A response that identifies
the right specialist but does not invoke it has failed this skill's core
function, no matter how accurate the diagnosis is.deliver requests. "Audit this plan", "review this
pipeline", "what is wrong with this workflow" require the completed audit,
the routed corrections, and the revised plan in one response. Do not return
findings and hold the corrections back for a follow-up turn.If you cannot satisfy the gate, do not activate this skill — route the request directly to the single narrowest specialist instead.
| Stage / problem | Specialist skill |
|---|---|
| Data acquisition, formats, CRS, tiling, pipelines | geo-data-engineering |
| Satellite/aerial imagery, spectral indices, classification | remote-sensing-analysis |
| Planetary-scale archives, GEE Python API, cloud compositing | google-earth-engine |
| CNN/U-Net/ViT on EO data, segmentation, detection | geo-deep-learning |
| Autocorrelation, hotspots, clusters, spatial regression | spatial-statistics |
| Site selection, suitability, AHP/weighted overlay | mcda-suitability-analysis |
| Interpolation from point samples, kriging, variograms | geostatistics-interpolation |
| DEM, slope, watersheds, flow, viewshed | terrain-hydrology |
| LiDAR / point clouds, DTM/DSM/CHM, PDAL | point-cloud-lidar |
| Routing, service areas, accessibility, OD matrices | network-accessibility-analysis |
| GPS tracks, trajectories, stops/trips, map matching | movement-trajectory |
| Multi-temporal comparison, land cover change, trends | change-detection |
| Map design, choropleths, web maps, publication figures | cartography-geoviz |
| Spatial SQL, PostGIS, large-scale spatial joins | postgis-spatial-sql |
Local ArcGIS Pro, ArcPy, .aprx, or .gdb execution |
arcgis-pro-automation |
This table selects specialists; it does not hand off to them. Every row you
select must be invoked under the routing gate. For cross-cutting method
standards (leakage, metrics, reproducibility), invoke ml-experiment-standards
and swe-devops-standards when their rules apply.
For any multi-stage request, produce a short pipeline plan BEFORE writing code, then invoke the specialists that plan names in the same response:
## Pipeline: <goal>
1. <stage> → <skill> → output: <artifact> → check: <verification criterion>
2. ...
Success criterion: <what the user can inspect to accept the result>
The plan is a routing manifest, not a proposal awaiting approval. Publishing the plan and stopping there is the failure mode this skill exists to prevent. Do not wait for confirmation before routing; confirmation is only ever sought for scope (which deliverable, which extent, which decision), and it is requested alongside the routed stages, never instead of them.
Every stage ends with a verification criterion. Spatial work fails silently (wrong CRS, empty joins, inverted axes produce plausible-looking garbage), so a stage without a check is not a stage.
gdf.estimate_utm_crs(); equal-area such as EPSG:6933 for
global area statistics). If a CRS is undefined, stop and resolve it;
never guess silently.is_valid; repair with
shapely.make_valid (not buffer(0), which can silently drop parts).ml-experiment-standards → references/spatial-cv-protocol.md.area_ha, dist_km, elev_m — never bare
area. Unit confusion survives code review; column names don't lie..explore(), a PNG, or GIS
software). A confusion matrix cannot show spatially clustered errors.Attribute tables in non-ASCII locales break naive string handling.
Canonical example: Turkish dotted/dotless I — 'İ'.lower() yields a
2-character string in Python. Before any string matching on attributes,
apply a locale-aware normalization step and show value_counts() of
cleaned categorical fields. Prefer UTF-8 formats; legacy shapefiles may
carry cp1252/cp125x mojibake silently.
Default to the open Python stack: GeoPandas + Shapely 2 + Rasterio + xarray/rioxarray + PyProj. Route to PostGIS when data exceeds comfortable memory (~millions of features) or needs concurrent/repeated querying; to Earth Engine when the data is a planetary archive rather than local files. Use GDAL CLI for bulk format conversion. If the user works in ArcGIS Pro or QGIS, generate headless-runnable scripts (arcpy / PyQGIS) rather than click instructions, and keep the analysis logic portable.
EPSG:4326 → Web Mercator area statistics — Mercator distorts area
massively away from the equator.Skill tool; declare handoffs and invariants; integrate and verify the final artifact.