{"audit":{"version":"1.3","generated_at":"2026-05-22T23:39:06.511249+00:00","generated_by":"Agenstry","report_url":"https://agenstry.com/agents/emem.dev","methodology_url":"https://agenstry.com/methodology","verifier_jwks_url":"https://agenstry.com/.well-known/jwks.json","subject":{"domain":"emem.dev","name":"emem","url":"https://emem.dev/.well-known/agent-card.json"}},"identity":{"provider":{"organization":"Vortx AI Private Limited","url":"https://vortx.ai"},"registry_verification":null,"signature":{"signed":false,"signature_valid":null}},"protocol":{"version":"0.2","supports_streaming":true,"supports_push_notifications":false},"operational":{"live_state":"live","live_responds":true,"last_status_code":200,"last_elapsed_ms":274,"last_error":null},"track_record":{"first_seen":"2026-05-18T13:08:04.824307+00:00","last_checked":"2026-05-22T23:07:33.921728+00:00","last_seen_ok":"2026-05-22T23:07:33.921728+00:00","checks_total":10,"checks_ok":10,"uptime_pct":100.0,"archived":false,"archived_reason":null},"conformance":{"score":73,"grade":"C","summary":"C-grade: usable but has clear conformance issues — review the breakdown below.","criteria":[{"key":"valid_card","label":"Valid AgentCard","points":10,"max_points":10,"status":"pass","detail":"Schema-validated A2A AgentCard returned by the well-known endpoint."},{"key":"live_responds","label":"Live JSON-RPC","points":25,"max_points":25,"status":"pass","detail":"Endpoint responds to message/send with valid JSON-RPC."},{"key":"protocol_version","label":"Protocol version","points":2,"max_points":10,"status":"partial","detail":"Declares unrecognised version '0.2'."},{"key":"signature","label":"JWS signature","points":0,"max_points":10,"status":"info","detail":"Card is unsigned (most published agents are)."},{"key":"uptime","label":"Uptime track record","points":15,"max_points":15,"status":"pass","detail":"10/10 probes succeeded (100% uptime)."},{"key":"skills","label":"Skill declaration","points":10,"max_points":10,"status":"pass","detail":"Declares 58 skills with structured metadata."},{"key":"verified_identity","label":"Verified Identity","points":5,"max_points":10,"status":"partial","detail":"Provider declared: Vortx AI Private Limited (https://vortx.ai). Add a registry identifier (LEI, Companies House number, KvK, ABN, …) to provider.legalEntity for full verified-business credit."},{"key":"freshness","label":"Freshness + modern flags","points":4,"max_points":5,"status":"pass","detail":"seen in upstream source within 0d"},{"key":"security","label":"Security declaration","points":2,"max_points":5,"status":"partial","detail":"Declares 1 security scheme(s) but none use PKCE or mTLS."}]},"skills":[{"id":"emem_locate","name":"Resolve place to cell64 + band inventory","description":"Resolves a place mention (free-text name, address, or lat/lng) to the protocol's cell64 identifier, and returns the topic-grouped inventory of bands and algorithms available at that location.","tags":["read","L0"],"examples":["Use whenever the input refers to a real-world location and the next step needs the cell64 identifier or wants to know which bands are available before recalling. The response carries `data_at_this_cell` with three sub-fields: `live_bands_by_topic` (every band recallable here, grouped by topic such as flood_water_event_window, vegetation_condition, built_up_human_geography), `algorithms_for_topic` (composition recipes that fuse those bands into named scores), and `declared_but_no_materializer_at_this_responder` (cube slots reserved without a live connector). For the single-shot path that runs the full chain server-side and returns one packaged answer, use `emem_ask` instead."],"inputModes":[],"outputModes":[]},{"id":"emem_ask","name":"Ask a free-text question about a place","description":"Single-shot free-text answer about a real-world location, backed by signed satellite/elevation/water/built-up receipts. Forwards a place mention plus a question; runs the locate → recall → algorithm chain server-side; returns one packaged envelope.","tags":["read","L0"],"examples":["Use when the question concerns a specific real-world place and a packaged, citation-bearing answer is preferable to manual primitive composition. Forward the user's question verbatim as `q` plus the location as `place` (free text), `cell` (cell64), or `lat`+`lng`. The server resolves the location, classifies the question to a topic, recalls every relevant band (auto-materializing Sentinel-2 / Sentinel-1 / Cop-DEM / JRC GSW / Overture / weather on miss), surfaces the algorithm recipes that compose those bands into named scores, and returns a single envelope with `topic_routing`, `facts`, `algorithms_for_question`, an optional Sentinel-2 RGB scene URL, and a `caveats` block (grid resolution, revisit cadence). All facts are signed by the responder; the receipt's `fact_cids` are content-addressed and citable. Set `include_image: true` to bundle the latest cloud-free Sentinel-2 thumbnail. Out-of-scope questions return `topic_routing.matched_topic: null` plus the full inventory so the caller can route elsewhere."],"inputModes":[],"outputModes":[]},{"id":"emem_hunt","name":"Hunter mode — find event hotspots over a region","description":"Event-discovery sweep: pick an event keyword (algal_bloom, deforestation, flood_extent, wildfire, urban_heat_island, methane_plume, landslide, drought, soil_salinity, crop_stress, water_turbidity, oil_slick) plus a region (free-text name or polygon_bbox). The responder geocodes the region, fans out across up to 32 sampled cells, recalls each event's primary scalar input band, and returns the top 8 hotspots ranked by that scalar — each carrying its cell64, lat/lng, the recalled value, a fact_cid for citation, and a scene.png URL. Bypass for free-text input is `emem_ask` (the classifier in /v1/ask routes \"find X in Y\" questions to the same hunter path).","tags":["read","L0"],"examples":["Call when the user asks an open-world discovery question (\"find oil spills in the Persian Gulf\", \"where is deforestation happening in the Amazon\", \"show me algal blooms in Lake Erie\", \"hunt wildfires across California\"). Surface 3–8 hotspots with their scene.png as image attachments and quote at least one fact_cid. For `oil_slick` the responder honestly reports `not_yet_implemented` and points at SAR-darkening + turbidity proxies — don't fabricate detections. The ranking uses the algorithm's primary scalar input only; for the full per-cell algorithm score, fetch the formula at /v1/algorithms/<key> and apply it client-side over the same recalled bands."],"inputModes":[],"outputModes":[]},{"id":"emem_eudr_dds","name":"EUDR Due Diligence Statement — polygon-in, signed Annex II envelope out","description":"Produce a Due Diligence Statement per Regulation (EU) 2023/1115 for one or more plots. Each plot carries operator-supplied geometry (GeoJSON Polygon for >4 ha, Point for ≤4 ha non-cattle per Article 2(28)), country of production (ISO3), Combined Nomenclature code (HS-6+), and quantity in kg. The endpoint applies the regulation's 10 % canopy / 0.5 ha / 5 m height forest definition (Article 2(4)) using the EU Commission's expected JRC GFC2020 V3 baseline plus Hansen GFC v1.12 loss-year confirmation; Sims et al. 2025 driver attribution and RADD SAR fallback layer on when those connectors are wired (Absence today). The response is an Annex II-shaped envelope with per-plot verdict (pass/fail/not_in_scope/indeterminate/fail_below_de_minimis), failing-cell fraction, and signed fact CIDs for every per-cell verdict — operators quote them in the company's Article 12 record. Article 9(1)(b) legality (land tenure, FPIC, country-of-origin laws) is structurally out of EO scope; the response carries an explicit `legality_disclaimer` for that reason.","tags":["read","L0"],"examples":["Call when a commodity supplier or EU importer needs to evidence due diligence under Regulation (EU) 2023/1115. Use the plot-level signed receipts as evidence inside the operator's company record; pair with a partner legality module before submitting the final DDS to the EU Information System (TRACES NT). For a single plot, pass one entry in `plots`. For batch supply-chain audits, pass up to a few dozen plots in one call — the endpoint fans out per plot. Surface the failing-cell fraction, the chosen forest baseline, and the legality disclaimer in the user-facing response so the operator understands what the engine claims (and does not)."],"inputModes":[],"outputModes":[]},{"id":"emem_state","name":"Read the place's state vector (single encoder OR full 1792-D cube)","description":"Dense state vector for a place. Two views: `encoder` (single foundation embedding at its native dim — 128-D Tessera, 1024-D Clay, 1024-D Prithvi) and `cube` (the full 1792-D voxel concatenated across every wired band, with per-band coverage manifest and full-fidelity extras for any encoder whose native dim exceeds its cube slot).","tags":["read","L0"],"examples":["Call when the agent needs a dense, ready-to-feed vector for downstream similarity / linear-probe / clustering, or wants a single rebindable handle (`memory_token` / `state_cid`) for a place. Default `view=encoder` (cheap, single recall) — pass `encoder` (default `geotessera`) to pick the band. Pass `view=cube` for the responder's full attested view at the cell; the response carries `coverage[]` so an agent can distinguish attested-zero (signed Absence) from not-yet-materialised, and `extras[]` preserves full Clay/Prithvi 1024-D vectors when the cube truncates to a 384-D slot. Pair with `emem_find_similar` for k-NN, `emem_compare` for two-cell cosine, or `emem_verify_receipt` to verify the signed payload offline."],"inputModes":[],"outputModes":[]},{"id":"emem_state_multi","name":"Multi-encoder state at one cell (foundation fan-out)","description":"Fans out across every wired foundation-embedding encoder (`geotessera`, `clay_v1`, `prithvi_eo2`) for one cell and returns a structured per-encoder state map. Each encoder is attempted independently; encoders that fail at this cell surface under `missing` with a typed reason instead of killing the request.","tags":["read","L0"],"examples":["Call when the agent wants cross-encoder consensus (do Tessera, Clay, and Prithvi agree on the archetype here?), redundancy-aware reasoning (which encoder is freshest at this cell?), or a concatenated multi-encoder state for downstream linear probes. Pass `encoders: [...]` to override the default foundation set."],"inputModes":[],"outputModes":[]},{"id":"emem_state_diff","name":"Between-tslot state vector delta (residual + cosine)","description":"Vector delta between the same cell at two tslots: returns the per-element residual, its L2 norm (scalar change-magnitude), the cosine between the two source vectors (orientation drift), and both source fact CIDs so the agent can quote both attestations as evidence.","tags":["read","L0"],"examples":["Call when the user asks 'how much did X change between A and B' for a foundation embedding at one place. Pass `tslot_a` and `tslot_b` (must differ); default `encoder=geotessera`. For per-band scalar change (NDVI delta, elevation delta) use `emem_diff` instead."],"inputModes":[],"outputModes":[]},{"id":"emem_memory_token","name":"Compose a memory_token citation handle","description":"Compose a `memt:<cell64>:<fact_cid>` (or `memt:<cell64>:<state_cid>`) citation handle. Validates both components are non-empty and do not contain the outer separator `:`.","tags":["read","L0"],"examples":["Call when the agent wants a single rebindable string to cite a place + attested fact across messages, threads, or tools. The token is the recommended way for agents to pass earth-memory citations to other agents without re-fetching. Pair with `emem_verify_receipt` on the receiving end to verify the signed payload."],"inputModes":[],"outputModes":[]},{"id":"emem_memory_token_resolve","name":"Dereference a memory_token in one round-trip","description":"Parse a `memt:<cell64>:<fact_cid>` citation handle and return the signed fact body the cid binds. Saves the agent from string-splitting the token and chaining `GET /v1/facts/<cid>` manually.","tags":["read","L0"],"examples":["Call when an agent receives a memory_token from another agent (or out of a previous turn) and wants the underlying signed bytes. The response carries the parsed cell + fact_cid, the full fact body, and the stable `fact_url` an agent can hand to any other peer. 404 with a typed code if the responder doesn't hold the cid; try /v1/fetch with the cid then, or paste the token at a mirror."],"inputModes":[],"outputModes":[]},{"id":"emem_corpus_state_stats","name":"Signed snapshot of corpus liveness","description":"Signed snapshot of corpus liveness: distinct_cells, distinct_bands, facts_scanned, top per-band counts, manifest CIDs. Same payload that backs /v1/stream's corpus.state tick (signed). Use this for a one-shot poll instead of holding an SSE connection.","tags":["read","L0"],"examples":["Call when an agent needs a single liveness reading to surface in a dashboard, attach to a report, or decide whether to refresh local caches. Includes ed25519 signature over a deterministic preimage so the snapshot is verifiable. For a continuous feed, GET /v1/stream over Server-Sent Events instead."],"inputModes":[],"outputModes":[]},{"id":"emem_benchmark","name":"Hand-verified eval items for agent grading","description":"Hand-verified evaluation items for grading an agent against the responder. Returns {items[], grader_url}. Submit answers (cell64 or fact_cid per item) to POST /v1/benchmark/grade for per-item scores. Items today: elevation recall, NDVI, find_similar neighbours.","tags":["read","L0"],"examples":["Call once at agent-onboarding time (or in CI) to fetch the canonical task list, then have the agent answer each item using its normal tool routing, and POST the answers map to /v1/benchmark/grade for a deterministic score. Lets an operator regression-check that an agent build still hits ground truth."],"inputModes":[],"outputModes":[]},{"id":"emem_recall","name":"Recall facts at a cell (auto-materializes on miss)","description":"Recall facts about a cell — auto-materializes on miss for any band with a registered materializer.","tags":["read","L0"],"examples":["Call after `emem_locate` (or with a known cell64). Returns every Primary fact stored at that (cell, band, tslot). IMPORTANT: if the cell has no fact yet for a requested band AND that band has `has_materializer=true` (per `emem_coverage_matrix` / `emem_materializers`), the responder fetches the upstream value, signs it under its identity, persists it, and returns it in the same response (~180 ms first call, ~10 ms cached thereafter). So for any wired band you can recall ANY cell on Earth without seeding — just pass `bands: [<band>]`. The response carries `materialize_notes` listing what was just fetched. Empty result with no notes means the band has no materializer at this responder."],"inputModes":[],"outputModes":[]},{"id":"emem_recall_polygon","name":"Recall facts across a place's polygon","description":"Recall facts across every cell inside a place's polygon (single signed envelope). Closes the place-name-drift gap for wide features (parks, lakes, regions).","tags":["read","L0"],"examples":["Call when the user names a wide feature (national park, river basin, country, large urban area) where one cell is too small. Pass `place` and the geocoder will fan out across the polygon — or pass `polygon_bbox` directly if you have coordinates. Returns `merged_facts`, `by_cell`, and a `polygon_bbox.source` indicator (`nominatim_boundingbox` = real polygon, `centre_cell_bbox` = fallback to one cell because the geocoder had no polygon). For *farm* queries the OSM polygon is the whole estate envelope; pass `include: [\"ftw_fields\"]` to additionally attach per-field agricultural-boundary polygons from Fields of The World (CC-BY-4.0) — or call the dedicated `emem_field_boundaries` for the pure-fetch shape."],"inputModes":[],"outputModes":[]},{"id":"emem_field_boundaries","name":"Per-field agricultural boundaries (Fields of The World)","description":"Per-field agricultural-boundary polygons from the Fields of The World global product (~3.17B fields, 241 countries, 10 m resolution, CC-BY-4.0). Returns a GeoJSON FeatureCollection with the polygon geometries, FIBOA-compatible properties, and a planar `area_m2` per field — plus provenance (source CID, provider URL, license, attribution).","tags":["read","L0"],"examples":["Call when the user asks about farms, fields, parcels, croplands, plots, or agricultural boundaries inside a region — anywhere the OSM/Nominatim boundary alone is too coarse (the OSM polygon for a farm is its estate envelope; this returns the individual field polygons inside). Pass `place` (free-text) or `polygon_bbox`. For farms wider than ~10 km², split the bbox: the fetcher caps each call at 16 covering tiles. The receipt quotes `license: CC-BY-4.0` and `attribution: Fields of The World / Taylor Geospatial Institute` — surface both with any rendered map. For a one-shot \"facts at every cell inside the farm PLUS the field polygons\", call `emem_recall_polygon` with `include: [\"ftw_fields\"]` instead."],"inputModes":[],"outputModes":[]},{"id":"emem_query_region","name":"Aggregate facts over a region","description":"Query facts over a region (single cell or list of cells), optionally aggregated per band.","tags":["read","L0"],"examples":["Call when the user asks 'how does region X look', 'what's the average NDVI here', or wants a region-level summary. Use `agg=mean|median|p90|vector_centroid` to fold per-band values."],"inputModes":[],"outputModes":[]},{"id":"emem_compare","name":"Compare two cells (cosine + scalar deltas)","description":"Compare two cells: cosine similarity over shared vector bands + per-band scalar deltas.","tags":["read","L0"],"examples":["Call when the user asks 'how similar is X to Y', 'compare these two places', or wants a difference vector. Returns a single cosine score and per-band deltas."],"inputModes":[],"outputModes":[]},{"id":"emem_compare_bands","name":"Compare two bands at one cell","description":"Compare two bands at the same cell. Scalar pair → metric=delta, value=b-a. Vector pair (equal dim) → metric=cosine + per-dim delta. Returns a signed receipt naming both source fact CIDs.","tags":["read","L0"],"examples":["Call when the user wants cross-source consistency at one place ('does Cop-DEM agree with GMRT here?'), cross-vintage drift ('how did the embedding change between 2017 and 2024 at this cell?'), or any band-vs-band comparison within a single cell. `cell` + `a` + `b` are required. `tslot_a`/`tslot_b` are OPTIONAL: omit them to let the responder auto-pick each band's latest attested tslot — required for medium/fast-tempo bands (NDVI 30-day, MODIS 8-day, weather, CAMS) where there is no fact at tslot=0. The response carries `tslot_resolution` (echoes what was chosen and why) and `bands_with_no_history` (lists any band the cell has no attested fact for)."],"inputModes":[],"outputModes":[]},{"id":"emem_find_similar","name":"k-NN over the corpus by embedding","description":"k-NN over the corpus by cell embedding or inline vector.","tags":["read","L0"],"examples":["Call when the user asks 'find places like X', 'where else looks like this', or hands an embedding to find neighbours. `key` is either a cell64 or `inline:[x,y,...]`. Default band is `geotessera` (128-D Tessera foundation embedding); pass `band: \"geotessera.multi_year\"` for the 1024-D 8-vintage fusion."],"inputModes":[],"outputModes":[]},{"id":"emem_trajectory","name":"Time series for one (cell, band)","description":"Time series for one (cell, band) over an inclusive [start, end] tslot window. Returns only what's already attested — does NOT trigger materialization. For historical backfill use `emem_backfill`.","tags":["read","L0"],"examples":["Call when the user asks 'how did X change over time' for a band that already has multiple historical tslots seeded. IMPORTANT differences from `emem_recall`: (1) trajectory does NOT auto-materialize past tslots — it returns only facts that have already been attested at this responder, so for fast-tempo bands like `indices.ndwi` you'll typically see ONE point at the latest tslot until an attester seeds history. (2) tslots are non-negative `u64`; there's no negative-offset 'last 2 years' shorthand. For LONG-TERM history questions ('flooded in last 2 years', 'forest loss since 2020') prefer either (a) a static-tempo summary band that one fact answers — `surface_water.recurrence` covers 1984-2021 in a single signed value, no trajectory needed — or (b) `emem_backfill` to materialize and sign the missing tslots in one call."],"inputModes":[],"outputModes":[]},{"id":"emem_diff","name":"Signed delta between two tslots","description":"Compute a DerivativeFact (delta) between a band's values at two tslots.","tags":["read","L0"],"examples":["Call when the user asks 'what changed between t1 and t2', 'give me the delta'. Returns a signed DerivativeFact + receipt — the delta itself is content-addressed and citable."],"inputModes":[],"outputModes":[]},{"id":"emem_fetch","name":"Resolve a fact by content-address (CID)","description":"Fetch a fact by its content-address (CID). Returns the full signed Primary or Absence fact — the same body served by REST `/v1/facts/{cid}`. Closes the citation loop: any fact_cid surfaced by recall, materialize, attest, or verify can be re-resolved by another agent without REST.","tags":["read","L0"],"examples":["Call whenever you have a `fact_cid` (e.g. from `emem_recall`'s response, an `emem_attest` receipt, an `emem_materializers` outcome, or a citation in another agent's reply) and need the full fact body — its value, unit, sources, signer, signed_at, and derivation. Particularly useful for verifying that a citation a downstream agent gave you actually resolves on this responder. The response is byte-identical across responders for the same CID — the CID itself is the validator."],"inputModes":[],"outputModes":[]},{"id":"emem_backfill","name":"Materialize historical facts in a window","description":"Materialize and sign every per-tslot fact for one (cell, band) inside a [start_unix, end_unix] window. Returns a signed list of (tslot, fact_cid, status) for each step. Slow but possible — one upstream fetch per tslot, capped by `max_facts`.","tags":["read","L0"],"examples":["Call when the user wants HISTORY for a fast/medium-tempo band and `emem_trajectory` returned only the latest point. The responder iterates the tslot range derived from the band's tempo, calls the per-tslot historical materializer, signs each result, and persists. After completion `emem_trajectory` over the same window returns the full series. Bands without a historical materializer (e.g. `weather.*` from met.no's nowcast) return `status: \"present_only\"` for past tslots — check `emem_coverage_matrix.history_available_from`/`history_available_to` to see how far back each band can be backfilled. Prefer this over staking an attestation when the upstream is publicly fetchable."],"inputModes":[],"outputModes":[]},{"id":"emem_heat_solve","name":"2-D heat-equation forecast (urban LST evolution)","description":"Forward-step 2-D explicit finite-difference solver for the heat equation ∂u/∂t = α∇²u over a 3×3 cell stencil centred on `cell`. Reads `modis.lst_day_8day` (Land Surface Temperature) at the centre and 8 cell64 neighbours, integrates N hours ahead under a CFL-stable timestep, returns a signed forecast. Real PDE rollout — not a decay-scoring heuristic.","tags":["read","L0"],"examples":["Use when the user wants a short-horizon LST forecast (urban heat island, surface-temperature evolution, heatwave onset modelling) at a specific cell. Default α=1e-6 m²/s matches urban surface diffusivity (Oke 2017); pass a smaller α for water bodies or higher for vegetated surfaces. The solver caps at one-week horizons because the 8-day MODIS composite stops being a representative initial condition past that. Each call materialises 9 MODIS facts (one per neighbour) on miss — first call ~5 s cold, ~30 ms warm. Receipt cites all 9 input fact CIDs."],"inputModes":[],"outputModes":[]},{"id":"emem_wave_solve","name":"1-D shallow-water swell propagation to coast","description":"Forward-step 1-D explicit finite-difference solver for the shallow-water wave equation ∂²u/∂t² = c²∂²u/∂x² with c² = g·h, where depth h comes from `gmrt.topobathy_mean` along the seaward gradient. Models how an offshore swell of height H_s and period T propagates toward `coastal_cell`. Returns arrival height + time + depth + phase-speed profiles, all under a CFL-stable timestep.","tags":["read","L0"],"examples":["Use when the user wants to predict swell arrival at a coast (storm-surge planning, shoreline-impact assessment, surf forecasting). The solver walks `n_offshore_cells` cells seaward from `coastal_cell` along the bathymetric gradient (default 8 cells = 80 m of profile at the active 10 m grid), samples GMRT depth at each, and integrates the wave equation forward until the wavefront reaches the coast plus one period. Receipt cites every depth fact CID along the profile. Returns 422 with a clear message if `coastal_cell` is land-locked."],"inputModes":[],"outputModes":[]},{"id":"emem_jepa_predict","name":"Constrained JEPA-pattern next-month NDVI predictor","description":"Predict next-month NDVI at a cell using a constrained JEPA-pattern AR(2) seasonal predictor. Reads up to 24 past months of `indices.ndvi`, fits a closed-form predictor `y_{t+1} = α·(lag-12 NDVI or recent mean) + β·(last + slope) + γ·recent_mean`, returns the prediction clamped to NDVI's physical range. Coefficients (α=0.6, β=0.3, γ=0.1) are NOT learned — they're fixed from the agricultural-NDVI literature. v2 (future) will train an actual encoder + predictor on the geotessera embedding pool.","tags":["read","L0"],"examples":["Use when the user wants a one-month-ahead NDVI forecast at a specific cell (crop-stress monitoring, growing-season tracking, vegetation-anomaly anticipation). Lookback defaults to 6 months; if fewer monthly tslots are attested at this cell, the predictor uses what's there and surfaces the count in `lookback_months_used`. Returns 422 if no NDVI history exists at the cell — chain to `emem_backfill` first to seed history. Receipt cites every input NDVI fact CID."],"inputModes":[],"outputModes":[]},{"id":"emem_jepa_predict_v2","name":"Learned dynamics head over Tessera embeddings (jepa_temporal_predictor@2)","description":"Predict the next-vintage 128-D Tessera embedding at a cell using a small learned dynamics MLP. Reads the K=3 most-recent attested `geotessera.YYYY` vintages, runs them through an ONNX dynamics head (~200k params, CPU-fast), returns the predicted next-year embedding. The receipt's `model` block carries `model_id`, `version`, `blake2b_hex` (model_cid), training/validation provenance, and `honesty_warnings` flagging `untrained_baseline` when the artifact is the zero-init sentinel. Distinct from v1 (`emem_jepa_predict`) — v1 returns an NDVI scalar via closed-form coefficients; v2 returns a 128-D embedding from a learned model.","tags":["read","L0"],"examples":["Use when you want a forecast in EMBEDDING space rather than NDVI scalar — e.g. to find next-year analogs via `emem_find_similar` against the prediction, or to feed any algorithm in `algorithms_for_topic.foundation_embedding`. Returns 422 with a `/v1/backfill` hint when the cell has fewer than 3 consecutive Tessera vintages cached. Always read the receipt's `model.honesty_warnings` array — when it contains `untrained_baseline`, the prediction is the trivial 'predict last vintage' baseline (treat as no-op)."],"inputModes":[],"outputModes":[]},{"id":"emem_verify","name":"Verify a structured claim against a cell","description":"Verify a structured claim against a cell's facts. Returns verdict + evidence CIDs + signed receipt.","tags":["verify","L1"],"examples":["Call when the user asks a yes/no question about a cell ('is the NDVI > 0.7 here', 'has this been deforested'), or when downstream code wants citable evidence for a logical predicate."],"inputModes":[],"outputModes":[]},{"id":"emem_bands","name":"Active band ontology","description":"Active band ontology (offsets, dims, tempo, privacy).","tags":["introspect","L0"],"examples":["Call once at session start to learn the band registry — every other primitive's `band` argument MUST come from this list."],"inputModes":[],"outputModes":[]},{"id":"emem_functions","name":"Active function registry","description":"Active function registry (derivation recipes).","tags":["introspect","L0"],"examples":["Call when you need to know which derivative ops are available for `emem_diff` or how a band is computed from upstream sources."],"inputModes":[],"outputModes":[]},{"id":"emem_sources","name":"Active source-connector registry","description":"Active source-connector registry (URL templates, providers, licenses).","tags":["introspect","L0"],"examples":["Call when you need to inspect which upstream EO providers are wired (Copernicus DEM, JRC GSW, ESA WorldCover, etc.) — useful for license attribution in agent answers."],"inputModes":[],"outputModes":[]},{"id":"emem_schema","name":"Active CDDL/JSON schema bundle","description":"Active CDDL/JSON schema bundle by CID.","tags":["introspect","L0"],"examples":["Rarely needed at chat time. Useful for offline verification of receipts / attestations against the exact schema version a responder used."],"inputModes":[],"outputModes":[]},{"id":"emem_errors","name":"Stable error code catalog","description":"Stable error code catalog.","tags":["introspect","L0"],"examples":["Call to enumerate the wire-stable error codes — useful when the LLM wants to programmatically branch on responses."],"inputModes":[],"outputModes":[]},{"id":"emem_manifests","name":"Active manifest CIDs","description":"Active manifest CIDs (bands / functions / sources / schema).","tags":["introspect","L0"],"examples":["Call to learn which exact registry versions a responder is serving. Cite these CIDs alongside any answer where reproducibility matters."],"inputModes":[],"outputModes":[]},{"id":"emem_capabilities","name":"Cached upstream capability snapshot","description":"Live capability snapshot of the responder's GPU sidecar — extensions[] (e.g. gpu, clay-v1.5, prithvi-eo2), cuda_available, models_loaded[], healthy, last_polled_unix_s. Refreshed every 30 s by a background poller; reads are constant-time.","tags":["introspect","L0"],"examples":["Call before scheduling a GPU-heavy plan (Clay / Prithvi / Galileo embeddings, foundation-anchored algorithms) so the agent knows whether the GPU tier is up *right now* without per-request /health round-trips. Pair with `emem_topics` (its `algorithm_availability` map says which algorithm keys can run given the current capabilities) and `emem_explain_algorithm` (full inference-tier metadata per algorithm). When `extensions[]` is empty the sidecar is unreachable — only CPU/scalar/cached tiers will produce facts; foundation-anchored materializers will sign Absence with `gpu_unavailable` reason."],"inputModes":[],"outputModes":[]},{"id":"emem_grid_info","name":"Active grid encoding","description":"Active grid encoding: cell64 ground resolution, lat/lng axis sizes, DGGS lineage.","tags":["introspect","L0"],"examples":["Call once at session start (or when the user asks about cell resolution / 'how big is a cell'). Returns the actual ground resolution today (~9.54 m × 9.55 m square at the equator (lat 21 bits × lng 22 bits, matching Sentinel-1/Sentinel-2 native pixel pitch). The cell64 bit layout reserves a resolution-tag field for future hierarchical refinement targeting H3-equivalent res-13 (~3.4 m) cells in v0.1.) and the spec target. Useful before you reason about whether one cell is enough or whether you need `emem_recall_polygon`."],"inputModes":[],"outputModes":[]},{"id":"emem_coverage_matrix","name":"Per-band live status & history bounds","description":"Per-band live status — what data is alive AND auto-materializable, with history bounds, tempo cadence, and the responder pubkey that signs the band.","tags":["introspect","L0"],"examples":["Call BEFORE `emem_recall` when you don't know which bands answer at this responder. For each band returns `has_materializer` (true → an empty recall will auto-fetch+sign, no seeding needed), `facts_count` (how many cells already cached), `last_attested_unix_s` (freshness), `tempo_seconds` (slot duration), `history_available_from` / `history_available_to` (oldest/newest Unix epoch the materializer can fetch — use these to bound an `emem_backfill` request), and `responder_pubkey_b32` (the ed25519 key whose signature attests this band — use to detect federation / multi-responder setups). Bands with `has_materializer=false AND facts_count=0` are cube placeholders without a wired connector — don't bother recalling them."],"inputModes":[],"outputModes":[]},{"id":"emem_materializers","name":"Auto-fetch registry (per-band materializers)","description":"Auto-fetch registry: which bands the responder will materialize on a recall miss, the upstream provider, license, value shape, and history bounds.","tags":["introspect","L0"],"examples":["Call once at session start (alongside `emem_bands` and `emem_coverage_matrix`) to learn which bands answer for ANY cell on Earth without seeding. Each entry declares `upstream_scheme`, `upstream_endpoint`, `derivation_fn_key`, `value_kind` (primary | absence | primary_or_absence), `coverage` (where the upstream has data), `unit`, `tempo`, `confidence`, and `history_available_from` / `history_available_to` (when the upstream supports historical fetch via `emem_backfill`). Use this when the user asks 'do you have flood data here', 'what providers feed this', or you need license attribution. The response also carries an `agent_hint` block explaining the trust model (responder signs, not upstream) and the absence-fact contract."],"inputModes":[],"outputModes":[]},{"id":"emem_data_availability","name":"Per-band temporal coverage catalog","description":"Temporal catalog: for every materializable band the upstream-of-record window the data genuinely covers, the temporal `kind` (static | annual_snapshot | annual_stack | time_series | now_only | per_release), tempo seconds, upstream wire path, and whether `emem_backfill` is meaningful.","tags":["introspect","L0"],"examples":["Call before `emem_backfill` or any historical recall to check whether a band has a meaningful past at the requested time. Each entry includes `history_available_from_unix` / `history_available_to_unix` (and ISO strings) plus `backfill_supported`. Use this to avoid trial-and-error 422s on now-only bands (`weather.*`) and to enumerate the per-year `geotessera.YYYY` vintages the responder ships. The catalog is driven by the same registry the recall path consults — so what it lists is exactly what materializes."],"inputModes":[],"outputModes":[]},{"id":"emem_algorithms","name":"Composition recipes (algorithms)","description":"Content-addressed dictionary of composition recipes — formulas that fuse attested band facts (and embeddings) into derived scores, classifications, and similarity metrics.","tags":["introspect","L0"],"examples":["Call when the user's question is COMPOSITE (flood risk, urban density, water consensus, change-since-2020) rather than a single band readout. Each entry has `kind` (solo | combined | embedding), the input `bands` (assemble one `emem_recall` body from them), the `formula` in plain math, the `output` shape, and a `citation`. The agent applies the formula in-process and quotes the algorithm key + `algorithms_cid` (from `emem_manifests`) alongside the input fact_cids — that gives the receipt enough context for any other operator to replay the same composition deterministically. Embedding entries (cosine, novelty, change, neighborhood-consistency) operate on `geotessera`; for the most common k-NN pattern the protocol-native `emem_find_similar` is faster than fetching vectors and computing locally."],"inputModes":[],"outputModes":[]},{"id":"emem_explain_algorithm","name":"One-algorithm drill-down (formula + inputs + citation)","description":"Per-key drill-down on a single composition recipe — full body (kind, inputs, formula, output, citation, references) for ONE algorithm key. Companion to `emem_algorithms` (which is the catalog).","tags":["introspect","L0"],"examples":["Call when you already know the algorithm key (from `emem_algorithms`'s catalog or the topic registry) and need its full math. Cheaper than fetching the 190 KB catalog when you only need one entry. Returns the same structure that `/v1/algorithms/{key}` does. 404s with `cid_not_found` if the key isn't registered — call `emem_algorithms` for the live key list."],"inputModes":[],"outputModes":[]},{"id":"emem_topics","name":"Topic-grouped band + algorithm registry","description":"Topic-grouped registry of every band and algorithm at this responder, plus visual surfaces and the `declared_but_no_materializer_at_this_responder` block (cube slots reserved without a live connector). Single source of truth shared with `/v1/locate`'s `data_at_this_cell` block.","tags":["introspect","L0"],"examples":["Call when the user's question lives in a topic but they haven't named a specific band — e.g. 'is this place flood-prone' (→ flood_history_long_term + flood_water_event_window) or 'how walkable is this' (→ urban_livability). Returns three blocks: `live_bands_by_topic` (every band you can recall right now), `algorithms_for_topic` (named recipes that compose those bands into derived answers — pair with `emem_algorithms` for the formulas), and `declared_but_no_materializer_at_this_responder` (honest gaps). Browse here BEFORE inventing your own synthesis formula."],"inputModes":[],"outputModes":[]},{"id":"emem_coverage_map","name":"Coverage map (SVG image)","description":"Live SVG render of the responder's corpus density, returned as a proper MCP EmbeddedResource content block (image/svg+xml) — multimodal MCP agents can render it natively.","tags":["introspect","L0"],"examples":["Call when the user asks 'where do you have data?', 'show me the coverage', or wants a visual brief of the responder's corpus footprint. Returns a 1440×720 Plate-Carrée SVG (1° × 1° bins, log-scale colour, continent envelopes for orientation) plus a structuredContent summary (cell_count, total_facts, responder pubkey, REST URL). Multi-content-block reply: an EmbeddedResource (mimeType `image/svg+xml`, with text + uri) followed by a one-line text summary so text-only clients still see the cell / fact counts. For the bare image bytes, fetch `/v1/coverage_map.svg` over plain REST."],"inputModes":[],"outputModes":[]},{"id":"emem_cell_scene_rgb","name":"Sentinel-2 true-colour thumbnail (PNG)","description":"True-colour Sentinel-2 L2A RGB thumbnail centred on a cell. PNG returned as a native MCP ImageContent block (mimeType image/png). Pure-Rust pipeline: STAC search + HTTP-Range COG reads + 2-98 percentile stretch + PNG encode.","tags":["read","L0"],"examples":["Call when the user wants a VISUAL of a place — 'show me what this looks like', 'before/after the flood', 'is there a forest here', 'is this developed'. Returns a 256×256 px RGB image (~2.56 km × ~2.56 km at S2's 10 m native resolution), centred on the cell. Pass `cell` as a cell64 string OR a place name (auto-resolved). `max_cloud` filters scenes by `eo:cloud_cover` (default 20 %); raise it (60–80 %) for cloud-prone tropics if you keep getting 'no scene' errors. `datetime` is an RFC 3339 interval like `\"2024-01-01T00:00:00Z/2024-12-31T00:00:00Z\"` for a temporal slice (defaults to last 90 days). `structuredContent` carries the STAC item id, capture time, cloud_cover, EPSG, and per-channel reflectance percentile stretch values used — quote those alongside the image so the receipt is reproducible."],"inputModes":[],"outputModes":[]},{"id":"emem_cell_geojson","name":"Cell polygon as GeoJSON","description":"Cell polygon as a native MCP EmbeddedResource (mimeType application/geo+json). Properties carry centre lat/lng, bbox, approx size in metres, and the 8-cell neighbourhood — drop straight into Mapbox / Leaflet / Deck.gl / QGIS without a GIS pipeline.","tags":["read","L0"],"examples":["Call when the agent (or a downstream renderer) needs the cell as geographic geometry — for map overlays, polygon-clipping ops, or feeding a styling pipeline. Pass `cell` as cell64 or place name. The result is a GeoJSON Feature with Polygon geometry; for a FeatureCollection that includes every recalled fact's value as a property, fetch /v1/cells/{cell64}/recall_geojson?bands=... over plain REST instead."],"inputModes":[],"outputModes":[]},{"id":"emem_recall_many","name":"Bulk recall across up to 256 cells","description":"Recall facts across a list of up to 256 cell64 strings in one signed envelope. Server fans out per-cell recalls in parallel, then aggregates the response. Auto-materializes any cell with a missing fact whose band has a registered materializer — same contract as emem_recall.","tags":["read","L0"],"examples":["Use after emem_find_similar (give it the neighbour cells), after emem_recall_polygon (when you want a deterministic cell list rather than a polygon), or whenever you have a precomputed set of cells (e.g. an admin-2 sample frame) and want one round-trip. Pass `cells: [c1, c2, ...]` plus the same `bands` shape as emem_recall. For more than 256 cells, batch the call."],"inputModes":[],"outputModes":[]},{"id":"emem_elevation","name":"Coherent elevation across Cop-DEM + GMRT + WorldCover","description":"One-shot elevation answer that fuses Cop-DEM 30 m (land), GMRT (ocean topobathy), and ESA WorldCover (water mask) into a single signed scalar at a place or coordinate. Returns `elevation_m`, the source actually used, and a `coherence_note` when the two surfaces disagree at the coast.","tags":["read","L0"],"examples":["Use when the user asks 'how high is X' or 'what's the elevation at this lat/lng' and you want the correct answer regardless of whether the cell is land, water, or coastline — the handler picks Cop-DEM for land and GMRT for water and surfaces the choice. Pass `place` (free text), `lat`+`lng`, OR `cell`. Otherwise, prefer emem_recall with `copdem30m.elevation_mean` / `gmrt.topobathy_mean` individually."],"inputModes":[],"outputModes":[]},{"id":"emem_fleet","name":"Satellite / sensor lineage per band","description":"Per-band satellite-and-sensor fleet inventory — names the upstream platform (e.g. Sentinel-2A/B, MODIS Aqua/Terra, Landsat-8/9), revisit cadence, native resolution, and license for every materialized band. Lets an agent attribute imagery products correctly and pick the right band when revisit cadence matters.","tags":["introspect","L0"],"examples":["Call when the user asks 'which satellite is this from', 'what's the revisit time', or needs source attribution for a derived answer. Pair with emem_materializers for the wire path and emem_sources for the connector-level metadata."],"inputModes":[],"outputModes":[]},{"id":"emem_temporal_route","name":"Plan a temporal recall recipe for a cell","description":"Walk the algorithm registry's `temporal_recipe` blocks against a cell + (optional) intent, and emit a concrete plan: which bands to recall at which lookback windows, with `purpose` tags. Useful before a multi-band emem_recall when the question is time-shaped (flood window, growing season, change year).","tags":["plan","L0"],"examples":["Use when the user's question references a TIME relationship ('flooded last year', 'NDVI baseline', 'change between vintages') and you want the responder to assemble the lookback recipe rather than reasoning about tslot offsets yourself. Pass `cell` plus optional `intent` (free-text hint). The plan is deterministic and verifiable; the receipt cites the algorithm key that supplied each recipe."],"inputModes":[],"outputModes":[]},{"id":"emem_verify_receipt","name":"Server-side ed25519 receipt verifier","description":"Verify a signed receipt envelope server-side: recomputes the canonical preimage (`request_id | served_at | primitive | cells, | fact_cids,`), runs ed25519 over the embedded pubkey + signature, and returns `{valid, reason, pubkey_b32}`. Use when the in-browser /verify path is blocked (CDN offline, agent runtime has no crypto) or when you want a server-side audit of a third-party receipt.","tags":["verify","L1"],"examples":["Pass a receipt object exactly as returned by any read primitive (signature can be byte[] or sig_b32; pubkey can be byte[] or responder_pubkey_b32 — the verifier tolerates both shapes). Optionally override `pubkey_b32` to assert verification against a specific signer. Returns 200 with `valid: false` when the signature fails — never 4xx for a structurally-well-formed bad signature."],"inputModes":[],"outputModes":[]},{"id":"emem_at","name":"Multi-band snapshot at a place","description":"One-shot multi-band recall at a place (or lat/lng). Defaults to emem's standard at-a-glance band set; pass `band` / `bands` to override. Polygon-resolved places stay at the centroid by default (`n_cells: 1`) to keep multi-band calls cheap — pass `n_cells: 2..=64` to fan out.","tags":["read","L0"],"examples":["Use when the user names a place and wants the standard situational readout (vegetation + elevation + landcover + recent weather) without picking bands. Polygon-aware: `place` that resolves to a polygon (park, lake, district) lands at the centroid unless `n_cells` widens it. For a single band, use the domain-specific shortcuts (emem_ndvi, emem_air, …) or emem_recall directly."],"inputModes":[],"outputModes":[]},{"id":"emem_ndvi","name":"NDVI at a place (one-shot, polygon-aware)","description":"Recall Sentinel-2 NDVI (indices.ndvi, 10 m native) at a point or place. Composes locate → cell64 → recall in one call; auto-materializes on miss.","tags":["read","L0"],"examples":["Use when the user names a place (or lat/lng) and just wants the NDVI number. Polygon-resolved places default to a 16-cell fan-out aggregated as mean/median. Set `n_cells: 1` for point behaviour. For multi-band batches use emem_recall."],"inputModes":[],"outputModes":[]},{"id":"emem_air","name":"Air-quality snapshot (CAMS PM2.5 / NO2 / O3)","description":"Recall Copernicus CAMS air-quality bands at a place: PM2.5 + NO2 + O3. Composes locate → recall → aggregate.","tags":["read","L0"],"examples":["Use when the user names a place and asks about air quality, pollution, or emissions exposure. CAMS is the European reanalysis — global coverage, ~0.4° native (resampled). For finer-grained urban PM2.5, pair with /v1/at-style stations data when available."],"inputModes":[],"outputModes":[]},{"id":"emem_lst","name":"Land surface temperature (MODIS day + night)","description":"Recall MODIS land surface temperature day-8day + night-8day composites at a place. 1 km native, 8-day composite.","tags":["read","L0"],"examples":["Use when the user asks about surface heat, urban heat island, thermal anomalies, or wants day/night LST. Returns both fluxes so the agent can derive day–night spread."],"inputModes":[],"outputModes":[]},{"id":"emem_soil","name":"Soil profile (SoilGrids 0–30 cm: SOC, pH, texture)","description":"Recall SoilGrids 250 m profile at a place: SOC, pH, clay/sand/silt fractions, bulk density, nitrogen — all at 0–30 cm depth.","tags":["read","L0"],"examples":["Use when the user asks about soil quality, agricultural suitability, or carbon stocks at a location. Six bands returned in one envelope."],"inputModes":[],"outputModes":[]},{"id":"emem_water","name":"Surface water (JRC GSW recurrence + S1 backscatter)","description":"Recall surface-water signals at a place: JRC Global Surface Water recurrence (1984–2021) + Sentinel-1 SAR backscatter (current). Pair detects standing water through clouds.","tags":["read","L0"],"examples":["Use when the user asks about flooding, wetlands, surface-water dynamics, or wants a robust water-presence check. JRC alone gives historical baseline; Sentinel-1 gives current flood detection."],"inputModes":[],"outputModes":[]},{"id":"emem_forest","name":"Forest signals (Hansen GFC + ESA WorldCover)","description":"Recall forest signals at a place: Hansen Global Forest Change (tree cover 2000 baseline + year-of-loss) + ESA WorldCover 2021 land class.","tags":["read","L0"],"examples":["Use when the user asks about deforestation, canopy cover, forest loss, or wants a forest-vs-not classification. Hansen gives year-of-loss for any cell with disturbance since 2001; WorldCover gives the current land class."],"inputModes":[],"outputModes":[]},{"id":"emem_weather","name":"Current weather snapshot (temperature, cloud, precip, wind)","description":"Recall the standard met.no/CAMS weather bundle at a place: 2 m temperature + total cloud cover + precipitation + 10 m wind speed.","tags":["read","L0"],"examples":["Use when the user names a place and asks 'what's the weather' or wants a now-cast snapshot. weather.* bands are now-only (no backfill); for climatology use terraclimate.*."],"inputModes":[],"outputModes":[]},{"id":"emem_intent","name":"Intent-routed planner","description":"Submit a typed Intent; receive a plan or executed result.","tags":["plan","L0"],"examples":["Call when the user asks something like 'where is X' or 'is A like B' and you don't want to pick a primitive yourself — the planner maps Intent variants to the right tool call."],"inputModes":[],"outputModes":[]}],"provenance":[{"source":"mcp_registry","first_seen":"2026-05-18T13:08:04.824307+00:00"},{"source":"recrawl_hot","first_seen":"2026-05-21T14:33:24.548216+00:00"}],"recent_probes":[{"fetched_at":"2026-05-22T23:07:33.921728+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":274,"live_responds":true},{"fetched_at":"2026-05-22T12:23:16.547496+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":278,"live_responds":true},{"fetched_at":"2026-05-22T06:47:30.774345+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":287,"live_responds":true},{"fetched_at":"2026-05-21T14:33:24.548216+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":282,"live_responds":true},{"fetched_at":"2026-05-20T13:15:14.065213+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":295,"live_responds":true},{"fetched_at":"2026-05-20T01:36:10.825548+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":279,"live_responds":true},{"fetched_at":"2026-05-19T22:40:18.212129+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":286,"live_responds":true},{"fetched_at":"2026-05-18T21:05:59.150717+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":280,"live_responds":true},{"fetched_at":"2026-05-18T14:29:39.677716+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":281,"live_responds":true},{"fetched_at":"2026-05-18T13:08:04.824307+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":289,"live_responds":true}],"catalog_attestation":null,"verification_history":[],"signatures":[{"protected":"eyJhbGciOiJFUzI1NiIsImprdSI6Imh0dHBzOi8vYWdlbnN0cnkuY29tLy53ZWxsLWtub3duL2p3a3MuanNvbiIsImtpZCI6ImFnZW50ZmluZGVyLWVzMjU2LTEiLCJ0eXAiOiJKT1NFIn0","signature":"6maj3Ra39mgHv7ggw7eA4jm09uecRIx0naJhpjZAOfUJ6AwZkXI0onWadY9mNEpIVwE470Y5ELO2ymqzqJ8KQA"}]}