Two gaps in the impact model: forecasts, and exposure #110
Replies: 6 comments 1 reply
|
Thanks for opening this discussion @emmanuelmathot Question 1Regarding the existing I agree that option 1b is the best from a user perspective. I think we should implement it, and (optionally) extend it depending on data upstream. Example ideas below: "monty:forecast": {
"issue_time": "2026-07-26T00:00:00Z",
"valid_time": "2026-07-27T00:00:00Z",
"lead_time_hours": 24,
"reference": "JTWC advisory 13"
"confidence": "0.7" # this could be valuable if provided upstream
"resolution": "3" # likely most applicable to weather forecasts
"resolution_unit": "km"
}Question 2
I think this is a pretty large issue that we should address. The number of people exposed to a hazard will often be wildly different to the number of people impacted by a hazard. Conflating the two in the same item property is not only incorrect, but I'd argue a credibility issue. I largely agree that option 2b is correct to implement now and 2c would be worth exploring, especially in the context of baseline hazard exposure and anticipatory action themes. Having data that covers baseline exposure, forecasted exposure (to a specific upcoming hazard), initial impact data, and response data is quite a compelling data set / product. |
|
Without knowing how the data will be used downstream or even the larger data model around this makes it difficult for me to give comment how it should structure. I share some thoughts still at the surface level: Question 1:
Question 2:
|
|
Picking this up after @wrynearson's and @p-phung's replies. They converged on the same pair of answers (1b for Q1, and 2c for Q2, with @wrynearson taking 2b as a step toward it), so rather than re-argue those, I want to add the piece that I think makes both concrete: Q1 and Q2 are the same question asked on two different axes, and an existing standard already draws both axes for us. The two axesReading Q1 and Q2 side by side:
These are independent. A figure can be observed-exposure, forecast-exposure, observed-loss or forecast-loss. The table in the original post already shows this for Q1; the same table works for exposure. Today Monty collapses both axes into There is an existing classification for the second axisThe Risk Data Library Standard (RDLS), curated by GFDRR, defines four risk-data components: Hazard · Exposure · Vulnerability · Loss RDLS metadata structure. Source: docs.riskdatalibrary.org The shape of that diagram is the part worth noticing for us. RDLS puts the fields common to everything at the dataset level, then groups the fields that are specific to a type of risk data under one object per component: Hazard, Exposure, Vulnerability, Loss. That is the same move Monty already makes with It is not one organisation's model. GEM led the exposure component, UCL EPICentre the vulnerability component, and BGS the hazard component. The same quadrant recurs in INSPIRE Natural Risk Zones ( That convergence is the argument. @p-phung asked for a clear distinction that follows widely known UNDRR definitions, because it "makes Monty more interoperable". RDLS is that distinction: already written down, already implemented by the modelling community, and already the vocabulary GEM and GFDRR publish data in. Monty already sits on this quadrant, with two legs present and two missing:
Monty already contains the exposure vocabularyThis is the part I forgot (this was done 2 years ago :-).
That is an exposed-asset and population taxonomy, close in shape to what GEM produced for RDLS. The pressure is already visible in four places@wrynearson put the cost of leaving this alone more sharply than the original post did: conflating exposure and impact in one property is "not only incorrect, but I'd argue a credibility issue". Worth noting how much surface that already covers: exposure is not a hypothetical future need, it is already being worked around in four places.
Four sources, four different workarounds, one missing class. Vulnerability answers "what else have we not anticipated?"The reason to reach for the whole quadrant rather than only adding Exposure: Vulnerability is the component nobody has raised yet, and it will arrive. Fragility curves, building-stock vulnerability indices, INFORM-style susceptibility indicators, IFRC's own vulnerability assessments are all Vulnerability data in the RDLS sense, and none of them fit Hazard, Impact or Response. Adopting the quadrant means that when it turns up, the class already exists and the boundary is already drawn by someone else. What this means for Q1, and why it is not the same fixRDLS deliberately keeps uncertainty out of the component axis. It handles it with separate, cross-cutting fields applied within a component:
So the answer to Q1 is not solved by adding an Exposure class, and vice versa. Both need answering. The useful part is that RDLS shows they should be answered separately, as an observed/forecast/probabilistic qualifier that applies to any component, rather than three more values crammed into That reframes option 1b ( On the
|
| Class | Detail object | Status |
|---|---|---|
| Hazard | monty:hazard_detail |
exists |
| Exposure | monty:exposure_detail |
new |
| Vulnerability | monty:vulnerability_detail |
reserved, define on demand |
| Impact (Loss) | monty:impact_detail |
exists, narrows |
| Response | monty:response_detail |
exists |
(Singular _detail, to match the three that already exist.)
monty:exposure_detail is mostly specified already, just in the wrong place. RDLS builds its exposure component on category (a closed codelist), taxonomy (the scheme naming individual assets, for example GEM's), and metrics[] carrying a dimension and quantity_kind. Monty's existing "Exposure Category" table is that first field, verbatim. A sketch, using this thread's GDACS figure:
"monty:exposure_detail": {
"category": "people",
"value": 103014755,
"unit": "people",
"estimate_type": "modelled"
}Two things need settling that impact_detail never had to answer, and both argue for a separate object rather than a flag:
- Exposure is always exposure to something. A population count is meaningless without the footprint that defines it, so an Exposure item needs a
relatedlink to the Hazard item carrying the threshold (the 39 kt band, the MMI level). That relationship has no equivalent on an Impact item. - The threshold itself has to be expressed.
pop39andpop74are the samecategoryat different hazard intensities. Today they are told apart only by prose.
The payoff is that potentially_affected can then be retired from impact_detail, or narrowed to the one meaning it was coined for. Every current use of it that actually means "inside the footprint" moves to monty:exposure_detail, and the field stops being the place where anything unclassifiable ends up.
monty:vulnerability_detail is worth reserving by name now and defining when a source arrives. RDLS says its vulnerability component "uses attributes consistent with the hazard, exposure and loss components" but the public schema reference does not enumerate it in the detail the other three get, so there is no point copying a shape we would have to redo.
On Q1, take 1b, framed as the uncertainty axis, rather than an impact-local field, so the same qualifier can sit on Exposure and Hazard items too. Note this is what the detail-object split buys: whatever monty:forecast ends up looking like, it applies to Exposure and Hazard items exactly as it does to Impact, instead of being defined once inside impact_detail and then needing a second copy per class.
Sequencing that avoids a migration cliff:
- Agree the framing (this thread / TWG).
- Add
exposureas a role,*-exposurecollections, andmonty:exposure_detail. Move the "Exposure Category" table out from under## Impactin the taxonomy, where it already belongs. Existing exposure-as-impact items keep working; sources migrate one at a time. - Settle the uncertainty axis (Q1 + #127) as one decision covering forecast and probabilistic data, defined once so it applies to every detail object.
- Once the four sources above have migrated, narrow or retire
potentially_affectedinmonty:impact_detail. This is the step that actually closes @wrynearson's credibility concern, and it is only safe after step 2. - Reserve
monty:vulnerability_detailby name. No implementation needed until a source turns up, but naming it now stops the next unanticipated data type being pushed into Impact.
Caveats
- RDLS is a dataset-level metadata standard; Monty is item-level STAC for events. This is an alignment of classes and vocabulary, not wholesale adoption of the RDLS schema. The component boundaries transfer; the field-level structure mostly does not.
- Making Exposure a class is genuinely the larger change. But the counterfactual is not "no change". It is continuing to add per-source workarounds, of which there are already four.
References
- Risk Data Library Standard: what it is, schema reference, GFDRR/rdl-standard
- UNDRR terminology: exposure
- USGS PAGER Scientific Background: the alert thresholds behind the unit finding
- #125, #127, #128, #129, #130
|
Thanks, I agree that For Question 1, I support option 1b. A separate For Question 2, I see a separate Exposure class and collection as the cleaner long-term model. However, I think we should first inventory the current source fields and the queries consumers need. GDACS is clearly exposure, but other sources need separate semantic review. I also suggest treating USGS PAGER alerts separately: they are probabilistic loss data, not exposure, so they should not be mapped to |
|
Core partners meeting discussion on 2026-09-09
|
Uh oh!
There was an error while loading. Please reload this page.
Raised from #89, where the GDACS tropical cyclone timeline mapping ran into both. Proposed as a Montandon TWG agenda item.
The GDACS mapping for
impacts[].resource.timelineis now written down. Two questions came up while writing it that the GDACS document cannot answer on its own. Both belong to the Monty model. This discussion is to settle them.The evidence
GDACS publishes a cyclone advisory timeline. Each entry is one point on the storm track. The entry carries a population count for each wind band. Here is the timeline of cyclone NOUL-26, episode 13 (
eventid=1001294), read live on 2026-08-03:actualadvisory_datetimewind_speedpop39pop74actual: Truemarks an observed track position.actual: Falsemarks a forecast position. Every population figure in the table, on both kinds of row, comes from the same GDACS population model applied to a wind footprint.Question 1 — should Monty mark an estimate as a forecast?
Monty has no field for this. The closest field is
monty:impact_detail.estimate_type, with the valuesprimary,secondaryandmodelled. That field describes where a figure comes from. It does not describe whether the figure is about the future.The two axes are independent:
A GDACS forecast and a USGS post-event PAGER run both map to
modelledtoday. A consumer cannot tell them apart, except by comparing the item datetime to the time it read the catalogue — which is not a stable test, and fails entirely on a historical query.This is not only a GDACS problem. PDC publishes forecast products. The Monty model text already says an event "has occurred or is forecasted to occur", and
docs/model/README.mddescribesstart_datetimeandend_datetimeas "when the impact estimate started or is forecasted to start". So the model already assumes forecasts exist. It just gives no way to query for them.Two implementations exist in the wild, both undeclared:
pystac-montysets a bare item propertyforecasted: true|falsefor GDACS TC (gdacs.py:542) and for USGS (usgs.py:717).patternPropertiesallows any key without themonty:prefix. So they are invisible to the extension, unnamespaced, and undiscoverable.The instinct is right. The field needs specifying.
Options
1a. Add
monty:impact_detail.observation_type. Valuesobservedandforecast. Small change. It sits besideestimate_type, where a consumer already looks. It does not carry the issue time or the lead time, so it cannot support forecast verification.1b. Add an item-level
monty:forecastobject.Presence marks the item as a forecast. Absence means observed. It carries enough to support forecast verification later. It applies to hazard items and impact items alike, which matters because a cyclone track point is arguably both. Larger change.
1c. Add
forecastto theestimate_typeenum. Cheapest. Rejected in the GDACS write-up, and stated here for completeness: it conflates the two axes, and it silently loses the provenance of a forecast figure, which is always modelled.Recommendation: 1b. The lead time is the field that makes forecast data usable, and 1a cannot be extended to carry it without a second change later.
Question 2 — is exposure an impact?
pop39counts the people inside the 39 kt wind field. It does not count the people the cyclone harmed. UNDRR keeps these apart: exposure is the presence of people or assets in hazard-prone areas; impact is the effect of the hazard on them.Monty has no exposure class. The GDACS mapping therefore files exposure under
monty:impact_detailwithtype: potentially_affected. That is a compromise, and it has costs:potentially_affectedis now doing two jobs. For GDACS it means "inside the footprint". For other sources it can mean an early, uncertain affected-persons estimate.buffer39response also lists exposed airports, ports, cities, hydro installations and nuclear plants, with model provenance. Monty currently maps none of it.Options
2a. Keep exposure inside Impact. Status quo. Document the convention per source, as the GDACS doc now does. Zero schema change. The ambiguity stays, and it grows with each source that publishes exposure.
2b. Add an
exposurevalue tomonty:impact_detail.type, or a flag on the detail object. Cheap and explicit. Exposure items stay queryable in the same collection as impacts, which keeps the "what do we know about this event" query simple.2c. Make Exposure a Monty class of its own, beside Event, Hazard, Impact and Response, with
*-exposurecollections. Cleanest conceptually. It matches how the DRR field draws the line, and it gives the non-population exposure (infrastructure) somewhere to live. Largest change: new role, new collections, ETL and consumer migration.Recommendation: 2b now, 2c on the roadmap. 2b removes the ambiguity for a small cost and does not block 2c. Deciding 2c properly needs a survey of which sources publish exposure, which is more work than this issue can carry.
What is blocked
Nothing urgent. The GDACS mapping ships with the rules as documented, and the compromise recorded. Both questions become migrations when settled, not rewrites.
Asks of the TWG
References
All reactions