diff --git a/frameworks/mdg-storms/2024-12-13.md b/frameworks/mdg-storms/2024-12-13.md index fef80ae0..4105ad57 100644 --- a/frameworks/mdg-storms/2024-12-13.md +++ b/frameworks/mdg-storms/2024-12-13.md @@ -52,9 +52,9 @@ model_report: null raw_extract: ["raw/frameworks/mdg-storms/2024-12-13.txt"] # --- live system --- operated_by: null -apps: [] +surfaces: [] # no published site for this repo (analysis notebooks only); the retired `apps:` key was empty (D102) # --- source repo & reconciliation --- -depends_on: [mdg-monitoring] # ds-aa-mdg-monitoring's daily IMERG rainfall check — the live implementation of the rainfall leg of the Annex's observational indicator (300mm/3-day threshold). Currently 🔴 DOWN per infrastructure/pipeline-registry.md (snapshot 2026-08-30). +depends_on: [mdg-monitoring] # ds-aa-mdg-monitoring's daily IMERG rainfall check — the live implementation of the rainfall leg of the Annex's observational indicator (300mm/3-day threshold). Currently 🔴 DOWN per infrastructure/pipeline-registry.md (re-verified 2026-09-07, still no successful run since ~11 April 2026). source_repo: ocha-dap/ds-aa-mdg-storms source_branch: main source_sha: a99828b @@ -73,7 +73,7 @@ discrepancies: - "[stale] Notebooks 01.4–01.6 and 01.6.1 include Scenario 2 (64 kt, ~118 km/h) and Scenario 2.5 (hybrid 64 kt on land / 90 kt within 100 km) analyses. These were candidate designs; only Scenario 3 (≥90 kt / ≥166 km/h, within 100 km) was endorsed in the final PDF." - "[conflict] The combined return-period notebook (04.0) computes the readiness RP from La Réunion RSMC *forecast* distances (MG_distance_km <= 100, max_wind_kt >= 90, lt_hour.between(72, 120)) — consistent with the PDF's 90 kt / 166 km/h / 100 km / 120-72 h readiness window — and finds **7 distinct qualifying storms across the 14 seasons** 2010/11–2023/24 (BATSIRAI, BELNA, EMNATI, ENAWO, FREDDY, GAMANE, GIOVANNA), which it reports as `14/7` = **~1-in-2 yr**, not the ~1-in-3 yr the PDF cites for Scenario 3 generally. NOTE the counting basis: the notebook divides seasons by *storms*, not by seasons-containing-a-storm — Batsirai and Emnati both fall in 2021/22, so only 6 of 14 seasons contained a qualifying storm and the season-frequency (the figure relevant to an all-in envelope) is nearer **~1-in-2.3 yr**. The action RP in the same notebook is computed from IBTrACS best-track *observations* (REU_WIND >= 90, SEASON >= 2001) with NO lead-time filter and NO explicit 100 km distance filter (points are pre-restricted only by a 100 km buffer spatial join, `buffer = 100` in constants.py) — i.e. a frequency-of-occurrence estimate (8 distinct storms across the 24 seasons 2001–2024 → ~1-in-3 yr, same storms-not-seasons basis), not the operational forecast-based action trigger (≤72 h, within 100 km) the PDF defines. So the PDF's headline '~once every three years' framing (Aperçu/Considérations principales) matches the notebook's *action* figure but not its *readiness* figure. The thresholds themselves are NOT in conflict (166 km/h / 100 km / 72–120 h vs ≤72 h match the PDF) — the disagreement is confined to the cited return period. IMPORTANTLY, the repo DOES compute the action RP under the PDF's exact forecast definition, in notebook **01.6** (not 04.0): `MG_distance_km <= 100 & max_wind_kt >= 90 & lt_hour.between(0, 72)` yields **10 distinct storms** (BELNA, BATSIRAI, BINGIZA, EMNATI, ENAWO, FREDDY, GIOVANNA, HARUNA, GAMANE, HELLEN) and prints 'The action trigger is met every **1.5** years.' — i.e. the exact-definition action RP is ~1-in-1.5 yr, roughly TWICE as frequent as the PDF's '~once every three years'. (01.6 also divides by an inconsistent denominator: readiness uses `df_rsmc['season'].nunique()` = 14 seasons, action uses `2024 - 2010 + 1` = 15; on a common 14 seasons the action figure is ~1-in-1.4 yr.) So the PDF's ~1-in-3 framing matches ONLY 04.0's loose IBTrACS-observation proxy, and neither of the two exact forecast-definition figures (readiness ~1-in-2, action ~1-in-1.5). Notebook 01.6.1 applies the same ≤72 h filter but computes no return period — it only cross-references the qualifying storms against CERF/EM-DAT impact data." - "[gap] The observational indicator (IDP count and rainfall) described in the Annex of the PDF is explicitly noted as still being finalized at time of publication ('les équipes d'OCHA travaillent actuellement à la définition précise des critères'). This repo (ds-aa-mdg-storms) contains only the analysis background for both legs — IDP classification/return-period work in notebook 02.2 (1,000–10,000 displaced → Scenario 1; 10,000–25,000 → Scenario 2; >25,000 → Scenario 3; Scenario 3 alone: 9 storms over an assumed 28 years ≈ 1-in-3.11 yr — note 04.0 divides the same 9 storms by 29 seasons instead, giving ~1-in-3.2 yr) and rainfall-threshold derivation in 03.2 (03.1 is exploratory review; the 300 mm figure is the 3-day region-mean IMERG sum over landfall ±1 day, and 03.2 states plainly that it was tuned to select the desired number of storms — `threshold = 300` with the comment `# we want to get 7 storms so fine tuning this` — i.e. the threshold is calibrated to a target frequency, not to an impact level; the resulting storm list transcribed into 04.0 has 8 names (ENAWO, MANOU, INDLALA, JADE, ELIAKIM, HUBERT, GAFILO, HEROLD) over 24 seasons ≈ 1-in-3 yr, one more than the 7 the comment was tuning for) — no finalized IDP-indicator code exists anywhere. The RAINFALL leg, however, has since been operationalized as a live pipeline in a SIBLING repo — see the next entry." - - "[gap] No monitoring pipeline or live trigger-checking system for the Scenario-3 wind/distance trigger itself is present in THIS repo (no `.github` workflows, no cron/schedule code anywhere in ds-aa-mdg-storms); that trigger is monitored manually by the Centre de Données Humanitaires (CHD) reading Météo-Madagascar bulletins, per the PDF's own process. The rainfall leg of the observational indicator DOES now have a live automated pipeline — [`pipelines/mdg-monitoring`](../../pipelines/mdg-monitoring.md) (sibling repo `ocha-dap/ds-aa-mdg-monitoring`, GHA daily 16:00 UTC): checks 3-day IMERG rainfall per ADM1 region against a 300 mm threshold and emails an informational (not activating) status to partners. Per `infrastructure/pipeline-registry.md` (snapshot 2026-08-30) it is still 🔴 DOWN/OVERDUE with no successful run since ~11 April 2026 — the registry is the one home for the live figure; re-check it there before relying on this pipeline." + - "[gap] No monitoring pipeline or live trigger-checking system for the Scenario-3 wind/distance trigger itself is present in THIS repo (no `.github` workflows, no cron/schedule code anywhere in ds-aa-mdg-storms); that trigger is monitored manually by the Centre de Données Humanitaires (CHD) reading Météo-Madagascar bulletins, per the PDF's own process. The rainfall leg of the observational indicator DOES now have a live automated pipeline — [`pipelines/mdg-monitoring`](../../pipelines/mdg-monitoring.md) (sibling repo `ocha-dap/ds-aa-mdg-monitoring`, GHA daily 16:00 UTC): checks 3-day IMERG rainfall per ADM1 region against a 300 mm threshold and emails an informational (not activating) status to partners. Per `infrastructure/pipeline-registry.md` (re-verified 2026-09-07) it is still 🔴 DOWN/OVERDUE with no successful run since ~11 April 2026 — the registry is the one home for the live figure; re-check it there before relying on this pipeline." - "[stale] rsmc.py carries two copy-paste artefacts from a Mozambique predecessor repo: (a) RSMC_RAW_DIR hard-codes 'moz' in the raw path (DATA_DIR / 'private' / 'raw' / 'moz' / 'rsmc' / ...) while the processed path correctly uses 'mdg'; and (b) the calculate_rp docstring still describes the pcode parameter as an 'ISO 3166-2:MZ code for the AOI' (Mozambique), whereas the Madagascar distance columns the code actually builds/consumes are `MG_distance_km` (ADM0) and `any_distance_km` (min across ADM1) — the only call sites, in notebook 01.2, pass `pcode=\"any\"`. Neither affects the endorsed trigger logic." - "[gap] The README is a bare stub (does not document the trigger thresholds, the readiness/action windows, or link the framework PDF) — typical of these repos. The endorsed trigger must be read from the PDF (framework_doc); the repo's notebooks derive but do not document it." # --- activation history --- @@ -97,7 +97,7 @@ extra: schema_strain: "target_people not stated as a single total in the PDF; per-agency/per-sector beneficiary counts in the Activités prioritaires table (sec. 7) sum to ~246,000 (15,721 + 3,750 + 1,200 + 57,217 + 3,600 + 10,000 + 1,500 + 5,000 + 75,000 + 17,063 + 20,000 + 15,000 + 21,000; a few rows, e.g. early-warning messaging and UNHAS logistics, are 'n/a' and excluded) but with significant overlap across sectors targeting the same individuals — not a deduplicated headcount." activation_verification: "The Cyclone Gezani (9 Feb 2026) activation is CONFIRMED against public sources (QA reviews 2026-07-13 and 2026-07-27): OCHA Tropical Cyclone Gezani Flash Updates No.1–4 (Feb 2026), the Anticipation Hub, WFP ('Madagascar: Anticipatory Actions Cyclone Gezani 2026') and UNICEF Madagascar Flash Updates #2–4. Verified: the activation threshold — 'a forecast of an intense tropical cyclone passing within 100 km of the coast with wind speeds exceeding 166 km/h' — was reached on 9 Feb on Météo-Madagascar forecasts (wording matches this page's Scenario-3 trigger exactly); US$3M of pre-arranged CERF finance was allocated to six UN agencies targeting >93,000 vulnerable people; Gezani made landfall near Toamasina/Tamatave on 10 Feb 2026 (~17:30 UTC) as an intense TC with 10-minute sustained winds ~180–195 km/h and gusts ~230–250 km/h (the QA review of 2026-08-03 corrected an earlier 'winds up to 250 km/h' phrasing, which was the high-end GUST figure from press reporting, not sustained wind — WMO gives ~180 km/h sustained / 230 km/h gusts at landfall, Météo-France La Réunion a 195 km/h 10-min peak); Madagascar's first cyclone AA pilot activation. TWO FIGURES, TWO MEANINGS — do not conflate: US$3M is the pre-arranged envelope allocated on activation, while '~US$900,000 in CERF Anticipatory Action funding released ahead of landfall' (OCHA flash updates, echoed by WFP and UNICEF) is what was actually disbursed ~1 day before landfall. The 2026-07-13 QA note wrongly called the ~US$900k figure unsupported and asserted the whole envelope was released; the 2026-07-27 review found it well sourced across OCHA/WFP/UNICEF and restored it as the pre-landfall disbursement. `prearranged_or_released_usd` is kept at 3000000 (the envelope, = prearranged_funding_usd). Both trigger windows fired (readiness then action) — per the CHD team (@t-downing) on PR #242; public sources document only the 9 Feb activation for Madagascar (the Anticipation Hub separately names an 8 Feb readiness trigger for MOZAMBIQUE, not Madagascar — do not transfer that date here). Mozambique received a separate US$4.5M CERF envelope (+ >US$1M from partners) for the same system. QA 2026-08-10 re-verified the headline figures verbatim against OCHA 'Madagascar: Humanitarian impact of Tropical Cyclone Gezani, Flash Update No. 1 (10 February 2026)': 'The UN Central Emergency Fund (CERF) allocated US$3 million to six UN agencies in Madagascar in pre-arranged finance for anticipatory action to help partners support more than 93,000 vulnerable people', Gezani 'intensified on 9 February', landfall 'in the evening of 10 February near the city of Toamasina' 'as an intense Tropical Cyclone', and the separate Fytia 'provision of $2 million for an urgent response' covering 'Soalala and Marovoay districts'. Flash Update No.1 does NOT itself carry the ~US$900k 'released ahead of landfall' figure (it appears in the later No.2–4 updates, verified in the 2026-07-27 pass); unocha.org report pages now 403 automated fetches, so that figure was not independently re-read in the 2026-08-10 pass." visibility: internal -last_synced: "2026-08-31" +last_synced: "2026-09-07" --- # Madagascar Tropical Cyclone — 2024-12-13 @@ -143,7 +143,7 @@ The analytical basis for the thresholds was developed in this repo using IBTrACS During cyclone season (1 November – 30 April), the CHD reads every Météo-Madagascar bulletin (issued every 6 h, or 3 h near landfall) as soon as it is published (within ~1 hour of validity time). Each bulletin is assessed against the Scenario 3 thresholds. If thresholds are met, an activation message is sent immediately via email and WhatsApp to the BNGRC, HC/RC, OCHA, UN agency focal points, Start Network, and IFRC/Red Cross. No automated pipeline checks the Scenario 3 wind/distance trigger; the repo's monitoring notebooks (`analysis/05.x`) are retrospective post-event analyses for learning purposes, not a live system. -Separately, the **rainfall leg of the Annex's observational indicator** does have a live automated pipeline: [`pipelines/mdg-monitoring`](../../pipelines/mdg-monitoring.md) (sibling repo `ocha-dap/ds-aa-mdg-monitoring`, not this page's `source_repo`) runs daily via GitHub Actions (16:00 UTC), pulls IMERG 3-day rainfall totals per ADM1 region from the prod DB, checks them against a 300 mm threshold (strictly `>`, per `src/monitoring/emails.py`), and sends an informational French-language email (via a Listmonk campaign to partner list 109) — flagging "ACTIVÉ"/"PAS ACTIVÉ" for awareness, not as a fund-releasing AA trigger in its own right. Per [`infrastructure/pipeline-registry.md`](../../infrastructure/pipeline-registry.md) (snapshot 2026-08-30) this job is still 🔴 **DOWN/OVERDUE**, with no successful run since ~11 April 2026 (the registry carries the live last-success figure — don't copy it here). It was therefore still running during the Cyclone Gezani activation (Feb 2026) and stalled in mid-April 2026, in the closing weeks of the 2025/26 cyclone season (which runs to 30 April) — so it has been down for the whole inter-season period and would need reactivating before the 2026/27 season. Treat it as stalled until re-verified. +Separately, the **rainfall leg of the Annex's observational indicator** does have a live automated pipeline: [`pipelines/mdg-monitoring`](../../pipelines/mdg-monitoring.md) (sibling repo `ocha-dap/ds-aa-mdg-monitoring`, not this page's `source_repo`) runs daily via GitHub Actions (16:00 UTC), pulls IMERG 3-day rainfall totals per ADM1 region from the prod DB, checks them against a 300 mm threshold (strictly `>`, per `src/monitoring/emails.py`), and sends an informational French-language email (via a Listmonk campaign to partner list 109) — flagging "ACTIVÉ"/"PAS ACTIVÉ" for awareness, not as a fund-releasing AA trigger in its own right. Per [`infrastructure/pipeline-registry.md`](../../infrastructure/pipeline-registry.md) (re-verified 2026-09-07) this job is still 🔴 **DOWN/OVERDUE**, with no successful run since ~11 April 2026 (the registry carries the live last-success figure — don't copy it here). It was therefore still running during the Cyclone Gezani activation (Feb 2026) and stalled in mid-April 2026, in the closing weeks of the 2025/26 cyclone season (which runs to 30 April) — so it has been down for the whole inter-season period and would need reactivating before the 2026/27 season. Treat it as stalled until re-verified. ## Historical activations @@ -153,7 +153,7 @@ The framework triggered once — its first activation: **Near-misses that did NOT trigger the framework:** -- **Cyclone Fytia, 31 Jan 2026** — landfall near Soalala (Boeny, north-west coast) ten days before Gezani, in the same monitoring window. Météo-France La Réunion put its peak at **~155 km/h** 10-minute sustained and classified it a standard *tropical cyclone*, never an *intense* tropical cyclone (OCHA/BNGRC reporting gives ~150 km/h sustained with ~210 km/h gusts at impact), so it stayed below the 166 km/h Scenario-3 threshold and the framework correctly did not fire. Madagascar's Fytia response instead went through a **US$2M CERF rapid-response** allocation (Soalala and Marovoay districts) — a post-impact allocation, not an AA activation (cf. D53). This is the framework's clearest real-world illustration of the Scenario-3 threshold binding as designed: two damaging landfalls ten days apart, and only the one that reached *intense TC* intensity (Scenario 3) triggered pre-arranged AA funds, while the Scenario-2-class storm was handled through conventional rapid response. +- **Cyclone Fytia, 31 Jan 2026** — landfall near Soalala (Boeny, north-west coast) ten days before Gezani, in the same monitoring window. Météo-France La Réunion put its peak at **~155 km/h** 10-minute sustained and classified it a standard *tropical cyclone*, never an *intense* tropical cyclone (OCHA/BNGRC reporting gives ~150 km/h sustained with ~210 km/h gusts at impact), so it stayed below the 166 km/h Scenario-3 threshold and the framework correctly did not fire. **Mind the wind standard:** press and JTWC-derived reporting quote Fytia at **185 km/h**, which is a *1-minute* sustained figure (Category-3-equivalent on Saffir–Simpson); the framework's 166 km/h threshold is on the **10-minute** standard Météo-Madagascar/RSMC La Réunion use, on which Fytia peaked at 155 km/h. The higher number does not mean the threshold was met. Madagascar's Fytia response instead went through a **US$2M CERF rapid-response** allocation (Soalala and Marovoay districts) — a post-impact allocation, not an AA activation (cf. D53). This is the framework's clearest real-world illustration of the Scenario-3 threshold binding as designed: two damaging landfalls ten days apart, and only the one that reached *intense TC* intensity (Scenario 3) triggered pre-arranged AA funds, while the Scenario-2-class storm was handled through conventional rapid response. - **The 2024/2025 season** (Cyclones Honde and Jude, Feb–Mar 2025 — repo notebooks 05.0/05.1) also did **not** trigger the framework. Note: The Start Network ran a separate 2021/2022 pre-activation for Cyclones Batsirai and Emnati (~USD 470,000 / GBP 370,000, 250,000 people) under **its own** protocol — >166 km/h within 100 km, 3 days out, i.e. the *same* intensity threshold as this framework, not a lower one (the Red Cross is the one using a lower 118 km/h threshold). Not an activation of this OCHA/CERF framework. Doc also records ~USD 1.2M mobilised by the Start Network in 2023/2024.