Globe List View Methodology
Loading…

Methodology

How verdicts and the Structural Presence Index are produced — and where they fall short.

Updated 2026-05-22

Pipeline summary

For every (country, sector) cell the pipeline runs a fresh search through DuckDuckGo, asks a local LLM (huihui_ai/gemma-4-abliterated:e4b) to generate four targeted query terms, then retrieves real result snippets and asks the same model to score the cell on an 8-point US–China scale (Solid US → Tilt US → Tilt China → Solid China). Every retrieved URL is preserved verbatim; the model never invents a source. A post-generation citation gate strips any [n] reference to a non-existent source. Source domains are then tagged primary / data / think-tank / news / other based on a curated keyword list.

Pipeline flowchart

Every step of a single run, end to end. Colour coding: blue = I/O, violet = LLM call, teal = network search, amber = guardrail / validation, green = external feed, olive = decision, rose = side-channel notification.
flowchart TD Start(["Pipeline start"]):::st --> LoadProg["Load progress.json
last-completed dates"]:::io LoadProg --> InfraGate{"Any feed past staleness threshold?"}:::dec InfraGate -->|No| IdentityPrime InfraGate -->|Yes| Infra subgraph Infra ["Infrastructure refresh"] direction LR I1["Submarine cables
TeleGeography V3
tag US / CN / CONTESTED"]:::feed I2["Military satellites
Celestrak TLE
name-keyword owner tag"]:::feed I3["US carriers
LLM estimate from news
JSON-mode enforced"]:::feed I4["GDP
World Bank PPP
NY.GDP.MKTP.PP.CD"]:::feed I5["Trade flows
UN Comtrade v3
US + CN bilateral totals"]:::feed end Infra --> IdentityPrime IdentityPrime["Identity priming
Each model self-assesses bias
once per session — hard-fail if empty"]:::llm IdentityPrime --> Queue Queue["Build work queue
stale cells first, then oldest
continuous cycling when all fresh"]:::stg Queue --> Cell subgraph Cell ["Per cell loop"] direction TB C1["1. Proxy-gen: 4 targeted queries
JSON-mode enforced"]:::llm C2["2. Search: DDG + Bing CN
ZH query translation per term
circuit-breaker after 10 failures"]:::net C3["3. Tag every URL by tier
primary / data / think-tank /
news / other"]:::stg C4["4. Gemma independent score
8-point scale + citations
JSON-mode enforced"]:::llm C4b["5. Qwen independent score
8-point scale + citations
JSON-mode enforced"]:::llm C5["6. Citation gate x2
strip hallucinated markers,
map valid ones to real URLs"]:::grd C6["7. Debate engine
detect disagreement, run rounds
search-augment if requested
reconcile to final verdict"]:::llm C7["8. Save data.json + report.md
winner, evidence, citations,
full debate transcript"]:::io C8["9. Update progress.json"]:::io C1 --> C2 --> C3 --> C4 --> C4b --> C5 --> C6 --> C7 --> C8 end Cell --> CompleteCheck{"Country at 100 percent complete?"}:::dec CompleteCheck -->|Yes| Bluesky["Optional Bluesky post
completion or flip alert"]:::sid CompleteCheck -->|No| DeployCheck Bluesky --> DeployCheck DeployCheck{"Every 10 entries?"}:::dec DeployCheck -->|No| TimeCheck DeployCheck -->|Yes| Build subgraph Build ["Website build"] direction TB B1["Walk all data.json files
build master_data"]:::stg B2["Aggregate per-country wins
US %, CN %, contentiousness avg"]:::stg B3["Calculate SPI
tier x log1p PPP GDP
+ 2,000,000 point pool"]:::stg B4["Detect flips vs previous run"]:::grd B5["Aggregate citations
tier counts, dedup by URL"]:::stg B6["Write strategic_overlays.json
carrier positions, cable landings"]:::stg B7["Render pages: globe, list,
methodology, per-country,
sitemap, robots"]:::stg B1 --> B2 --> B3 --> B4 --> B5 --> B6 --> B7 end Build --> Deploy["Deploy to Cloudflare Pages
via wrangler"]:::io Deploy --> TimeCheck TimeCheck{"Runtime limit reached?"}:::dec TimeCheck -->|No| Queue TimeCheck -->|Yes| EndRun(["Session complete"]):::dn classDef st fill:#1a3a1a,stroke:#3a8c3a,color:#cfe6cf classDef dn fill:#1a3a1a,stroke:#3a8c3a,color:#cfe6cf classDef io fill:#0f1620,stroke:#3a5a8c,color:#9ec0ec classDef stg fill:#141414,stroke:#2a2a2a,color:#cccccc classDef llm fill:#1a1428,stroke:#5a3a8c,color:#bfa4e0 classDef net fill:#10181a,stroke:#3a6a6a,color:#9ec8c8 classDef grd fill:#1f1810,stroke:#8c6a2a,color:#d8c08a classDef feed fill:#0f1410,stroke:#3a6a3a,color:#bfd8bf classDef sid fill:#1c1014,stroke:#7a3a4a,color:#d8a0b0 classDef dec fill:#181410,stroke:#7a6a3a,color:#d8c89a

Structural Presence Index

Per-country SPI is the tier-weighted share of sectors won by each power. Sector tiers:

Tier 1 (×3) — structural / military: Military Engineering Cooperation, Military Planning Cooperation, Cybersecurity Cooperation, Semiconductor Supply Chain, 5G Telecommunications
Tier 2 (×2) — relational lock-in: Artificial Intelligence Export, Satellite Internet Infrastructure, Port Management and Logistics, Renewable Energy Investment, Spaceport and Launch Capabilities, Rare Earth Mineral Mining, Biotech and Genomic Research, Economic Imports, Economic Exports, Financial Cooperation
Tier 3 (×1) — ambient / soft power: Electric Vehicle Manufacturing, Tourism (Both ways), Public Reception, Immigration & Emigration, Cultural Influence

Regional and global SPI are GDP-weighted means of the per-country scores, where the weight is log1p(PPP GDP) from the World Bank indicator NY.GDP.MKTP.PP.CD. A 2,000,000-point pool is then distributed proportionally to those weights and split across sectors by tier.

Source-quality tiers

Every retrieved URL is tagged by domain into one of: primary (governments, IGOs, regulatory filings), data (established quantitative trackers), think_tank (recognised research institutes), news (established wire services and major outlets), or other (everything else). The tier is shown as a small badge next to each citation. The classifier is a coarse domain-keyword heuristic; it under-classifies primary sources from jurisdictions whose government domains are not in the keyword list, and it cannot tell a strong news article from a weak one within the same outlet.

Chinese-internet sourcing (Phase 1)

English-language search alone systematically under-samples the Sinophone information space — precisely the side of the US–China contest where Beijing is the active player. To partially close that gap, every cell now also runs a parallel Chinese-language search leg: each English query is translated into Simplified Chinese by the model, the translated query is run through cn.bing.com (Microsoft's compliant mainland index), and the resulting snippets are translated back to English for the judge. The Chinese original is preserved alongside the translation in the citation manifest so reviewers can audit translation drift.

Source-stance taxonomy. Chinese-language domains are tagged with an editorial-stance pill that displays alongside the standard quality tier (e.g. a Caixin article reads NEWS · ZH-INDEPENDENT; a Xinhua release reads PRIMARY · ZH-STATE). The five buckets:

zh_state — mainland state media (Xinhua, People's Daily, CCTV, China Daily, Global Times). Reads as a primary source for what Beijing claims, not for ground truth.
zh_party — explicit CCP organs (Qiushi).
zh_independent — mainland commercial / less party-aligned outlets that still operate inside the censorship envelope but produce real reporting (Caixin, 36Kr, The Paper, Yicai).
zh_diaspora — Sinophone media outside mainland censorship (RFA Mandarin, VOA Mandarin, Initium, HKFP, Taiwanese press, BBC/DW Chinese).
zh_translated — English-language outlets that translate / curate Chinese content (China Digital Times, Sinocism, ChinaFile, MERICS, SCMP).

Honest caveat. Reading state media does not make analysis less biased; it makes it biased in a different direction. Mainland state media exists to manufacture a specific narrative. The tier+stance badging surfaces that distinction at the citation level so a verdict resting heavily on zh_state sources is visibly less robust than one drawing across zh_state, zh_independent, and zh_diaspora.

Phase 2/3 (planned, not yet active). Sogou WeChat public-account search; direct site-search wrappers for Caixin, Initium, China Digital Times; a triangulation rule that requires multi-stance coverage before high-confidence verdicts; Zhihu and Weibo integration.

Limitations

This is a real product but it is not a peer-reviewed analytical index. The honest list:

Single LLM as judge. Every cell is graded by one model in one shot, with no ensemble, no calibration, and no inter-rater agreement. There is currently no held-out gold set against which accuracy can be measured.

Multilingual source bias. As of Phase 1, every cell now runs a parallel Chinese-language search leg through cn.bing.com with model-driven translation in both directions (see "Chinese-internet sourcing"). Lusophone, Russophone, Arabophone, and Francophone perspectives are still under-sampled — closing those gaps is on the roadmap.

Tier weights are asserted, not validated. The Tier 1/2/3 weighting is a defensible editorial choice, but no sensitivity analysis has been run to show how stable the SPI rankings are under alternative weightings.

Forced binary. The 8-point scale forbids "tied" or "neither", which discards real information about countries that genuinely hedge (India, UAE, Indonesia, Brazil).

Citation gate is shape-only. The gate guarantees every [n] points at a real retrieved URL. It does not verify that the surrounding sentence faithfully summarises that URL. Misrepresentation of cited sources is the residual hallucination risk.

Carrier positions are illustrative. Aircraft-carrier coordinates on the globe are LLM estimates derived from open-source news, not AIS or fleet-tracker data. They should be treated as a sketch of fleet posture, not a real-time track.

Reproducibility. DuckDuckGo results vary by time, IP, and rate-limiting. Two runs of the same cell will not return identical sources, and the model's verdict can differ. Verdicts should be read as snapshots, not deterministic conclusions.

Coverage at a glance

20 countries × 20 sectors. Citation index currently holds 8759 unique source URLs across 3726 domains (12329 total references).

Sinophone share: 264 Chinese-tagged sources — state 217, independent 2, diaspora 6, translated 39, party 0.

Credits & Sources

Libraries
D3.js v7 — Data-driven documents (Mike Bostock / Observable)
Versor — Quaternion-based globe dragging (Mike Bostock)
satellite.js — SGP4/SDP4 orbital propagation (Shashwat Kandadai)
Three.js — 3D WebGL library (Mr.doob / three.js authors)
Globe.gl — Three.js globe component (Vasco Asturiano)
Geospatial Data
Natural Earth 110m — Country boundaries (Nathaniel V. Kelso & Tom Patterson)
TeleGeography Submarine Cable Map — Submarine cable routes & ownership data
CelesTrak — Satellite TLE orbital elements (Dr. T.S. Kelso)
US carrier positions — LLM estimate from open-source news (illustrative, not OSINT-grade)
Antarctic territorial claims — Antarctic Treaty Secretariat / public domain
Intelligence Analysis
All geopolitical assessments are produced with the assistance of a privately hosted large language model
Intelligence References Loading…
Typography
LT Binary Neue — Typeface family by Linotype
Balance of Power is an independent research project. Assessments reflect open-source analysis and do not represent any government or institutional position.