Skip to content

⚠️ Dashboard: Risk Assessment & Anomaly Detection System #55

@pethers

Description

@pethers

πŸ“‹ 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

🏷️ 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

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions