Add cloud-native-geo skill - #12
Conversation
Helps Claude choose and use cloud-native geospatial formats (COG, STAC, Zarr/Icechunk/GeoZarr, GeoParquet, PMTiles, FlatGeobuf, COPC) and the tools that read/write/serve/visualize them, with Development Seed's own stack (titiler, rio-tiler, obstore, pgstac, eoAPI, deck.gl-raster, lonboard) as the default. Includes a weekly GitHub Action that checks tracked package versions against live registries and flags drift via an issue, since several of these libraries are under two years old and change fast enough that memorized API details go stale quickly. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Add `contents: read` to the freshness workflow. Specifying any `permissions:` block sets unlisted scopes to `none`, which can break actions/checkout. - Drop the pointer to a "conversion skill in this repo" that doesn't exist, and give a fallback instead of a dead end. - Fix a broken `references/../SKILL.md` relative path in formats.md. - Track rio-cogeo (7.0.2) and stac-fastapi-geoparquet (0.0.6). Both are recommended by the skill but went unchecked; stac-fastapi-geoparquet is pre-1.0, so it also gets a verify-before-coding row. - Harden the freshness script: prefer /releases/latest over tags[0] (the tags endpoint isn't ordered by date or semver), match the issue title locally instead of via the lagging search index, close the tracking issue once drift is resolved, and correct the docstring's env var. Verified against live registries: 22 tracked sources, all matching. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… skill
The frontmatter description led with what the skill does and summarized
its workflow ("points to live docs instead of memorized API details").
That's the documented failure mode for skill descriptions: agents follow
the summary instead of reading the body, which here would skip the two
rules that make the skill useful — ask before recommending, and verify
before writing code. Now it states triggering conditions only, keeping
the format and library names for discovery. 603 -> 408 chars.
Also move tracked-sources.yaml to .github/, next to the script that
consumes it. It's CI bookkeeping for maintainers, and sitting in
references/ meant ~170 lines of version pins could be loaded as skill
guidance. SKILL.md now names the path without linking it.
Add the stac-map docs URL, the one recommended tool that had none.
Verified: script resolves the manifest at its new path, 22 tracked
sources, all matching. No stale references to the old path.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Controlled test of the skill's two rules, 5 reps per arm per scenario, fresh subagent per rep, no-skill control. Ask-before-recommending: 0/5 control asked before recommending, vs 4/5 with the skill. 3/5 control reps proposed re-hosting the user's data on a third-party service; 0/5 with the skill. Verify-before-coding: control reps made zero doc fetches and produced five mutually incompatible APIs — a nonexistent module (rio_tiler.readers), a pre-4.0 class name, three module paths for one class, and four invented ways to pass an obstore store to rio-tiler — all at 75-95% stated confidence. With the skill, all five fetched docs and converged on one pattern. Lands in evals/ rather than references/ so it isn't loaded as guidance. Caveats and three open items are in the file; the control arm was primed by repo context, which makes the measured gap conservative. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Three edits, driven by the baseline eval:
1. Rule 1 was advisory ("ask before recommending, if the request is
vague"), which let a rep rule the request not-vague and recommend
anyway. It is now an output contract keyed to an observable predicate:
if any of the four axes is unknown, the reply is the questions that
close them. 4/5 -> 5/5 compliance.
2. Added a rule for requested tool pairings that aren't documented. The
baseline showed every control rep inventing an obstore/rio-tiler
bridge that does not exist in either library's docs. 3/5 -> 5/5 report
it, and all five now lead with rio-tiler's native s3:// support.
3. Added a rule to split verified from inferred instead of giving one
blended confidence number. 0/5 -> 2/5. Partial; left as an open item
rather than padded with more emphasis.
Also fixes a defect the re-test exposed: the verify table's rio-tiler row
pointed at titiler's docs. A rep followed it, got 404s, fell back to
memory and emitted the deprecated COGReader. titiler and rio-tiler are
now separate rows with their own docs, both confirmed 200.
The s3:// claim now in the skill was verified, not recalled:
rasterio.path.parse_path("s3://b/k.tif") resolves to /vsis3/b/k.tif.
Re-test covered the treatment arms only; controls carry no skill text and
are unchanged by these edits. Noted as a deviation in the eval file,
along with two residual issues.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Empty commit to fire claude-pr-review.yml, merged in from main. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Claude finished @wrynearson's task in 2m 7s —— View job ✅ No blocking issues — safe to merge. Mostly documentation (SKILL.md + references), which reads clearly and is well-scoped. The only real code is the freshness-check automation ( One non-blocking correctness note worth a follow-up:
Everything else checked out:
Simplify (ponytail): nothing to cut — the freshness-check script solves a problem stdlib/existing tooling doesn't (diffing a curated package list against three different registries and syncing a single tracking issue), uses stdlib 💰 Estimated review cost: $0.52 · 2m06s · 26 turns |
This skill aims to help people using agents use cloud-native geospatial formats and tools. It gives the LLM context about our niche, cutting-edge (that the model probably wasn't trained on) world and instructions to fetch docs > relying on memory. For people who don't know (a lot) about CNG, this skill can help them use and learn about it.
Below is 🤖 Generated with Claude Code
What this is
A skill for choosing and using cloud-native geospatial formats and the tools that read, write, serve, and visualize them — COG, STAC, Zarr/Icechunk/GeoZarr, GeoParquet, PMTiles, FlatGeobuf, COPC, MosaicJSON — with DevSeed's stack (titiler, rio-tiler, obstore, pgstac, eoAPI, deck.gl-raster, lonboard) as the default.
Shoutout to @dzole0311 for the idea!
Why
Picking a format here depends on four things — data shape, access pattern, whether it needs a backend, and what infrastructure already exists — and the answer changes completely across them. Claude tends to commit to a stack before knowing any of them.
The libraries also move faster than training data. Several are under two years old; obstore and deck.gl-raster postdate most of it. Memorized snippets for these are wrong often enough to be worth a rule.
So: lead with the questions when the request doesn't pin down all four axes, and fetch current docs before writing code against anything on the fast-moving list.
What's in it
SKILL.md— the two rules, a decision guide, a verify-before-coding tablereferences/formats.md— per-format primers and the gotchas that bite (COG IFD ordering, WGS84 bbox reprojection for STAC, polar CRS producing NaN infitBounds, colormap-on-multiband 500s)references/python-stack.md,references/visualization.md— server-side and client-side toolingNote
.github/(a weekly job checking 22 tracked packages against live registries; opens one issue on drift, closes it when resolved) is also included in this PR.If it's too noisy or unnecessary, we can remove this.
Tests
Full record in
skills/cloud-native-geo/evals/. 5 reps per arm per scenario, fresh subagent each, identical prompts except the skill, all arms with tools.Both failure modes reproduced cleanly. Asked how to show a Sentinel-2 scene from S3 on a web map, every control run recommended a stack before knowing whether the file was a COG, and three proposed re-hosting data that was already in the user's own bucket. Asked for an obstore + rio-tiler snippet, every control run wrote code with zero lookups and produced five incompatible APIs — including a module that doesn't exist and a class renamed back at 4.0 — at 75–95% stated confidence.
The first pass scored 4/5 and 3/5 on the first two rows. Rewriting the rules as output contracts rather than advice took both to 5/5. A third edit — split verified from inferred instead of one blended confidence number — reached only 2/5 and is left as an open item.
Caveats, all recorded: runs were on Haiku; the control arm inherited repo context and skewed toward titiler, making the gap conservative; the skill was inlined rather than loaded normally, so description-driven selection is untested; n=5.