scenario-analysis.md

May 3, 2026 · View on GitHub

Hack23 Logo

🔮 Scenario Analysis Template

📊 Structured Future-State Analysis: Base · Upside · Downside · Wildcard
🎯 Probability-Weighted · Trigger-Conditioned · Decision-Supporting

Owner Version Effective Date Classification

📋 Document Owner: CEO | 📄 Version: 1.3 | 📅 Last Updated: 2026-05-01 (UTC) 🏢 Owner: Hack23 AB (Org.nr 5595347807) | 🏷️ Classification: Public

📌 Template instructions: Produce on every run and save as analysis/daily/${ARTICLE_DATE}/${DOC_TYPE}/scenario-analysis.md. On lighter days, keep the scenario set concise but still complete; when a day's documents carry multi-path uncertainty or the run includes P0/P1-significance material, expand the analysis depth, evidence, and trigger detail. Uses the 5-level confidence scale and DIW weighting defined in ai-driven-analysis-guide.md.

✨ What to produce: Four named scenarios (Base, Upside, Downside, Wildcard), each with explicit probability, trigger conditions, early warning signals, and a decision-playbook paragraph. Probabilities sum to 100%.


📐 Template Contract — every fill of this template MUST satisfy this row.

SlotValue
Owning methodologyper-artifact-methodologies.md
Owning gate checkCheck 7 (Family C — ≥ 3 scenarios + posteriors) — see 05-analysis-gate.md
Required inputssibling Family A + intelligence-assessment.md
Horizon bandper-run (per scripts/horizon-context.ts)
Output familyFamily C — Strategic Extensions
Aggregation order8 of 30 in canonical order (see scripts/render-lib/aggregator/order.ts)
Reader Intelligence Guiderow generated from scenario-analysis.md (see scripts/render-lib/aggregator/reader-guide.ts)
Canonical evidence anchor| claim | evidence (dok_id / vote / MP intressent_id / primary-source URL) | retrieved_at | confidence | — every analytical claim row uses this schema.

Cross-reference: README.md §Template ↔ Methodology ↔ Gate-Check Matrix.

🔄 Tradecraft Context

FieldValue
F3EAD stageAnalyze / Disseminate
PIRslist the priority intelligence requirements this scenario set answers
Admiralty floorB2 for trigger conditions; A1 for anchor evidence from primary MCP sources
SATs usedAlternative Futures Analysis; Key Assumptions Check; Indicators & Signposts; Premortem
ICD 203 standards applieduncertainty, alternative analysis, confidence, argumentation, customer relevance

See political-style-guide.md for canonical F3EAD / PIR catalog / Admiralty Code / ICD 203 / WEP / SATs definitions.


📋 Scenario Context

FieldValue
Scenario IDSCN-YYYY-MM-DD-NNN
GeneratedYYYY-MM-DD HH:MM UTC
Questione.g., "Will the September 2026 election return the current coalition?"
Time horizone.g., 2026-09-13 (election day) / 6-month / 12-month
Decision supportede.g., "Editorial coverage weight through Q3 2026"
Source documentslist of dok_ids
Overall Confidence🟦 VERY HIGH / 🟩 HIGH / 🟧 MEDIUM / 🟥 LOW / ⬛ VERY LOW — pair with WEP probability term (e.g., "likely / about even / unlikely") per political-style-guide.md

🧭 Scenario Quadrant

quadrantChart
    title Scenario Probability × Impact (y-coordinate ≈ probability; x-coordinate ≈ relative impact)
    x-axis Low Impact --> High Impact
    y-axis Low Probability --> High Probability
    quadrant-1 Plan For
    quadrant-2 Prepare Resilience
    quadrant-3 Monitor
    quadrant-4 Consider Opportunistically
    "🟢 Base: Coalition holds (40%)": [0.55, 0.40]
    "🟡 Upside: Opposition wins cleanly (25%)": [0.75, 0.25]
    "🟠 Downside: Hung result (25%)": [0.80, 0.25]
    "🔴 Wildcard: Mid-cycle crisis (10%)": [0.90, 0.10]

📊 Scenario Set

Warning

Illustrative example — replace before publishing. The quadrant, the four scenarios below, every probability, every named actor/committee/dok_id, every trigger condition, and every early-warning signal are worked-example values from a prior reference run. Replace them with run-specific scenario content (or explicitly reuse and re-justify them) before committing this file.

🟢 Scenario A — Base Case (probability 40 %)

FieldValue
NameBase — Coalition holds with SD confidence & supply
Probability40 % (confidence 🟩 HIGH)
HeadlineKristersson government retains office with modified mandate
Trigger conditionsCoalition + SD sustain ≥ 47 % polling through August 2026; no crisis event
Early warning signals(a) cost-of-living package lands within voter segments 1 & 2 by July; (b) no major KU scandal; (c) SD keeps confidence posture
Outcome on key dimensionsBudget continuity, justice agenda continues, climate pace moderated
Decision implicationEditorial: maintain standard coverage weighting; prepare for post-election budget continuity scenario

🟡 Scenario B — Upside (probability 25 %)

FieldValue
NameUpside — S-led opposition wins outright
Probability25 % (WEP: "unlikely" — confidence 🟧 MEDIUM); roughly level with Scenario C
HeadlineSocial Democrats return with C + MP partners
Trigger conditionsOpposition block polls ≥ 52 % by Aug 2026; ULA (unemployment-linked affordability) narrative dominates
Early warning signals(a) Q2 2026 SIFO gap ≥ 6 points; (b) SCB AKU June unemployment > 8.6 %; (c) EU-Commission rebuke on fuel-tax cut
Outcome on key dimensionsBudget redirection to welfare; green-transition acceleration; migration policy recalibration
Decision implicationEditorial: prepare policy-pivot coverage; commission expert-panel content on transition continuity

🟠 Scenario C — Downside (probability 25 %)

FieldValue
NameDownside — Hung parliament / protracted formation
Probability25 % (WEP: "unlikely" — confidence 🟧 MEDIUM); roughly level with Scenario B
HeadlineNo bloc reaches 175 seats; multi-week government formation
Trigger conditionsNo bloc > 48 % in final polls; SD shifts position during campaign
Early warning signals(a) fragmented polling by late July; (b) leadership challenges in smaller parties; (c) late-campaign defections
Outcome on key dimensionsInterim government; budget via caretaker rules; institutional stress
Decision implicationEditorial: activate constitutional-crisis playbook; commission KU + Statsrätt analyses; boost capacity

🔴 Scenario D — Wildcard (probability 10 %)

FieldValue
NameWildcard — Mid-cycle crisis (scandal / external shock / health event)
Probability10 % (WEP: "very unlikely" — confidence 🟥 LOW)
HeadlineExternal event reshapes the race
Trigger conditionsOne of: major KU reprimand, Riksbank crisis action, NATO escalation, public-health emergency
Early warning signals(a) unusual opinion-poll volatility; (b) government-agency resignations; (c) regional escalations
Outcome on key dimensionsUnpredictable; likely short-term rally-around-the-flag then realignment
Decision implicationEditorial: pre-draft crisis explainers; maintain rapid-response editorial shift capacity

Probability check: 40 + 25 + 25 + 10 = 100 %


🧩 Drivers & Dependencies

DriverCurrent signalConfidenceScenarios affected
GDP growth trajectory (SCB + IMF WEO)+0.82 % 2024, +1.8 % 2026 proj🟦 VERY HIGHA, B, C
SIFO/Novus polling gap−4 pt government disadvantage Apr 2026🟩 HIGHA, B, C
SD confidence-supply postureStable through FiU48🟩 HIGHA, C
EU-Commission Green-Deal responseAwaited, 0–30 d horizon🟧 MEDIUMA, B
NATO/Ukraine situationActive, escalation risk moderate🟧 MEDIUMD

🔮 Early-Warning Dashboard

graph TD
    W1["📅 2026-04-24<br/>FiU48 chamber vote"] --> A["🟢 Base holds<br/>if unified Ja"]
    W1 --> B["🟠 Downside<br/>if coalition Avstår"]
    W2["📅 2026-06-30<br/>Q2 SIFO"] --> A
    W2 --> B
    W3["📅 2026-07-15<br/>Pump-price effect"] --> A
    W4["📅 2026-08-15<br/>Final-push polling"] --> A
    W4 --> B
    W4 --> C["🔴 Hung parliament<br/>fragmentation"]

    style W1 fill:#FF9800,color:#FFFFFF
    style W2 fill:#FFC107,color:#000000
    style W3 fill:#FFC107,color:#000000
    style W4 fill:#D32F2F,color:#FFFFFF
    style A fill:#4CAF50,color:#FFFFFF
    style B fill:#FF9800,color:#FFFFFF
    style C fill:#D32F2F,color:#FFFFFF
``$

---

## 📘 \text{Decision} \text{Playbook}

| \text{Scenario} | \text{Action} 1 | \text{Action} 2 | \text{Action} 3 |
|----------|----------|----------|----------|
| \text{A} (\text{Base}) | \text{Maintain} \text{normal} \text{coverage} \text{cadence} | \text{Prepare} \text{post}-\text{election} \text{budget}-\text{continuity} \text{explainer} | \text{Track} \text{SD} \text{confidence}-\text{supply} \text{signals} |
| \text{B} (\text{Upside}) | \text{Commission} \text{policy}-\text{pivot} \text{explainer} \text{series} | \text{Stand} \text{up} \text{transition}-\text{team} \text{coverage} | \text{Prepare} \text{international}-\text{reaction} \text{pieces} |
| \text{C} (\text{Downside}) | \text{Activate} \text{constitutional}-\text{crisis} \text{playbook} | \text{Commission} \text{Statsr}ä\text{tt} / \text{KU} \text{analyses} | \text{Expand} \text{multilingual}-\text{explainer} \text{capacity} |
| \text{D} (\text{Wildcard}) | \text{Pre}-\text{draft} \text{crisis} \text{templates} | \text{Maintain} \text{real}-\text{time} \text{monitoring} \text{intensified} \text{by} 2 \times  | \text{Prepare} \text{coordinated} \text{EN} + \text{SV} \text{rapid} \text{response} |

---

## 🌳 \text{Horizon}-\text{Stratified} \text{Scenarios} *(\text{optional} — \text{emit} \text{only} \text{when} $horizonDays >= 90`)*

> **📌 When to render this block.** Triggered by the run's `horizonDays` value resolved from [`analysis/article-types.json`](../article-types.json) via [`scripts/horizon-context.ts`](../../scripts/horizon-context.ts):
> - `horizonDays < 90` (today / week-ahead / month-ahead) → **omit this block entirely**; the default §"Scenario Set" above stands alone.
> - `horizonDays >= 90` (`quarter-ahead`) → render the **4 base scenarios** sub-tree (Optimistic / Base / Pessimistic / Disruptive — these are the long-horizon canonical names and map to §"Scenario Set" Scenario A–D as **Base ⇄ A**, **Upside ⇄ Optimistic ⇄ B**, **Downside ⇄ Pessimistic ⇄ C**, **Wildcard ⇄ Disruptive ⇄ D**).
> - `horizonDays >= 365` (`year-ahead`) → also render the **wildcard sub-tree** with `longHorizonRules.wildcardCount` entries from [`analysis/article-types.json`](../article-types.json) (currently **5** for `year-ahead` / `election-cycle`), each linked to a wildcard in [`wildcards-blackswans.md`](wildcards-blackswans.md).
> - `horizonDays >= 1460` (`election-cycle`) → also render `longHorizonRules.scenarioBranchesPerScenario` governing-coalition branches per base scenario (currently **3** → 12 leaves total).
>
> Naming convention — every node carries:
> - `horizonClass` — one of `T+90` / `T+365` / `T+1460`
> - WEP confidence term that **degrades with horizon** per [`ext/long-horizon-forecasting.md` §1](../../.github/prompts/ext/long-horizon-forecasting.md)
> - cross-link to the matching band in [`forward-indicators.md`](forward-indicators.md)
> - `counterfactual` flag — mandatory for `cycle`, optional otherwise (counterfactual paragraphs themselves live in [`devils-advocate.md`](devils-advocate.md))
>
> **Probability discipline.** Probabilities at every level sum to 100 %. Sibling base scenarios sum to 100 %; wildcards form a separate set summing to 100 % among themselves; coalition branches under each base scenario sum to 100 %.
>
> The illustrative IDs and probabilities below mirror the worked example in §"Scenario Set" — replace before publishing.

### 🌲 Tree summary table

| Scenario ID | Parent | `horizonClass` | Branch | Probability | WEP (band-degraded) | Confidence | `forward-indicators.md` band | Counterfactual flag |
|-------------|--------|:--------------:|--------|:-----------:|---------------------|:----------:|------------------------------|:-------------------:|
| `SCN-Q-OPT` | — | `T+90` | Optimistic — coalition consolidates (≡ §Scenario Set "B / Upside") | 25 % | likely [horizon:quarter] | 🟩 HIGH | `quarter` | ⬜ optional |
| `SCN-Q-BASE` | — | `T+90` | Base — status-quo continuity (≡ §Scenario Set "A / Base") | 40 % | likely [horizon:quarter] | 🟩 HIGH | `quarter` | ⬜ optional |
| `SCN-Q-PESS` | — | `T+90` | Pessimistic — coalition stress (≡ §Scenario Set "C / Downside") | 25 % | roughly even [horizon:quarter] | 🟧 MEDIUM | `quarter` | ⬜ optional |
| `SCN-Q-DISRUPT` | — | `T+90` | Disruptive — exogenous shock (≡ §Scenario Set "D / Wildcard") | 10 % | unlikely [horizon:quarter] | 🟥 LOW | `quarter` | ⬜ optional |
| `SCN-Y-WILD-1` | — | `T+365` | Wildcard 1 — KU/scandal cascade | 30 % *(of wildcard set)* | roughly even [horizon:year] | 🟧 MEDIUM | `year` | ⬜ optional |
| `SCN-Y-WILD-2` | — | `T+365` | Wildcard 2 — external security shock | 25 % *(of wildcard set)* | unlikely [horizon:year] | 🟧 MEDIUM | `year` | ⬜ optional |
| `SCN-Y-WILD-3` | — | `T+365` | Wildcard 3 — economic dislocation | 20 % *(of wildcard set)* | unlikely [horizon:year] | 🟥 LOW | `year` | ⬜ optional |
| `SCN-Y-WILD-4` | — | `T+365` | Wildcard 4 — leadership / health event | 15 % *(of wildcard set)* | unlikely [horizon:year] | 🟥 LOW | `year` | ⬜ optional |
| `SCN-Y-WILD-5` | — | `T+365` | Wildcard 5 — institutional / KU constitutional shock | 10 % *(of wildcard set)* | very unlikely [horizon:year] | 🟥 LOW | `year` | ⬜ optional |
| `SCN-C-OPT` | — | `T+1460` | Cycle base — Optimistic (≡ §Scenario Set B / Upside, cycle-aged) | 25 % *(of base set)* | roughly even [horizon:cycle] | 🟧 MEDIUM | `cycle` | ✅ mandatory |
| `SCN-C-BASE` | — | `T+1460` | Cycle base — Base (≡ §Scenario Set A / Base, cycle-aged) | 40 % *(of base set)* | roughly even [horizon:cycle] | 🟧 MEDIUM | `cycle` | ✅ mandatory |
| `SCN-C-PESS` | — | `T+1460` | Cycle base — Pessimistic (≡ §Scenario Set C / Downside, cycle-aged) | 25 % *(of base set)* | unlikely [horizon:cycle] | 🟥 LOW | `cycle` | ✅ mandatory |
| `SCN-C-DISRUPT` | — | `T+1460` | Cycle base — Disruptive (≡ §Scenario Set D / Wildcard, cycle-aged) | 10 % *(of base set)* | very unlikely [horizon:cycle] | 🟥 LOW | `cycle` | ✅ mandatory |
| `SCN-C-OPT-A` | `SCN-C-OPT` | `T+1460` | Coalition A — same-bloc continuity | 50 % *(of OPT branches)* | roughly even [horizon:cycle] | 🟧 MEDIUM | `cycle` | ✅ mandatory |
| `SCN-C-OPT-B` | `SCN-C-OPT` | `T+1460` | Coalition B — narrowed bloc + SD | 35 % *(of OPT branches)* | unlikely [horizon:cycle] | 🟥 LOW | `cycle` | ✅ mandatory |
| `SCN-C-OPT-C` | `SCN-C-OPT` | `T+1460` | Coalition C — minority + supply | 15 % *(of OPT branches)* | very unlikely [horizon:cycle] | 🟥 LOW | `cycle` | ✅ mandatory |
| `SCN-C-BASE-A` | `SCN-C-BASE` | `T+1460` | Coalition A — Tidö-style continuity | 50 % | roughly even [horizon:cycle] | 🟧 MEDIUM | `cycle` | ✅ mandatory |
| `SCN-C-BASE-B` | `SCN-C-BASE` | `T+1460` | Coalition B — S-led red-green-centre | 35 % | roughly even [horizon:cycle] | 🟧 MEDIUM | `cycle` | ✅ mandatory |
| `SCN-C-BASE-C` | `SCN-C-BASE` | `T+1460` | Coalition C — grand coalition / caretaker | 15 % | unlikely [horizon:cycle] | 🟥 LOW | `cycle` | ✅ mandatory |
| `SCN-C-PESS-A` | `SCN-C-PESS` | `T+1460` | Coalition A — fragmented right | 40 % | unlikely [horizon:cycle] | 🟥 LOW | `cycle` | ✅ mandatory |
| `SCN-C-PESS-B` | `SCN-C-PESS` | `T+1460` | Coalition B — protracted formation | 35 % | unlikely [horizon:cycle] | 🟥 LOW | `cycle` | ✅ mandatory |
| `SCN-C-PESS-C` | `SCN-C-PESS` | `T+1460` | Coalition C — snap re-election | 25 % | very unlikely [horizon:cycle] | 🟥 LOW | `cycle` | ✅ mandatory |
| `SCN-C-DISRUPT-A` | `SCN-C-DISRUPT` | `T+1460` | Coalition A — emergency unity government | 50 % | very unlikely [horizon:cycle] | 🟥 LOW | `cycle` | ✅ mandatory |
| `SCN-C-DISRUPT-B` | `SCN-C-DISRUPT` | `T+1460` | Coalition B — populist realignment | 30 % | very unlikely [horizon:cycle] | ⬛ VERY LOW | `cycle` | ✅ mandatory |
| `SCN-C-DISRUPT-C` | `SCN-C-DISRUPT` | `T+1460` | Coalition C — institutional crisis | 20 % | very unlikely [horizon:cycle] | ⬛ VERY LOW | `cycle` | ✅ mandatory |

> [!IMPORTANT]
> **Composition rule.** When `horizonDays >= 1460`, the four base scenarios `SCN-C-OPT` / `SCN-C-BASE` / `SCN-C-PESS` / `SCN-C-DISRUPT` reuse the probabilities from the §"Scenario Set" base table. Coalition-branch probabilities under each base scenario sum to 100 % and **do not** redistribute the parent's probability — they refine it conditionally on that base scenario being realised. Cross-validate every leaf against the matching band row in [`forward-indicators.md`](forward-indicators.md) before publishing; any leaf without a matching band signal is a Pass-2 rewrite trigger.

### 🌳 Tree visualisation

```mermaid
graph LR
    R["📅 horizonDays<br/>(from article-types.json)"] -->|< 90| OFF["⬜ skip horizon-stratified block<br/>default §Scenario Set stands alone"]
    R -->|≥ 90| Q["🧭 T+90 — quarter-ahead"]
    R -->|≥ 365| Y["🛰️ T+365 — year-ahead<br/>(also emits T+90)"]
    R -->|≥ 1460| C["🗳️ T+1460 — election-cycle<br/>(also emits T+90 + T+365)"]
    Q --> QO["🟢 Optimistic"]
    Q --> QB["🟢 Base"]
    Q --> QP["🟠 Pessimistic"]
    Q --> QD["🔴 Disruptive"]
    Y --> YW1["🔮 Wildcard 1<br/>→ wildcards-blackswans.md"]
    Y --> YW2["🔮 Wildcard 2<br/>→ wildcards-blackswans.md"]
    Y --> YW3["🔮 Wildcard 3<br/>→ wildcards-blackswans.md"]
    Y --> YW4["🔮 Wildcard 4<br/>→ wildcards-blackswans.md"]
    Y --> YW5["🔮 Wildcard 5<br/>→ wildcards-blackswans.md"]
    C --> CB1["🟢 Base × {A,B,C} coalitions"]
    C --> CB2["🟢 Optimistic × {A,B,C} coalitions"]
    C --> CB3["🟠 Pessimistic × {A,B,C} coalitions"]
    C --> CB4["🔴 Disruptive × {A,B,C} coalitions"]

    style R fill:#0A66C2,color:#FFFFFF
    style OFF fill:#9E9E9E,color:#FFFFFF
    style Q fill:#4CAF50,color:#FFFFFF
    style Y fill:#FF9800,color:#FFFFFF
    style C fill:#D32F2F,color:#FFFFFF
horizonClassPermitted top-end WEP (without ≥ 3 corroborated cycle-aged sources)Counterfactual flagforward-indicators.md band
T+90 (quarter)likely / unlikely⬜ optionalquarter
T+365 (year)roughly even (corroboration unlocks likely)⬜ optionalyear
T+1460 (cycle / coalition leaf)roughly even floor; never likely / very likely without ≥ 3 cycle-aged sources✅ mandatorycycle / election

Every WEP term in this block carries a [horizon:<band>] inline tag (gate-checked by 05-analysis-gate.md §LH-1); every coalition leaf at T+1460 references at least one paragraph in devils-advocate.md by **Counterfactual N — <name>:** heading.


🔁 Update Cadence

IntervalAction
Weekly (Sunday)Update probabilities from polling + macro signals
On-trigger (any W-signal)Immediate rerun of affected scenarios + downstream analyses
MonthlyFull rewrite with pass-2 deep review

Document Control


✅ Pass-2 Self-Audit Checklist (v4.4 — required)

Purpose: AI-FIRST principle requires a Pass-2 read-back-and-improve. After producing this artifact in Pass 1, re-read it end-to-end and verify each item below. Document any remediation in methodology-reflection.md §"Pass-2 audit log". Any unchecked ❌ box at the end of Pass 2 forces a Pass-3 rewrite of the affected section.

  • Tradecraft anchors honoured — F3EAD stage matches the artifact's role; PIRs declared in the §Tradecraft Context block are actually addressed in the body; Admiralty grades attached to every external source; WEP band + ODNI confidence on every probabilistic judgement.
  • Source diversity floor met — at least the minimum number of independent MCP sources required by the artifact's tradecraft block are cited; single-source claims are explicitly labelled [SINGLE-SOURCE — corroboration pending].
  • Evidence specificity — every quantified claim cites a dok_id (Riksdag), an SCB / IMF dataflow code, or a named external source with date; no "according to data" / "studies show" hand-waves.
  • Named-actor discipline — every political claim names ≥ 1 person (party + role + dated act/quote) or labels the absence ([diffuse — no named actor]).
  • Counter-narrative present — at least one explicit competing hypothesis, dissent quote, or framed objection appears in the body; "no opposition recorded" is itself a finding to label, not silence.
  • Election 2026 lens applied — the §"Election 2026 Implications" subsection (or equivalent) addresses electoral salience, coalition pressure, and forward indicators; not boilerplate.
  • No illustrative content shipped as fact — every [REQUIRED] placeholder is filled OR removed; every Example: block is clearly fenced or removed; no fabricated dok_id, vote count, or quote leaks into the final artifact.
  • Cross-references resolve — every [link](file.md) in this artifact points to a file that exists in the run folder (analysis/daily/$ARTICLE_DATE/$SUBFOLDER/) or to a methodology / template under analysis/.
  • Mermaid renders — every fenced ```mermaid block parses (no missing class definitions, no orphan nodes, no >40-node graphs that overflow viewport on mobile).
  • Line-floor check — artifact length ≥ the per-artifact floor in reference-quality-thresholds.json; shorter artifacts trigger Pass-2 rewrite, never a [truncated] note.
  • Horizon-stratified branches compose correctly with forward-indicators.md bands — when horizonDays >= 90, every node in §"Horizon-Stratified Scenarios" carries a horizonClass (T+90 / T+365 / T+1460), a band-degraded WEP term with a [horizon:<band>] tag, a cross-link to a matching band row in forward-indicators.md, and a counterfactual flag (mandatory at T+1460); base + wildcard + coalition-branch probabilities each sum to 100 % at their own level.