Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Um comando direto ignora o prompt de revisão. Verifique a origem antes de executá-lo.
Instruções da origem · Visualização somente leitura
name
behavioral-analysis
description
Political psychology, cognitive biases, group dynamics, leadership analysis, decision-making patterns for Swedish political intelligence
license
Apache-2.0
Behavioral Analysis Skill
🔴 AI FIRST Quality Principle
This skill MUST be applied with the AI FIRST principle: never accept first-pass quality. ALL analysis and content MUST go through minimum 2 complete iterations. After first pass, read ALL output back completely and systematically improve every section — strengthen evidence, deepen analysis, add specific citations, broaden perspectives. Spend ALL allocated time on real work. Single-pass output is NEVER acceptable. NO SHORTCUTS.
Purpose
This skill provides comprehensive behavioral analysis methodologies for understanding political decision-making, cognitive patterns, and psychological dynamics within the Swedish Parliament. It combines political psychology research with OSINT intelligence to identify behavioral indicators, predict policy positions, and assess leadership effectiveness through evidence-based analysis of voting patterns, speech behavior, and collaboration networks.
When to Use This Skill
Apply this skill when:
✅ Analyzing voting deviation patterns to understand internal party conflicts
✅ Identifying cognitive biases in parliamentary decision-making
✅ Assessing leadership styles and personality traits of political figures
✅ Detecting group polarization and echo chamber effects in committees
✅ Evaluating constituency influence on voting behavior
✅ Predicting policy positions based on behavioral indicators
✅ Conducting psychological profiling for strategic intelligence
✅ Analyzing coalition dynamics and negotiation patterns
Political psychologists recognize voting deviation as a key indicator of cognitive dissonance - when a politician's personal beliefs conflict with party expectations. The Riksdagsmonitor platform tracks this through multi-dimensional analysis.
@ComponentpublicclassPartyConformityAnalyzer {
/**
* Analyzes voting deviation patterns to identify cognitive dissonance.
*
* High deviation indicates:
* - Internal conflict with party platform
* - Constituency pressure overriding party discipline
* - Personal ideology asserting independence
* - Strategic positioning for leadership
*/@Transactional(readOnly = true)public PartyConformityProfile analyzeConformity(String politicianId, String partyId) {
Stringsql="""
SELECT
p.person_id,
p.first_name || ' ' || p.last_name as name,
p.party as current_party,
vbs.total_votes,
vbs.won_votes,
vbs.lost_votes,
vbs.rebel_votes,
vbs.avg_vote_win_rate,
vbs.vote_effectiveness_score,
ROUND(100.0 * vbs.rebel_votes / NULLIF(vbs.total_votes, 0), 2) as deviation_rate,
-- Behavioral indicators
CASE
WHEN vbs.rebel_votes::float / NULLIF(vbs.total_votes, 0) < 0.02 THEN 'CONFORMIST'
WHEN vbs.rebel_votes::float / NULLIF(vbs.total_votes, 0) < 0.05 THEN 'MODERATE'
WHEN vbs.rebel_votes::float / NULLIF(vbs.total_votes, 0) < 0.10 THEN 'INDEPENDENT'
ELSE 'MAVERICK'
END as conformity_type,
-- Cognitive dissonance indicators
CASE
WHEN vbs.rebel_votes > 50 AND vbs.rebel_votes::float / vbs.total_votes > 0.10
THEN 'HIGH_DISSONANCE'
WHEN vbs.rebel_votes > 20 AND vbs.rebel_votes::float / vbs.total_votes > 0.05
THEN 'MODERATE_DISSONANCE'
ELSE 'LOW_DISSONANCE'
END as dissonance_level
FROM view_riksdagen_politician p
JOIN view_riksdagen_politician_ballot_summary vbs ON p.person_id = vbs.person_id
WHERE p.person_id = :politicianId
AND p.party = :partyId
""";
return jdbcTemplate.queryForObject(sql, PartyConformityProfile.class,
Map.of("politicianId", politicianId, "partyId", partyId));
}
}
Psychological Profile Types
Conformity Type
Deviation Rate
Behavioral Indicators
Strategic Implications
CONFORMIST
< 2%
Strong party loyalty, risk-averse, hierarchical mindset
Safe coalition partner, reliable vote
MODERATE
2-5%
Balanced independence, calculated risks
Negotiable on key issues
INDEPENDENT
5-10%
Constituency-driven, personal ideology
Swing vote potential
MAVERICK
> 10%
Highly independent, ideological purity
Unpredictable, high-risk alliance
2. Group Dynamics & Polarization
Echo Chamber Detection
Political committees can develop echo chambers where dissenting views are suppressed. The Riksdagsmonitor platform identifies these through collaboration pattern analysis.
import pandas as pd
import networkx as nx
from typing importDict, List, TupleclassEchoChamberDetector:
"""
Detects echo chambers in parliamentary committees using network analysis.
Indicators of echo chambers:
- High internal connectivity, low external bridges
- Ideological homogeneity exceeding party baseline
- Resistance to cross-party collaboration
- Information isolation from opposing viewpoints
"""defanalyze_committee_network(self, committee_id: str) -> Dict:
"""
Analyzes committee collaboration networks for echo chamber indicators.
Returns metrics:
- Internal density: Collaboration within ideological cluster
- Bridge centrality: Cross-cluster information flow
- Homophily index: Ideological similarity preference
- Polarization score: Cluster separation intensity
"""
query = """
SELECT
c.org_code,
c.committee_name,
-- Network structure metrics
COUNT(DISTINCT cm.person_id) as member_count,
COUNT(DISTINCT cm.party) as party_diversity,
-- Collaboration patterns (co-authorship, co-sponsorship)
(SELECT COUNT(*)
FROM document_person dp1
JOIN document_person dp2 ON dp1.document_id = dp2.document_id
WHERE dp1.person_id IN (SELECT person_id FROM committee_member WHERE org_code = c.org_code)
AND dp2.person_id IN (SELECT person_id FROM committee_member WHERE org_code = c.org_code)
AND dp1.person_id < dp2.person_id
) as internal_collaboration,
-- Cross-party bridge activity
(SELECT COUNT(*)
FROM document_person dp1
JOIN document_person dp2 ON dp1.document_id = dp2.document_id
JOIN person p1 ON dp1.person_id = p1.person_id
JOIN person p2 ON dp2.person_id = p2.person_id
WHERE dp1.person_id IN (SELECT person_id FROM committee_member WHERE org_code = c.org_code)
AND dp2.person_id IN (SELECT person_id FROM committee_member WHERE org_code = c.org_code)
AND p1.party != p2.party
AND dp1.person_id < dp2.person_id
) as cross_party_bridges,
-- Ideological homogeneity (voting similarity)
AVG(
(SELECT AVG(
CASE WHEN v1.vote = v2.vote THEN 1.0 ELSE 0.0 END
) FROM vote v1, vote v2
WHERE v1.person_id IN (SELECT person_id FROM committee_member WHERE org_code = c.org_code)
AND v2.person_id IN (SELECT person_id FROM committee_member WHERE org_code = c.org_code)
AND v1.ballot_id = v2.ballot_id
AND v1.person_id < v2.person_id
)
) as internal_voting_similarity
FROM committee c
JOIN committee_member cm ON c.org_code = cm.org_code
WHERE c.org_code = %s
GROUP BY c.org_code, c.committee_name
"""
df = pd.read_sql(query, self.connection, params=[committee_id])
# Calculate echo chamber indicators
internal_density = df['internal_collaboration'].iloc[0] / (df['member_count'].iloc[0] ** 2)
bridge_ratio = df['cross_party_bridges'].iloc[0] / max(df['internal_collaboration'].iloc[0], 1)
homophily_index = df['internal_voting_similarity'].iloc[0]
# Echo chamber score (0-100, higher = stronger echo chamber)
echo_chamber_score = (
(internal_density * 30) +
((1 - bridge_ratio) * 30) +
(homophily_index * 40)
)
return {
'committee_id': committee_id,
'echo_chamber_score': round(echo_chamber_score, 2),
'internal_density': round(internal_density, 3),
'bridge_ratio': round(bridge_ratio, 3),
'homophily_index': round(homophily_index, 3),
'classification': self._classify_echo_chamber(echo_chamber_score)
}
def_classify_echo_chamber(self, score: float) -> str:
"""Classify echo chamber severity."""if score >= 75:
return"SEVERE_ECHO_CHAMBER"elif score >= 60:
return"MODERATE_ECHO_CHAMBER"elif score >= 40:
return"MILD_POLARIZATION"else:
return"HEALTHY_DIVERSITY"
Groupthink Detection Criteria
Indicator
Measurement
Risk Threshold
Intelligence Assessment
Internal Density
Collaboration frequency within group
> 0.75
High cohesion, low external input
Bridge Ratio
Cross-party collaboration rate
< 0.20
Limited opposing viewpoints
Homophily Index
Voting similarity among members
> 0.85
Ideological homogeneity
Dissent Suppression
Minority opinion frequency
< 5%
Conformity pressure
Echo Chamber Score
Composite metric
> 75
Critical groupthink risk
3. Leadership Style Profiling
Five Leadership Dimensions
Political leadership styles significantly impact party effectiveness and coalition stability. The Riksdagsmonitor platform classifies leaders across five dimensions based on behavioral evidence.
@ServicepublicclassLeadershipStyleAnalyzer {
/**
* Analyzes leadership effectiveness through behavioral indicators.
*
* Based on transformational leadership theory (Bass & Riggio, 2006)
* and political leadership research (Burns, 1978).
*/public LeadershipProfile analyzeLeadership(String politicianId) {
Stringsql="""
WITH leadership_metrics AS (
SELECT
p.person_id,
p.first_name || ' ' || p.last_name as name,
p.party,
-- Dimension 1: Collaborative vs. Authoritarian
vim.collaboration_score,
vim.network_centrality,
-- Dimension 2: Ideological vs. Pragmatic
vbs.rebel_votes::float / NULLIF(vbs.total_votes, 0) as ideological_purity,
vbs.vote_effectiveness_score as pragmatic_success,
-- Dimension 3: Proactive vs. Reactive
COUNT(DISTINCT d.document_id) as initiated_documents,
vbs.total_votes as participation_votes,
-- Dimension 4: Consensus-builder vs. Confrontational
vim.cross_party_collaboration_score,
vbs.rebel_votes as confrontational_votes,
-- Dimension 5: Visible vs. Behind-scenes
COUNT(DISTINCT CASE WHEN d.document_type = 'motion' THEN d.document_id END) as public_initiatives,
COUNT(DISTINCT CASE WHEN d.document_type = 'interpellation' THEN d.document_id END) as oversight_activity
FROM view_riksdagen_politician p
LEFT JOIN view_riksdagen_politician_ballot_summary vbs ON p.person_id = vbs.person_id
LEFT JOIN view_riksdagen_politician_influence_metrics vim ON p.person_id = vim.person_id
LEFT JOIN view_riksdagen_politician_document d ON p.person_id = d.person_id
WHERE p.person_id = :politicianId
GROUP BY p.person_id, p.first_name, p.last_name, p.party,
vim.collaboration_score, vim.network_centrality,
vbs.rebel_votes, vbs.total_votes, vbs.vote_effectiveness_score
)
SELECT
*,
-- Leadership style classification
CASE
WHEN collaboration_score > 0.7 AND cross_party_collaboration_score > 0.6
THEN 'TRANSFORMATIONAL'
WHEN ideological_purity > 0.15 AND confrontational_votes > 100
THEN 'IDEOLOGICAL_PURIST'
WHEN pragmatic_success > 0.75 AND cross_party_collaboration_score > 0.5
THEN 'PRAGMATIC_DEALMAKER'
WHEN initiated_documents > 50 AND public_initiatives > 30
THEN 'POLICY_ENTREPRENEUR'
WHEN network_centrality > 0.8 AND collaboration_score < 0.4
THEN 'AUTHORITARIAN_BROKER'
ELSE 'BACKBENCHER'
END as leadership_style
FROM leadership_metrics
""";
return jdbcTemplate.queryForObject(sql, LeadershipProfile.class,
Map.of("politicianId", politicianId));
}
}
Leadership Style Taxonomy
Style
Behavioral Indicators
Strengths
Weaknesses
Strategic Use
TRANSFORMATIONAL
High collaboration, cross-party bridges, inspires change
Coalition-building, reform leadership
Can compromise core values
Coalition negotiations
IDEOLOGICAL_PURIST
High deviation, confrontational, principle-driven
Policy consistency, base mobilization
Limited legislative success
Opposition leadership
PRAGMATIC_DEALMAKER
Low deviation, high effectiveness, flexible
Legislative productivity, majority-building
Perceived as lacking principles
Government formation
POLICY_ENTREPRENEUR
High document initiation, innovation-focused
Agenda-setting, thought leadership
Implementation challenges
Committee chairmanship
AUTHORITARIAN_BROKER
High centrality, low collaboration, control-oriented
Discipline enforcement, clarity
Stifles innovation, loyalty issues
Crisis management
BACKBENCHER
Low activity across all dimensions
Low-risk, loyal follower
Limited influence
Safe majority vote
4. Cognitive Bias Identification
Decision-Making Bias Framework
Political decisions are influenced by systematic cognitive biases. The Riksdagsmonitor platform identifies these patterns through voting behavior analysis.
from dataclasses import dataclass
from typing importList, Optionalfrom datetime import datetime, timedelta
@dataclassclassCognitiveBiasIndicators:
"""Indicators of cognitive biases in political decision-making."""
politician_id: str
confirmation_bias_score: float
status_quo_bias_score: float
authority_bias_score: float
recency_bias_score: float
availability_bias_score: floatclassCognitiveBiasDetector:
"""
Identifies cognitive biases through voting pattern analysis.
Based on Kahneman & Tversky's cognitive bias research
applied to political decision-making contexts.
"""defdetect_confirmation_bias(self, politician_id: str) -> float:
"""
Detects confirmation bias: Tendency to vote with pre-existing beliefs.
Measured by:
- Consistency with historical positions
- Resistance to policy evolution despite new evidence
- Selective attention to information supporting prior stance
"""
query = """
WITH politician_voting AS (
SELECT
v.person_id,
v.vote,
b.issue_category,
b.vote_date,
LAG(v.vote) OVER (
PARTITION BY v.person_id, b.issue_category
ORDER BY b.vote_date
) as previous_vote,
LAG(b.vote_date) OVER (
PARTITION BY v.person_id, b.issue_category
ORDER BY b.vote_date
) as previous_date
FROM vote v
JOIN ballot b ON v.ballot_id = b.ballot_id
WHERE v.person_id = %s
AND b.vote_date >= NOW() - INTERVAL '4 years'
)
SELECT
person_id,
-- Consistency score: How often votes align with historical position
AVG(CASE WHEN vote = previous_vote THEN 1.0 ELSE 0.0 END) as consistency_rate,
-- Rigidity score: Resistance to policy evolution over time
COUNT(CASE WHEN vote != previous_vote
AND previous_date < vote_date - INTERVAL '1 year'
THEN 1 END)::float / COUNT(*) as evolution_resistance,
COUNT(*) as total_comparable_votes
FROM politician_voting
WHERE previous_vote IS NOT NULL
GROUP BY person_id
"""
result = pd.read_sql(query, self.connection, params=[politician_id])
if result.empty or result['total_comparable_votes'].iloc[0] < 10:
return0.0# Confirmation bias score: High consistency + high resistance = stronger bias
consistency_rate = result['consistency_rate'].iloc[0]
evolution_resistance = result['evolution_resistance'].iloc[0]
bias_score = (consistency_rate * 0.6) + (evolution_resistance * 0.4)
returnround(bias_score * 100, 2)
defdetect_status_quo_bias(self, politician_id: str) -> float:
"""
Detects status quo bias: Preference for maintaining current state.
Measured by:
- Voting against reform proposals
- Supporting incumbent policies
- Resisting change initiatives
"""
query = """
SELECT
v.person_id,
COUNT(CASE WHEN b.is_reform_proposal = TRUE AND v.vote = 'Nej' THEN 1 END)::float /
NULLIF(COUNT(CASE WHEN b.is_reform_proposal = TRUE THEN 1 END), 0) as reform_opposition_rate,
COUNT(CASE WHEN b.is_status_quo_motion = TRUE AND v.vote = 'Ja' THEN 1 END)::float /
NULLIF(COUNT(CASE WHEN b.is_status_quo_motion = TRUE THEN 1 END), 0) as status_quo_support_rate,
COUNT(*) as total_policy_votes
FROM vote v
JOIN ballot b ON v.ballot_id = b.ballot_id
WHERE v.person_id = %s
AND (b.is_reform_proposal = TRUE OR b.is_status_quo_motion = TRUE)
AND b.vote_date >= NOW() - INTERVAL '2 years'
GROUP BY v.person_id
"""
result = pd.read_sql(query, self.connection, params=[politician_id])
if result.empty or result['total_policy_votes'].iloc[0] < 5:
return0.0
reform_opposition = result['reform_opposition_rate'].iloc[0] or0.0
status_quo_support = result['status_quo_support_rate'].iloc[0] or0.0
bias_score = (reform_opposition * 0.5) + (status_quo_support * 0.5)
returnround(bias_score * 100, 2)
defdetect_authority_bias(self, politician_id: str) -> float:
"""
Detects authority bias: Over-reliance on party leadership guidance.
Measured by:
- Voting alignment with party leadership
- Lack of independent positions
- Deference to authority figures
"""
query = """
WITH party_leader_votes AS (
SELECT
v.ballot_id,
v.vote as leader_vote
FROM vote v
JOIN person p ON v.person_id = p.person_id
WHERE p.is_party_leader = TRUE
AND p.party = (SELECT party FROM person WHERE person_id = %s)
)
SELECT
v.person_id,
COUNT(CASE WHEN v.vote = plv.leader_vote THEN 1 END)::float /
NULLIF(COUNT(*), 0) as leadership_alignment_rate,
COUNT(*) as total_votes_with_leader
FROM vote v
JOIN party_leader_votes plv ON v.ballot_id = plv.ballot_id
WHERE v.person_id = %s
GROUP BY v.person_id
"""
result = pd.read_sql(query, self.connection, params=[politician_id, politician_id])
if result.empty or result['total_votes_with_leader'].iloc[0] < 20:
return0.0
alignment_rate = result['leadership_alignment_rate'].iloc[0]
# Authority bias score: Very high alignment suggests deferenceif alignment_rate > 0.95:
return100.0elif alignment_rate > 0.90:
return75.0elif alignment_rate > 0.85:
return50.0else:
returnround((alignment_rate - 0.70) * 200, 2) # Scale 70-85% to 0-30defdetect_recency_bias(self, politician_id: str) -> float:
"""
Detects recency bias: Disproportionate weight on recent information.
Measured by:
- Vote position changes after recent media coverage
- Inconsistency with long-term stance based on recent events
- Rapid policy shifts following public attention
"""
query = """
WITH recent_votes AS (
SELECT
v.person_id,
v.vote,
b.issue_category,
b.vote_date,
CASE WHEN b.vote_date >= NOW() - INTERVAL '90 days' THEN 'recent'
WHEN b.vote_date >= NOW() - INTERVAL '1 year' THEN 'medium_term'
ELSE 'historical' END as time_period
FROM vote v
JOIN ballot b ON v.ballot_id = b.ballot_id
WHERE v.person_id = %s
AND b.vote_date >= NOW() - INTERVAL '3 years'
),
consistency_analysis AS (
SELECT
person_id,
issue_category,
AVG(CASE WHEN time_period = 'recent' AND vote = 'Ja' THEN 1.0 ELSE 0.0 END) as recent_support,
AVG(CASE WHEN time_period = 'historical' AND vote = 'Ja' THEN 1.0 ELSE 0.0 END) as historical_support
FROM recent_votes
GROUP BY person_id, issue_category
HAVING COUNT(CASE WHEN time_period = 'recent' THEN 1 END) >= 3
AND COUNT(CASE WHEN time_period = 'historical' THEN 1 END) >= 5
)
SELECT
person_id,
AVG(ABS(recent_support - historical_support)) as avg_shift_magnitude,
COUNT(*) as analyzed_categories
FROM consistency_analysis
WHERE ABS(recent_support - historical_support) > 0.20 -- Significant shift threshold
GROUP BY person_id
"""
result = pd.read_sql(query, self.connection, params=[politician_id])
if result.empty or result['analyzed_categories'].iloc[0] < 3:
return0.0
shift_magnitude = result['avg_shift_magnitude'].iloc[0]
# Recency bias score: Larger shifts = stronger bias
bias_score = min(shift_magnitude * 150, 100) # Cap at 100returnround(bias_score, 2)
Cognitive Bias Risk Matrix
Bias Type
Detection Method
Risk Threshold
Behavioral Impact
Intelligence Use
Confirmation Bias
Historical vote consistency
> 85%
Ignores contradictory evidence
Predict resistance to new information
Status Quo Bias
Reform opposition rate
> 70%
Blocks necessary change
Identify reform obstacles
Authority Bias
Leadership alignment
> 90%
Lacks independent judgment
Predict via party leadership
Recency Bias
Vote shift magnitude after events
> 30% shift
Overreacts to recent news
Exploit timing of proposals
Availability Bias
Media-salient issue focus
> 60% media-driven
Ignores non-salient issues
Assess media manipulation vulnerability
5. Constituency Influence Analysis
Electoral Pressure Indicators
Politicians balance party loyalty with constituency demands. The Riksdagsmonitor platform measures this tension through deviation analysis correlated with electoral data.
-- Constituency Influence ScoringWITH constituency_characteristics AS (
SELECT
er.election_region_id,
er.region_name,
er.population,
er.urban_rural_classification,
er.median_income,
er.education_level,
-- Electoral competitiveness (closer races = more pressure)
er.winning_margin_percentage,
CASEWHEN er.winning_margin_percentage <5THEN'MARGINAL_SEAT'WHEN er.winning_margin_percentage <10THEN'COMPETITIVE_SEAT'ELSE'SAFE_SEAT'ENDas seat_classification,
-- Ideological distance from party median
er.constituency_ideology_score,
p.party_ideology_score,
ABS(er.constituency_ideology_score - p.party_ideology_score) as ideological_distance
FROM election_region er
JOIN party p ON er.winning_party = p.party_id
),
politician_constituency_behavior AS (
SELECT
pol.person_id,
pol.first_name ||' '|| pol.last_name as name,
pol.party,
pol.constituency_id,
cc.seat_classification,
cc.ideological_distance,
-- Voting behavior
vbs.rebel_votes,
vbs.total_votes,
vbs.rebel_votes::float/NULLIF(vbs.total_votes, 0) as deviation_rate,
-- Document activity reflecting constituency concernsCOUNT(DISTINCT pd.document_id) as constituency_documents,
-- Constituency influence scoreCASEWHEN cc.seat_classification ='MARGINAL_SEAT'AND cc.ideological_distance >15AND vbs.rebel_votes::float/ vbs.total_votes >0.05THEN'HIGH_CONSTITUENCY_INFLUENCE'WHEN cc.seat_classification ='COMPETITIVE_SEAT'AND vbs.rebel_votes::float/ vbs.total_votes >0.03THEN'MODERATE_CONSTITUENCY_INFLUENCE'WHEN cc.seat_classification ='SAFE_SEAT'AND vbs.rebel_votes::float/ vbs.total_votes <0.02THEN'PARTY_DISCIPLINE_DOMINANT'ELSE'BALANCED_INFLUENCE'ENDas influence_classification
FROM view_riksdagen_politician pol
JOIN constituency_characteristics cc ON pol.constituency_id = cc.election_region_id
JOIN view_riksdagen_politician_ballot_summary vbs ON pol.person_id = vbs.person_id
LEFTJOIN view_riksdagen_politician_document pd ON pol.person_id = pd.person_id
GROUPBY pol.person_id, pol.first_name, pol.last_name, pol.party, pol.constituency_id,
cc.seat_classification, cc.ideological_distance,
vbs.rebel_votes, vbs.total_votes, pd.document_id
)
SELECT
person_id,
name,
party,
seat_classification,
deviation_rate,
influence_classification,
-- Strategic intelligence assessmentCASEWHEN influence_classification ='HIGH_CONSTITUENCY_INFLUENCE'THEN'Target for constituency-based persuasion campaigns'WHEN influence_classification ='PARTY_DISCIPLINE_DOMINANT'THEN'Requires party leadership negotiation'ELSE'Balanced approach needed'ENDas strategic_approach
FROM politician_constituency_behavior
ORDERBY deviation_rate DESC, ideological_distance DESC;
6. Behavioral Risk Indicators
Comprehensive Risk Profiling
The Riksdagsmonitor platform integrates behavioral indicators with Drools risk rules to create comprehensive risk profiles. These profiles predict potential accountability failures.
Swedish Parliament (Riksdagen) - Official documentation of parliamentary procedures
V-Dem Institute - Democracy measurement and behavioral indicators
Swedish Election Authority - Electoral competitiveness data
🔗 Integration with agentic workflows & analysis artifacts
This skill is consumed by the 11 agentic news workflows in .github/workflows/news-*.md. The authoritative contract lives in .github/prompts/README.md; this skill supplies domain expertise on top of that contract.
Required before any article: 9 core artifacts (14 for Tier-C) in analysis/daily/$ARTICLE_DATE/$SUBFOLDER/; 05-analysis-gate.md is the single blocking gate.