---
title: Fix Overton analysis — SVD axis interpretation, pass rate, synthesis
type: fix
status: active
date: 2026-05-08
origin: docs/plans/2026-05-08-002-feat-overton-window-shift-plan.md
---

# Fix Overton Window Analysis — Critical Corrections

## Summary

The current reports have critical issues: (1) the findings report SVD section was never updated after the Procrustes rewrite — and the original sign-convention assumption was wrong (after flip correction, negative y = right-wing/nationalist), meaning centrists moved LEFT culturally, not right — the SVD shows divergence not convergence, which is actually stronger Overton evidence; (2) pass rate still pollutes tables and charts despite being a useless metric at 96%+ ceiling; (3) the synthesis doesn't name the key finding: "acceptance without conversion" — centrists vote more with right-wing despite becoming spatially MORE distant from them, the defining signature of an Overton window widening. Fix the reports, redraw Figure 1 to drop pass-rate panels, and produce a coherent narrative around this interpretation.

---

## Requirements

- R1. Rewrite SVD section with correct axis interpretation and sign convention: axis 1 (economic, positive=pro-market) shows centrist leftward drift (-0.22). Axis 2 (cultural, negative=right-wing/nationalist after flip correction) shows centrists moved left culturally (+0.08 toward kosmopolitisch) while right-wing moved further right (-0.07 toward nationalist) — net cultural divergence of +0.15. The centrist-voting-rise / SVD-divergence combination is "acceptance without conversion."
- R2. Drop pass rate from all tables, chart panels, and narrative. Keep only centrist_support.
- R3. Rewrite Figure 1: single panel with 4–5 lines (RW overall, opposition-only, migration, non-migration, + all-motions baseline). No pass-rate panel.
- R4. Rewrite synthesis to name the central tension: centrist_support rises post-2024 but SVD axes show centrists moved LEFT economically and diverged from right culturally. This is not a contradiction — it's consistent with right-wing motions becoming more mainstream rather than centrists drifting right.
- R5. Update next steps section to reflect completed work.
- R6. Qualify "no extremity increase" with LLM bias caveats noted in the manual audit.

---

## Scope Boundaries

- In scope: Rewriting reports (markdown + chart regenerated from analysis script).
- Out of scope: Re-running LLM scoring, new data collection, changes to classification pipeline.
- Only `analysis/right_wing/overton_breakpoint_analysis.py` and the three report files in `reports/overton_window/` are affected.

---

## Context & Research

### Relevant Code and Patterns

- `analysis/config.py` — SVD_THEMES[1] = economic, SVD_THEMES[2] = cultural/nationalist
- `analysis/right_wing/overton_breakpoint_analysis.py` — Figure 1 generation at ~line 500
- `reports/overton_window/svd_stability_report.md` — already has Procrustes-aligned results, needs axis interpretation
- `reports/overton_window/findings_report.md` — main synthesis, stale SVD section (still says "stability gate failed")

### Key Axis Data (from svd_stability_report.md)

| Year | Centrist Ax1 (econ) | Centrist Ax2 (cultural) | Right Ax1 | Right Ax2 |
|------|-----|------|------|------|
| 2016 | 0.340 | 0.010 | 0.132 | -0.272 |
| 2026 | 0.117 | 0.091 | 0.054 | -0.337 |
| Δ    | **-0.223** (LEFT) | **+0.081** (RIGHT) | -0.078 | -0.065 (MORE nationalist) |

**Cultural axis distance (centrist−right):** 2016: 0.282 → 2026: 0.428. INCREASED by +0.146.

### Central Tension

Centrist support for right-wing motions surged (d=+0.85 opposition-only), yet SVD axes show centrists:
- Moved LEFT economically (divergence from right)
- Moved slightly right culturally, but right moved even further right (INCREASING cultural divergence)

Resolution: the Overton window widened → right-wing motions became more mainstream (closer to centrist positions on ax2), earning centrist support WITHOUT centrists meaningfully changing their overall position. The SVD measures overall voting-position similarity, not specific-motion support.

---

## Key Technical Decisions

- **Keep Figure 2 as-is** — centrist_support per bucket with IQR is correct and informative.
- **Figure 1: merge into single panel** — 4–5 centrist_support lines + annotation, no pass rate. Pass rate adds no signal and clutters the visual.
- **SVD section: keep Procrustes results, fix interpretation only** — the data is right, the framing was wrong.
- **Do not add p-values or confidence intervals** — staying with descriptive stats as the plan commits to.

---

## Implementation Units

### U1. Fix Figure 1 — Drop Pass Rate, Merge Panels

**Goal:** Replace the 2-panel Figure 1 with a single chart showing centrist_support lines only.

**Requirements:** R1, R2, R3

**Dependencies:** None

**Files:**
- Modify: `analysis/right_wing/overton_breakpoint_analysis.py` (Figure 1 generation)
- Regenerate: `reports/overton_window/breakpoint_figure_1.png`

**Approach:**
- Replace 2-panel layout (ax1 centrist_support, ax2 pass_rate) with a single panel.
- Lines: RW overall (solid blue), opposition-only (dashed blue), migration (red), non-migration (green), all-motions baseline (gray dashed).
- Drop all pass-rate computation from `compute_yearly_aggregates()` baseline section (lines ~160–170).
- Vertical line at 2024, Cohen's d annotation box.

**Patterns to follow:**
- Existing `create_figure_1()` at ~line 500 in the breakpoint script

**Test scenarios:**
- Figure renders without error.
- No pass-rate data in chart data paths.
- All 5 lines are distinguishable.

**Verification:**
- `breakpoint_figure_1.png` has a single panel with 5 lines and no pass-rate axis.

---

### U2. Rewrite breakpoint_analysis.md — Drop Pass Rate from Tables

**Goal:** Remove pass-rate columns from all tables in the breakpoint report.

**Requirements:** R2

**Dependencies:** U1

**Files:**
- Modify: `reports/overton_window/breakpoint_analysis.md`
- Modify: `analysis/right_wing/overton_breakpoint_analysis.py` (report generation section)
- Regenerate: `reports/overton_window/breakpoint_analysis.md`

**Approach:**
- Section 1 table: remove Pass Rate and Right Support columns. Keep N, Centrist Support, Extremity, Left Opp.
- Section 2 tables: remove Pass Rate column.
- Section 4 table: remove PR columns.
- Update Section 5 header text to reference "centrist support" not "pass rate".

**Verification:**
- No "pass rate" or "PR" appears in breakpoint analysis tables.

---

### U3. Rewrite Findings Report — SVD + Synthesis

**Goal:** Update the findings report with correct SVD interpretation (ax2 sign convention), name the "acceptance without conversion" finding, drop pass-rate mentions, update next steps.

**Requirements:** R1, R4, R5, R6

**Dependencies:** U1, U2

**Files:**
- Modify: `reports/overton_window/findings_report.md`

**Approach:**

1. **SVD section (Section 4):** Replace "Stability gate: FAILED" with Procrustes results. Add a note explaining the sign convention: after flip correction, negative y = right-wing/nationalist (PVV at -0.56, FVD at -0.36), positive y = left-wing/kosmopolitisch (Volt at +0.27, GL-PvdA at +0.21). Present the data:

   | Metric | 2016 | 2026 | Δ | Direction |
   |--------|------|------|---|-----------|
   | Centrist Ax1 (econ) | +0.340 | +0.117 | -0.223 | Left (more welfare) |
   | Centrist Ax2 (cultural) | +0.010 | +0.091 | +0.081 | Left (more kosmopolitisch) |
   | Right Ax2 (cultural) | -0.272 | -0.337 | -0.065 | Right (more nationalist) |

   **Key finding:** Centrists moved LEFT on BOTH axes (more welfare-economics, more kosmopolitisch-culture) while right-wing moved further RIGHT on the cultural axis. Net cultural distance grew from 0.282 to 0.428 (+0.146).

2. **SVD interpretation (the core insight):** "Acceptance without conversion." Centrists vote more with right-wing motions (d=+0.85) despite becoming spatially MORE distant from right-wing parties on the cultural axis. This is the defining signature of an Overton window widening: the range of acceptable policy expanded without centrist parties themselves converting to right-wing positions. Right-wing motions shifted toward topics/proposals centrists find harder to oppose, or the framing became more palatable, while the underlying party-ideology divide held or widened.

3. **Section 1: Centrist Support:** Cut the "Pass rate is an insensitive measure" paragraph. Replace with one-sentence note.

4. **Section 3: Content Extremity:** Add qualifier: "LLM audit shows 75% agreement with systematic overrating of anti-institutional and migration-adjacent content. A flat trend may partially reflect these biases rather than genuine content stability. See deferred two-dimensional rescoring."

5. **Section 5 (Synthesis):** Restructure around three tiers:
   - **Strong (converging):** Centrist voting support surged (d=+0.85 opposition-only). Migration is the primary domain (+0.233 vs +0.076 Δ), but non-migration starts at a higher baseline (0.53 vs 0.30 pre-2024).
   - **Tension (not contradictory, explanatory):** SVD shows centrists moved LEFT on both axes post-2024 while cultural polarization grew. This is "acceptance without conversion" — the center supports right-wing motions more without becoming right-wing. The Overton window widened, party positions didn't shift.
   - **Weak (noisy):** Content extremity trend is flat (d=-0.09) but relies on imperfect LLM scores (75% audit agreement, systematic overrating biases). Cannot confidently claim content didn't radicalize.
   - Remove SVD row from "Inconclusive" — it's now "Explanatory: acceptance without conversion."

6. **Section 8 (Next Steps):** Remove stale "Procrustes-aligned SVD" suggestion (already done). Keep two-dimensional rescoring and temporal decomposition. Add "mechanism analysis: what specific types of right-wing motions gained centrist support?"

**Test scenarios:**
- SVD section references axis 1 = economic, axis 2 = cultural, with correct sign convention.
- "Acceptance without conversion" concept is clearly explained.
- All pass-rate mentions removed.
- Next steps don't suggest work that's already complete.

**Verification:**
- Report is internally consistent.
- SVD narrative no longer claims (incorrectly) that centrists moved right on ax2.
- The synthesis presents acceptance-without-conversion as the unifying interpretation.

---

### U4. Add Axis Labels to SVD Stability Report

**Goal:** Add axis interpretation context to the Procrustes SVD tables.

**Requirements:** R1

**Dependencies:** None

**Files:**
- Modify: `reports/overton_window/svd_stability_report.md`

**Approach:**
- Add a header row labeling axis-1 as "economic (pos=pro-market)" and axis-2 as "cultural (pos=nationalist)".
- Add a paragraph explaining what movement means on each axis.
- Add a net-drift-per-axis summary: ax1 Δ = -0.223 (centrist economic-left), ax2 Δ = +0.081 (centrist cultural-right).
- Add cultural distance widening note.

**Verification:**
- Reader understands which axis is which without consulting config.py.

---

## System-Wide Impact

- **No code changes beyond breakpoint script** — chart regeneration only.
- **No database changes.**
- **Reports are markdown** — no pipeline dependency.

---

## Risks & Dependencies

| Risk | Mitigation |
|------|------------|
| Figure 1 rework breaks chart layout | Use existing `create_figure_1()` as template, test before committing |
| Axis interpretation oversimplifies SVD_THEMES | Cite source (`analysis/config.py` SVD_THEMES[1] and SVD_THEMES[2]) in report footnotes |
| Tension narrative feels like forced reconciliation | Frame explicitly as "this is what the data shows — we don't resolve it" |
