Skip to content

Showcase Script — the North Star

Four demo moments, all four walked on prod, written as step-by-step scripts. This is the artifact every phase must visibly advance (per plan.md → Development-Phase Goals): a step either works today (live) or names the phase that delivers it (target: P11, …). When a phase closes, walk the affected moment(s) and flip the markers — the walk, not the issue count, is the progress measure.

The machine-checkable twin of this script is scripts/smoke_e2e.py (Phase 10, #890); this file is the human walk on top of it.

Personas here are showcase lenses, not validated markets — the same logged-in platform demonstrates all of them (four moments live; Moment 4 was added 2026-09-08 and walked at the Phase 15 exit on 2026-09-17 — its one remaining target marker is step 8, a 24-hour evidence read rather than a walk).

Routes since Phase 17. Phase 17 replaced Assess, the portfolio analysis and the Live map with one Explore workspace, and renamed Runs, Datasets and Measures to Analyses, Data and Adapt (phase-17-revamp.md D1). The moments below name the Phase 17 routes: /explore (with ?scope=portfolio&id= for a book today, the Phase 17b target being ?exposure=portfolio:<id> with the old address rewritten to it, EX-16; ?mode=events&event= for an event or a live watch, ?mode=compare for compare), /analyses, /data and /adapt. The live markers record walks on the surfaces of their day and stay valid as evidence. The phase-end owner walk (#1501, exit criterion 2) re-walks Moments 1–4 on the new routes, and nothing is removed without that walk (Phase 14 guardrail 2).

Redirected from — each old address opens its new surface in one hop (UI src/App.tsx, ui#515 and ui#527), so every evidence link in this file and the mid-review docs still resolves: /assess, /dashboard and /matrix?batchId= → /explore (scenario, horizon and batch carried) · /live, /live/:eventId and /portfolios/:id/events/:eventId → /explore?mode=events&event= · /runs and /scenarios → /analyses · /runs/compare and /compare → /explore?mode=compare · /datasets → /data · /measures → /adapt.


Moment 1 — Citizen: "How risky is my home?"

Surface: /lookup (RiskLookupPage). Known-good river-flood pins: Greece 40.60, 22.80 (Thessaloniki / Axios delta); Cyprus 34.89, 33.61 (Larnaca district). Both are recorded with their provenance on scripts/packs/country_profile.py (CountryProfile.demo_pin) — read them from there rather than re-typing them. The Cyprus pin is measured, not picked off a map (issue #1084): the Aqueduct baseline clip is only 0.652 % valid cells and barely a quarter of those are on land, so an eyeballed Cyprus coordinate almost certainly lands in nodata and demonstrates nothing.

Cyprus evidence (D13, owner walk 2026-09-02 on prod UI v0.12.0): pin 34.89, 33.61 → Earthquake 6/10 Elevated (ESHM20 earthquake hazard – Cyprus, screening-grade EAI) and River flood 4/10 Moderate-low (Aqueduct river flood Cyprus – historical baseline 1980 (WATCH), RP10 0.11 m / RP50 0.21 m / RP100 0.25 m); wildfire/storm/coastal/heatwave values-only, tropical cyclone/drought not covered. Greek pin 40.60, 22.80 → River flood 7/10 High (JRC river flood Greece), earthquake 6/10, coastal values-only + screening-grade — the cross-country property holds in the UI.

  1. Open /lookup and search an address — the box lists matches and picking one drops the pin (dropping a pin manually still works too). live (walked on prod 2026-09-17 by the owner: searching an address on /lookup returned matches and picking one dropped the pin — #1377 reverses #1322's pin-drop-only decision now that GEOCODER_ADVERTISED=true and Nominatim are live on prod. Cyprus addresses do not resolve — the Nominatim import is a Greece-only PBF (Limassol → 200, 0 candidates), so the Cyprus leg of this moment still uses the measured pin 34.89, 33.61 above, per #1377's closing note)
  2. See the multi-hazard score card: plain-language RAG bands, documented misses, screening-grade badge, provenance drawer with citation. live · Phase 17b (LK-8, LK-13): provenance moves into one collapsed "Why this score?" with a "How this score is made" block (hazard, dataset, design return period, scheme; no exposure, per K15).
  3. See the hazard raster rendered behind the pin — the map shows why the band is what it is. live (walked 2026-08-26 on UI v0.8.0: the JRC national COG renders behind the pin with the measured legend 0.121 – 7.98 m, the H3 answer cell outlined — ui#186/ui#205 + backbone #964/#965; evidence on #971)
  4. Toggle scenario and time horizon — "what about 2050 under SSP5-8.5?" — and watch the card update. live (walked 2026-08-27 on trunk 73413cf: lookup-axis.spec.ts:19 sets the axis, the URL carries it and a reload restores it — ui#218 + ui#219; smoke run 33064354961)
  5. See a risk-over-time mini-chart across horizons. live (walked 2026-08-27 on trunk 73413cf: lookup-axis.spec.ts:57 charts a pinned lookup across the horizon axis — ui#220; smoke run 33064354961)
  6. Copy a shareable permalink of this exact pin + settings and open it on a phone (responsive layout). live (walked 2026-08-26: Copy link → /lookup?lat=40.6&lon=22.8 restores pin + card — ui#179; the phone layout collapse was ui#208, fixed in v0.8.0)

Moment 2 — Insurer: "What's my book's risk?"

Surfaces: /portfolios (the books and their upload), the book's analysis in /explore?scope=portfolio&id=<id> (Phase 17b target EX-16: /explore?exposure=portfolio:<id>), its events in /explore?mode=events&event=, and exposure datasets in /data. Steps 1–9 were walked on the portfolio page and the Live event page before Phase 17.

Cyprus evidence (D13) — re-walked 2026-09-03 on prod UI v0.12.0: the first Moment 2 walk on the Cyprus book scored 0 of 1 members ("No risk surface in scope" on every hazard). Two causes, both remediated the same day: Cyprus had no baseline/0 surface at all, and the rollup scores a member only through the res-8 H3 cell its own coordinates fall in — with no parent-cell fallback — so a LitPop member could never be scored by a surface built over GHSL points. The two baseline surfaces were built through the matrix endpoint (river + coastal, 3902 cells each) and the book acd702b1… re-membered with three GHSL Cyprus rows. It now answers 3 / 3 scored: headline 4 Moderate-low river flood at baseline (aggregate 0.2542 m), 3 at ssp2-4.5/2030, 4 at ssp5-8.5/2050, exposed value 16,769,833 USD, worst members 7,043,304 / 5,050,948 / 4,675,581 USD; coastal flood reports metric_absent_from_cells rather than a zero. The owner reopened /portfolios/acd702b1… in the browser the same day and confirmed the page renders exactly that — 3 of 3 scored, headline 4, band 3 on the ssp2-4.5/2030 toggle, coastal flood as metric absent; steps 1–7 below are unaffected and stay live. (#1048, closed 2026-09-03; the res-8/per-member-reason finding is #1154.)

  1. Create a portfolio; bulk-upload an asset CSV. live
  2. See the portfolio's assets on a map. live (walked 2026-08-27 on trunk 73413cf: portfolio-map.spec.ts:34 takes an empty book to a mapped one — ui#225; smoke run 33064354961)
  3. Read the book rollup: headline band, per-hazard chips, band distribution of value with the share in high or severe, value-weighted average band (screening), worst-N concentration table. live · Phase 17b (PF-9, #1580): the band distribution of value (value_weighted.band_distribution) and the share in high or severe (share_high_or_severe) joined the rollup, and the average was labelled in the route's description.
  4. Toggle scenario/horizon on the rollup. live (walked 2026-08-27 on trunk 2612a25: portfolio.spec.ts step 5 moves the axis, the URL carries ?horizon=2080 and a reload restores it — ui#221; smoke run 33043634432)
  5. Run a monetary loss computation on the portfolio — portfolio EAD/AAI and a frequency curve, not just score bands. live (walked 2026-08-27 on trunk 73413cf: portfolio.spec.ts steps 6-7 run the computation and read a finite EAD off the panel — ui#228 + backbone #1008; smoke run 33064354961)
  6. See real metrics on the portfolio list (exposure count, EAD per hazard) instead of placeholders. live · Phase 17b (PF-8): the list's total_ead counted a dataset once per member row and mixed perils. Backbone #1571 landed ead_by_hazard, one labelled figure per hazard read from the portfolio's own run. A dataset-level run stood in, weighted once per dataset, only when every attachment selected all and every dataset had a run in the same cell, and total_ead became one hazard's figure, never a cross-hazard total. (walked 2026-08-27 on trunk 2612a25: portfolio.spec.ts step 3 reads real counts — ui#226 + backbone #1010; smoke run 33043634432. The third column, "Scenario", stays a dash: the list response carries no per-row scenario and fetching one would reintroduce the N+1 ui#226 exists to avoid)
  7. Download a portfolio report. live (walked 2026-08-27 on trunk 73413cf: portfolio.spec.ts step 8 exports the computed result and the browser receives a .csv download — ui#222; smoke run 33064354961)
  8. Open one of the book's events — a replayed real past earthquake (Samos 2020) or fire (Evia 2021): the same asset map and worst-N table, with the observed footprint in place of the return-period layer. live (walked 2026-09-03 on prod, UI v0.12.0 + backbone v0.21.0: the Samos card in the book's Events section opens to the header, the life-safety line, the ranked table and the ShakeMap raster on the map; the Evia card plays a six-tick scrubber with the footprint changing per day; a book without an event shows no Events heading — phase-13-event-replay.md) · Re-walked on the new route 2026-09-17 (prod, UI v0.15.1 / backbone v0.26.0): the Events card landed on the Live event page — the portfolio event address redirected there (Phase 15 exit criterion 6, Phase 14 guardrail 2; both now open /explore?mode=events&event=) — and Evia plays the same six-tick scrubber on it (mid-review-phase-15.md, row M2.8)
  9. Read the event loss as a screening-grade figure that states the snapshot's observed-at, its age and its source version — never an annual number, never a band. live (walked 2026-09-03: Samos reads 585,548,574 USD with the screening badge and observed-at 2020-10-30T11:51:27Z; Evia's loss changes with each scrubber tick and peaks on 6 August; a page search for "alert" finds nothing) · Re-walked on the Live event page 2026-09-17: Samos reads $585,548,575 with the screening badge and the same observed-at, no annual figure and no band (mid-review-phase-15.md, row M2.9) · Phase 17b (EV-10): the headline is the cumulative event-to-date loss; per-overpass figures remain the scrubber frames.

Backbone + UI landed with backbone v0.21.0 / UI v0.12.0 (2026-09-02), and both replays are live on prod since 2026-09-03 — the Events section now mounts on exactly the two replay books and stays absent elsewhere. The smoke walk's event leg is green (sdk-smoke.yml run 33597653760, E2E_READY_EVT_GRC event_loss=49450.5251 assets=3 valid_at=2020-10-30T11:51:27Z, grade screening) — Phase 13 exit criterion 1 is met.

Prod evidence (owner walk done 2026-09-03). Samos–İzmir M7.0, 2020-10-30 — book 9de7a920… (100 LitPop Greece rows), event 2e3fd696…, one snapshot 47564d9e… (valid_at 2020-10-30T11:51:27Z, unit g), event loss 585,548,574 USD, grade screening, top members 134,898,561 / 78,285,453 / 74,662,151 USD. North Evia wildfire, 3–10 Aug 2021 — book dbe2a065… (216 rows), event da01cb7a…, six daily snapshots (unit K), losses 926,127 / 21,451,558 / 15,095,527 / 13,491,984 / 5,470,912 / 15,714,748 USD, the 08-06 peak matching the fire's worst day, the seeded Lüthi 1 km curve auto-resolving. Neither payload carries ead or aai; tiles serve through /v1/tiles/cog/{id}/… and snapshots stay hidden from GET /v1/hazards. The owner walked /portfolios/9de7a920… and /portfolios/dbe2a065… in the browser on 2026-09-03 and the markers flipped — the walk, not the evidence, is what flips a marker (#1146, closed on the data proof; mid-review mid-review-phase-13.md).

Moment 3 — Scientist: "How do scenarios and engines compare?"

Surfaces: /explore (the batch run, Engine + Compare engines), /explore?mode=compare (two runs or engines side by side) and /analyses (saved runs). Steps 1–6 were walked on Assess and Runs, the surfaces Explore and Analyses replaced in Phase 17.

Phase 14 (opened 2026-09-05) moves these surfaces. The scenario × horizon batch (steps 1–4) becomes a run mode of Assess, the engine comparison (step 6) becomes an Engine option + Compare toggle on Assess, and saved batches / compare (steps 3, 5) live on Runs. /matrix and /agreement are deleted; the live markers below record the walks made on the old surfaces and stay valid as evidence; each step was re-walked on its new surface at the Phase 14 exit (owner, 2026-09-09 and 2026-09-10, prod UI v0.14.0 → v0.14.1) — the PR that deletes a route rewrites its step here in the same change (phase-14-solidify.md guardrail 2 and D3/D4/D6).

Done so far: /agreement is deleted (ui#324 — step 6 below is rewritten onto Assess). /matrix is deleted too (ui#323 — steps 1–4 below are rewritten onto Assess). Its address survives only as a redirect: /matrix?batchId=X → Explore's /explore?batch=X (one hop since Phase 17, ui#515), so the Phase 11–13 evidence links in this file and in the mid-review docs still resolve.

Steps 1–4 were walked on /matrix, which no longer exists. They are rewritten below onto the surfaces that absorbed them (ui#322 moved the grid to Assess, ui#314 the saved-batch list to Runs, ui#323 deleted the old page). The Phase 11–13 live markers are kept as the record of what was proven, with the trunk and smoke run that proved it — and each carried a re-walk owed marker until the Phase 14 exit, because the walk that produced it went through a page that is gone. The re-walks landed at the Phase 14 exit: the owner walked every step below on prod on 2026-09-09 (UI v0.14.0), the findings shipped as R2.1 (UI v0.14.1), and the owner re-walked the affected steps green on 2026-09-10 — ids per step.

  1. Run one hazard × impact-function × exposure across scenarios × horizons as a tracked batch; watch per-cell progress. live — re-walked on Assess (owner, 2026-09-09/10, prod): batch e0bf0155-5686-4189-b6fd-4235ac3acd5e — Aqueduct river flood Greece 1980 × LitPop Greece × JRC flood Europe buildings, ssp2-4.5 + ssp5-8.5 × 2030 + 2050, four cells completed. The batch is dispatched from Assess's own rail: widen ScenarioHorizonControl past a single cell and Run Assessment submits the whole grid to POST /v1/compute/impact/matrix instead of a single job. Progress is the grid itself — each tile carries its own data-cell-state and settles independently — rather than the separate progress page /matrix showed first. The batch gets an address as soon as it is dispatched (Assess's ?batch=<id>, /explore?batch=<id> since Phase 17), which is what makes a run in flight shareable. Covered by scenario-matrix.spec.ts:173-199 (ui#322).
  2. Read the result as a scenario × horizon heatmap grid and read any cell's full result in place. live — re-walked on Assess (owner, 2026-09-09/10, prod): the cells of batch e0bf0155-5686-4189-b6fd-4235ac3acd5e read in place. (Originally walked 2026-08-27 on trunk 73413cf — ui#224; smoke run 33064354961 — through /matrix's grid and its drill-in modal.) The grid is the same one, moved into Assess's results strip; the modal is gone. Clicking a tile loads that cell into the page's own map, stats bar and frequency curve, so the answer lands beside the map rather than on top of it — MatrixCellDrilldown was deleted with the page in ui#323. Covered by scenario-matrix.spec.ts:197-213.
  3. Save the batch and recall it later. live — re-walked on Runs (owner, 2026-09-09/10, prod): saved as scenario 8cfee746-5cb5-4089-b709-35fa2c4be8e4 ("walk batch river flood GR", inputs.batch_id = e0bf0155-5686-4189-b6fd-4235ac3acd5e), reopened from the Runs hub as one row, and the single baseline saved as 91fb2637-9b4e-4bcf-b84f-42fcead9c405 ("walk baseline river flood GR"). (Originally walked 2026-08-27 on trunk 73413cf — ui#223 + backbone #1009; smoke run 33064354961 — reopening from /scenarios' saved batches.) The batch is saved as before; the list that recalls it is the Runs hub now (ui#314), one table of every scenario, batch and comparison, and a batch row reopens on Assess's ?batch= address rather than on /matrix. Since Phase 17 the hub is Analyses (/analyses) and the batch opens in Explore. Covered by scenario-matrix.spec.ts:214-220 (reopen from the address) and :290-317 (reopen from the hub).
  4. Download the composed report (PDF). live — re-walked on Assess (owner, 2026-09-09/10, prod) from the strip header of batch e0bf0155-5686-4189-b6fd-4235ac3acd5e. · Per-result CSV/PDF export on any result surface. live (walked 2026-08-27 on trunk 73413cf: scenario-matrix.spec.ts exports a selected cell and asserts the .csv download — ui#222; smoke run 33064354961). The composed-report button moved with the results entry: it sits in the batch strip's header on Assess and renders the whole batch, the same POST → 202 job_id → poll → GET contract it always had. Its coverage moved too — ui#323 deleted matrix.spec.ts (which walked the old run form to this download) and folded the download half into scenario-matrix.spec.ts:222-259, since the form half no longer exists.
  5. Compare two saved scenarios side by side — synchronized maps, delta stats. live, on the Runs compare page (walked 2026-08-27 on trunk 2612a25: scenario-matrix.spec.ts:134 reaches the compare view — ui#227; smoke run 33043634432). The top-level Compare nav entry was retired by ui#311: compare became a nested page under the Runs hub, reached by selecting two runs, and the spec asserts the old banner link is gone as well as that the view is still one click from Runs. Since Phase 17 compare is Explore's Compare mode (/explore?mode=compare&a=&b=, ui#523).
  6. In Explore (/explore, walked on Assess), pick an Engine for the run — or turn on Compare engines to run the same input across every live engine at once — and see real divergence badges. live — re-walked on Assess (owner, 2026-09-09, prod UI v0.14.0): engine comparison 82e38d05-38ae-4266-badb-4f294a333af5 (kind = engine_comparison, two engines, completed) on Aqueduct river flood Greece × LitPop Greece.

Rewritten onto Assess by ui#324, which deleted /agreement and moved both halves into Assess's run settings: - an Engine select, options from GET /v1/engines, each one disabled with its reason inline when the deployment does not have it or the chosen peril is outside its supported_hazards. Left unchosen the request omits X-Engine and the deployment default applies (the header ui#309 landed on the client). - a Compare engines toggle. On, Run Assessment fans the same prerequisites across the checked engines through POST /v1/compute/impact/compare; the results column renders the same per-engine EAD / AAI / insured-loss table — engine_version included (ui#299/#301) — with divergence badges against the reference engine, and the map keeps showing the reference engine's result. Offered on the baseline horizon, which is the only cell the compare endpoint has a request shape for. Phase 17b (EX-11, EX-15): engine compare takes any scenario × horizon cell (/compare accepts the /impact body with a cell), missing sides compute in place, default Today versus SSP5-8.5 · 2080. - the comparison rides in the URL as ?comparison=<id>, so a reload reopens it instead of losing a run that cost real compute — the one behaviour /agreement did not have (its id lived in component state).

The evidence below is the last /agreement walk. It still proves the capability — the same components, the same endpoints, the same divergence rendering — and the new surface was walked at the Phase 14 exit (id above), so both records stand. (Walked 2026-09-02 on prod, UI v0.12.0 + backbone v0.21.0: /agreement listed climada and climate_lama, both selected by default from GET /v1/engines; hazard Aqueduct river flood Greece, exposure LitPop Greece → EAD/AAI 409,851,434 on both engines, 0 % EAD/AAI divergence badges, climate_lama marked reference, parity link "How the engines are compared" rendered; switching to ESHM20 earthquake hazard - Cyprus disables climada with the inline reason "(not supported for Earthquake)" — the roster's supported_hazards drives the picker as D11 specified. Sidecar proof: scripts/verify_engine_agreement.py exit 0, both engines completed, failed_engines == [], 0.0000 % EAD divergence (#1051); /agreement UI walk verified (#1053) — phase-12-country-engine.md D11/D12)

Moment 4 — Decision-maker: "What is at risk right now?"

Surfaces: Explore's Events mode, /explore?mode=events (Phase 17 folded the Live tab into it, mounted only when features.live_mode is on), and /adapt for step 9. Steps 1–7 were walked on the Live tab before Phase 17 (phase-15-live-risk.md). Added 2026-09-08 by owner instruction, promoting the charter's parked "Moment 4 (responder/official)" (exploration/07-live-risk.md §13). The responder is a lens of the P3 decision-maker persona, not a new one. The walk runs on a replay feed over real archived data — the North Evia 2021 FIRMS series released one observation per tick with its original observed-at — so every number on screen is a real provider observation, never a demo fixture (ADR-077).

Walked by the owner on prod on 2026-09-17 (UI v0.15.1, backbone v0.25.0 → v0.26.0 from 16:09Z mid-walk, Alembic head 0094 at both tags, features.live_mode: true) — steps 1–7 flipped to live on that walk; step 8 is an evidence read, not a walk, and stays target until #1300 records it. The walk's ids, figures and three tagged findings are in mid-review-phase-15.md. Walk precondition: prod carried no replay series, so a six-observation North Evia 2021 series was staged on the host under the worker's /data mount from the Phase 13 daily FIRMS rasters — the recipe is now in DEPLOYMENT.md § "Staging a replay series on prod".

  1. Open Explore → Events (/explore?mode=events, offered only when the deployment has live mode on; the Live tab before Phase 17) and see the open watches as cards: name, hazard, Replay or Near-real-time, a freshness dot whose opacity is the age of the latest observation, the latest event loss and a loss sparkline. Phase 17b (EV-10, EV-11): the latest event loss is the cumulative event-to-date loss, monotone, never falling between frames, grouped per event_key. live (walked 2026-09-17 on prod: nav = 9 with Live mounted; the rail listed the two Phase 13 replay watches with chip, freshness dot, latest loss and sparkline)
  2. Select a watch: the map flies to its area of interest and shows the latest observed footprint behind the book's assets coloured by loss; the scrubber shows one tick per observation with Follow latest on. live (walked 2026-09-17: the map flew to the AOI with Follow latest on and both the watched-area and event-loss layers rendered)
  3. Watch a new observation arrive without touching anything — the replay feed ticks, the snapshot lands through the real ingest pipeline, the event lane scores it, and the map, the scrubber and the headline update. live (walked 2026-09-17: the scheduler released all six observations untouched, then logged live_feed.replay.series_exhausted. The ticks arrived at the deployment's live_feed_tick_seconds = 300 s, not the feed's configured 120 s — the loop is right, the contract is not, filed #1444)
  4. Read the two numbers — exposed count and value (assumption-free) and the screening-grade event loss — with observed-at, age at render, source version, the feed's latency budget and the life-safety line. Phase 17b (EV-10, EV-14, EV-16): the headline loss is cumulative, labelled "ground-up loss of one observed footprint, not annual", with its unit. live (walked 2026-09-17 on the 6 August snapshot: event loss $21,451,558, 21 assets exposed, exposed value $21,451,558, Screening-grade EAI, with observed-at, age, source and the life-safety line all present)
  5. Read what changed since the previous observation: Δ loss, Δ exposed, the top movers and the newly exposed assets. Phase 17b (EV-11): the delta compares two observations of the same event key, never two events in one watch. live (walked 2026-09-17 against the 5 August snapshot: +$20,525,432 and +17 assets, with largest changes and newly exposed both populated)
  6. Open the ranked-assets drawer, sort it, and step back through the timeline to see how the ranking moved. live (walked 2026-09-17: Assets (100) sorted by event loss and by name, and stepping back through the timeline moved the ranking)
  7. Create a watch from the UI — book or exposure dataset, area of interest from the book's extent or the current map view, feed kind and cadence — and close it again. live (walked 2026-09-17: watch d2d04091-d117-4e73-bcdf-d2a64605e609 with feed a2ed14e2, replay at 120 s, created 13:40:30Z and closed after the series exhausted. Two reporting defects on this step, neither in the data: the success toast is styled as an error (ui#481) and the new replay watch wears a Near-real-time chip in the rail until a reload (ui#482))
  8. (Prod only, evidence not a walk) A FIRMS near-real-time watch and a USGS ShakeMap watch poll for 24 h with the feed strip showing last and next poll and no error. target: P15 — opened and polling: FIRMS watch d33c553d / feed 1f4de1a9 first polled 2026-09-17T19:10:00Z and USGS watch aafa30f7 / feed 6d0fba09 at 19:15:00Z, last_error null on both; the 24 h read is due 2026-09-18T19:15Z on #1300 and flips this marker.
  9. Open Adapt (/adapt), pick adaptation measures for the watched book and read the avoided loss: adapted against unadapted risk, with the future hazard climate-adjusted for the chosen scenario and horizon (Phase 17 D9). Phase 17b (AD-11, AD-12, AD-13, K20): the plan is one combined run in the canonical order (hazard shifts, hazard factors, protection standards, curve factors); avoided loss, BCR, payback and residual risk come from it, never from per-measure sums; the base is an ungrown, unadapted Today run; the appraisal period is the hazard horizon, capped by lifetime. target: P17 — walked at the phase-end walk on #1501.

Steps 8–9 of Moment 2 are re-walked on the Live event page at the Phase 15 exit: the portfolio event route redirected there (Phase 14 guardrail 2 — nothing is removed without its walk). Done 2026-09-17 — both markers carry the re-walk above.


Out of showcase scope (deliberate)

  • Cross-hazard matrix runs (one batch spanning hazards) — parked, revisit after P12
  • Report export packs (TCFD/CSRD), onboarding tour, multi-tenant admin flows
  • Pan-EU data coverage (#447)