Skip to content

Commit 0d1b7fb

Browse files
docs(cems): close all open questions with exhaustive verification
- statusCode/type enums: scanned all 224 activations (2074 products). Confirmed exhaustive sets statusCode {F,I,W,N} and types {REF,FEP,DEL,GRA,GRM}; no others. - N->status rule now data-driven from version.reason: "no change of impact/ damage/situation" -> no-impact; remote-sensing limitations / cancelled -> withdrawn. - GDACS episode resolution verified: geteventdata returns the current episode (TC1001230 -> 41, iscurrent), so resolve it via one lookup instead of a stale -1 default. - No CEMS OpenAPI endpoint exists, so enums are grounded in the full corpus. Removed the residual-verification note; decisions table now fully closed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 46e5c3e commit 0d1b7fb

1 file changed

Lines changed: 14 additions & 11 deletions

File tree

docs/model/sources/CEMS/README.md

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ Each product maps to a Monty Response item via `monty:response_detail`.
177177
|----------------------|-------------|-------|
178178
| `type` | `monty:response_detail.type` | `REF``eo-ref`, `FEP``eo-fep`, `DEL``eo-del`, `GRA``eo-gra`. Monitoring/variant type codes (e.g. **`GRM`** grading-monitoring) map to their base product code (`eo-gra`) with `monitoring_number` set |
179179
| `code` (activation) | `monty:response_detail.source_id` | e.g. `EMSR847` (source-system anchor) |
180-
| `version.statusCode` | `monty:response_detail.status` | `F` (delivered)`published`; `I` (in production)`in-production`; `W` (scheduled, future `expectedDelivery`)`planned`; `N` (not produced)→`withdrawn`, or `no-impact` when `version.reason` indicates no damage/impact. `feasible=false``withdrawn` |
180+
| `version.statusCode` | `monty:response_detail.status` | Full enum (confirmed across all 224 activations): `F``published`, `I``in-production`, `W``planned`, `N``no-impact` when `version.reason` mentions *no change of impact/damage/situation*, else `withdrawn` (remote-sensing limitations, cancelled) |
181181
| `monitoring` / `monitoringNumber` | `monty:response_detail.monitoring_number` | Set **only** when `monitoring=true`; iteration links to the prior via `rel: prev` |
182182
| `extent` (WKT) | `geometry` / `bbox` | Product footprint (AOI extent) |
183183
|| `monty:response_detail.producer` | `Copernicus EMS` (mapping provider) |
@@ -302,7 +302,7 @@ link** so the graph is directly navigable (65/224 sampled activations carry a `g
302302

303303
| CEMS field | Example | Target Monty id (derivation) | Link |
304304
|------------|---------|------------------------------|------|
305-
| `gdacsId` | `TC1001230` | GDACS `{eventtype}`+`{eventid}`; Monty id `{eventid}-{episodeid}` in `gdacs-events``1001230-{episode}` | `rel: related`, `roles: ["event"]` |
305+
| `gdacsId` | `TC1001230` | GDACS `{eventtype}`+`{eventid}`; Monty id `{eventid}-{episodeid}` in `gdacs-events``1001230-41` (current episode via `geteventdata`) | `rel: related`, `roles: ["event"]` |
306306
| `charterNumber` (+ `charterUrl`) | `996` | Charter Event `charter-event-{activation_id}``charter-event-996` (`charter-events`) | `rel: related`, `roles: ["event"]` (+ `["response"]` to Charter VAPs) |
307307
| `relatedevents` | EMSR codes | `cems-event-{code}` | `rel: related`, `roles: ["event"]` |
308308

@@ -313,9 +313,12 @@ The edge is reciprocal — the Charter source doc already links VAPs to sibling
313313
- **Emit unconditionally** from the deterministic id — a `related` link to a not-yet-ingested
314314
target is valid STAC and cheaper than gating on presence; it resolves when the sibling source
315315
is ingested/back-filled.
316-
- **GDACS episode**: `gdacsId` gives `{eventtype}{eventid}` but no episode, so link to
317-
**episode 1** (`{eventid}-1`) as the deterministic anchor (episodes refine the same event);
318-
optionally upgrade to the latest episode when a cheap GDACS lookup is available.
316+
- **GDACS episode**: `gdacsId` gives `{eventtype}{eventid}` but no episode. Resolve the
317+
**current** episode with one cheap call —
318+
`gdacsapi/api/events/geteventdata?eventtype={t}&eventid={id}` returns the current
319+
`episodeid` (e.g. `TC1001230` → episode **41**, `iscurrent: true`) — and link to
320+
`{eventid}-{episodeid}`. (A bare `{eventid}-1` would be stale; only fall back to it if the
321+
lookup fails.)
319322

320323
## Hazard codes
321324

@@ -365,20 +368,20 @@ All mapping decisions are settled — none block ETL implementation.
365368

366369
| # | Decision | Resolution |
367370
|---|----------|------------|
368-
| 1 | **`statusCode``status`** | Enum `F`/`I`/`W`/`N` `published`/`in-production`/`planned`/`withdrawn` (confirmed stable across ~20 activations spanning the full range). `N``no-impact` when `version.reason` states no damage/impact observed, else `withdrawn`. |
369-
| 2 | **Product type codes** | `REF`/`FEP`/`DEL`/`GRA` `eo-ref`/`eo-fep`/`eo-del`/`eo-gra`; monitoring/variant codes (`GRM`)base code + `monitoring_number`. |
371+
| 1 | **`statusCode``status`** | Enum **`F`/`I`/`W`/`N`** (exhaustive — scanned all 224 activations / 2074 products) `published`/`in-production`/`planned`/`withdrawn`. `N``no-impact` when `version.reason` says *no change of impact/damage/situation*, else `withdrawn` (remote-sensing limitations, cancelled). |
372+
| 2 | **Product type codes** | Types **`REF`/`FEP`/`DEL`/`GRA`/`GRM`** (exhaustive) `eo-ref`/`eo-fep`/`eo-del`/`eo-gra`; the monitoring variant `GRM``eo-gra` + `monitoring_number`. |
370373
| 3 | **Hazard geometry** | AOI → Hazard; geometry = **latest delivered DEL** (`statusCode=F`, max `monitoringNumber`), fallback AOI `extent`, **updated in place**. |
371374
| 4 | **Multi-hazard** | Driven by `category`/`subCategory` + GRA footprint classes — **not** DEL count. A secondary hazard with no dedicated polygon uses the AOI extent (coarse) and takes severity from its footprint-class figure. |
372375
| 5 | **Response geometry** | The product's own `extent` (precise footprint); AOI extent only as fallback. |
373376
| 6 | **Source imagery** | Emit linked **acquisition items** from `images[]` (carrying `sat:`/`eo:`/`sar:`, `resolutionClass`, `acquisitionTime`) referenced via `derived_from` — per the best-practices layer-separation rule; imagery extensions never on the Response product. |
374377
| 7 | **Monitoring & revisions** | Monitoring iterations = separate items chained by `rel: prev`; `version.number` corrections supersede in place — see [Tracking over time](#tracking-over-time). |
375378
| 8 | **Impact granularity** | Per-product GRA `stats` series (each timestamped), one Impact per exposure class per iteration; aggregated activation `stats` is cross-check only. |
376-
| 9 | **Cross-source links** | Emit `related` **unconditionally** from the deterministic target id; GDACS episode defaults to `-1`. |
379+
| 9 | **Cross-source links** | Emit `related` **unconditionally** from the deterministic target id; resolve the GDACS **current** episode via one `geteventdata` call (`-1` only if the lookup fails). |
377380
| 10 | **Refresh** | Watermark on the `?closed=false` list; detail only when `(lastUpdate, n_products, n_aois)` advance — see [Refresh & polling strategy](#refresh-and-polling-strategy). |
378381

379-
**Residual verification (non-blocking):** cross-check the `statusCode` enum against the CEMS
380-
product-lifecycle spec (only `F`/`I`/`W`/`N` observed); confirm whether a cheap GDACS
381-
episode-resolution lookup is worth adding over the `-1` default.
382+
All questions are closed against the live data (enums scanned exhaustively; GDACS episode
383+
resolution verified). No CEMS OpenAPI/schema endpoint is published, so the enums above are
384+
grounded empirically in the full 224-activation corpus rather than a spec.
382385

383386
## Resources
384387

0 commit comments

Comments
 (0)