12 KiB
| title | type | status | date | origin |
|---|---|---|---|---|
| Fix Overton analysis — SVD axis interpretation, pass rate, synthesis | fix | active | 2026-05-08 | 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.pyand the three report files inreports/overton_window/are affected.
Context & Research
Relevant Code and Patterns
analysis/config.py— SVD_THEMES[1] = economic, SVD_THEMES[2] = cultural/nationalistanalysis/right_wing/overton_breakpoint_analysis.py— Figure 1 generation at ~line 500reports/overton_window/svd_stability_report.md— already has Procrustes-aligned results, needs axis interpretationreports/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.pnghas 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:
-
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).
-
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.
-
Section 1: Centrist Support: Cut the "Pass rate is an insensitive measure" paragraph. Replace with one-sentence note.
-
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."
-
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."
-
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" |