Skip to content

CII manual tuning can over-amplify China relative to active conflict states, creating a geopolitical bias problem #2457

@zouyonghe

Description

@zouyonghe

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 (1549 vs 46), yet both countries landed on the same conflict component (60)
  • Syria had ~17x China's displacement outflow (5.65M vs 332k), but only received a small extra displacement boost (+8 vs +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.5
  • IR.eventMultiplier = 2.0
  • SY.eventMultiplier = 0.7

Relevant lines:

  • src/config/countries.ts:24
  • src/config/countries.ts:38
  • src/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:

  • china
  • chinese
  • beijing
  • taiwan strait
  • south china sea
  • xi 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:

  • +8 for >= 1,000,000
  • +4 for >= 100,000

Source: src/services/country-instability.ts:1006

That means:

  • China at 332,007 gets +4
  • Iran at 214,271 gets +4
  • Syria at 5,647,885 gets 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

  1. Revisit or remove country-specific multipliers for politically sensitive countries, especially where the multiplier amplifies media attention more than verified instability.
  2. Separate "geopolitical salience/news pressure" from "domestic social instability" instead of combining them into one score.
  3. Replace the current HAPI fallback cap with a mapping that preserves meaningful distance between moderate and extreme conflict intensity.
  4. Rework displacement boosts so millions of displaced people are not only marginally above six-figure displacement.
  5. Audit country alias lists to avoid treating broader US-China strategic coverage as a proxy for China's internal instability.
  6. Document the fairness rationale for all curated country parameters, or move to a more uniform scoring regime.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: AI/intelAI analysis, intelligence findings, summarizationbugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions