-
Notifications
You must be signed in to change notification settings - Fork 7.4k
CII manual tuning can over-amplify China relative to active conflict states, creating a geopolitical bias problem #2457
Description
Summary
This is not just a score-sync bug. The current CII design itself can produce politically skewed results that do not map cleanly to real-world social stability.
In practice, the model can push China close to, or in some runtime states above, countries in active conflict because of manually tuned country multipliers, broad China-specific keyword aliases, aggressive alert/news boosts, and hard caps that flatten the gap between low and extreme conflict severity.
That is an algorithmic bias problem. It risks presenting China as comparably unstable to war-zone states in a way that reflects the scoring design more than real conditions, and it can reinforce existing Western media bias rather than measure actual instability.
Fresh evidence from local reproduction
On a fresh local run of main, after waiting for browser-side intelligence ingestion, the client-side CII state was:
- China (
CN):25 - Iran (
IR):31 - Syria (
SY):36
The raw inputs behind those scores in the same browser session were:
- China:
hapiPoliticalViolence = 46,displacementOutflow = 332007 - Iran:
hapiPoliticalViolence = 1549,displacementOutflow = 214271 - Syria:
hapiPoliticalViolence = 21,displacementOutflow = 5647885
So in this reproduced run:
- Iran had 33x China's HAPI political-violence count (
1549vs46), yet both countries landed on the same conflict component (60) - Syria had ~17x China's displacement outflow (
5.65Mvs332k), but only received a small extra displacement boost (+8vs+4) - The resulting overall gap between China and active conflict states was compressed to only a few points
This compression is hard to defend as a faithful measure of real-world stability.
Why the current design creates this distortion
1. Country multipliers are manually tuned and uneven
src/config/countries.ts gives China a much higher event multiplier than Syria:
CN.eventMultiplier = 2.5IR.eventMultiplier = 2.0SY.eventMultiplier = 0.7
Relevant lines:
src/config/countries.ts:24src/config/countries.ts:38src/config/countries.ts:122
This means the same alert or the same amount of news pressure gets amplified much more for China than for Syria.
2. China also gets broad, geopolitically loaded aliases
China is matched using:
chinachinesebeijingtaiwan straitsouth china seaxi jinping
Source: src/config/countries.ts:27
Those aliases sweep in a large amount of geopolitical coverage that is not equivalent to domestic social instability. By design, that can inflate China's score simply because China is central to great-power news cycles.
3. HAPI conflict fallback caps flatten huge severity differences
The fallback conflict formula is:
hapiFallback = Math.min(60, h.eventsPoliticalViolence * 3 * multiplier)Source: src/services/country-instability.ts:876
With the fresh runtime values above, that produces:
- China:
min(60, 46 * 3 * 2.5) = 60 - Iran:
min(60, 1549 * 3 * 2.0) = 60 - Syria:
min(60, 21 * 3 * 0.7) = 44.1
So the cap erases the enormous gap between 46 and 1549. Once that happens, China and Iran look identical on the conflict component despite radically different underlying conflict intensity.
4. Displacement boosts are too coarse to preserve humanitarian scale
The displacement boost is:
+8for>= 1,000,000+4for>= 100,000
Source: src/services/country-instability.ts:1006
That means:
- China at
332,007gets+4 - Iran at
214,271gets+4 - Syria at
5,647,885gets only+8
A country with millions displaced ends up only 4 points above a country just over the lower threshold.
5. News alerts can disproportionately inflate China
The information score includes:
const alertBoost = data.newsEvents.some(e => e.isAlert) ? 20 * multiplier : 0;Source: src/services/country-instability.ts:952
Because CN.eventMultiplier = 2.5, a single alert can add 50 points to China's information component. For Syria, with 0.7, the same mechanism adds only 14.
This is a design choice, not neutral measurement.
Why this is a bias issue, not only a calibration issue
The current scoring setup embeds human judgment in three sensitive places at once:
- country-specific baseline risk
- country-specific event multipliers
- country-specific keyword alias breadth
That is already a normative model. Once combined with hard caps and media-sensitive boosts, it can systematically overstate the instability of geopolitically salient countries like China relative to countries experiencing prolonged armed conflict.
The downstream effect is not abstract:
- users can read China as being nearly as unstable as, or in some sessions more unstable than, active war/conflict states
- the score then appears to validate an existing geopolitical narrative
- this risks reinforcing Western bias instead of describing actual social stability
Expected
A country-instability score should not let media salience and manually tuned multipliers compress away the real difference between:
- a heavily covered geopolitical rival
- an active conflict state
- a country with mass displacement and prolonged war conditions
Actual
The current design can do exactly that.
Suggested fixes
- Revisit or remove country-specific multipliers for politically sensitive countries, especially where the multiplier amplifies media attention more than verified instability.
- Separate "geopolitical salience/news pressure" from "domestic social instability" instead of combining them into one score.
- Replace the current HAPI fallback cap with a mapping that preserves meaningful distance between moderate and extreme conflict intensity.
- Rework displacement boosts so millions of displaced people are not only marginally above six-figure displacement.
- Audit country alias lists to avoid treating broader US-China strategic coverage as a proxy for China's internal instability.
- Document the fairness rationale for all curated country parameters, or move to a more uniform scoring regime.