Skip to content

Roadmap

Where egms-client could go next. Nothing here is a promise. The point is to pick a direction together: open an issue before you start one of these.

Today the library gets EGMS data (search, download, mosaic, tables, L2 → vertical / east-west). The next step is to help people read the data, both people and AI agents. That work falls into three tracks, each building on the one before:

flowchart LR
    A["1 · Foundations<br/>point queries, sync API,<br/>uncertainties"] --> B["2 · Analysis<br/>series that accelerate,<br/>active areas, jumps"]
    B --> C["3 · AI<br/>MCP server, llms.txt,<br/>grounded reports"]

Ground rule for every AI feature

The numbers come from the data, computed by code that is tested. A language model may choose what to compute and may explain it in words. It never produces a velocity, a date or a point id itself. Every answer says which file it came from, and none is presented as a hazard warning.


1 · Foundations

These features are useful as they are, and the AI track needs them.

Feature What it is Why Effort
Point query ✅ await archive.velocity_at(lon, lat, component="U"): the L3 value of the 100 m cell, fetching only its tile (cached) "How fast does the ground move here?" is the first question every user asks. It is also the first tool an agent needs S
Sync façade ✅ egms_client.sync.Archive wraps EgmsArchive with asyncio.run, for scripts and notebooks that do not want await Removes the first stumbling block for GIS users S
Uncertainties and north in decompose propagate mean_velocity_std; a third geometry for N Error bars on every map (an idea already listed in the README) M
Release diff egms diff --bbox ... 2019-2023 2020-2025: the change in velocity between two releases The windows overlap, and an area that speeds up between releases is news M
Streaming large CSVs tables.iter_csv(path, chunksize=) → GeoParquet without loading the whole file L2 CSVs of a dense burst do not fit in memory comfortably M
STAC items a STAC Item for each downloaded file Plugs into existing EO catalogues and tools S
Tutorials on the site a page per recipe, with figures An idea already listed in the README S

2 · Analysis of the time series

EGMS L2 points come with a series of displacements, one every 6 to 12 days. A mean velocity hides the interesting cases. The methods below are classic, explainable signal processing and machine learning, with no language model involved. They would go in a new module, egms_client.analysis (numpy, optionally scikit-learn).

Feature What it finds Method Effort
Acceleration ✅ points whose motion speeds up (often the warning sign of a landslide) analysis.trend_change: a two-slope line with its date, and delta_bic M
Seasonality ✅ the yearly cycle (clay soils, aquifers, thermal dilation of structures) analysis.fit: amplitude and the day of the peak S
Unwrapping jumps ✅ steps of about ±28 mm (half the Sentinel-1 wavelength) that are processing errors, not ground motion step detection on the differenced series S
Active deformation areas clusters of moving points, rather than isolated noisy ones DBSCAN on position + velocity, above a stability threshold (the "ADA" approach in the InSAR literature) M
Anomalies points that behave unlike their neighbours isolation forest on per-point features (velocity, acceleration, seasonal amplitude, coherence) M
Features for models per-cell features (velocity, acceleration, seasonality, share of moving points) on a regular grid aggregation, the same as grid_los S

What the archive already gives

Each CSV already holds acceleration and seasonality: one quadratic and one annual cycle fitted over the whole release. analysis.fit is that same model, checked against those columns, so it can run on any window. trend_change and unwrapping_jumps are what the columns cannot show.

The last row is the one Limen needs for its landslide-risk model. Every method should be validated on the three notebooks (Campi Flegrei, Ancona, Bologna), where we already know what to expect.


3 · AI

3.1 An MCP server: EGMS for any agent

Done: releases, find_files, velocity_at, area_summary

egms mcp, extra mcp. See With an AI assistant. moving_points and map wait for track 2.

What. An optional extra, egms-client[mcp], with an MCP server, egms mcp. It exposes the library as tools for Claude, Claude Code, IDE assistants or any other MCP client:

Tool Built on
releases() EgmsArchive.releases
find(place or bbox, level, release) Query, find; the file list and its size, with nothing downloaded
velocity_at(lon, lat) point query (track 1)
area_summary(bbox) mosaic + statistics: share of the area sinking, percentiles, hottest cells
moving_points(bbox, min_speed) L2 + analysis (track 2)
map(bbox, component) to_cog plus a PNG preview

Why. Someone can ask "is the ground moving under the A14 near Ancona?" and get an answer computed from the data, with no Python. It is also the fastest way to spread the library.

Guardrails. Downloads stay within max_bytes (the tool asks before going above it). The 2-download limit and the token handling stay in the client, where they already are. The service key is read from the environment and never passes through the conversation. Effort: M.

3.2 llms.txt and a skill for coding agents

Done

llms.txt, llms-full.txt and the agent skill are published with the site. See With an AI assistant.

What. Publish /llms.txt and /llms-full.txt on this site: the API, the recipes and the traps table, in plain text that AI assistants read. Add an agent skill (SKILL.md) that tells a coding agent how to use the library, and above all what not to do: the _1 sub-release, the "022" orbit, the 5° box, the 2 downloads.

Why. The traps table is the most valuable thing in this project, and it is exactly what a model gets wrong when it writes EGMS code from memory. Effort: S (generated from the docs in the docs workflow, so it never goes stale).

3.3 Questions in plain language

What. egms ask "vertical speed around Bologna, latest release". A model turns the sentence into a Query through tool use (with a fixed schema and no free code), the place name is geocoded by a deterministic geocoder (Nominatim), the plan is shown with its size, and only then is anything downloaded.

Why. It saves looking up tiles, orbits and boxes. Optional and pluggable: the provider sits behind an interface, and the CLI works exactly as today without it. Effort: M.

3.4 Area reports that cite their data

What. egms report --bbox ... produces a Markdown or HTML report: maps, histograms, the fastest clusters (track 2), and a short text that describes them. The text is generated from a JSON of computed figures, and every number in it is checked against that JSON before the report is written (a sentence with a number that is not there is removed).

Why. Municipalities and infrastructure teams need a readable summary, and they need it to be right. Effort: M, after track 2.

3.5 Research directions

These are worth a notebook first, not a module:

  • Gap filling on L3 with Gaussian processes (kriging), with an uncertainty per cell.
  • Short-term forecast of a point's series, to flag deviations from the expected trend rather than to predict events.
  • Fusion with rainfall (ERA5) or groundwater data, to separate seasonal causes from structural ones.

Suggested order

# Item Track Effort Unlocks
1 ~~llms.txt + agent skill~~ ✅ AI S better AI-written code, today
2 ~~Point query + sync façade~~ ✅ 1 S the MCP server, beginners
3 ~~MCP server (find, velocity_at, area_summary)~~ ✅ AI M agents over EGMS
4 ~~analysis: acceleration, seasonality, jumps~~ ✅ 2 M moving points, reports, Limen
5 Active deformation areas + MCP moving_points 2 · AI M the most useful question
6 Uncertainties in decompose, release diff 1 M error bars, change
7 egms ask, egms report AI M non-programmers

Sizes: S is a few days, M a week or two, both including tests and docs.