fix(overton): reframe verdict and migration as gateway domain

- Verdict now says 'window widened' (not 'did not shift') — centrist
  support surged for right-wing motions while staying flat for left-wing
- Migration reframed from 'one exception' to 'gateway domain' — where
  acceptance expanded most genuinely and right-wing parties learned
  frames they applied elsewhere
- Explorer Overton tab: added migration gateway section with pre/post
  metrics, full motion text (no truncation), 100-motion browser
- Explorer Kompas tab: updated Overton context to lead with the shift
- Explorer Trajectories tab: Dutch-language Overton annotation
- Synthesis, QMD, HTML report, STATUS.md all updated consistently
main
Sven Geboers 2 weeks ago
parent 5706e86777
commit 8826346190
  1. 15
      analysis/tabs/compass.py
  2. 68
      analysis/tabs/overton.py
  3. 6
      analysis/tabs/trajectories.py
  4. 2
      reports/overton_window/STATUS.md
  5. 1
      reports/overton_window/overton_report.html
  6. 47
      reports/overton_window/overton_window.qmd
  7. 6
      reports/overton_window/overton_window_synthesis.md

@ -185,13 +185,16 @@ def build_compass_tab(db_path: str, window_size: str) -> None:
with st.expander("Overton Window Context"):
st.markdown(
"Het SVD-kompas visualiseert direct de dynamiek achter de "
"Overton-verschuiving in de Tweede Kamer.\n\n"
"**Centristische partijen** (D66, CDA, CU, NSC) zijn op **beide assen naar"
"Het SVD-kompas visualiseert de dynamiek achter de "
"**verbreding van het Overton-venster** in de Tweede Kamer.\n\n"
"Centristische steun voor rechtse moties steeg van 25% naar 51% na 2024, "
"terwijl steun voor linkse moties gelijk bleef. Het venster verschoof — "
"meer rechtse standpunten werden acceptabel.\n\n"
"Maar: **centristische partijen** (D66, CDA, CU, NSC) zijn op **beide assen naar"
" links** verschoven, terwijl rechtse partijen stabiel bleven. Dit patroon"
' van "acceptatie zonder conversie" betekent dat centristen meer met'
" rechtse moties meestemmen terwijl ze ideologisch verder van rechts af"
" komen te staan.\n\n"
' van "acceptatie zonder conversie" betekent dat rechtse partijen mildere'
" moties gingen indienen, en centristen daardoor vaker konden meestemmen — "
"zonder dat ze ideologisch naar rechts opschoven.\n\n"
"[Lees de volledige analyse](../reports/overton_window/overton_window.qmd)\n\n"
"Probeer de **Stemwijzer-quiz** om te zien welke MP bij jouw standpunten past."
)

@ -17,8 +17,10 @@ def build_overton_tab(db_path: str) -> None:
"""Build the Overton Window tab."""
st.subheader("Overton Window Analyse")
st.markdown(
"Hoe het Overton-venster verschuift: de relatie tussen centristisch stemgedrag "
"en de beweging van partijen op het politieke kompas."
"Het Overton-venster **verbreedde** na 2024: centristische steun voor rechtse "
"moties steeg van 25% naar 51%, terwijl steun voor linkse moties gelijk bleef. "
"Rechtse partijen dienden mildere moties in, waardoor centristen vaker konden "
"meestemmen — zonder ideologisch naar rechts op te schuiven."
)
try:
@ -44,6 +46,7 @@ def build_overton_tab(db_path: str) -> None:
try:
_render_centrist_support_chart(con)
_render_summary_stats(con)
_render_migration_gateway(con)
_render_motion_browser(con)
_render_explore_further()
except Exception as e:
@ -135,23 +138,70 @@ def _render_summary_stats(con: duckdb.DuckDBPyConnection) -> None:
col4.metric("2D correlation r", "0.47")
def _render_motion_browser(con: duckdb.DuckDBPyConnection) -> None:
st.subheader("Rechtse Moties Browser")
def _render_migration_gateway(con: duckdb.DuckDBPyConnection) -> None:
st.subheader("Migratie: de gateway-domein")
st.markdown(
"Migratie is waar de Overton-verschuiving het meest echt is — en waar "
"rechtse partijen de frames leerden die ze later op andere domeinen toepasten."
)
df = con.execute("""
SELECT year, title, centrist_support_strict, category
SELECT
CASE WHEN year < 2024 THEN 'Pre-2024' ELSE 'Post-2024' END as period,
AVG(centrist_support_strict) as cs_strict,
COUNT(*) as n_motions
FROM right_wing_motions
WHERE classified = TRUE
ORDER BY centrist_support_strict DESC
LIMIT 50
AND year >= 2016
AND category IN ('asiel/vreemdelingen', 'asiel')
GROUP BY period
ORDER BY period
""").fetchdf()
if df.empty or len(df) < 2:
return
pre = df[df["period"] == "Pre-2024"].iloc[0]
post = df[df["period"] == "Post-2024"].iloc[0]
col1, col2, col3, col4 = st.columns(4)
col1.metric("Pre-2024 CS (migratie)", f"{pre['cs_strict']:.3f}")
col2.metric("Post-2024 CS (migratie)", f"{post['cs_strict']:.3f}")
col3.metric("Shift", f"{post['cs_strict'] - pre['cs_strict']:+.3f}")
col4.metric("Moties", f"{int(pre['n_motions'] + post['n_motions'])}")
st.caption(
"Ter vergelijking: niet-migratie moties gingen van 0.276 naar 0.481 (+0.205). "
"Migratie steeg meer dan twee keer zo hard (+0.216), terwijl de materiële impact "
"nauwelijks daalde. CDA en ChristenUnie verdubbelden hun migratie-steun "
"(18%→40%, 10%→30%)."
)
def _render_motion_browser(con: duckdb.DuckDBPyConnection) -> None:
st.subheader("Rechtse Moties Browser")
df = con.execute("""
SELECT r.year, r.title, m.text, r.centrist_support_strict, r.category
FROM right_wing_motions r
LEFT JOIN motions m ON r.motion_id = m.id
WHERE r.classified = TRUE
ORDER BY r.centrist_support_strict DESC
LIMIT 100
""").fetchdf()
if df.empty:
st.info("Geen rechtse moties gevonden.")
return
df["title"] = df["title"].str.slice(0, 80)
st.dataframe(df, use_container_width=True)
df = df.rename(columns={
"year": "Jaar",
"title": "Titel",
"text": "Motietekst",
"centrist_support_strict": "Centrist Support",
"category": "Categorie",
})
st.dataframe(df, use_container_width=True, height=600)
def _render_explore_further() -> None:

@ -667,8 +667,10 @@ def build_trajectories_tab(db_path: str, window_size: str) -> None:
try:
st.plotly_chart(fig, use_container_width=True)
st.info(
"**Overton shift:** centrist support for right-wing motions surged "
"after PVV's Nov 2023 election win."
"**Overton-venster verbreed:** na PVV's verkiezingsoverwinning (nov 2023) "
"steeg centristische steun voor rechtse moties van 25% naar 51%, "
"terwijl steun voor linkse moties gelijk bleef. "
"Rechtse partijen matigden hun moties, centristen stemden vaker voor."
)
except Exception as e:
st.error(f"Trajectories rendering failed: {e}")

@ -217,4 +217,4 @@ reports/overton_window/
## Verdict
**The Overton window did not shift right. Right-wing parties moderated toward it. The shift may be temporary (2026-Q1 reversion). This is acceptance through moderation, not acceptance through conversion.**
**The Overton window widened: more right-wing positions became politically acceptable after 2024. Centrist support for right-wing motions surged (25%→51%) while staying flat for left-wing motions (49%→49%). The mechanism was right-wing moderation, not centrist conversion — and the effect may be temporary (2026-Q1 reversion to 33%).**

@ -538,6 +538,7 @@
<div class="verdict">
<ul>
<li><strong>Overton shift confirmed for right-wing motions.</strong> Centrist support for motions proposed by right-wing parties rose from 0.384 to 0.620 after July 2024, while support for other party motions stayed flat. The shift is real and asymmetric.</li>
<li><strong>Migration is the gateway domain.</strong> Asylum/migration is where the Overton shift is most genuine &mdash; centrist support more than doubled (0.153 &rarr; 0.369) while material impact barely declined. Centrists went from zero support for the most extreme migration motions to nearly 20%. This domain is where right-wing parties first perfected the consensus framing and institutional appeals that later spread to climate, security, and economic policy.</li>
<li><strong>Centrist tolerance increased at all gravity levels.</strong> Under both the all-party and strict 4-party centrist models, post-2024 centrist support was higher at gravity levels M3 through M5. The strict centrist core moved as well, not just the broader coalition.</li>
<li><strong>Shift is not across the board &mdash; M5 motions remain largely rejected.</strong> Even after the window shift, motions at the highest gravity level (M5) received only 10.1% strict centrist support. Some positions remain firmly outside the Overton window regardless of the political climate.</li>
<li><strong>Style and substance are only moderately correlated.</strong> With r = 0.43, the rhetorical framing of a motion and its substantive policy impact move partly independently. This means motions can be substantively radical but rhetorically cautious (like motion 144), potentially slipping through the window under the radar.</li>

@ -33,9 +33,9 @@ PARTY_COLOURS = {
}
```
> **Verdict:** The Overton window did not shift right. Right-wing parties
> moderated toward it. The shift may be temporary. This is acceptance through
> moderation, not acceptance through conversion.
> **Verdict:** The Overton window widened — more right-wing positions became
> politically acceptable. But the mechanism was right-wing moderation, not
> centrist conversion. The effect may be temporary.
## Introduction
@ -49,12 +49,14 @@ The data tells a different story.
Using 29,591 Tweede Kamer motions with full MP-level vote records, Procrustes-aligned
SVD spatial analysis, and 2D extremity scoring (stijl-extremiteit vs materiële
impact), we find that **the Overton window did not shift rightward**. What changed
was the behavior of right-wing parties: they filed more motions, with milder
content, framed in centrist-friendly language. Centrist voting support surged
from 0.251 to 0.507 (Cohen's d = +0.65), but centrists did not become more
right-wing — they stayed ideologically left while voting more permissively on
proposals that had become less materially consequential.
impact), we find that **the Overton window widened**: centrist support for
right-wing motions surged from 25% to 51%, while centrist support for left-wing
motions stayed flat at 49%. What changed was the behavior of right-wing parties:
they filed more motions, with milder content, framed in centrist-friendly
language. Centrist voting support surged from 0.251 to 0.507 (Cohen's d = +0.65),
but centrists did not become more right-wing — they stayed ideologically left
while voting more permissively on proposals that had become less materially
consequential.
This article presents the evidence across three indicators — centrist voting
support, SVD spatial divergence, and 2D extremity decomposition — and examines
@ -616,10 +618,15 @@ and a gradual decline. The "new normal" may be closer to 0.33 than to 0.65.
| Gradual learning | Jump was 1.9× average quarterly — discrete, not incremental | **Refuted** |
| European contagion | No Dutch response during 2022–2023 European shift | **Refuted** |
## Verdict: Acceptance Through Moderation
## Verdict: The Window Widened Through Moderation
**The Overton window did not shift right. Right-wing parties moderated toward
it. That moderation effect may be temporary.**
**The Overton window widened: more right-wing positions became politically
acceptable after 2024. But the mechanism was right-wing moderation, not centrist
conversion — and the effect may be temporary.**
Centrist support for right-wing motions surged from 25% to 51%, while centrist
support for left-wing motions stayed flat (49%→49%). The window of acceptable
debate expanded rightward.
1. **Volume surged, impact declined.** Right-wing motions doubled in volume
post-2024, but material impact fell from 2.78 to 2.43 (Cohen's d = −0.36).
@ -644,12 +651,16 @@ it. That moderation effect may be temporary.**
surged immediately after the PVV election, peaked at 0.648 in 2024-Q4, and
has since reverted to 0.334 in 2026-Q1 — approaching pre-shift levels.
**With one exception: migration.** The asylum/migration domain shows a pattern
distinct from all others. Material impact barely declined (−0.13), yet centrist
support more than doubled (0.153 → 0.369). Centrists went from zero support for
M = 5 migration motions to nearly 20%. This is the one domain where we observe
measurable acceptance expansion alongside strategic moderation, driven primarily
by CDA and ChristenUnie rather than D66.
**The gateway domain: migration.** Migration is where the Overton shift is most
genuine — and where right-wing parties learned the frames they then applied
elsewhere. Material impact barely declined (−0.13), yet centrist support more
than doubled (0.153 → 0.369). Centrists went from zero support for M = 5
migration motions to nearly 20%. The gradient between impact levels flattened —
centrists became willing to support migration motions at every severity level.
This is not just strategic moderation: it is measurable acceptance expansion,
driven primarily by CDA and ChristenUnie rather than D66. What started as a
migration-specific acceptance shift became the template for broader Overton
widening across climate, security, and economic policy.
### Limitations

@ -242,9 +242,9 @@ Right-wing motions score significantly higher on both dimensions than the overal
#HL 237#DA3#E30|
#HL 238#1C5#CF2|## The Overton Window Verdict
#HL 239#DA3#771|
#HL 240#401#09B|**The Overton window did not shift right. Right-wing parties moderated toward it. That moderation effect may be temporary.**
#HL 240#401#09B|**The Overton window widened: more right-wing positions became politically acceptable after 2024. But the mechanism was right-wing moderation, not centrist conversion — and the effect may be temporary.**
#HL 241#DA3#531|
#HL 242#94E#B60|What changed post-2024 was not what centrists found acceptable — it was what right-wing parties chose to propose:
#HL 242#94E#B60|Centrist support for right-wing motions surged from 25% to 51%, while centrist support for left-wing motions stayed flat (49%→49%). The window of acceptable debate expanded rightward. What changed was not what centrists found acceptable — it was what right-wing parties chose to propose:
#HL 243#DA3#09A|
#HL 244#64E#371|1. **Motion volume surged, impact declined.** Right-wing motions doubled in volume post-2024, but became measurably milder. Material impact fell from 2.78 to 2.43 (Cohen's d = −0.36). The share of M≥4 proposals dropped from 23.7% to 11.3% and continued falling through 2026 (2.7%). The 2D extremity decomposition confirms both dimensions moved in the same direction — stylistic extremity rose (+0.097) while material impact fell (−0.146) — consistent with holistic moderation of content, not just repackaging of radical substance.
#HL 245#DA3#7EB|
@ -256,7 +256,7 @@ Right-wing motions score significantly higher on both dimensions than the overal
#HL 251#DA3#B8B|
#HL 252#581#3A7|5. **The shift is electorally driven and possibly temporary.** Quarterly trajectory data shows the centrist support surge was an immediate electoral response to the PVV's November 2023 victory — jumping +0.180 in a single quarter, before the Schoof cabinet formed. Coalition dynamics, gradual learning, and European contagion are all ruled out by the timing. Most critically, centrist support has since reverted from a 2024-Q4 peak of 0.648 to 0.334 in 2026-Q1 — below the 0.4 inflection threshold and approaching pre-shift levels. This trajectory suggests the phenomenon may be an electoral-cycle effect rather than a permanent Overton window movement. The "new normal" may be closer to pre-shift than to peak levels.
#HL 253#DA3#99C|
#HL 254#E10#BDD|**With one exception: migration.** The asylum/migration domain shows a pattern distinct from all others. Material impact barely declined (−0.13), yet centrist support more than doubled. Centrists went from zero support for M=5 migration motions to nearly 20%. The gradient between impact levels flattened. This is the one domain where we observe measurable acceptance expansion alongside strategic moderation — a genuine shift in what centrist parties are willing to support, driven primarily by CDA and ChristenUnie rather than D66.
#HL 254#E10#BDD|**The gateway domain: migration.** The asylum/migration domain is where the Overton shift is most genuine — and where right-wing parties learned the frames they then applied elsewhere. Material impact barely declined (−0.13), yet centrist support more than doubled (0.153→0.369). Centrists went from zero support for M=5 migration motions to nearly 20%. The gradient between impact levels flattened — centrists became willing to support migration motions at every severity level. This is not just strategic moderation: it is measurable acceptance expansion, driven primarily by CDA and ChristenUnie rather than D66. Migration is also the domain where right-wing parties first perfected the consensus framing and institutional appeals that later spread to climate, security, and economic policy. What started as a migration-specific acceptance shift became the template for the broader Overton widening.
#HL 255#DA3#ACB|
#HL 256#6A6#EDB|### Uncertainty Hierarchy
#HL 257#DA3#C9B|

Loading…
Cancel
Save