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.
 
 
motief/docs/plans/2026-05-25-001-overton-wind...

17 KiB

title type status date
Address Critical Gaps in Overton Window Analysis feat active 2026-05-25

Address Critical Gaps in Overton Window Analysis

Summary

The current Overton window synthesis identifies a structural break in centrist voting behavior post-2024 but leaves critical analytical gaps unresolved. This plan addresses the seven most important gaps: temporal trajectory analysis, 2D extremity decomposition, systematic mechanism classification, causal mechanism exploration, left-wing response patterns, motion success correlation, and quarterly granularity. The goal is to transform the current "what happened" analysis into a "how and why" explanation.

Problem Frame

The synthesis report establishes that centrist support for right-wing motions surged from 0.251 to 0.507 (d=+0.65) and that right-wing parties moderated their proposals (material impact 2.78→2.43). However, the analysis relies on a binary pre/post-2024 split that obscures the actual dynamics. We don't know whether the shift was immediate (post-election shock) or gradual (learning curve), whether the 2D extremity trends diverge over time, whether the 24-motion mechanism sample generalizes, or what actually caused the behavioral change. These gaps prevent us from distinguishing between competing explanations: strategic adaptation by right-wing parties, genuine ideological convergence by centrists, coalition dynamics, or external shocks.

Requirements

  • R1. Replace binary pre/post-2024 analysis with continuous temporal trajectories showing when and how the shift occurred
  • R2. Decompose 2D extremity scores into separate stylistic and material trend lines to test whether the "flat single-dimension trend" masks diverging trajectories
  • R3. Systematically classify mechanisms across a representative sample (not just 24 top motions) to validate the consensus framing hypothesis
  • R4. Identify causal mechanisms by correlating the timing of the shift with political events (Schoof cabinet formation, European rightward shift, specific policy crises)
  • R5. Analyze left-wing voting patterns to determine whether the shift reflects right-wing moderation, centrist acceptance, or left-wing opposition hardening
  • R6. Correlate centrist support with actual motion passage to test whether high-support motions passed at higher rates
  • R7. Provide quarterly or monthly granularity to distinguish immediate post-election effects from gradual adaptation

Scope Boundaries

  • In scope: Quantitative analysis of existing data (motions, votes, 2D scores, SVD positions). No new data collection.
  • Out of scope: Qualitative interviews, media analysis, public opinion data, comparative analysis with other countries.
  • Deferred: Full causal inference modeling (diff-in-diff, regression discontinuity) — requires more sophisticated statistical framework than current descriptive approach.

Key Technical Decisions

  • Temporal unit: Use quarterly aggregation (Q1 2016 through Q2 2026 = 42 quarters). Monthly would be too noisy; annual loses the 2024 breakpoint resolution.
  • 2D extremity analysis: Compute separate yearly means for stylistic and material scores, then test for divergence using paired t-tests or Wilcoxon signed-rank tests.
  • Mechanism classification: Use the existing 24-motion taxonomy (consensus framing, institutional, welfare, procedural, local, coalition, symbolic, targeted restriction, system dismantling, crisis response) and apply it to a stratified sample of 200 motions (50 pre-2024, 150 post-2024) using LLM classification with manual validation of 20%.
  • Causal timing: Identify the exact quarter when centrist support crossed the 0.4 threshold (midpoint between pre and post means) and correlate with political events.
  • Left-wing analysis: Compute left_support_mp (already exists) and analyze whether left-wing opposition hardened (decreased support) or remained stable.
  • Success correlation: Compute pass_rate for motions binned by centrist_support quartiles (0-0.25, 0.25-0.5, 0.5-0.75, 0.75-1.0) and test for monotonic relationship.

Implementation Units

U1. Temporal Trajectory Analysis

Goal: Replace binary pre/post analysis with continuous quarterly trajectories showing the exact timing and shape of the centrist support shift.

Requirements: R1, R7

Dependencies: None

Files:

  • Create: analysis/right_wing/temporal_trajectory.py
  • Output: reports/overton_window/temporal_trajectory.md
  • Output: reports/overton_window/temporal_trajectory_figure.png

Approach:

  • Aggregate centrist_support_strict by quarter (2016-Q1 through 2026-Q2)
  • Compute rolling 3-quarter moving average to smooth noise
  • Identify the inflection point: first quarter where centrist_support > 0.4
  • Plot trajectory with confidence intervals (bootstrap resampling, 1000 iterations)
  • Annotate political events: 2021 election, 2023 election, July 2024 Schoof cabinet formation
  • Compute quarterly motion counts to show volume surge timing

Patterns to follow:

  • analysis/right_wing/temporal_analysis.py — yearly aggregation pattern
  • analysis/right_wing/overton_breakpoint_analysis.py — matplotlib chart patterns

Test scenarios:

  • Happy path: Script produces quarterly aggregates for all 42 quarters, identifies inflection point, generates figure with 5 lines (overall, opposition-only, migration, non-migration, all-motions baseline)
  • Edge case: Quarters with <10 motions should show wider confidence intervals
  • Edge case: 2026-Q2 (partial year) should be flagged as incomplete

Verification:

  • temporal_trajectory.md contains a table with quarterly centrist_support, motion counts, and confidence intervals
  • Figure shows the exact quarter when the shift began and whether it was immediate or gradual
  • Inflection point is explicitly identified and correlated with political events

U2. 2D Extremity Temporal Decomposition

Goal: Test whether the "flat single-dimension trend" masks diverging trajectories when stylistic and material scores are analyzed separately.

Requirements: R2

Dependencies: U1 (uses same temporal framework)

Files:

  • Create: analysis/right_wing/extremity_2d_temporal.py
  • Output: reports/overton_window/extremity_2d_temporal.md
  • Output: reports/overton_window/extremity_2d_temporal_figure.png

Approach:

  • Join extremity_scores_2d with right_wing_motions to get year for each motion
  • Compute yearly means for stylistic_score and material_score separately
  • Plot both trajectories on the same figure with the original single-dimension score for comparison
  • Test for divergence: paired Wilcoxon signed-rank test on yearly (stylistic, material) pairs
  • Compute the gap (material - stylistic) over time to see if it's widening, narrowing, or stable
  • Stratify by domain (migration vs non-migration) to test whether the gap differs by policy area

Patterns to follow:

  • analysis/right_wing/extremity_rescore_2d.py — 2D score structure
  • analysis/right_wing/temporal_analysis.py — yearly aggregation

Test scenarios:

  • Happy path: Script produces yearly means for both dimensions, generates figure with 3 lines (stylistic, material, original), computes divergence test statistic
  • Edge case: Years with <50 scored motions should be flagged as low-confidence
  • Integration: Results should be consistent with the aggregate findings (material > stylistic, r≈0.47)

Verification:

  • extremity_2d_temporal.md contains a table with yearly stylistic and material means
  • Figure shows whether the two dimensions diverged over time or moved in parallel
  • Divergence test result is reported (p-value or effect size)

U3. Systematic Mechanism Classification

Goal: Validate the consensus framing hypothesis by classifying mechanisms across a representative sample of 200 motions, not just the 24 highest-support motions.

Requirements: R3

Dependencies: None

Files:

  • Create: analysis/right_wing/mechanism_classification.py
  • Output: reports/overton_window/mechanism_classification.md

Approach:

  • Stratified sampling: 50 pre-2024 motions (25 high centrist support, 25 low), 150 post-2024 motions (75 high, 75 low)
  • Use LLM classification with the 10-mechanism taxonomy from the synthesis report
  • Prompt template: "Classify this motion's primary mechanism for gaining centrist support: [taxonomy with definitions]"
  • Manual validation: randomly sample 40 motions (20%) and have a human reviewer confirm or correct the classification
  • Compute mechanism distribution by period (pre vs post) and by centrist support level (high vs low)
  • Test whether consensus framing is more common in high-support post-2024 motions than in other groups

Patterns to follow:

  • analysis/right_wing/derive_categories.py — LLM classification pattern
  • analysis/right_wing/extremity_rescore_2d.py — batch processing with validation

Test scenarios:

  • Happy path: Script classifies 200 motions, produces mechanism distribution table, computes chi-squared test for mechanism × period × support interaction
  • Edge case: LLM returns invalid mechanism labels should be caught and re-prompted
  • Integration: Manual validation should achieve >80% agreement with LLM classifications

Verification:

  • mechanism_classification.md contains a table showing mechanism distribution across 4 groups (pre-high, pre-low, post-high, post-low)
  • Chi-squared test result is reported
  • Manual validation agreement rate is reported

U4. Causal Timing Analysis

Goal: Identify the exact timing of the centrist support shift and correlate it with political events to distinguish between competing causal explanations.

Requirements: R4, R7

Dependencies: U1 (uses quarterly trajectory data)

Files:

  • Create: analysis/right_wing/causal_timing.py
  • Output: reports/overton_window/causal_timing.md

Approach:

  • Use the quarterly trajectory from U1
  • Identify the inflection point: first quarter where centrist_support > 0.4 (midpoint between pre=0.25 and post=0.51)
  • Compute the "shift velocity": change in centrist_support per quarter in the 4 quarters before and after the inflection point
  • Correlate with political events timeline:
    • March 2021: Rutte IV election
    • November 2023: Schoof election (PVV victory)
    • July 2024: Schoof cabinet formation
    • Ongoing: European rightward shift (Meloni 2022, Sweden 2022, Finland 2023)
  • Test whether the shift was immediate (single-quarter jump) or gradual (multi-quarter ramp)
  • Compute "event proximity": did the shift begin before or after the Schoof cabinet formation?

Patterns to follow:

  • analysis/right_wing/overton_breakpoint_analysis.py — breakpoint detection logic

Test scenarios:

  • Happy path: Script identifies inflection point quarter, computes shift velocity, generates timeline figure with annotated events
  • Edge case: If no clear inflection point (gradual shift), report the quarter with the steepest slope
  • Integration: Results should be consistent with U1 trajectory analysis

Verification:

  • causal_timing.md explicitly states which quarter the shift began
  • Shift velocity is reported (quarters to reach 80% of the total shift)
  • Timeline figure shows the relationship between the shift and political events

U5. Left-Wing Response Analysis

Goal: Determine whether the centrist support surge reflects right-wing moderation, centrist acceptance, or left-wing opposition hardening.

Requirements: R5

Dependencies: None

Files:

  • Create: analysis/right_wing/left_wing_response.py
  • Output: reports/overton_window/left_wing_response.md
  • Output: reports/overton_window/left_wing_response_figure.png

Approach:

  • Compute left_support_mp (already exists in right_wing_motions) for pre and post-2024
  • Stratify by left party: SP, PvdA, GroenLinks, PvdD, Volt, DENK
  • Test whether left-wing opposition hardened (decreased support) or remained stable
  • Compute the "polarization gap": (centrist_support - left_support) over time
  • If the gap widened, it could reflect centrist acceptance OR left-wing hardening OR both
  • Stratify by domain to see if left-wing hardening is concentrated in migration (where centrist acceptance is highest)

Patterns to follow:

  • analysis/right_wing/overton_breakpoint_analysis.py — party-level vote analysis
  • analysis/right_wing/migrate_mp_level_metrics.py — left_support_mp computation

Test scenarios:

  • Happy path: Script computes pre/post left_support_mp by party, generates figure showing left-wing trajectory vs centrist trajectory
  • Edge case: Parties with <5 MPs in a given year should be excluded from party-level analysis
  • Integration: Results should be consistent with the synthesis report's claim that "left opposition hardened"

Verification:

  • left_wing_response.md contains a table with pre/post left_support_mp by party
  • Figure shows whether left-wing opposition hardened, softened, or remained stable
  • Polarization gap trajectory is reported

U6. Motion Success Correlation

Goal: Test whether motions with high centrist support actually passed at higher rates, validating that centrist support translates to legislative success.

Requirements: R6

Dependencies: None

Files:

  • Create: analysis/right_wing/success_correlation.py
  • Output: reports/overton_window/success_correlation.md

Approach:

  • Compute pass_rate for right-wing motions binned by centrist_support quartiles: [0-0.25], (0.25-0.5], (0.5-0.75], (0.75-1.0]
  • Test for monotonic relationship using Cochran-Armitage trend test
  • Stratify by period (pre vs post-2024) to see if the relationship strengthened after the shift
  • Control for motion type: government motions (from coalition parties) vs opposition motions
  • Compute "success premium": pass_rate(high support) - pass_rate(low support)

Patterns to follow:

  • analysis/right_wing/overton_breakpoint_analysis.py — pass rate computation (even though it's 96%+, we're testing for variation within that 4%)

Test scenarios:

  • Happy path: Script computes pass_rate by centrist_support quartile, performs trend test, generates table
  • Edge case: Quartiles with <50 motions should be flagged as low-confidence
  • Integration: Results should show whether the 96%+ pass rate is uniform or varies by centrist support level

Verification:

  • success_correlation.md contains a table with pass_rate by centrist_support quartile
  • Trend test result is reported (p-value)
  • Success premium is computed and interpreted

U7. Synthesis Update

Goal: Integrate all new findings into the synthesis report, updating the verdict and uncertainty hierarchy.

Requirements: R1-R7

Dependencies: U1, U2, U3, U4, U5, U6

Files:

  • Modify: reports/overton_window/overton_window_synthesis.md

Approach:

  • Update the "Three Indicators at a Glance" table with new temporal and 2D findings
  • Add a new section "Temporal Dynamics" summarizing U1 and U4 findings (when the shift happened, how fast)
  • Add a new section "2D Extremity Trajectories" summarizing U2 findings (whether stylistic and material diverged)
  • Update the "Mechanisms of Influence" section with U3 systematic classification results
  • Add a new section "Causal Mechanisms" summarizing U4 timing analysis and event correlation
  • Add a new section "Left-Wing Response" summarizing U5 findings
  • Update the "Uncertainty Hierarchy" table to reflect which gaps are now resolved
  • Revise the verdict if new evidence changes the interpretation

Patterns to follow:

  • Existing synthesis report structure

Test scenarios:

  • Happy path: All U1-U6 outputs are integrated, uncertainty hierarchy is updated, verdict is revised if needed
  • Integration: Report remains internally consistent after updates

Verification:

  • Synthesis report contains new sections for temporal dynamics, 2D trajectories, causal mechanisms, and left-wing response
  • Uncertainty hierarchy table reflects the current state of knowledge
  • Verdict is supported by all available evidence

System-Wide Impact

  • No database changes: All analysis uses existing tables (right_wing_motions, extremity_scores_2d, mp_votes, motions)
  • No UI changes: All outputs are markdown reports and PNG figures
  • No agent_tools changes: Analysis scripts are standalone
  • Reproducibility: All scripts are deterministic given the same database state

Risks & Dependencies

Risk Mitigation
Quarterly aggregation produces noisy estimates for low-volume quarters Use 3-quarter moving average and bootstrap confidence intervals
LLM mechanism classification may be inconsistent Manual validation of 20% sample, re-prompt invalid classifications
Causal timing analysis may be ambiguous (gradual vs immediate shift) Report both the inflection point and the shift velocity; let the data speak
Left-wing analysis may be underpowered for small parties Exclude parties with <5 MPs in a given year from party-level analysis
Pass rate analysis may find no variation (96%+ ceiling) Report the result honestly; if no correlation exists, say so

Sources & References

  • Current synthesis: reports/overton_window/overton_window_synthesis.md
  • 2D extremity data: extremity_scores_2d table (2,869 motions scored)
  • Temporal framework: analysis/right_wing/temporal_analysis.py
  • Mechanism taxonomy: Synthesis report Section "Mechanisms of Influence"
  • Left-wing data: left_support_mp column in right_wing_motions table