--- 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" |