You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
217 lines
12 KiB
217 lines
12 KiB
---
|
|
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" |
|
|
|