{"agent_card":"https://emem.dev/.well-known/agent-card.json","matched":115,"note":"Skills here are the same set the A2A AgentCard advertises; this endpoint exists so a peer can ask `do you do X` without fetching the whole catalog. `matched` is the pre-limit count, so a narrow answer is distinguishable from a truncated one.","peers":[],"peers_note":"Other agents on this responder's roster that have SIGNED a declaration of what they do. The signature proves which key wrote it, exactly as it does for any other note. It does not prove the endpoint answers or that the skill is real, and this responder does not check either: call them and judge for yourself. Pass `cell` to keep only peers whose declared coverage contains that cell64.","query":{"category":"","cell":"","limit":25,"q":"","tag":""},"returned":25,"skills":[{"description":"The map of emem's tool surface, and the only tool you need to find the rest: the working loop in the order you walk it (name, ground, cite, resolve, verify, check for drift), then every other tool grouped by the question it answers, each with its one-line trigger. Pass `name` for one tool's full schema and a runnable example. IF YOU ARE READING A LIST OF 18 TOOLS, YOU ARE SEEING A CURATED SUBSET OF 115, NOT THE WHOLE SURFACE; hosts strip `_meta`, so the count is repeated here. Every catalogued tool stays callable by name through tools/call at either endpoint.","example_args":"{\"q\":\"ndvi\"}","id":"emem_tools","level":"L0","name":"What tools exist here, and when to reach for each","tier":"core","when_to_use":"Call FIRST when you do not know which tool answers the question, or need a capability absent from your list: absent from the list is not absent from the server. `q` searches by topic (`ndvi`, `flood`, `verify`), `name` returns one exact schema, no arguments returns the whole map. /mcp/full registers the full catalog; emem_ask answers in one shot without picking a primitive."},{"description":"Mint the canonical, vendor-neutral address (cell64) for a real-world place: the shared spatial identity every agent resolves to identically, so two models refer to the same ground instead of two descriptions of it. Also returns the topic-grouped inventory of bands and algorithms recallable there. For a first-class OBJECT identity (a bridge, a plot, a named place) rather than a raw cell, use emem_entity. Send EITHER `lat`+`lng` as numbers OR a free-text place; coordinates win when both arrive. `q`, `query` and `name` are all accepted spellings of `place`. A key this schema does not declare is reported in `_unrecognised_arguments`, so a typo answers about somewhere else rather than erroring.","example_args":"{\"place\":\"Mount Everest\"}","id":"emem_locate","level":"L0","name":"Resolve place to cell64 + band inventory","tier":"core","when_to_use":"Call when the input names a real-world place and the next step needs its cell64, or wants to know which bands exist there before recalling. `data_at_this_cell` lists every recallable band by topic (`live_bands_by_topic`), the recipes fusing them (`algorithms_for_topic`), and bands with no materializer here. For one packaged answer in a single call, use `emem_ask`."},{"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.","example_args":"{\"q\":\"is this neighbourhood flood-prone for a flat purchase\",\"place\":\"Ashok Nagar, Ranchi\"}","id":"emem_ask","level":"L0","name":"Ask a free-text question about a place","tier":"core","when_to_use":"Call when the question is about a specific place and the answer should carry its own evidence. Send the question verbatim as `q` plus `place`, `cell` or `lat`+`lng`. Over MCP a point answer is a projection: `answer`, `receipt` (cite `receipt.fact_cids`), `place_resolved`, `routed_to`, `facts_summary`, `algorithm_outcomes_summary`, `spatial_trace`, `scene_url`, `model_answer` if you passed `model`, and `_projection` naming what was left out. POST /v1/ask has more: `caveats`, `topic_routing`, `reasoning`, and `inventory` with include:[\"inventory\"]. A `routed_to` other than answer comes back whole. It answers with a current value; for how X changed use emem_intent did_change or emem_diff."},{"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 an attested entry in the shared memory 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).","example_args":"{\"event\":\"algal_bloom\",\"region\":\"Lake Erie\"}","id":"emem_hunt","level":"L0","name":"Hunter mode, find event hotspots over a region","tier":"extended","when_to_use":"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."},{"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 baseline (the version read is in `forest_baseline_dataset`) plus Hansen GFC v1.13 loss year, which counts loss through 2025. JRC TMF deforestation year is read on every cell and reported per plot as `tmf_cross_check`, not voted; a TMF-only loss sets `review_required` and makes `statementOfComplianceSignable` false until reviewed. Each plot carries `verdict_support`, a stated rule over baseline completeness, TMF agreement, borderline canopy and sample spacing. WRI driver attribution and RADD alerts are not wired here. The response is an Annex II-shaped envelope with per-plot verdict (pass/fail/not_in_scope/indeterminate/below_mmu), 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.","example_args":"{\"plots\":[{\"plot_id\":\"farm-001\",\"geometry_geojson\":{\"type\":\"Polygon\",\"coordinates\":[[[-60.5,-3.5],[-60.4,-3.5],[-60.4,-3.4],[-60.5,-3.4],[-60.5,-3.5]]]},\"country_of_production\":\"BRA\",\"commodity_hs\":\"0901\",\"commodity_name\":\"coffee\",\"quantity_kg\":12000}],\"operator\":{\"name\":\"Acme Coffee BV\",\"eori\":\"NL123456789\"}}","id":"emem_eudr_dds","level":"L0","name":"EUDR Due Diligence Statement, polygon-in, signed Annex II envelope out","tier":"extended","when_to_use":"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)."},{"description":"Compute the Standardized Precipitation Index (McKee et al. 1993) at a cell: fit a gamma distribution to the same-window precipitation-accumulation history, then standardize the current accumulation to a z-score and map it to a drought class (extreme/severe/moderate drought … normal … wet). Supply `precip_history_mm` + `current_accumulation_mm` directly, or omit them to read the stored `weather.precipitation_mm` trajectory and build the window accumulations server-side. `window_days` selects SPI-1 (30 d), SPI-3 (90 d, default), SPI-12 (360 d), etc. The result is signed; the receipt cites the precipitation fact_cids it read from the shared memory.","example_args":"{\"cell\":\"defi.zb493.xoso.zcb6a\",\"window_days\":90}","id":"emem_spi","level":"L0","name":"Standardized Precipitation Index (McKee 1993) drought metric","tier":"extended","when_to_use":"Call when the user asks 'is this place in drought', 'how dry is it relative to normal', or wants a precipitation-anomaly z-score. The response is honest: when fewer than the WMO-recommended minimum samples exist it returns verdict=`inconclusive` with `spi:null` and a `honest_note` rather than fabricating a z-score from a handful of points. Quote the `spi`, `spi_class`, and `n_samples`. For raw precipitation use `emem_weather`; SPI is the standardized anomaly."},{"description":"Compute the differenced Normalized Burn Ratio (dNBR = NBR_pre − NBR_post; Key & Benson 2006) and map it to the USGS burn-severity classes (unburned / low / moderate-low / moderate-high / high). Supply `nbr_pre` + `nbr_post` (pin the scenes bracketing the fire date) for a correct result, or omit both to use the two most-recent stored `indices.nbr` scenes (older=pre, newer=post) as a coarse estimate. The result is signed; the receipt cites the NBR fact_cids it read from the shared memory.","example_args":"{\"cell\":\"defi.zb493.xoso.zcb6a\",\"nbr_pre\":0.62,\"nbr_post\":0.11}","id":"emem_burn_severity","level":"L0","name":"Burn severity (dNBR, Key & Benson) from pre/post-fire NBR","tier":"extended","when_to_use":"Call after a wildfire to quantify how badly an area burned, or to triage post-fire severity across a region cell-by-cell. Best practice: explicitly pass `nbr_pre`/`nbr_post` from scenes that bracket the known fire date, the stored-trajectory fallback just takes the two most-recent scenes and may not bracket the fire. Surface `dnbr` and `severity_class`. For active-fire detection use `emem_hunt` with the wildfire event instead."},{"description":"Estimate seasonal CH4 emissions from rice cultivation per IPCC 2019 Refinement Eq 5.1: integrate the daily emission factor over the cultivation period with water-regime scaling (SFp pre-season, SFo organic amendment) and an optional Yan-2005 Q10 temperature modifier. `cultivation_period_days` and the regional `efc_kg_ch4_ha_day` (Table 5.11) are REQUIRED, the endpoint refuses to guess a global default because the regional EFc drives the magnitude (~30% bias if wrong). An NDWI series (supplied or read from stored `indices.ndwi`) informs the flooding-regime context.","example_args":"{\"cell\":\"defi.zb493.xoso.zcb6a\",\"cultivation_period_days\":120,\"efc_kg_ch4_ha_day\":1.22}","id":"emem_rice_ch4","level":"L0","name":"Rice-paddy methane (IPCC 2019 Tier 2, Eq 5.1)","tier":"extended","when_to_use":"Call for paddy-rice GHG inventory / MRV work where the user needs kg CH4 per hectare for a cultivation season. The caller MUST pick the IPCC region's EFc row (Table 5.11) and the cultivation-period length; pass SFp/SFo when the water regime or organic amendment is known. Surface the seasonal emission, the EFc used, and the scaling factors so the inventory is auditable. For enteric/fertilizer pathways use the dedicated sustainability endpoints."},{"description":"Composite deforestation-alert score: `alert_score = 0.5·clamp01(ndvi_drop/0.30) + 0.5·clamp01(embedding_change/0.20)`, where `ndvi_drop = max(0, ndvi_modis_baseline − ndvi_now)` and `embedding_change = 1 − cos(tessera_latest, tessera_prev)`. Each half degrades INDEPENDENTLY and honestly: if a band is missing, that half is dropped AND the output is renamed so a half-score can never be mistaken for the full composite. If NEITHER half is computable the response is a signed `inconclusive` carrying no number. Every response also carries a machine-readable `degraded` boolean plus `degraded_reason` (closed set: `embedding_half_unavailable`, `ndvi_half_unavailable`, `no_inputs`) and `degraded_message`, so a caller gates on the flag instead of parsing prose.","example_args":"{\"cell\":\"defi.zb493.xoso.zcb6a\"}","id":"emem_deforestation_alert","level":"L0","name":"Deforestation alert proxy (NDVI drop + embedding change)","tier":"extended","when_to_use":"Call to flag recent forest-loss-like change at a known cell when you want a single 0..1 alert score rather than a full ensemble. Gate on `degraded`/`degraded_reason`: a half-score (`degraded:true`) must NOT be thresholded against the 0.6 alert gate. Read the renamed score field and the present/absent halves, don't treat a half-score as the full composite. For multi-cell open-world discovery use `emem_hunt` (deforestation event); for regulatory EUDR evidence use `emem_eudr_dds`."},{"description":"Cloud- and night-independent Sentinel-1 C-band confirmation of forest disturbance. Intact forest scatters VV strongly + stably (canopy volume scattering); clearing collapses that term so VV backscatter DROPS ~3-5 dB. Samples VV at a baseline-year July-1 anchor and the latest scene, reports `vv_drop_db = baseline − recent` and a `disturbed` flag when the drop ≥ 3 dB (Reiche et al. 2018, RSE 204:147). Both VV reads are signed Primary facts; the response cites both fact_cids. Honest `inconclusive` when either S1 vintage is unavailable. Source: Microsoft Planetary Computer sentinel-1-rtc (anonymous SAS, no requester-pays, no API key).","example_args":"{\"cell\":\"defi.zb493.xoso.zcb6a\",\"baseline_year\":2020}","id":"emem_sar_forest_disturbance","level":"L0","name":"Sentinel-1 SAR forest-disturbance scout (cloud-penetrating)","tier":"extended","when_to_use":"Call to corroborate or scout forest clearing where cloud blocks the optical products, radar sees through cloud and at night, catching wet-season clearing the annual Hansen/JRC-TMF layers and a single cloudy Sentinel-2 pass miss (the gap RADD was meant to fill). This is an ADDITIVE scout signal, NOT a standalone legal verdict: a VV drop can also be transient (soil moisture, harvest, flood recession), so confirm with the optical consensus (`emem_eudr_dds` or `emem_deforestation_alert`) before crediting a decision."},{"description":"The first runnable surface of the change decomposition Δz = Δ_env + Δ_sensor + Δ_geo + Δ_encoder + ε: a per-term evidence LEDGER for the readout change at a cell, with NO numeric split. `observed` carries the Tessera year-over-year embedding change. `terms.env` carries label-free index pairs (NDVI, NBR, NDWI) with raw deltas and both fact cids, evidence a future estimator would read. `terms.sensor` records what each visit was observed through (source scheme and scene id per band) and whether that path changed. `terms.geo` is declared not estimated (no registration-residual surface exists). `terms.encoder` is pinned by construction: both vintages are slices of one signed multi-year fact under one recipe, named by fn_key. `terms.noise` reports the S2 scene-classification class per visit, so a cloud flip is visible. `split` is null and `attribution_note` says why: splitting a delta numerically needs a calibrated cross-encoder, cross-sensor stability model this responder does not have, and inventing magnitudes would fabricate the exact confusion the decomposition exists to prevent. The ledger persists: each run stores itself as a derivative fact (band change_attribution.ledger, parents = every fact read) and the response returns its own emem:fact: token under ledger_fact, so an attribution is cited and dereferenced like any reading. The receipt binds every input fact cid plus the stored ledger cid. Bands read cold may materialize, so this signs and persists facts.","example_args":"{\"cell\":\"defi.zb493.xoso.zcb6a\"}","id":"emem_change_attribution","level":"L0","name":"Change attribution ledger: why did this place's readout move","tier":"extended","when_to_use":"Call when a change surface (emem_diff, emem_state_diff, did_change) reported that a place's readout moved and the question is WHY: world, instrument, pixels, model, or noise. Read the per-term evidence and cite its fact cids; do not expect a numeric split (`split` is null by design, see `attribution_note`). Bands with fewer than two distinct tslots at the cell appear under evidence_absent with a typed reason rather than a fabricated pair. For the raw delta itself use emem_diff."},{"description":"Fetch a public https page as this responder and return its visible text, with blake3 and sha256 of the exact bytes received, the ETag, and a signed receipt (PreimageV1 emem.read.v1). The hashes let anyone who fetches the same url check they got the same page; the text is derived from those bytes. https only, DNS pinned to publicly routable addresses, at most three redirects each re-admitted, 4 MiB, per-IP daily quota. This signs a receipt and persists nothing.","example_args":"{\"url\":\"https://example.com/\"}","id":"emem_read","level":"L0","name":"Read a web page, signed","tier":"extended","when_to_use":"Call instead of a third-party text reader when a page cannot be fetched from where you run (no CORS) or when you need to cite exactly which bytes you read. Record body_sha256_hex or body_blake3_b32 next to anything you quote from it."},{"description":"Run open-source Tesseract on an image, by url or base64 upload (png, jpeg, tiff, webp, gif, bmp; 8 MiB), and return the text with blake3 of the image and of the text, the engine version, and a signed receipt (PreimageV1 emem.ocr.v1). provenance_class model_output: the receipt proves which image, engine and language produced the text, not that the reading is right. 501 ocr_unavailable on a responder with no engine installed. Persists nothing.","example_args":"{\"url\":\"https://emem.dev/release.png\"}","id":"emem_ocr","level":"L0","name":"Read the text in an image (Tesseract)","tier":"extended","when_to_use":"Call when an agent needs the text in a scan, screenshot, sign or chart and wants the reading tied to the exact image bytes. Quote image_blake3_b32 with the text; treat the text as a reading, not a fact."},{"description":"A system-one call: give a state and up to 8 questions whose answers are known in advance (choice among 2-8 options, bool, or score on a small scale) and get back only values from that set, each with the model's probability for every option, a confidence, and valid_mass (the share of the first token that went to the options; under 0.5 the answer abstains as null). No free text is generated. Runs on this node's local open-weights model; provenance_class model_output; probabilities are uncalibrated. Signed receipt over input, model and answers (PreimageV1 emem.decide.v1). Persists nothing.","example_args":"{\"state\":\"ddzmyzhn -> k572x7go: please witness pointer amii4tnp, chunks 1-107\",\"questions\":[{\"id\":\"kind\",\"kind\":\"choice\",\"ask\":\"What does this note ask for?\",\"options\":[\"witness a pointer\",\"report a bug\",\"say thanks\",\"request a feature\"]}]}","id":"emem_decide","level":"L0","name":"Typed decisions from a small open-weights model","tier":"extended","when_to_use":"Call for repeated closed-set decisions: route an incoming note to request/claim/deliver/verify, flag whether a result needs review, score a match. Do not use it as a verifier of facts: the state it reads can steer it, and its probabilities are not a hit rate until you measure them on your own labelled cases."},{"description":"Have this responder read exactly `length` bytes at `offset` of a public https url and return their BLAKE3, the pointer-row leaf (so the answer slots into an emem:tree), and a signed receipt binding url asked, url fetched after redirects, offset, length, hash, ETag and fetch time (PreimageV1 emem.range_hash.v1). The upstream must answer 206 with that exact Content-Range. 16 MiB per call, https only, DNS pinned, redirects re-admitted. Persists nothing.","example_args":"{\"url\":\"https://huggingface.co/openai-community/gpt2/resolve/main/model.safetensors\",\"offset\":0,\"length\":14291}","id":"emem_range_hash","level":"L0","name":"Hash a byte range next to the data, signed","tier":"extended","when_to_use":"Call to witness one chunk of a large remote file without moving it through your own network, or to spot-check a pointer note's row independently of its author."},{"description":"Given a pointer.v1 or directory.v1 note's file_cid and a row (index or label), return that row's leaf and its audit path to the root the note states, so one chunk is checked with log2(n) hashes instead of the whole table. Refuses root_mismatch when the stated root does not match the note's own rows, and not_a_tree for other kinds. Without row, returns the row count and root. Token: emem:tree:<file_cid>#row=<i>. Persists nothing.","example_args":"{\"file_cid\":\"amii4tnpkfoofsyzrbbs2vxsj4\",\"row\":\"0\"}","id":"emem_tree","level":"L0","name":"Audit path into a note's Merkle table","tier":"extended","when_to_use":"Call when a note names a large object by a Merkle root over its chunks and you want to verify one chunk you fetched, or hand another agent a one-row proof."},{"description":"Return a native-resolution Sentinel-2 window over a bounding box as a FIELD, not a set of points: the pixels become one content-addressed grid artifact (deterministic f32 encoding; fetch the bytes at the returned artifact url, Cache-Control immutable), and what the receipt attests is the DERIVATION, never a byte pipe. A persisted derivation record pins the chosen scene (id, asset, capture time, cloud cover), the recipe (band_raster@1), the grid georeferencing in the scene's UTM CRS, and best-effort per-cell anchors that bridge the artifact to existing signed facts; the receipt's FIELD preimage segment binds (aoi_cid, derivation_cid), reported by /v1/verify_receipt as field_bound. Bounds are refusals with the cap named: six raw S2 bands (B02/B03/B04/B08/B11/B12) and 512 px per side at native resolution (about 5.1 km at 10 m). Anchors never materialize a fact, so a cold AOI costs one scene read, nothing more. The artifact is evictable BY DESIGN: the record persists like any fact and pins everything needed to rebuild identical bytes, so eviction turns a dereference into a recompute, never a broken citation. Returns two tokens: emem:raster: (resolve with emem_raster_resolve) and the record's own emem:fact: handle. This signs and persists the derivation record. TERRAIN: pass band `copdem30m.elevation` (or `elevation` / `dem`) for a static Copernicus GLO-30 elevation field via the dem_raster@1 path, no scene selection, no cloud, EPSG:4326 grid; a bbox crossing a 1-degree DEM tile edge is refused (single-tile only) and open ocean has no tile. EMBEDDING (WB-5): pass an encoder band (geotessera etc.) for a MULTI-CHANNEL embedding field via embedding_raster@1, a signed N-D vector per cell (geotessera = 128-D) packed into one artifact, so a client-side per-cell embedding fan-out becomes one citeable token; every filled cell is anchored to its real signed encoder fact; grid capped at 256 cells at the 0.1-degree native step.","example_args":"{\"bbox\":{\"min_lat\":12.95,\"min_lng\":77.55,\"max_lat\":12.97,\"max_lng\":77.57},\"band\":\"s2.B04\"}","id":"emem_band_raster","level":"L0","name":"Band raster: a field as a signed derivation","tier":"extended","when_to_use":"Call when an agent needs an area's actual field of values rather than per-cell scalars: change analysis over a scene window, input to a model that reads grids, exporting verifiable pixels a third party can re-derive, or a terrain/elevation field (band copdem30m.elevation). For one cell's value use emem_recall; for an RGB visual use emem_cell_scene_rgb, which is a view, not a signed artifact; for areas beyond the 512 px cap, page the bbox."},{"description":"Resolve emem:raster:<aoi_cid>:<band>:<tslot>:<derivation_cid> back to its signed derivation record and the artifact's status. Every claim in the token binds to the signed record before anything dereferences, the same rule fact tokens follow: the cid must be a band_raster@1 derivation and the token's aoi_cid, band, and tslot must each match the record's own body, so a real derivation_cid cannot be passed off under a false area, band, or date (mismatch is a typed 409). The response carries the full record (scene pin, grid georeferencing, anchors) and the artifact url; bytes come from GET /v1/artifacts/{cid}, immutable. An evicted artifact is not an error: the record pins the rebuild, and calling emem_band_raster with the record's own bbox, band, and capture date re-derives identical bytes. The receipt binds (aoi_cid, derivation_cid) through the FIELD preimage segment.","example_args":"{\"token\":\"emem:raster:<aoi_cid>:s2.B04:20650:<derivation_cid>\"}","id":"emem_raster_resolve","level":"L0","name":"Dereference an emem:raster: field token","tier":"extended","when_to_use":"Call when you receive an emem:raster: token from another agent and want the verified field behind it: first this, to get the bound record and artifact url, then fetch the bytes and re-hash them against artifact_cid for the spot-check tier of verification. For emem:fact: tokens use emem_memory_token_resolve."},{"description":"Mint an emem:cube: token: a Sentinel-2 field over an AOI ACROSS TIME. A world model is a field over an area across time, and emem:raster: names only one time-slice, so a 4D world's time scrub had no token to anchor. This mints one band_raster member per target date, each an independent, resolvable emem:raster: derivation, then signs a cube record binding the ordered set. It is NOT new pixels: lineage terminates in each member's pinned scene, so a stranger walks cube -> members -> scenes and re-derives every value from raw Sentinel-2 bytes. cube_cid content-addresses the ordered membership (blake3 of the member derivation cids), so the same slices always name the same cube. Two dates that resolve to the same scene collapse; a cube needs at least two distinct slices and caps at 24 per mint (refused with the cap named). Each member echoes `requested_dates` (the observed_on entries that mapped to it) and `requested_date_distance_days` (the nearest one's gap from the scene's own capture date), so a caller lines a requested date up with its slice directly rather than guessing by tslot proximity. The receipt's FIELD preimage segment binds (aoi_cid, derivation_cid), reported by /v1/verify_receipt as field_bound. Returns the emem:cube: token plus the member emem:raster: tokens. This signs and persists the cube record and its members.","example_args":"{\"bbox\":{\"min_lat\":32.5699,\"min_lng\":77.0328,\"max_lat\":32.5727,\"max_lng\":77.0362},\"band\":\"s2.B08\",\"observed_on\":[\"2026-05-01\",\"2026-06-01\",\"2026-07-01\"]}","id":"emem_band_cube","level":"L0","name":"Band cube: a field over time, as a signed manifest","tier":"extended","when_to_use":"Call when a world model or change-over-time analysis needs a time series of fields over one AOI, not one snapshot: the 4D world token, a phenology stack, a before/during/after triptych. For one time-slice use emem_band_raster; for one cell's value over time use emem_trajectory; resolve a received cube with emem_cube_resolve."},{"description":"Mint a signed, cloud-masked median composite over a date window as a raster-shaped field: the clean, gap-filled texture a world model actually drapes, rather than one cloudy scene. It reads every Sentinel-2 scene in [start_date, end_date] over the bbox, masks each per pixel by its SCL scene-classification class (default reject {0,1,3,8,9,10}: no-data, saturated, cloud shadow, cloud, cirrus; snow 11 is KEPT because snow is surface, not occlusion, and a snow-rejected median would fabricate a bare winter scene; override with mask_policy), and takes the per-pixel lower-of-two median (never averaging two measurements into a value nobody took) with a pinned min_valid_count, below which a pixel is nodata. The mask policy, min_valid_count, and the exact member scene list are pinned in the signed derivation, so a stranger re-derives the composite pixel for pixel from the same scenes. Returns an emem:raster: token (resolve with emem_raster_resolve) plus the content-addressed artifact; the receipt binds (aoi_cid, derivation_cid). Needs at least two clear scenes at one CRS. This signs and persists the derivation.","example_args":"{\"bbox\":{\"min_lat\":32.5699,\"min_lng\":77.0328,\"max_lat\":32.5727,\"max_lng\":77.0362},\"band\":\"s2.B04\",\"start_date\":\"2026-05-01\",\"end_date\":\"2026-07-31\"}","id":"emem_band_composite","level":"L0","name":"Band composite: a signed cloud-masked median over a window","tier":"extended","when_to_use":"Call when a world model or an analyst needs the clean composite texture over an area across a season, not a single-date snapshot that may be cloudy: a scrub-frame base layer, a gap-filled band drape, a cloud-free mosaic. For one pinned scene use emem_band_raster; for the per-slice time series use emem_band_cube."},{"description":"A spectral index (NDVI or NDWI) over a polygon or bbox, per Sentinel-2 overpass across a window, computed from the pixels and signed as one derivation. Every pixel is masked by its scene classification (cloud, shadow, cirrus, no-data), and each scene reports its clear-sky share of the area and the distribution over the clear pixels inside it: median, p10, p25, p75, p90, mean, std, n. A scene the sky mostly hid is listed in `excluded` with its share, never averaged in. On top of the rows: a Theil-Sen trend with Kendall's S and p (seasonal cycle not removed, and it says so), a same-season anomaly for the latest scene against earlier years within 30 days of its day of year, per-scene block medians (map frames to animate), and a first-to-last change map as GeoJSON with the day-of-year gap that confounds it. Scene ids, assets, mask, formula, quantile rule and selection are pinned in the signed record, so every number re-derives from the same scenes. Returns rows ready to chart, an emem:fact: token and a receipt binding (aoi_cid, derivation_cid). This signs and persists the derivation.","example_args":"{\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-5.3012,6.8501],[-5.2988,6.8501],[-5.2988,6.8524],[-5.3012,6.8524],[-5.3012,6.8501]]]},\"index\":\"ndvi\",\"start_date\":\"2025-01-01\",\"end_date\":\"2026-09-30\"}","id":"emem_field_series","level":"L0","name":"Field series: an index over an area through time, signed","tier":"extended","when_to_use":"Call when the question is about an AREA over time, not one point: how a field, plot, orchard or catchment greened or dried across a season, a dashboard tile with uncertainty bands, a map that changes frame by frame. For one cell's stored readings use emem_trajectory; for one clean composite image use emem_band_composite; for year-over-year at one day of year use emem_compare_same_doy. Areas cap at 512 px (about 5 km) a side and windows at four years."},{"description":"Resolve emem:cube:<aoi_cid>:<band>:<tslot_lo>..<tslot_hi>:<derivation_cid> back to its signed cube record and the ordered member emem:raster: tokens. Same fail-closed rule as emem_raster_resolve: the cid must be a band_cube@1 derivation, the token's aoi_cid, band, and tslot range must each match the signed record, and cube_cid is recomputed from the record's members so an altered membership is refused (typed 409), not silently served. Returns the full record plus a member_tokens list you resolve independently with emem_raster_resolve or batch through resolve_many; each member's artifact is at GET /v1/artifacts/{cid}, immutable. The receipt binds (aoi_cid, derivation_cid) through the FIELD preimage segment.","example_args":"{\"token\":\"emem:cube:<aoi_cid>:s2.B08:20600..20651:<derivation_cid>\"}","id":"emem_cube_resolve","level":"L0","name":"Dereference an emem:cube: field-over-time token","tier":"extended","when_to_use":"Call when you receive an emem:cube: token from another agent and want the verified time series behind it: this returns the bound record and the member raster tokens, then resolve those (or resolve_many) and re-hash each artifact against its artifact_cid for the spot-check tier. For a single emem:raster: token use emem_raster_resolve; for emem:fact: use emem_memory_token_resolve."},{"description":"Mint an emem:rasterset: token: a signed manifest binding 2..64 already-minted emem:raster: field tokens (any mix of band_raster / s2_median_composite / dem_raster / embedding_raster) into ONE citeable thing. The composition primitive a world model or a compliance report needs when it must cite one token that points at every signed layer at once - the RGB ground composites, the DEM geometry, the encoder embedding field - so the report points at the world and the world points back at each signed layer. Unlike emem_band_cube (which MINTS members by fanning one band across dates), this BUNDLES existing tokens across bands and types: it is the raster analogue of a memory bundle and the cross-band analogue of a cube. It mints no new pixels - each member resolves and re-derives on its own, and the bundle's lineage terminates in each member's own derivation. bundle_cid = blake3 of the ordered member derivation cids (plus purpose), so the same ordered set always names the same bundle; resolve recomputes it and refuses an altered or forged membership. A member that is not a live raster-shaped derivation fails the whole mint by name. This signs and persists the manifest.","example_args":"{\"tokens\":[\"emem:raster:<aoi>:s2.B04:20509:<dcid1>\",\"emem:raster:<aoi>:s2.B03:20509:<dcid2>\",\"emem:raster:<aoi>:s2.B02:20509:<dcid3>\"],\"purpose\":\"world_soubre RGB ground\"}","id":"emem_raster_bundle","level":"L0","name":"Raster bundle: bind N field tokens into one citeable manifest","tier":"extended","when_to_use":"Call when you have several minted emem:raster: tokens (a world's ground, geometry, and embedding layers) and want ONE token the report or world card cites. For one field use emem_band_raster; for one band over time use emem_band_cube; to bundle per-cell FACTS (not fields) use emem_memory_bundle. Resolve a received bundle with emem_raster_bundle_resolve."},{"description":"Resolve emem:rasterset:<bundle_cid>:<derivation_cid> back to its signed manifest and verify it. Fail-closed like every field-token resolve: the cid must be a raster_bundle@1 derivation, bundle_cid is recomputed from the record's ordered members and matched against BOTH the token and the record (any mismatch is a typed 409, refusing an altered or forged membership), and every member emem:raster: token is re-verified as a live raster derivation. Returns the member list with a per-member resolves flag, so a stranger confirms the whole set is intact before trusting the world it names.","example_args":"{\"token\":\"emem:rasterset:<bundle_cid>:<derivation_cid>\"}","id":"emem_raster_bundle_resolve","level":"L0","name":"Dereference an emem:rasterset: bundle token","tier":"extended","when_to_use":"Call when you receive an emem:rasterset: token (a world's or DDS's bundle of field layers) and want to verify the membership is intact and every layer still resolves, before you trust or render it. For a single emem:raster: token use emem_raster_resolve."},{"description":"Compute three standard DEM terrain indices from one 3×3 Copernicus-DEM (copdem30m.elevation_mean) neighbourhood at a cell: Horn (1981) slope in degrees, Riley (1999) Terrain Ruggedness Index (TRI = sqrt(Σ(Z_centre−Z_i)²)), and Weiss (2001) Topographic Position Index (TPI = Z_centre − mean(neighbours); positive = ridge, negative = valley). The 8 neighbour cell64s are derived by perturbing the cell's lat/lng one cell pitch per axis; the east-west ground spacing is cos(lat)-corrected. Each result is signed; the receipt cites the elevation fact_cids read from the shared memory.","example_args":"{\"cell\":\"defi.zb493.xoso.zcb6a\"}","id":"emem_terrain","level":"L0","name":"Terrain triad, slope + ruggedness + topographic position from DEM","tier":"extended","when_to_use":"Call when the user asks how steep / how rugged / ridge-or-valley a place is, for siting (solar, construction, agriculture), erosion/landslide screening, or habitat-heterogeneity inputs. Slope and TRI need the full 8-neighbour ring; TPI degrades to ≥1 neighbour. Copernicus DEM is bathymetry-free, so ocean cells return a signed `inconclusive` rather than a fabricated slope, read each index's own `verdict`. For raw elevation use `emem_elevation`."}],"truncated":true}