Skip to main content

Entity classification policy

This document explains how Internacia classifies politically sensitive or non-standard entities. It complements country-code-policy.md and applies to country records only — not intblock membership politics.

Principles

  1. Reference data, not recognition judgments. Fields describe how the entity is modeled for join resolution, not diplomatic recognition.
  2. Explicit over implicit. Non-standard codes carry code_status, entity_type, un_status, and independent so consumers never infer from absence.
  3. Mechanical inclusion. User-assigned country records exist when an intblock roster in this repository requires a join target.

Edge cases

CodeEntityentity_typeNotes
TWTaiwandependent_territoryListed for geographic/reference joins; not a UN member (un_status: non_member).
PSPalestinedisputed_territoryObserver state at UN; capital_city uses Ramallah (de facto administrative seat).
XKKosovodisputed_territoryUser-assigned XK/XKX (de facto EU/IMF/SWIFT standard); former KV/KSV in countries_aliases.json.
EHWestern Saharadisputed_territoryIncluded where intblock rosters require it (e.g. African Union).
VAVatican Citysovereign_stateUN non-member observer; independent: true.
CKCook Islandsdependent_territoryAssociated state of New Zealand; in free association, not UN member.
NUNiuedependent_territorySame free-association status as Cook Islands.
XAXNCIS2 de facto statesdisputed_territory / historical_entityPresent because CIS2 roster references them; see CIS2 section in country-code-policy.

Consumer filters

Official ISO countries only:

SELECT * FROM countries WHERE code_status = 'official_iso3166_1';

Exclude all user-assigned and obsolete codes:

SELECT * FROM countries
WHERE code_status NOT IN ('obsolete', 'user_assigned');

Remap legacy Kosovo code:

aliases = {a["alias"]: a["target"] for a in json.load(open("data/datasets/countries_aliases.json"))}
code = aliases.get("KV", "XK") # KV → XK