# Overton Window Analysis — Status

**Last updated:** 2026-06-07
**Active plan:** `docs/plans/2026-06-06-001-overton-coherent-narrative-plan.md`
**Working branch:** `feat/right-wing-motion-analysis`

---

## Context

The Overton window analysis is a flagship output of Stemwijzer's **Track 2: Analytical Depth and Transparency** (see `STRATEGY.md`). Stemwijzer is a Dutch parliamentary analysis platform with three tracks:

1. **Data pipeline reliability** — robust ingestion of all Tweede Kamer votes
2. **Analytical depth and transparency** — interpretable political dimensions (this analysis)
3. **Agent-native architecture** — self-documenting, agent-operable codebase

The Overton analysis demonstrates what the platform can do: SVD compass, 29K+ scored motions, 2D extremity scoring, and Procrustes-aligned drift detection — all in service of a real political science question.

## Goal

A coherent, multi-surface story about whether the Dutch Overton window shifted — accessible as an interactive Quarto article, live in the Streamlit Explorer, and backed by reproducible analysis scripts. The narrative serves dual purpose: a political science finding AND a platform showcase that drives engagement with the Stemwijzer compass and explorer.

Three tiers:

1. **Narrative spine** — Quarto article (the story, with "About Stemwijzer" section)
2. **Detailed appendices** — Markdown reports in `reports/overton_window/` (the evidence)
3. **Live exploration** — Streamlit Explorer Overton tab + existing Kompas/Trajectories tabs (the data)

---

## Completed

### Core Analysis (U1-U5 from plan 001)
- [x] Right-wing motion classification (2,986 → 3,030 classified)
- [x] 1D extremity scoring (LLM, 2,986 motions)
- [x] Sentiment analysis (LLM, 2,986 motions)
- [x] Category derivation (7+13 categories)
- [x] Temporal aggregation (yearly trends, 2016-2026)

### Overton Window Analysis (plans 002-003)
- [x] Centrist support breakpoint (strict 4-party: D66/CDA/CU/NSC)
- [x] Opposition-only filtering (coalition control)
- [x] Domain decomposition (migration vs non-migration)
- [x] SVD spatial drift (Procrustes-aligned PCA)
- [x] Content extremity trends (material impact declined, style rose)
- [x] "Acceptance without conversion" confirmed
- [x] Findings report written

### 2D Extremity Scoring (plan 004)
- [x] Project-local skill: `.opencode/skills/score-extremity/SKILL.md`
- [x] 2D scoring (stijl-extremiteit + materiele impact, 1-5)
- [x] Pearson r = 0.47 (right-wing), r = 0.43 (all-motion) — dimensions separable
- [x] All 29,591 motions scored via subagent pipeline
- [x] 2D temporal decomposition (material fell, style rose — divergence confirmed)
- [x] Gravity-controlled analysis (M≥4 centrist support shifted +0.263)

### Gap Analysis & Extensions (plans 005-006)
- [x] Quarterly temporal trajectory (33 quarters, inflection at 2024-Q2)
- [x] Causal timing (electoral jump, not coalition-driven)
- [x] Left-wing response (18.3× asymmetry, Volt exception)
- [x] Mechanism classification (consensus framing confirmed, κ=0.41 moderate)
- [x] Party differentiation (JA21 drives moderation, PVV entered government)
- [x] Voting margin analysis (ρ=0.812, far superior to pass rate)
- [x] Predictive model (AUC-ROC=0.81, RF=0.84)
- [x] Coalition coding fix (2024 split at July 1)
- [x] All-motion 2D extremity (29,591 motions, stijl=1.36, mat=2.12)
- [x] HTML report with gravity-controlled charts + example motions

### Code Quality
- [x] Shared helpers extracted to `analysis/right_wing/common.py`
- [x] requests.Timeout bug fixed
- [x] p-value walrus operator fixed
- [x] 35 tests for common.py (TDD)
- [x] DROP TABLE bug fixed in classify_motions.py

### Knowledge Capture
- [x] Overton methodology documented (7-step, `docs/solutions/best-practices/`)
- [x] Domain decomposition methodology documented
- [x] Extended analysis methodology documented
- [x] Large-scale subagent scoring methodology documented
- [x] Narrative architecture documented

---

## In Progress

### Plan 007: Coherent Narrative (current)
- [ ] U1: Clean up stale reports (remove findings_report.md, blog_post.html)
- [ ] U1: Fix hashline corruption in synthesis report
- [ ] U1: Add cross-reference headers to all reports
- [ ] U1: Switch HTML report to strict 4-party centrist definition
- [ ] U2: Install Quarto CLI
- [ ] U2: Write Quarto narrative spine (8 sections, interactive Plotly)
- [ ] U3: Add Overton context panel to Explorer Kompas tab
- [ ] U3: Add 2024 breakpoint annotation to Trajectories tab
- [ ] U3: Create new Overton tab (centrist support trend, right-wing motion browser)
- [ ] U3: Wire Overton tab into Explorer
- [ ] U4: Write `build_all_reports.py` master script
- [ ] U5: Write `reports/overton_window/README.md` reading guide
- [ ] U5: Update project README.md

---

## Deferred

### Analysis Depth
- [ ] European comparison (AfD, Meloni, Le Pen, Sweden Democrats)
- [ ] Mechanism taxonomy revision (κ=0.41 → improve agreement)
- [ ] Forward-looking scenario analysis (permanent vs temporary shift)
- [ ] Anti-institutional pivot deep-dive (abolition → contestation)
- [ ] Re-populate category column in right_wing_motions (wiped by DROP TABLE)

### Presentation
- [ ] Quarto blog post with interactive charts
- [ ] Table of contents / reading guide linking all 17 reports
- [ ] Single-script reproducible build with Quarto render

### Infrastructure
- [ ] Agent-native architecture improvements (pipeline_run_stage, UI integration)
- [ ] CRUD completeness (delete_motion, mop up entity gaps)

---

## Report Directory Map

```
reports/overton_window/
├── STATUS.md                              ← THIS FILE
├── README.md                              ← Reading guide (U5, pending)
├── overton_window.qmd                     ← Narrative spine (U2, pending)
├── _quarto.yml                            ← Quarto config (U2, pending)
│
├── overton_window_synthesis.md            ★ Master synthesis (291 lines)
├── overton_report.html                    ★ Public HTML dashboard
│
├── breakpoint_analysis.md                 Appendix: Centrist support breakpoint
├── breakpoint_figure_1.png                Fig: Centrist support over time
├── breakpoint_figure_2.png                Fig: Extremity-stratified
├── breakpoint_figure_3.png                Fig: Left-wing support
├── breakpoint_figure_4.png                Fig: Gravity-controlled CS
│
├── extremity_2d_temporal.md               Appendix: 2D extremity temporal
├── extremity_2d_temporal_figure.png       Fig: 4-panel 2D temporal
│
├── temporal_trajectory.md                 Appendix: Quarterly trajectory
├── temporal_trajectory_figure.png         Fig: 33-quarter trajectory
│
├── causal_timing.md                       Appendix: Causal attribution
├── causal_timing_figure.png              Fig: Pre/post event timing
│
├── svd_stability_report.md                Appendix: Procrustes SVD drift
├── svd_drift_chart.png                    Fig: 2D party compass
├── svd_trajectory_figure.png             Fig: Party trajectories
│
├── mechanism_classification.md            Appendix: Why motions gain support
├── mechanism_validation.md                Appendix: κ=0.41 validation
│
├── party_differentiation.md               Appendix: Per-party shifts
├── party_differentiation_figure.png       Fig: JA21/FVD/PVV/SGP comparison
│
├── left_wing_response.md                  Appendix: Left-wing voting
├── left_wing_response_figure.png          Fig: Left party support
│
├── voting_margin.md                       Appendix: Voting margin analysis
├── voting_margin_figure.png              Fig: Margin distribution
│
├── predictive_model.md                    Appendix: ML prediction
├── predictive_model_figure.png           Fig: Feature importance
│
├── success_correlation.md                 Appendix: Pass rate (ceiling)
│
├── 2d_extremity_correlation_report.md     Appendix: Full 29,591 correlation
│
├── findings_report.md                     ✗ REMOVED (superseded)
├── blog_post.html                         ✗ REMOVED (replaced by Quarto)
```

---

## Data Sources

| Table | Rows | Purpose |
|-------|------|---------|
| `right_wing_motions` | 29,588 | Classified right-wing motions with centrist support metrics |
| `extremity_scores` | 2,986 | Original 1D LLM scores (legacy) |
| `extremity_scores_2d` | 3,089 | 2D scores for right-wing motions (active) |
| `extremity_scores_all` | 29,591 | 2D scores for ALL motions (baseline) |
| `sentiment_scores` | 2,986 | Dutch sentiment scores (legacy) |
| `motions` | 29,570+ | Main motions table |
| `mp_votes` | — | Per-MP per-motion vote records |
| `party_axis_scores` | — | Procrustes-aligned PCA party positions |
| `overton_svd_center` | 11 | Yearly SVD centrist/right-wing centers |

---

## Key Numbers (canonical)

| Metric | Pre-2024 | Post-2024 | Δ |
|--------|----------|-----------|---|
| Centrist support (strict 4-party) | 0.251 | 0.507 | +0.256 |
| Opposition-only CS | 0.270 | 0.543 | +0.272 |
| Material impact (right-wing) | 2.79 | 2.45 | −0.34 |
| M≥4 share (% high-impact) | 23.7% | 11.3% | −12.4 pp |
| SVD cultural gap | 0.282 | 0.428 | +0.146 |
| Stylistic extremity | 1.718 | 1.815 | +0.097 |
| Migration CS | 0.153 | 0.369 | +0.216 |
| All-motion stijl | — | 1.36 | — |
| All-motion materieel | — | 2.12 | — |
| Stijl-materieel r (RW) | — | 0.47 | — |
| Stijl-materieel r (all) | — | 0.43 | — |
| Voting margin ρ | — | 0.812 | — |
| Mechanism κ | — | 0.41 | — |
| AUC-ROC (logistic) | — | 0.81 | — |
| Inflection quarter | — | 2024-Q2 | — |
| Peak centrist support | — | 0.648 (2024-Q4) | — |
| Latest (2026-Q1) | — | 0.334 | — |

## Verdict

**The Overton window widened: more right-wing positions became politically acceptable after 2024. Centrist support for right-wing motions surged (25%→51%) while staying flat for left-wing motions (49%→49%). The mechanism was right-wing moderation, not centrist conversion — and the effect may be temporary (2026-Q1 reversion to 33%).**
