📌 Template Instructions: Copy to
analysis/daily/{date}/{article-type}-run{N}/intelligence/voting-patterns.md. Replace every[REQUIRED]marker with analysis derived fromget_voting_records,analyze_voting_patterns,analyze_coalition_dynamics, andcompare_political_groups. See methodologies/per-artifact-methodologies.md §voting-patterns.
🎯 Purpose: Group-by-group coalition arithmetic for the period. Answers "how did each political group behave, where did blocs cohere, where did they fracture, and which cross-group coalitions carried majorities?" Distinct from
coalition-dynamics.md(alliance-pair focused) — this file is bloc-behaviour focused.
| Field | Value |
|---|---|
| Report ID | [REQUIRED: VP-YYYY-MM-DD-runNN] |
| Analysis Period | [REQUIRED: e.g. Q1 2026 (2026-01-01 to 2026-03-31)] |
| Roll-Call Votes Covered | [REQUIRED: count] |
| Plenary Sessions Covered | [REQUIRED: list of part-sessions] |
| Confidence | [REQUIRED: 🟢 HIGH / 🟡 MEDIUM / 🔴 LOW — explain in body if not HIGH] |
| Group | Seats | % of 720 | Role |
|---|---|---|---|
| EPP | [#] |
[%] |
[REQUIRED: one-line strategic role] |
| S&D | [#] |
[%] |
[REQUIRED] |
| PfE | [#] |
[%] |
[REQUIRED] |
| ECR | [#] |
[%] |
[REQUIRED] |
| Renew | [#] |
[%] |
[REQUIRED] |
| Greens/EFA | [#] |
[%] |
[REQUIRED] |
| The Left | [#] |
[%] |
[REQUIRED] |
| ESN | [#] |
[%] |
[REQUIRED] |
| NI | [#] |
[%] |
[REQUIRED] |
Majority threshold: 361 votes (of 720). Simple majority of votes cast: varies by attendance.
%%{init: {"theme":"dark","themeVariables":{"primaryColor":"#1565C0","primaryTextColor":"#ffffff","primaryBorderColor":"#0A3F7F","lineColor":"#90CAF9","secondaryColor":"#2E7D32","secondaryTextColor":"#ffffff","tertiaryColor":"#FF9800","tertiaryTextColor":"#000000","mainBkg":"#1565C0","secondBkg":"#2E7D32","tertiaryBkg":"#FF9800","noteBkgColor":"#FFC107","noteTextColor":"#000000","errorBkgColor":"#D32F2F","fontFamily":"Inter, Helvetica, Arial, sans-serif"}}}%%
graph LR
%% Palette note: this diagram uses political-group colours (EPP blue, S&D red, Renew orange, Greens green, ECR light-blue)
%% which intentionally differ from the general Hack23 semantic palette defined in ai-driven-analysis-guide.md §Colour legend.
%% Party colours take precedence over the semantic palette whenever a diagram depicts named political groups.
EPP[EPP<br/>[#]] ---|[agreement %]| SD[S&D<br/>[#]]
SD ---|[agreement %]| REN[Renew<br/>[#]]
EPP ---|[agreement %]| REN
EPP -.-|[agreement %]| ECR[ECR<br/>[#]]
REN ---|[agreement %]| GRE[Greens/EFA<br/>[#]]
style EPP fill:#1565C0,color:#ffffff
style SD fill:#D32F2F,color:#ffffff
style REN fill:#FF9800,color:#000000
style GRE fill:#2E7D32,color:#ffffff
style ECR fill:#0288D1,color:#ffffff
| Coalition | Groups | Typical Majority | Use Cases | Cohesion (%) | Evidence |
|---|---|---|---|---|---|
| Grand Centre | EPP + S&D + Renew | [# votes] |
[REQUIRED: policy domains] |
[%] |
[REQUIRED: ≥1 RCV ID] |
| Progressive-Centrist | S&D + Renew + Greens/EFA + Left | [# votes] |
[REQUIRED] |
[%] |
[REQUIRED] |
| Conservative-Right | EPP + ECR + selective PfE | [# votes] |
[REQUIRED] |
[%] |
[REQUIRED] |
| Opposition Blocs | PfE + ECR + ESN | [# votes] |
[REQUIRED] |
[%] |
[REQUIRED] |
For each group: cohesion, defection highlights, sample votes.
- Internal cohesion:
[REQUIRED: % with evidence — e.g. 91% across 567 RCVs] - Dominant position:
[REQUIRED: 1-2 sentences] - Notable defections:
[REQUIRED: ≥1 named MEP + RCV ID, or note "none observed this period"] - Cross-group alliances:
[REQUIRED: most frequent partners]
- Internal cohesion:
[REQUIRED] - Dominant position:
[REQUIRED] - Notable defections:
[REQUIRED] - Cross-group alliances:
[REQUIRED]
- Internal cohesion:
[REQUIRED] - Dominant position:
[REQUIRED] - Notable defections:
[REQUIRED] - Cross-group alliances:
[REQUIRED]
- Internal cohesion:
[REQUIRED] - Dominant position:
[REQUIRED] - Notable defections:
[REQUIRED] - Cross-group alliances:
[REQUIRED]
- Internal cohesion:
[REQUIRED] - Dominant position:
[REQUIRED] - Notable defections:
[REQUIRED] - Cross-group alliances:
[REQUIRED]
- Internal cohesion:
[REQUIRED] - Dominant position:
[REQUIRED] - Notable defections:
[REQUIRED] - Cross-group alliances:
[REQUIRED]
- Internal cohesion:
[REQUIRED] - Dominant position:
[REQUIRED] - Notable defections:
[REQUIRED] - Cross-group alliances:
[REQUIRED]
- Behaviour notes:
[REQUIRED: aggregate position given fragmentation]
| Bloc | Members | Votes Won | Votes Lost | Win Rate | Trend vs. Prior Period |
|---|---|---|---|---|---|
| Grand Centre | [EPP+S&D+Renew] |
[#] |
[#] |
[%] |
[↑ / → / ↓] |
| Progressive-Centrist | [S&D+Renew+Greens+Left] |
[#] |
[#] |
[%] |
[↑ / → / ↓] |
| National-Right | [PfE+ECR+ESN] |
[#] |
[#] |
[%] |
[↑ / → / ↓] |
| EPP-led right | [EPP+ECR±PfE] |
[#] |
[#] |
[%] |
[↑ / → / ↓] |
| RCV ID | Topic | Outcome | Why outlier? | Coalition flipped? |
|---|---|---|---|---|
[REQUIRED] |
[REQUIRED] |
[For/Against/Abstain counts] |
[REQUIRED: ≥30 words] |
[yes/no] |
[REQUIRED] |
[REQUIRED] |
[...] |
[REQUIRED] |
[...] |
[REQUIRED] |
[REQUIRED] |
[...] |
[REQUIRED] |
[...] |
≥3 outlier votes required.
| Upcoming Vote | Expected Coalition | Confidence | What would flip it |
|---|---|---|---|
[REQUIRED: plenary date + topic] |
[REQUIRED] |
[🟢/🟡/🔴] |
[REQUIRED] |
[REQUIRED] |
[REQUIRED] |
[🟢/🟡/🔴] |
[REQUIRED] |
≥3 forward forecasts.
Required field — consumed by
mcp-reliability-audit.md§"Data-source bridge" and by Stage-C completeness gate. Copy the value fromVotingRecordsFallbackResult.freshnessLabelproduced bygetVotingRecordsWithFallbackinsrc/mcp/ep-open-data-client.ts.
| Field | Value |
|---|---|
| Data source | [REQUIRED: "mcp" / "ep-open-data-portal" / "unavailable"] |
| Freshness label | [REQUIRED: 🟢 MCP (...→...) / 🟡 EP Open Data Portal fallback (...→...) / 🔴 voting data unavailable for window...] |
| EP MCP tool | get_voting_records (dateFrom / dateTo) |
| Fallback used? | [yes — queried EP Open Data Portal /api/v2/decision / no — MCP data sufficient / n/a — both sources empty] |
| Attribution | [REQUIRED when fallback active: "European Parliament Open Data Portal — https://data.europarl.europa.eu — CC BY 4.0"] |
| Confidence adjustment | [REQUIRED: explain whether 🟡 or 🔴 widens WEP bands or degrades Admiralty grade per osint-tradecraft-standards.md §3] |
When source = "unavailable": Do NOT substitute structural-proxy cohesion scores without an explicit 🔴 LOW-confidence flag on every claim in §§2–4. Widen all WEP bands by ~10 pp. See analysis/methodologies/osint-tradecraft-standards.md §3.1 and .github/prompts/07-mcp-reference.md §11 item #6.
- ✅ Roll-call IDs present:
[count cited in this file] ⚠️ Aggregate vs. per-MEP:[REQUIRED: note where EP roll-call delay limits claims to LOW]- 🔬 Tools used:
analyze_voting_patterns,analyze_coalition_dynamics,compare_political_groups,get_voting_records(per session),ep-get-voting-records(fallback, if active)
| EP MCP tool | Used for which section | Notes |
|---|---|---|
get_voting_records |
§1 RCV-evidence column (every claim cites RCV ID) | Aggregate margins; flag LOW if <4 weeks. |
ep-get-voting-records (fallback) |
§1 RCV-evidence column when MCP returns empty | EP Open Data Portal /api/v2/decision; activate via getVotingRecordsWithFallback; CC BY 4.0 attribution required. |
analyze_voting_patterns |
§2 Per-MEP behaviour rubric | When per-MEP feed available; aggregate otherwise. |
analyze_coalition_dynamics |
§3 Group-cohesion proxy | Two-window deltas. |
compare_political_groups |
§4 Seat-share normalisation | Confirms majority arithmetic. |
track_legislation |
§5 Procedure context | COD/CNS/APP per RCV. |
get_meeting_decisions |
§6 Adopted-decision ↔ RCV cross-check | Verifies passage. |
get_adopted_texts |
§8 Outcome confirmation | Adopted-text reflects RCV result. |
correlate_intelligence |
§9 Anomaly alerts | Defection / abstention spikes. |
detect_voting_anomalies |
§9 Outlier RCVs | Configurable sensitivity threshold. |
❌ Pass-1 (thin, 22 words):
"Several important votes happened. AI Act passed. CRA implementation was approved. Coalitions held. Some defections noted but minor."
✅ Pass-2 (compliant, 110 words, sourced):
Top 5 RCVs (Strasbourg-I 2025-10-21/24): (1) 2024/0123(COD) Critical Raw Materials Act final 412/189/68 — passage margin 178; (2) 2024/0145(COD) AI-Office implementing-act amendment 392/214/41 — Renew lost 11 of 84 (Strack-Zimmermann + 10) per
analyze_voting_patterns; (3) 2025/2014(RSP) Ukraine-aid 50bn extension 487/126/52 — broadest cross-party majority of session; (4) 2024/0099(COD) CRA implementation amendment 367/241/45 — closest passage of session; (5) 2025/2901(RSP) Iran-MEK delisting 287/198/153 — high abstention signal (153 = 22 %). PfE+ESN+ECR cohesion on RCVs (1)+(4): 84 % peranalyze_coalition_dynamics— right-flank consolidation continues.
| # | Procedure code + short title | Date | For | Against | Abstain | Margin | Anchor group split |
|---|---|---|---|---|---|---|---|
| 1 | 2024/0123(COD) Critical Raw Materials Act — final | 2025-10-22 | 412 | 189 | 68 | +178 | EPP 184/188 (98 %); S&D 134/136 (99 %); Renew 79/84 (94 %); ECR 41/78 (53 %); PfE 0/84; Greens/EFA 47/53 (89 %) |
| 2 | 2024/0145(COD) AI-Office IA amendment | 2025-10-22 | 392 | 214 | 41 | +178 | EPP 184/188 (98 %); S&D 132/136 (97 %); Renew 73/84 (87 %, 11 defectors); ECR 22/78 (28 %); PfE 0/84 |
| 3 | 2025/2014(RSP) Ukraine-aid 50 bn extension | 2025-10-23 | 487 | 126 | 52 | +361 | EPP 188/188; S&D 136/136; Renew 84/84; ECR 56/78; PfE 18/84; ESN 0/30 |
| 4 | 2024/0099(COD) CRA implementation amendment | 2025-10-23 | 367 | 241 | 45 | +126 | EPP 181/188; S&D 121/136 (15 dissenters); Renew 81/84; Greens/EFA 12/53 (24 % only); ECR 39/78 |
| 5 | 2025/2901(RSP) Iran-MEK delisting | 2025-10-24 | 287 | 198 | 153 | +89 | EPP 117/188; S&D 91/136; Renew 51/84; high abstention reflects free-vote on terrorism listing |
| Behaviour | Definition | Worked observation (Strasbourg-I 2025) | Score 1-5 |
|---|---|---|---|
| Discipline | % of group voting with whip on top-5 RCVs | EPP 98 %, S&D 97 %, Renew 89 %, Greens/EFA 87 %, ECR 65 %, PfE 92 %, ESN 88 % | 4 (Grand Coalition); 3 (right-flank) |
| Defection | named MEPs voting against own group ≥1 of top-5 | Strack-Zimmermann + 10 Renew on RCV 2; 15 S&D dissenters on RCV 4 | 2 (low — Grand Coalition); 4 (S&D fissure on CRA) |
| Abstention | abstention rate on contested RCVs | RCV 5 (Iran-MEK) 22 % abstention — high signal | 5 on RCV 5; 1-2 elsewhere |
| No-show | % of MEPs absent (not voting / not authorised substitute) | Top-5 average 8 % (515-pp turnout / 720 seats); rises to 14 % on Thursday RCV 5 | 2 (Tue/Wed); 4 (Thu) |
| # | Banned pattern | Why it fails |
|---|---|---|
| 1 | RCV cited without procedure code (e.g. "the AI Act vote") | Unindexed; reviewer cannot trace. |
| 2 | Per-MEP defection claim while EP roll-call publication delay >4 weeks | Tradecraft violation. |
| 3 | Top-5 RCV table without abstain column | Abstain is a signal, not noise. |
| 4 | Group behaviour score without RCV citation | Score is judgment-only. |
| 5 | "Coalition held" verdict on a vote where one anchor group ≤80 % cohesion | Definition mismatch. |
| 6 | Defection narrative without naming defectors (where public-record permits) | Hides the political signal. |
| 7 | Margin column missing or computed from only For-Against (ignores Abstain) | Margin = For - Against; absent column = unverifiable. |
../methodologies/per-artifact-methodologies.md#voting-patterns— construction rules.../methodologies/political-classification-guide.md— group taxonomy + procedure-code conventions.../methodologies/osint-tradecraft-standards.md— Admiralty per RCV; LOW-confidence flag for <4-week-old votes../coalition-dynamics.md— group-pair aggregate view consumes per-RCV detail here../session-baseline.md— RCV count baseline.../methodologies/electoral-domain-methodology.md— legislature voting tradecraft.
scripts/validate-analysis-completeness.js checks for this artifact:
| Check | Threshold | Source |
|---|---|---|
| Line floor | per article-type (breaking 150, week-in-review 150, month-in-review 180, motions 200) | reference-quality-thresholds.json |
| Required H2 substrings | "Top RCVs" / "Roll-Call" / "Behaviour" / "Anomalies" | structural contract |
| Mermaid block | ≥1 (xychart of For/Against/Abstain across top-5 preferred) | visual contract |
| Tradecraft markers | Admiralty per RCV; LOW flag for <4-week-old votes; abstain column populated | osint-tradecraft-standards.md |
| Source diversity | ≥3 EP MCP tools (must include get_voting_records or ep-get-voting-records fallback) |
per-artifact rule |
| Top-5 coverage | 5 distinct RCVs cited with procedure codes | template logic |
| Voting data freshness | §7 "Voting Data Freshness" table present and source field populated |
D-02 fallback compliance |
Document Control: /analysis/daily/{date}/{type}-run{N}/intelligence/voting-patterns.md · Template v1.2 · Depth floor: per article-type minimum defined in ../methodologies/reference-quality-thresholds.json (authoritative — e.g. breaking 150, week-in-review 150, month-in-review 180, motions 200).