# Finance — Reverse-Engineered Reference

The comprehensive specification for replicating Dr. Vikrant Panwar's RESI (Resilient and Sustainable Islands Initiative) Resilience Finance Power BI dashboard using our own data pipeline and this widget.

**Reference Power BI dashboard** (5 pages, 18 charts):
https://app.powerbi.com/view?r=eyJrIjoiY2Y2MTQ2OTMtM2Q2OC00NWYwLTk0MzEtOTg2ZWIyMzVhOGYzIiwidCI6IjRjMzU4MWE3LTc3OWMtNDNjZS1hNTI2LWZmNjFkNjYzOGRmYyIsImMiOjh9

## How to use this doc

Each chart carries a stable `[ID]` (e.g. `P2.C3`, page 2 chart 3). Treat the ID as a prompt: "implement P2.C3 against our data." The spec for each chart says where to read from, what filters / exclusions to apply, the exact computation, and the expected reference value for verification. When a chart matches the reference value, it's verified. When the source data changes, the spec stays valid as long as Vikrant's methodology holds.

## What this doc is NOT

- The implementation — that lives elsewhere in `lab-app/`.
- The source-data extraction — that lives in `widget-data/per-source/dashboard-data-pivot/`.
- The canonical schema — that lives in `widget-data/country_schema.mmd` + `widget-data/docs/schema.md`.

---

## Contents

- [1. Methodology (Page 1)](#1-methodology-page-1)
- [2. Classification systems](#2-classification-systems)
- [3. Source data map](#3-source-data-map)
- [4. Common exclusions](#4-common-exclusions)
- [5. The five-part narrative](#5-the-five-part-narrative)
- [6. Page 2 — Resilience finance to SIDS](#6-page-2--resilience-finance-to-sids)
- [7. Page 3 — Resilience finance by provider / sector](#7-page-3--resilience-finance-by-provider--sector)
- [8. Page 4 — Resilience finance comparison](#8-page-4--resilience-finance-comparison)
- [9. Page 5 — Resilience finance & MVI](#9-page-5--resilience-finance--mvi)
- [10. Chart index](#10-chart-index)
- [11. Replication roadmap](#11-replication-roadmap)
- [12. Open questions](#12-open-questions)

---

## 1. Methodology (Page 1)

Vikrant's analytical definitions and rules. These are load-bearing — every chart inherits them.

| Topic | Rule |
|---|---|
| **What counts as "resilience finance"** | Adaptation + Mitigation **(energy sector only)** + DRR (Disaster Risk Reduction). Explicitly **excludes emergency response**. The dashboard measures preventive / structural finance, not crisis-response money. |
| **Source blend** | OECD CRDF (Climate-Related Development Finance) + OECD CRS (Creditor Reporting System) + CFU (Climate Funds Update) database. No single source covers all flows — climate funds like GCF sit outside OECD reporting. |
| **Double-counting adjustment** | DRR purpose codes `43060`, `73010`, `74020` deduplicated across sources. |
| **Unit** | **Commitments**, not disbursements. Figures represent donor intent, not actual delivery. Real money received on the ground is likely lower. |
| **Currency basis** | 2023 US$ (real terms, deflated). |
| **Time period** | 2013–2023 (11 years). |
| **SIDS in scope** | 36 of 39 UN-member SIDS (Page 4), 35 on Page 5 (Nauru lacks MVI sub-dimensions). Excluded: Bahrain, Cook Islands, Niue, Singapore (no usable RF data). Per `widget-data/per-source/dashboard-data-pivot/by-sids/README.md`. |

---

## 2. Classification systems

Three orthogonal classifications drive every chart:

### 2.1 `dim_income_group` — World Bank 4-tier (authority: World Bank, FY2025)

| `income_group_id` | Name | WB GNI per capita threshold |
|---|---|---|
| `LICs` | Low income | ≤ $1,145 |
| `LMICs` | Lower middle income | $1,146 – $4,515 |
| `UMICs` | Upper middle income | $4,516 – $14,005 |
| `HICs` | High income | > $14,005 |

WB updates annually (typically July). Per-year version stored in `dim_country_year.income_group_id`.

### 2.2 `dim_income_range` — 3-tier collapsed (used in MPI Figs 6/7 only — not in this dashboard)

| `income_range_id` | Composed of |
|---|---|
| `low_and_lower_middle` | LIC + LMIC |
| `upper_middle` | UMIC |
| `high` | HIC |

Not referenced by any Finance chart. Listed here so we don't confuse it with `dim_income_group`.

### 2.3 Orthogonal flags

| Flag | Authority | Updates |
|---|---|---|
| `is_sids` | UN OHRLLS (Small Island Developing State list — 39 UN-member SIDS) | Rare changes |
| `is_ldc` | UN OHRLLS (Least Developed Country list) | Triennial review |

**Cohort precedence (used by Page 4 + Page 5 charts)**: each country lands in exactly ONE bucket — SIDS takes precedence over income tier. So Dominica is bucketed `SIDS`, not `UMICs (non-SIDS)`, even though it's also UMIC by WB classification.

```
cohort_id = "SIDS" if is_sids
            else income_group_current_id + " (non-SIDS)"
```

### 2.4 MVI dimensions (authority: UN SDSN, 2023 pilot)

| Column in VSP | What it measures |
|---|---|
| `Environmental MVI` (H) | Exposure to natural hazards and climate volatility |
| `Composite MVI` (I) | Full aggregate across all MVI dimensions |
| `Structural Vulnerability` (J) | Inherent exposure from size / geography / economic structure |
| `Lack of Structural Resilience` (K) | Capacity deficit (weak institutions, low diversification, etc.) |

One published vintage so far (2023). Cached locally as `widget-data/external/un-sdsn-mvi-2023.csv` (to be downloaded).

---

## 3. Source data map

Where each chart's numbers ultimately come from:

| Chart input | Source sheet | Extraction location |
|---|---|---|
| Per-country × year × flow / objective | `Dashboard Data_Pivot.xlsx` › `By SIDS` | `widget-data/per-source/dashboard-data-pivot/by-sids/atomic.csv` |
| Annual % of ODF (all-SIDS) | `Dashboard Data_Pivot.xlsx` › `By SIDS` (tail rows) | `widget-data/per-source/dashboard-data-pivot/by-sids/pct-of-odf.csv` |
| Non-ODA MDB annual aggregate (all-SIDS) | `Dashboard Data_Pivot.xlsx` › `By SIDS` (tail rows) | `widget-data/per-source/dashboard-data-pivot/by-sids/non-oda-mdbs.csv` |
| All-SIDS instrument totals (5 rows, cumulative) | `Dashboard Data_Pivot.xlsx` › `Finance type` | `widget-data/per-source/dashboard-data-pivot/finance-type/all-sids-totals.csv` *(pending)* |
| Per-provider × flow × objective × year | `Dashboard Data_Pivot.xlsx` › `Provider+Sectors` (providers) | `widget-data/per-source/dashboard-data-pivot/provider-sectors/providers-atomic.csv` *(pending)* |
| Per-sector × flow × objective × year | `Dashboard Data_Pivot.xlsx` › `Provider+Sectors` (sectors) | `widget-data/per-source/dashboard-data-pivot/provider-sectors/sectors-atomic.csv` *(pending)* |
| Per-country derivation hub | `Dashboard Data_Pivot.xlsx` › `Vulnerability scatter plot` | `widget-data/per-source/dashboard-data-pivot/vulnerability-scatter-plot/source.csv` *(pending)* |
| Country identity / cohort tags | (built) | `widget-data/countries.json` |
| Per-year income group + population + GDP | World Bank Open Data | `widget-data/country-years.csv` (currently placeholder; WB enrichment pending) |
| MVI sub-dimensions | UN SDSN 2023 pilot | `widget-data/external/un-sdsn-mvi-2023.csv` *(pending)* |

**The Vulnerability Scatter Plot (VSP) is special** — 17 columns, 149 rows (145 countries + 4 cohort aggregates). It mixes derived computations (columns C/D/E/F/G/M/O/P/Q) with external inputs (H/I/J/K MVI + L/N GDP/Pop). See section 8 for VSP regeneration logic.

---

## 4. Common exclusions

Applied at chart-rendering time, NOT at extraction time. The atomic source CSVs preserve every row; the chart layer slices.

| Exclusion rule | Affects | Why |
|---|---|---|
| Exclude rows where `Flow channel/objective = '% of ODF'` | All charts | These are pre-computed annual ratios, not dollar values. Routed to `pct-of-odf.csv` for use as a separate KPI input. |
| Exclude rows where `SIDS = 'Non-ODA unspecified (MDBs)'` OR `Objective = 'Unspecifed Non-ODA (MDBs)'` *(typo preserved from source)* | All per-country charts | Provider-side aggregate, not country-attributable. $547.9M in 2017 alone. Routed to `non-oda-mdbs.csv` for donor-side analysis only. |

**Effect at per-country level**: zero. No specific SIDS receives these flows.
**Effect at all-SIDS aggregate level**: significant. 2017's all-SIDS total drops from ~$2.67B to $2.12B (a $547.9M reduction = the MDB pool).

Additional chart-specific filters layered on top (e.g., Page 2 Chart 5 also pre-filters to `instrument IN {Concessional loans, Non-concessional loans}` for the loans-only concessionality view). These are noted per-chart below.

---

## 5. The five-part narrative

The dashboard isn't 18 isolated charts — it's a structured argument. Read in sequence, the pages claim that **resilience finance allocation to SIDS does not track measured vulnerability**.

| Page | Title | Argument |
|---|---|---|
| 1 | Notes | Define "resilience finance" narrowly (preventive, not emergency) and align it with vulnerability metrics. |
| 2 | Resilience finance to SIDS | SIDS got $25.53B over 2013–2023 — sounds substantial, but loan-heavy and concentrated in a few islands. |
| 3 | Resilience finance by provider/sector | Architecture is multilateral-dominated; sector concentration on energy + disaster prevention. |
| 4 | Resilience finance comparison | By absolute $ SIDS are last. By per-capita SIDS are first. But the MVI scatter breaks the comfortable narrative. |
| 5 | Resilience finance & MVI | Across all four MVI dimensions, the finance-vulnerability mismatch persists. |

The implicit policy claim (never stated but visible in the data): **allocation needs to be reoriented toward vulnerability metrics, shifted from loans toward grants for the most exposed islands, and engineered to reach the smallest and most remote nations currently receiving near-zero flows despite extremely high MVI scores.**

---

## 6. Page 2 — Resilience finance to SIDS

> **The aggregate picture.** Establishes scale + composition.

### `P2.C1` — Headline KPI: Total Resilience Finance to SIDS

| Field | Value |
|---|---|
| **Type** | KPI card |
| **Title shown** | "Total resilience finance to SIDS" |
| **Source** | `by-sids/atomic.csv` |
| **Filter logic** | All rows (no country filter); years 2013–2023 |
| **Exclusions** | `% of ODF` rows (always); `Non-ODA MDB` rows (always at per-country level) |
| **Computation** | `SUM(value_usd)` across all rows |
| **Format** | `$X.XXbn` |
| **Expected reference value** | **$25.53B** cumulative 2013–2023 |
| **Slicer behavior** | If country slicer = single country, recompute for that country only (e.g., Dominica = $510.7M) |

### `P2.C2` — Time-series stacked bar by Year × Objective

| Field | Value |
|---|---|
| **Type** | Stacked bar (vertical) |
| **X-axis** | Year (2013–2023) |
| **Y-axis** | Resilience finance (US$) |
| **Stack** | `flow_objective` (adaptation / mitigation_energy / drr) |
| **Source** | `by-sids/atomic.csv` filtered to `finance_class = 'Objective'` |
| **Exclusions** | standard |
| **Computation** | `SUM(value_usd) GROUP BY year, flow_objective` |
| **Note** | Adaptation dominates by volume across years; mitigation (energy) is the fastest-growing component |

### `P2.C3` — Donut: Resilience finance by Objective

| Field | Value |
|---|---|
| **Type** | Donut |
| **Slices** | `flow_objective` (3 wedges) |
| **Source** | `by-sids/atomic.csv` filtered to `finance_class = 'Objective'` |
| **Exclusions** | standard |
| **Computation** | `SUM(value_usd) / total GROUP BY flow_objective` |
| **Expected reference (Dominica 2017)** | Mitigation 85.67% · Adaptation 12.13% · DRR 2.18% (of $28.9M total) |
| **Slicer behavior** | Year + Country slicers recompute the totals |

### `P2.C4` — Donut: Resilience finance by Financial Instrument *

| Field | Value |
|---|---|
| **Type** | Donut |
| **Slices** | Instrument (Grants / Debt instruments-Loans / Equity-Hybrid-Others) |
| **Source** | `finance-type/all-sids-totals.csv` *(pending extraction)* |
| **Exclusions** | standard + rows missing an instrument tag |
| **Note** | The asterisk in Vikrant's title indicates an additional filter — flows without an instrument classification are excluded. **Gap between this denominator and P2.C3's: ~$5.34M for Dominica 2017** ($23.56M vs $28.9M). |
| **Expected reference (Dominica 2017)** | Grants 59.16% ($13.94M) · Debt 40.60% ($9.56M) · Equity 0.25% ($58K) of $23.56M |
| **🔴 OPEN QUESTION** | The user's external analysis showed Dominica's per-instrument values matching the `Finance type` sheet's all-SIDS totals exactly — strongly suggesting this chart's per-country instrument breakdown is sourced from a table NOT in our 4 source workbooks. Likely Vikrant joins external OECD CRS data in Power BI. **See [section 12 — open questions](#12-open-questions).** |

### `P2.C5` — Donut: Concessionality in Resilience Finance *

| Field | Value |
|---|---|
| **Type** | Donut |
| **Slices** | Concessional loans / Non-concessional loans (2 wedges only — loans subset) |
| **Source** | `finance-type/all-sids-totals.csv` *(pending)* |
| **Exclusions** | standard + visual-level filter: `instrument IN {Concessional loans, Non-concessional loans}` (grants + equity excluded) |
| **Computation** | `SUM(value_usd) GROUP BY instrument` then percent of loan subtotal |
| **Expected reference (Dominica 2017)** | Concessional 48.39% ($4.63M) · Non-concessional 51.61% ($4.94M) of $9.57M |
| **🔴 OPEN QUESTION** | Same as P2.C4 — per-country concessionality data not in our extracted sources. |

### `P2.C6` — Horizontal bar: Resilience finance by SIDS

| Field | Value |
|---|---|
| **Type** | Horizontal bar (per-country ranking) |
| **X-axis** | `SUM(value_usd)` for the cohort |
| **Y-axis** | SIDS country, sorted descending by value |
| **Source** | `by-sids/atomic.csv` |
| **Exclusions** | standard |
| **Computation** | `SUM(value_usd) GROUP BY iso3 ORDER BY SUM DESC` |
| **Note** | Politically loaded — shows extreme concentration. A handful of larger / strategically-important SIDS receive most of the flow; smallest islands appear as tiny bars at the bottom. |

---

## 7. Page 3 — Resilience finance by provider / sector

> **Who is sending it and for what.**

### `P3.C1` — Time series by Flow Type

| Field | Value |
|---|---|
| **Type** | Stacked vertical bar |
| **X-axis** | Year (2013–2023) |
| **Y-axis** | Resilience finance (US$, M scale) |
| **Stack** | `flow_type` (Bilateral / Multilateral / Private philanthropic) |
| **Source** | `provider-sectors/providers-atomic.csv` (all-SIDS aggregated; sum across providers per year × flow type) |
| **Exclusions** | standard |
| **Computation** | `SUM(value_usd) GROUP BY year, flow_channel` |
| **Expected reference (2017)** | Bilateral $794.08M · Multilateral $1,328.56M · Private philanthropic ~$0 · **Total $2,122.64M** |
| **Without exclusion** | 2017 raw total would be ~$2,670.57M (the $547.93M Non-ODA MDB pool is the difference) |

### `P3.C2` — Provider chart (stacked by Objective)

| Field | Value |
|---|---|
| **Type** | Stacked horizontal bar (sorted descending by total) |
| **Y-axis** | Provider name |
| **X-axis** | Resilience finance (US$, ~$0–$0.4B scale) |
| **Stack** | `flow_objective` (DRR yellow / Adaptation navy / Mitigation teal) |
| **Source** | `provider-sectors/providers-atomic.csv` filtered by Year slicer |
| **Exclusions** | standard |
| **Computation** | `SUM(value_usd) GROUP BY provider, flow_objective WHERE year = <slicer>` |
| **Expected reference (2017 top providers)** | IDA $234.94M · GCF $226.71M · IBRD ~$177M · EU Institutions ~$186M · Australia ~$142M · ADB ~$142M · UAE ~$80M · IADB $78.99M · Canada ~$74M |
| **Critical context** | If Non-ODA MDB rows weren't excluded, an unlabelled "Unspecified" bar of $547.9M would dominate, making the chart useless. The exclusion is what makes this chart interpretable. |

### `P3.C3` — Sector chart (stacked by Objective)

| Field | Value |
|---|---|
| **Type** | Stacked horizontal bar (sorted descending by total) |
| **Y-axis** | OECD CRS sector code (e.g., `II.3. Energy`) |
| **X-axis** | Resilience finance (US$, ~$0–$0.8B scale) |
| **Stack** | `flow_objective` (DRR yellow / Adaptation navy / Mitigation teal) |
| **Source** | `provider-sectors/sectors-atomic.csv` filtered by Year slicer |
| **Exclusions** | standard |
| **Computation** | `SUM(value_usd) GROUP BY sector, flow_objective WHERE year = <slicer>` |
| **Expected reference (2017 top sectors)** | II.3. Energy ~$738M (mostly mitigation_energy) · III.1. Agriculture, Forestry, Fishing ~$290M · VIII.3. Disaster Prevention & Preparedness $289.13M (100% DRR) · IV.2. Other Multisector ~$272M · II.1. Transport & Storage ~$231M · I.5. Government & Civil Society ~$225M |

---

## 8. Page 4 — Resilience finance comparison

> **The benchmarking turn.** Adds non-SIDS cohorts for context.

### Cohort definition (used by every chart on Pages 4 + 5)

Each country lands in **one** bucket via the precedence rule:

```
cohort_id =
  "SIDS"                 if is_sids
  else "LDCs (non-SIDS)" if is_ldc and not is_sids
  else income_group_current_id + " (non-SIDS)"
```

The 4 cohort labels (matching VSP tail rows): `SIDS`, `LDCs (non-SIDS)`, `LMICs (non-SIDS)`, `UMICs (non-SIDS)`. Sources for these labels: `widget-data/schema-build/UN Income Groups.csv`.

### Slicer architecture

- **Income group slicer**: 4 cohorts (above) + Select all. Does NOT affect bar charts (C1/C2/C3 — they always show the 4-cohort totals). DOES affect scatters (C4/C5 — toggles visible series).
- **Country slicer**: cascading — list updates dynamically to show only countries in the selected income group. DOES affect scatters (removes individual dots, x-axis auto-rescales). Does NOT affect bar charts.

### `P4.C1` — Bar: Resilience finance by country groups (averages)

| Field | Value |
|---|---|
| **Type** | Horizontal bar |
| **X-axis** | Cohort (4 bars) |
| **Y-axis** | Sum of country-level average annual finance (USD billions) |
| **Source** | `vulnerability-scatter-plot/source.csv` — read the 4 tail aggregate rows directly |
| **Computation** | `SELECT cohort_id, "Average resilience finance" FROM VSP WHERE country IN (4 cohort tail rows)` |
| **Expected reference** | LMICs (non-SIDS) **$20.45B** · LDCs (non-SIDS) **$14.69B** · UMICs (non-SIDS) **$10.61B** · SIDS **$2.14B** |
| **Note** | "Average" = Σ(country's 11-year-cumulative / 11) per cohort. The SIDS value matches `(SUM of all SIDS in atomic.csv) / 11`. |

### `P4.C2` — Bar: Resilience finance as % of GDP

| Field | Value |
|---|---|
| **Type** | Horizontal bar |
| **X-axis** | Cohort (4 bars) |
| **Y-axis** | % of GDP |
| **Source** | `vulnerability-scatter-plot/source.csv` — tail rows, column Q |
| **Computation** | `SELECT cohort_id, "Resilience finance as % of GDP" FROM VSP WHERE country IN (4 cohort tail rows)` |
| **Expected reference** | LDCs (non-SIDS) **1.18%** · SIDS **0.60%** · LMICs (non-SIDS) **0.27%** · UMICs (non-SIDS) **0.04%** |
| **Note** | Ranking REVERSES from C1. The point. |

### `P4.C3` — Bar: Resilience finance per capita

| Field | Value |
|---|---|
| **Type** | Horizontal bar |
| **X-axis** | Cohort (4 bars) |
| **Y-axis** | USD per capita |
| **Source** | `vulnerability-scatter-plot/source.csv` — tail rows, column P |
| **Computation** | `SELECT cohort_id, "Resilience finance per capita" FROM VSP WHERE country IN (4 cohort tail rows)` |
| **Expected reference** | SIDS **$36.46** · LDCs (non-SIDS) **$14.39** · LMICs (non-SIDS) **$7.34** · UMICs (non-SIDS) **$4.41** |
| **Note** | Ranking REVERSES AGAIN. SIDS lead by 2.5× over LDCs. |

### `P4.C4` — Scatter: Avg resilience finance × Environmental MVI

| Field | Value |
|---|---|
| **Type** | Scatter |
| **X-axis** | Average resilience finance (US$, 0–~$4B) |
| **Y-axis** | Environmental MVI (20–100) |
| **Color** | Cohort (LDCs cyan/teal · LMICs dark navy · SIDS yellow · UMICs purple) |
| **Source** | `vulnerability-scatter-plot/source.csv` — 145 country rows (exclude the 4 tail aggregates) |
| **Computation** | `SELECT country, cohort_id, "Average resilience finance", "Environmental MVI" FROM VSP WHERE country NOT IN (4 tail aggregates)` |
| **Expected named points** | India $3.85B · 48.60 · Indonesia $1.84B · 31.41 · Bangladesh $2.42B · 49.12 · Somalia $0.29B · 83.50 · Haiti $0.255B · 70.45 · Dominica $0.046B · 74.47 |
| **Key insight** | No positive correlation — finance doesn't track exposure. The whole point of the dashboard. |

### `P4.C5` — Scatter: RF as % of GDP × Environmental MVI

| Field | Value |
|---|---|
| **Type** | Scatter |
| **X-axis** | RF as % of GDP (0–~60%) |
| **Y-axis** | Environmental MVI (20–100) |
| **Color** | Cohort |
| **Source** | same as P4.C4, columns Q × H |
| **Expected named points** | Tuvalu **58.02% · 50.75** (extreme outlier — micro-state with relatively small absolute flows that hit huge % of tiny GDP) · Kiribati 16.75% · 50.27 · Dominica 6.85% · 74.47 · India 0.128% · 48.60 |
| **Key insight** | Tuvalu and Kiribati anchor the right side; SIDS rise from the far left of C4 to mid-to-right here. India collapses to the far left. |

---

## 9. Page 5 — Resilience finance & MVI

> **Deepening the vulnerability diagnosis.** Same finance, four different MVI lenses.

### Slicer architecture

Identical to Page 4: cascading Income group → Country. Affects which dots appear; x-axis auto-rescales. No bar charts on this page.

**One country fewer than Page 4 (35 vs 36):** Nauru lacks the 3 MVI sub-dimensions (Composite / Structural / Lack of Resilience). UN SDSN data gap. Nauru appears on Page 4's Environmental MVI scatter but is absent from all 4 Page 5 charts.

### `P5.C1` — Scatter: Avg RF × Composite MVI

| Field | Value |
|---|---|
| **Type** | Scatter |
| **X-axis** | Average resilience finance (US$, 0–~$4B) |
| **Y-axis** | Composite MVI (range ~32–73, more compressed than Environmental) |
| **Source** | `vulnerability-scatter-plot/source.csv` — 145 country rows minus Nauru |
| **Computation** | `SELECT country, cohort_id, "Average resilience finance", "Composite MVI" FROM VSP WHERE country NOT IN (4 tail aggregates) AND "Composite MVI" IS NOT NULL` |
| **Expected named points** | India $3.85B · 45.98 · Bangladesh $2.42B · 52.39 · Indonesia $1.84B · 32.11 · Maldives $0.052B · 72.21 · Saint Lucia $0.023B · 66.51 · Tuvalu $0.032B · 64.28 · Haiti $0.255B · 65.56 · Dominica $0.046B · ~62 |
| **Note** | Composite MVI range is more compressed than Environmental (32–73 vs 28–84). SIDS cluster at the upper end. |

### `P5.C2` — Scatter: RF as % of GDP × Composite MVI

| Field | Value |
|---|---|
| **Type** | Scatter |
| **X-axis** | RF as % of GDP (0–~60%) |
| **Y-axis** | Composite MVI |
| **Source** | same as P5.C1, columns Q × I |
| **Expected named points** | Tuvalu 58.02% · 64.28 (upper-right outlier) · Kiribati 16.75% · 63.99 · Maldives ~16.75% · 72.21 |
| **Note** | Direct parallel to P4.C5 with only y-axis changed. Same x-coordinates, slightly different y. |

### `P5.C3` — Scatter: Avg RF × Structural Vulnerability

| Field | Value |
|---|---|
| **Type** | Scatter |
| **X-axis** | Average resilience finance (US$, 0–~$4B) |
| **Y-axis** | Structural Vulnerability (20–100) |
| **Source** | `vulnerability-scatter-plot/source.csv` columns G × J |
| **Expected named points** | India $3.85B · 31.15 · Bangladesh $2.42B · 47.20 · Indonesia $1.84B · 20.61 (lowest in dataset — diversified economy) · Saint Lucia $0.023B · **73.18 (highest SIDS)** · Maldives $0.052B · 70.38 · Haiti $0.255B · 68.02 · Dominica $0.046B · 62.42 |
| **Key insight** | SIDS cluster at mid-to-upper right (Y 45–73); LMICs and UMICs cluster lower-left (Y 20–50). Structural exposure correlates with island geography. |

### `P5.C4` — Scatter: Avg RF × Lack of Structural Resilience

| Field | Value |
|---|---|
| **Type** | Scatter |
| **X-axis** | Average resilience finance (US$, 0–~$4B) |
| **Y-axis** | Lack of Structural Resilience (20–100) |
| **Source** | `vulnerability-scatter-plot/source.csv` columns G × K |
| **Expected named points** | India $3.85B · 57.08 · Bangladesh $2.42B · 57.11 · Indonesia $1.84B · 40.47 · Somalia $0.29B · 72.55 (highest LDC) · Tuvalu $0.032B · **77.03 (highest SIDS)** · Maldives $0.052B · 74.00 · Haiti $0.255B · 63.00 |
| **Key insight** | Tuvalu sits at the top — simultaneously receives the most finance % of GDP AND has the lowest structural resilience. Suggests a CEILING on what additional finance can achieve when absorption capacity is constrained. |

---

## 10. Chart index

Stable IDs for prompt-driven generation. Click an ID to scroll to its spec.

| ID | Page | Title | Type | Primary source |
|---|---|---|---|---|
| [`P2.C1`](#p2c1--headline-kpi-total-resilience-finance-to-sids) | 2 | Headline KPI: total RF to SIDS | KPI | `by-sids/atomic.csv` |
| [`P2.C2`](#p2c2--time-series-stacked-bar-by-year--objective) | 2 | Time series stacked bar by Year × Objective | Stacked bar | `by-sids/atomic.csv` |
| [`P2.C3`](#p2c3--donut-resilience-finance-by-objective) | 2 | Donut: RF by Objective | Donut | `by-sids/atomic.csv` |
| [`P2.C4`](#p2c4--donut-resilience-finance-by-financial-instrument-) | 2 | Donut: RF by Instrument | Donut | `finance-type/all-sids-totals.csv` + per-country source TBD |
| [`P2.C5`](#p2c5--donut-concessionality-in-resilience-finance-) | 2 | Donut: Concessionality | Donut | `finance-type/all-sids-totals.csv` + per-country source TBD |
| [`P2.C6`](#p2c6--horizontal-bar-resilience-finance-by-sids) | 2 | Horizontal bar by SIDS | Horizontal bar | `by-sids/atomic.csv` |
| [`P3.C1`](#p3c1--time-series-by-flow-type) | 3 | Time series by Flow Type | Stacked bar | `provider-sectors/providers-atomic.csv` |
| [`P3.C2`](#p3c2--provider-chart-stacked-by-objective) | 3 | Provider chart | Stacked horizontal bar | `provider-sectors/providers-atomic.csv` |
| [`P3.C3`](#p3c3--sector-chart-stacked-by-objective) | 3 | Sector chart | Stacked horizontal bar | `provider-sectors/sectors-atomic.csv` |
| [`P4.C1`](#p4c1--bar-resilience-finance-by-country-groups-averages) | 4 | Bar: RF by country groups (averages) | Horizontal bar | `vulnerability-scatter-plot/source.csv` tail rows |
| [`P4.C2`](#p4c2--bar-resilience-finance-as--of-gdp) | 4 | Bar: RF as % of GDP | Horizontal bar | VSP tail rows |
| [`P4.C3`](#p4c3--bar-resilience-finance-per-capita) | 4 | Bar: RF per capita | Horizontal bar | VSP tail rows |
| [`P4.C4`](#p4c4--scatter-avg-resilience-finance--environmental-mvi) | 4 | Scatter: Avg RF × Env MVI | Scatter | VSP country rows |
| [`P4.C5`](#p4c5--scatter-rf-as--of-gdp--environmental-mvi) | 4 | Scatter: RF % of GDP × Env MVI | Scatter | VSP country rows |
| [`P5.C1`](#p5c1--scatter-avg-rf--composite-mvi) | 5 | Scatter: Avg RF × Composite MVI | Scatter | VSP country rows |
| [`P5.C2`](#p5c2--scatter-rf-as--of-gdp--composite-mvi) | 5 | Scatter: RF % of GDP × Composite MVI | Scatter | VSP country rows |
| [`P5.C3`](#p5c3--scatter-avg-rf--structural-vulnerability) | 5 | Scatter: Avg RF × Structural Vuln | Scatter | VSP country rows |
| [`P5.C4`](#p5c4--scatter-avg-rf--lack-of-structural-resilience) | 5 | Scatter: Avg RF × Lack of Resilience | Scatter | VSP country rows |

**Totals: 18 charts across 5 pages.** Page 1 is text-only methodology, no charts.

---

## 11. Replication roadmap

Order of work, top-down through dependencies:

1. ✅ **Extract `By SIDS`** — atomic + pct-of-odf + non-oda-mdbs. *(done)*
2. **Finish `By SIDS` provenance** — src_file / src_sheet / src_is_sids + drift check. *(interrupted by rate-limit earlier, ready to resume)*
3. **Extract `Finance type`** — 5 instrument totals, cumulative 2013–2023.
4. **Extract `Provider+Sectors`** — split into providers + sectors atomic files + MDB aggregate (10 rows).
5. **Extract `Vulnerability scatter plot`** — full 149 rows including 4 cohort tail aggregates; flag Nauru's missing MVI sub-dimensions.
6. **WB Open Data enrichment** — populates `dim_country_year` with per-year income group + population + GDP + change-detection metadata. **Unblocks P4.C2 / P4.C3 / P4.C5 / P5.C2** (per-capita and % GDP charts) and feeds VSP regen.
7. **UN SDSN MVI cache** — one-time download of 2023 pilot data into `widget-data/external/un-sdsn-mvi-2023.csv`. Feeds VSP regen H/I/J/K columns.
8. **VSP regen script** — verifies our model against VSP for the 36 SIDS. The 109 non-SIDS rows pass through from VSP source unchanged until Vikrant updates them or we extract OECD CRS directly.
9. **Implement charts in `lab-app/`** — one at a time, per the IDs in section 10. Each chart's spec above tells you the source, the computation, the expected reference value.
10. **Verify against Power BI** — every chart's expected reference values must match. When they do, the chart is correct. When they don't, the spec is wrong or the source is wrong — debug accordingly.
11. **Once all 18 verified** — use this widget as the baseline. Then we redesign — more interesting illustrations, custom behaviors, integrated with the globe widget, etc.

---

## 12. Open questions

| ID | Question | Affects | Status |
|---|---|---|---|
| OQ-1 | Where does per-country × year × instrument data come from? (Page 2 Chart 4 & 5 numbers for Dominica 2017 match the `Finance type` all-SIDS totals exactly — suspicious. Either Vikrant joins external OECD CRS data in Power BI, or the external-analysis sample conflated all-SIDS with Dominica-specific.) | P2.C4, P2.C5 | **Need to ask Vikrant** or independently extract OECD CRS. |
| OQ-2 | Should `dim_income_group` use WB canonical (`LICs` at the bottom) or RESI canonical (`LDCs` at the bottom — collapses LIC into LDC)? | Every chart that uses cohorts | **User decision pending.** Recommend WB canonical with `is_ldc` as orthogonal flag. |
| OQ-3 | What's the actual UN SDSN MVI vintage Vikrant used? (Only one published vintage — 2023 pilot — but worth confirming.) | All Page 5 charts + P4.C4/C5 | **Need to verify** by downloading the SDSN dataset and comparing values. |
| OQ-4 | How to handle Nauru's missing MVI sub-dimensions on Page 5? Show as a gap, surface as a footnote, or silently exclude? | P5.C1–C4 | UX choice — defer to design. |
| OQ-5 | When Vikrant updates the source workbooks annually, what's the SLA + protocol? | Everything | Project / coordination question. |
