-
Notifications
You must be signed in to change notification settings - Fork 1
Description
π Issue Type
Feature - Data Visualization Dashboard
π― Objective
Implement comprehensive risk assessment and anomaly detection dashboard utilizing CIA platform's 45 risk rules to identify high-risk politicians, detect voting anomalies, monitor crisis resilience, and provide early warning indicators for democratic accountability using advanced D3.js and Chart.js visualizations.
π Current State
- No risk assessment visualizations
- CIA risk data available but not consumed (45 risk rules Γ 349 MPs)
- No anomaly detection displays
- No crisis monitoring dashboards
π Desired State
Interactive dashboard featuring:
- Risk Level Heat Map: 45 rules Γ 349 MPs risk matrix (D3.js)
- Anomaly Detection: Statistical anomaly visualization with P90/P99 thresholds
- Crisis Resilience Indicators: Party and politician stability metrics
- Risk Evolution Timeline: Temporal risk trends (2020-2026)
- Early Warning System: Real-time risk alerts and threshold monitoring
π CIA Data Integration Context
CIA Product(s):
- Risk Assessment Dashboard (45 rules)
- Anomaly Detection System
- Crisis Resilience Monitoring
- Ethics Concerns Rankings
Data Sources:
Primary CSV Files:
Risk Assessment:
- distribution_politician_risk_levels.csv (risk level distribution)
- distribution_risk_by_party.csv (party-level risk)
- distribution_risk_score_buckets.csv (risk score ranges)
- distribution_ministry_risk_levels.csv (ministry risk)
- distribution_ministry_risk_quarterly.csv (quarterly trends)
Risk Evolution:
- distribution_risk_evolution_temporal.csv (temporal changes)
- percentile_risk_score_evolution.csv (P1-P99 risk percentiles)
- percentile_politician_risk_summary.csv (politician risk metrics)
- percentile_ministry_risk_evolution.csv (ministry risk trends)
Anomaly Detection:
- distribution_voting_anomaly_classification.csv (anomaly types)
- distribution_anomaly_by_party.csv (party anomalies)
- distribution_seasonal_anomaly_detection.csv (seasonal anomalies)
- percentile_voting_anomaly_detection.csv (anomaly percentiles)
- percentile_seasonal_anomaly_detection.csv (seasonal percentiles)
Crisis Resilience:
- distribution_crisis_resilience.csv (resilience scores)
- percentile_crisis_resilience_indicators.csv (resilience percentiles)
Ethics & Transparency:
- top10_ethics_concerns.csv (top 10 ethics issues)
- top10_electoral_risk.csv (MPs at risk)
Sample Size: 300-500 rows (risk/anomaly data)
Coverage: 349 MPs Γ 45 rules = 15,705 risk assessments
Sample Data: Reference https://github.com/Hack23/cia/tree/master/service.data.impl/sample-data/
Methodology:
- 45 risk rules from DATA_ANALYSIS_INTOP_OSINT.md
- Statistical anomaly detection (P90/P99 thresholds)
- Crisis resilience scoring
- Percentile benchmarking for risk levels
Implementation Notes:
- Fetch CSV files via GitHub raw content API
- Calculate real-time risk scores (45 rules per MP)
- Detect anomalies using statistical thresholds
- Cache locally in
/data/cia/risk/ - Update frequency: Daily (risk changes daily)
π§ Implementation Approach
1. Data Integration
async function loadRiskData() {
const datasets = {
politicianRisk: 'distribution_politician_risk_levels.csv',
riskEvolution: 'percentile_risk_score_evolution.csv',
anomalies: 'distribution_voting_anomaly_classification.csv',
crisisResilience: 'distribution_crisis_resilience.csv',
ethicsConcerns: 'top10_ethics_concerns.csv'
};
const data = await fetchMultipleCIADatasets(datasets);
return {
riskMatrix: buildRiskMatrix(data.politicianRisk), // 45 rules Γ 349 MPs
anomalies: detectAnomalies(data.anomalies, {p90: 90, p99: 99}),
resilience: analyzeCrisisResilience(data.crisisResilience),
alerts: generateEarlyWarnings(data)
};
}2. D3.js Risk Heat Map
// 45 risk rules Γ 349 MPs heat map
function renderRiskHeatMap(data) {
const svg = d3.select('#riskHeatMap')
.append('svg')
.attr('width', width)
.attr('height', height);
// Y-axis = Politicians (349 MPs, sortable)
// X-axis = Risk rules (45 rules)
// Color = Risk level (green=low, red=critical)
const cells = svg.selectAll('rect')
.data(data)
.enter()
.append('rect')
.attr('x', d => xScale(d.rule))
.attr('y', d => yScale(d.politician))
.attr('width', cellWidth)
.attr('height', cellHeight)
.attr('fill', d => riskColorScale(d.score))
.attr('class', d => `risk-${d.level}`)
.on('mouseover', showRiskTooltip)
.on('click', showRiskDetails);
// Add zoom and filter capabilities
svg.call(d3.zoom().on('zoom', zoomed));
}3. Anomaly Detection Visualization
// Statistical anomaly detection with thresholds
function renderAnomalyDetection(data, thresholds) {
// Scatter plot: time Γ deviation score
const anomalies = data.filter(d => d.score > thresholds.p90);
new Chart(ctx, {
type: 'scatter',
data: {
datasets: [{
label: 'Anomalies (P90+)',
data: anomalies.map(a => ({
x: new Date(a.date),
y: a.score
})),
backgroundColor: anomalies.map(a =>
a.score > thresholds.p99 ? '#d32f2f' : '#f57c00'
),
pointRadius: 6
}]
},
options: {
scales: {
x: { type: 'time', title: { display: true, text: 'Date' } },
y: { title: { display: true, text: 'Deviation Score' } }
},
plugins: {
annotation: {
annotations: {
p90: { type: 'line', yMin: thresholds.p90, yMax: thresholds.p90, borderColor: '#f57c00', label: { content: 'P90 Threshold' } },
p99: { type: 'line', yMin: thresholds.p99, yMax: thresholds.p99, borderColor: '#d32f2f', label: { content: 'P99 Critical' } }
}
}
}
}
});
}4. HTML Structure
<section id="risk-dashboard" class="dashboard-container">
<h2>β οΈ Risk Assessment & Anomaly Detection</h2>
<div class="alert-banner" id="earlyWarnings" role="alert">
<!-- Real-time risk alerts displayed here -->
</div>
<div class="dashboard-grid">
<div class="chart-card full-width">
<h3>Risk Level Heat Map (45 Rules Γ 349 MPs)</h3>
<div class="controls">
<label>
<input type="checkbox" id="filterHighRisk" />
Show only high-risk (β₯6.0)
</label>
<select id="riskRuleFilter" aria-label="Filter by risk rule">
<option value="">All Rules</option>
<!-- 45 risk rules -->
</select>
</div>
<div id="riskHeatMap" role="img" aria-label="Risk assessment heat map"></div>
</div>
<div class="chart-card">
<h3>Risk Distribution</h3>
<canvas id="riskDistributionChart"></canvas>
</div>
<div class="chart-card">
<h3>Anomaly Detection (P90/P99)</h3>
<canvas id="anomalyDetectionChart"></canvas>
</div>
<div class="chart-card">
<h3>Crisis Resilience Indicators</h3>
<canvas id="crisisResilienceChart"></canvas>
</div>
<div class="chart-card">
<h3>Risk Evolution Timeline (2020-2026)</h3>
<canvas id="riskEvolutionChart"></canvas>
</div>
<div class="chart-card">
<h3>Top 10 Ethics Concerns</h3>
<ol id="ethicsConcernsList"></ol>
</div>
<div class="chart-card">
<h3>Electoral Risk (MPs at Risk)</h3>
<ol id="electoralRiskList"></ol>
</div>
</div>
</section>5. Risk Level Classification
const RISK_LEVELS = {
CRITICAL: { min: 8.0, max: 10.0, color: '#d32f2f', label: 'Critical' },
HIGH: { min: 6.0, max: 8.0, color: '#f57c00', label: 'High' },
MEDIUM: { min: 4.0, max: 6.0, color: '#fbc02d', label: 'Medium' },
LOW: { min: 0.0, max: 4.0, color: '#388e3c', label: 'Low' }
};
function classifyRiskLevel(score) {
if (score >= 8.0) return RISK_LEVELS.CRITICAL;
if (score >= 6.0) return RISK_LEVELS.HIGH;
if (score >= 4.0) return RISK_LEVELS.MEDIUM;
return RISK_LEVELS.LOW;
}6. Early Warning System
function generateEarlyWarnings(data) {
const warnings = [];
// High-risk politicians (β₯8.0)
const critical = data.filter(d => d.risk_score >= 8.0);
if (critical.length > 0) {
warnings.push({
severity: 'critical',
message: `${critical.length} MPs with critical risk level (β₯8.0)`,
details: critical
});
}
// Anomaly spike (>P99 in last 7 days)
const recentAnomalies = data.anomalies.filter(a =>
a.score > data.thresholds.p99 &&
isWithinDays(a.date, 7)
);
if (recentAnomalies.length > 5) {
warnings.push({
severity: 'high',
message: `${recentAnomalies.length} critical anomalies detected (last 7 days)`,
details: recentAnomalies
});
}
return warnings;
}7. Accessibility
- Heat map keyboard navigation (arrow keys)
- Alternative risk tables for screen readers
- ARIA live regions for alerts
- High contrast mode
- Focus indicators
π€ Recommended Agent
data-visualization-specialist - Expert in D3.js heat maps, anomaly detection, and risk visualization
Rationale: Requires advanced D3.js heat map expertise (45Γ349 matrix), statistical anomaly detection knowledge, and understanding of risk assessment methodologies.
Custom Instructions:
- Use D3.js v7+ for risk heat map (45 rules Γ 349 MPs)
- Use Chart.js for anomaly scatter plot and time series
- Implement statistical anomaly detection (P90/P99)
- Use risk-based color coding (WCAG AA compliant)
- Add zoom/pan/filter to heat map
- Implement early warning alert system
- Ensure WCAG 2.1 AA accessibility
- Support all 14 languages
- Cache risk data locally
- Update daily (risk changes daily)
- No JavaScript frameworks (vanilla JS + D3/Chart.js)
- Add real-time threshold monitoring
β Acceptance Criteria
Data Integration
- CIA risk CSV files fetched and parsed
- 45 risk rules Γ 349 MPs matrix built
- Anomaly detection implemented (P90/P99)
- Crisis resilience scores calculated
- Local caching in
/data/cia/risk/
Risk Heat Map
- D3.js heat map (45 rules Γ 349 MPs)
- Risk-based color coding (green to red)
- Interactive: click cell for details
- Filter by risk level (β₯6.0, β₯8.0)
- Filter by specific risk rule
- Zoom and pan functionality
- Sort by politician name or risk score
Anomaly Detection
- Scatter plot with P90/P99 threshold lines
- Critical anomalies highlighted (>P99)
- Temporal trend visualization
- Anomaly type classification
- Filter by anomaly type
Early Warning System
- Real-time alert banner
- Critical risk alerts (β₯8.0)
- Anomaly spike detection
- Crisis resilience warnings
- Alert severity levels (critical/high/medium)
Quality
- HTML validation passes
- WCAG 2.1 AA compliance
- Color-blind friendly palette
- Responsive design (320px-1440px+)
- Load time < 5 seconds (large heat map)
- D3.js v7+ and Chart.js via CDN with SRI
Risk Assessment
- 45 risk rules documented
- Risk scoring methodology explained
- Percentile benchmarks (P50, P75, P90, P99)
- Historical risk trends displayed
Multi-Language
- Risk rule names localized (14 languages)
- Alert messages translated
- Chart labels in current locale
Documentation
- 45 risk rules documented
- Anomaly detection algorithm explained
- Crisis resilience methodology
- Update SECURITY_ARCHITECTURE.md with risk dashboard
π References
- Repository: https://github.com/Hack23/riksdagsmonitor
- CIA Sample Data: https://github.com/Hack23/cia/tree/master/service.data.impl/sample-data
- CIA Risk Analysis: DATA_ANALYSIS_INTOP_OSINT.md (45 risk rules)
- CIA Business Product: Risk dashboard specification
- D3.js Heat Map: https://d3-graph-gallery.com/heatmap.html
- Statistical Anomaly Detection: P90/P99 methodology
- ISMS Policy: https://github.com/Hack23/ISMS-PUBLIC/blob/main/Secure_Development_Policy.md
- THREAT_MODEL.md: https://github.com/Hack23/riksdagsmonitor/blob/main/THREAT_MODEL.md
π·οΈ Labels
type:feature, priority:critical, component:visualization, component:data-integration, agent:data-visualization-specialist, cia-data, dashboard, risk-assessment, anomaly-detection, security, early-warning
π Multi-Language Support
All 14 languages supported with localized risk terminology
π Security & Compliance
- GDPR: Public risk data (no private information)
- Transparency: 45 risk rules publicly documented
- HTTPS-only: Secure data transmission
- SRI: D3.js and Chart.js with integrity hashes
- ISMS: Follows risk assessment and threat modeling standards
- Democratic Accountability: Systematic transparency focus