Scoring intent
We quantify social collapse risk on a 0–100 scale where 0 = best (no risk signal) and 100 = worst (critical risk). Replit only explains and displays; all scoring is performed by an external service using the rules below.
Signal construction (from news)
Coverage window: last 7 days of news per country with country-specific keyword filters.
Per-article weight: recency_weight × severity_weight
Recency weight: exponential decay with half-life = 7 days. Newer items weigh more.
Severity weight: starts at 1.0 and is multiplied by 1.6 whenever a severe hint (e.g., "coup", "hyperinflation", "famine") appears in the title/summary. Multiple hints multiply cumulatively.
Pseudo-count (per criterion): sum of per-article weights across all matched articles in the window.
Normalization to 0–100 (per criterion)
Baseline floor: first 2 pseudo-count units are treated as background noise and ignored for scoring.
Soft cap: counts above 60 are capped to prevent runaway spikes.
Linear map: score_raw = 100 × clamp(pseudoCount − 2, 0, 60) / 60.
Directionality:
- Non-beneficial criteria (e.g., "Riots", "Blackouts"): score = score_raw (more signals ⇒ worse).
- Beneficial criteria (if any in future, e.g., "Press Freedom ↑"): score = 100 − score_raw (more signals of improvement ⇒ better).
Direction per criterion is fixed by taxonomy; the UI never flips it.
Aggregation
Category score: weighted mean of its criteria:
category_score = Σ(criterion_score × criterion_weight) / Σ(criterion_weight)
Overall score: weighted mean of categories:
overall_score = Σ(category_score × category_weight) / Σ(category_weight)
Qualitative bands:
- 0–19.9 Stable
- 20–34.9 Watch
- 35–49.9 Elevated
- 50–64.9 High
- 65–79.9 Severe
- 80–100 Critical
Transparency & citations
Every score is backed by linked articles. The dashboard cites up to 6 recent items per factor (category).
For audit, the external scorer returns the exact query used per criterion (criteria[].query) and sampled items.
Replit never invents or modifies scores. If data is missing, show "N/A (news-only mode)" and keep citations visible.
Data quality & safeguards
De-duplication: identical titles/links within the window should be treated as a single item.
Language: en (extendable); country names/aliases are AND-ed in the query.
Rate limits: fetch at most 30 items per criterion per refresh.
Refresh cadence: backend recomputes every 10 minutes; the UI polls every 5 minutes or on manual refresh.
Outlier control: soft cap at 60, severity multiplier 1.6, time-decay half-life 7 days.
Division of responsibilities
External Scorer: fetches news, applies the method above, and returns JSON with numbers.
Replit Frontend: renders charts/cards/citations only. No local math beyond drawing.