Public, dated record of every change to how NationsHelm computes nation and leader
scores. The scoring model is versioned independently of the app: MAJOR reorders
headline rankings, MINOR adds or removes a metric or floor, PATCH fixes or
relabels.
5.5.0 — 2026-08-01 — One public scale, end to end (raw representation eliminated)
The dual raw/published bookkeeping introduced in v5.2.0 is gone. There is now
exactly ONE leader scale everywhere — data, pipelines, snapshots, rankings,
code and UI: the public 0–100 scale on which benchmark-matching performance
reads as 60. Two scales cannot drift because only one exists.
- Emission-time mapping. The contribution kernels still produce their
natural 50-centred intermediate, but it is mapped onto the public scale at
pipeline emission (scripts/lib/publishScale.mjs: ×1.2 below 50, 60 + 0.8·Δ
above; strictly monotonic; 0→0, 50→60, 100→100) and never stored. A one-off
migration converted every stored value (4,355 dimension values, 877 legacy
bases, all stewardship records, crisis-response mirrors, diplomatic-conduct
scores) onto the scale.
- The composite is now computed ON the public scale — the gated weighted
mean of the stored dims (mixed above/below-benchmark profiles shift slightly
vs the previous calibrate-after-aggregation construction; documented in the
regenerated roster report). Legacy anchors directly at 60:
clamp(60 + (base − 60) × tenureFactor × luckFactor, 1, 99).
- All raw fields removed from the leader objects, snapshots, feeds and UI
(currentFormRawOverall, currentFormPublished, legacyRatingRaw,
stewardshipRawOverall/Dimensions, the LeaderScore raw/rawPrecise pair, the
drawer/profile raw readouts). Stewardship records store
overall and
per-metric score on the scale directly.
- Thresholds live on the scale they judge. Archetype pillar floors and
rule cut-offs are the exact public-scale images of their former kernel
values (35→42 · 50→60 · 65→72 · 58→66 · 55→64 · 53→62 · 75→80 · 28→34 ·
30→36 · 25→30), so vetoes and classifications carry over.
- A parity test pins the .mjs emission map to its TS mirror so the one
function cannot fork.
MINOR: representation change; per-leader composites shift only where mixed
profiles interact with the former nonlinear aggregation order.
5.4.0 — 2026-08-01 — Benchmark-anchored Legacy, cri calibration, core-dimension floor, band-aligned semantics
Four corrections from the post-v5.2.0 methodology audit. Rank order within each
rating is preserved where the underlying values are unchanged; where values move
(Legacy, the core floor) the regenerated diff report and the snapshot diff gate
document every shift.
- Legacy is now benchmark-anchored. The tenure and luck factors previously
multiplied the ABSOLUTE performance base (base × tf × lf), which silently moved
the neutral point — a leader who performed exactly at the world benchmark
drifted below it on a short tenure or above it under a headwind, a rating
change produced by no performance signal. The factors now scale the DISTANCE
from the benchmark: legacyRaw = clamp(50 + (base − 50) × tenureFactor ×
luckFactor, 1, 99). A benchmark performance stays a benchmark legacy regardless
of tenure length or macro conditions; tailwinds discount credit, headwinds
amplify it, and neither moves a leader with nothing to scale. Observed shifts
on the roster: −3 to +7 raw points (median +5).
- Crisis Response joins the published calibration. Its internal 50 is the
median outcome among comparable-severity crises worldwide (±10 severity
points) — a benchmark point in the same sense as the world trajectory — so a
published 60 now means "matched the typical comparable-crisis outcome" on
every dimension alike. Raw values and the composite are unchanged; null stays
"Untested". Diplomacy and Communication are documented as behavioral
leadership signals (media-derived conduct/communication measures) rather than
national-outcome trajectories.
- Core-dimension floor. A rating now requires ALL FOUR core dimensions —
Governance, Economy, Politics, Institutional Integrity — sourced, on top of
the 50%-of-weight floor. A share-of-weight floor alone let two "rated" leaders
measure structurally different things. 18 of 885 previously-rated mandates
drop to "No data". The dossier shows an explicit coverage note (n/8) beside
every rating, and the composite is described as "up to eight dimensions".
- Strengths/Weaknesses and Challenges are band-aligned. A strength requires
≥70 published (strong band); a weakness requires ≤57 (below the benchmark
band); dimensions at 58–69 are near-benchmark and belong to neither column —
previously everything under 70 was branded a weakness, including
above-benchmark 60s. Challenge flags fire only below the benchmark band
(<58; severe <48), replacing the per-dimension exceptions (Economy <64) that
flagged values that had beaten the world.
- Stewardship hardening. The group weights are documented as mirrors of the
current-form weights, always renormalized over eligible groups (they
intentionally do not sum to 1). A new rank-eligibility floor (≥3 of 4 groups)
gates any future GLOBAL Stewardship ranking; a 2-group score remains visible
on the leader's own page.
- Reproducibility & transparency. The methodology now states the full
recipe: every k sensitivity, the unweighted blends, the 2-year endpoint
tolerance, the ±10 crisis-severity neighbourhood, the 20-day GDELT floor, and
the exact published map (raw×1.2 below 50; 60 + 0.8·(raw−50) above). Editorial
archetype pins are now enumerated in a generated public ledger on the
methodology page (a pin names the label only — never a score).
MINOR: corrects the legacy anchoring and adds a coverage floor; per-leader
values shift accordingly, documented in the snapshot diff.
5.3.0 — 2026-08-01 — Defense retired as a leader dimension (8-dimension stat set)
Defense (def, weight 0.07) overlaid the NATION's Military Score — a log-scaled
composite of real force counts — onto the person. That is a property of the country,
not something the leader's tenure moved, and under the contribution model (v5.0.0)
it was never produced: every leader read "No data" on the axis. The dimension is
retired; national military capability stays scored where it belongs, on the nation's
own Military Score.
- The leader stat set is now eight dimensions (gov · eco · dip · pol · cri · vis
· com · int). Radar, ledger columns, OG cards, comparisons and copy all drop the
axis; the registry row and its
def key are removed.
- No score changes.
computeOverall renormalises over sourced stats, so only
weight RATIOS matter — the eight remaining weights keep their exact values (they
now sum 0.93, normalised at display time), and since def was always null it
never participated in any composite. The republished snapshot's diff gate ran
clean: zero value findings (snap-20260801-7bd55011).
- Archetypes: the def-gated derived rules (strongman trait, crisis-hero →
military-commander, dominant-def) were dead code — none could fire on a null def —
and were removed with the dimension. Archetypes whose pillar lists named
def
keep their remaining pillars; military-commander (whose only pillar was def)
becomes curated-only. No leader's archetype changes.
data/officials.json cleaned: the inert def: null keys were stripped from 1,157
stat blocks.
MINOR: removes a metric; no composite, rank, or archetype changes.
5.2.0 — 2026-08-01 — Published leader-score calibration (benchmark = 60) + the Stewardship lens
The leader contribution model is centred on 50: a leader who matched the world's
trajectory scored exactly 50. That is statistically correct and semantically wrong on
a public 0–100 rating — readers take 50 as mediocre or failing, so a competent steward
of an already-excellent, mature economy (raw high-40s/low-50s: Frederiksen 56.8,
Støre 48.3, Kristersson 46.1, Orpo 46.4) read as underperformance. This is a semantic
calibration, not a change in measured performance: the underlying contribution
estimates are unchanged. The published scale now maps benchmark-matching performance
to 60 rather than displaying the statistical neutral point at 50.
- One canonical map (
lib/leaderScoreCalibration.ts): strictly monotonic,
piecewise linear — raw 0 → 0, raw 50 → 60, raw 100 → 100 (below 50: ×1.2; above:
60 + 0.8×(raw − 50)). Applied ONLY after a raw dimension or composite is fully
computed; the composite is never rebuilt from calibrated dimensions (the map is
nonlinear). Null stays null; a failed coverage gate is never calibrated into a score.
- Raw everywhere internal, published everywhere public. The contribution kernels,
baselines, world means, sensitivities, coverage gates, weights and composite
construction are untouched; snapshots, sorts, comparisons and rankings stay on the
raw scale (
currentFormRawOverall is byte-identical to the previous
currentFormOverall). Rank order is provably unchanged — see
docs/data-quality-fix/leader-calibration-diff-report.md (871 scored, 0 rank moves).
- Per-dimension policy (audited): gov/eco/pol/int/vis (contribution kernels),
dip (Diplomatic Conduct amplifies deviation from the 50 midpoint) and com
(rank-relative around 50) are calibrated. cri is not — Crisis Response is an
absolute response-quality scale (null = "Untested"), so 50 is not a benchmark point
there. def is not produced under this model.
- Legacy Rating publishes through the same calibration, applied after the full raw
legacy computation (base × tenure factor × luck factor); the raw legacy survives as
legacyRatingRaw for the ledger and the pinned snapshot.
- Interpretation bands (published): 80–100 exceptional contribution · 70–79 strong
· 58–69 broadly in line to positive · 48–57 below expected trajectory · 0–47 weak.
All banded copy, tints and prose thresholds were remapped through the exact
calibration so no leader's classification changed. Public UI no longer describes 50
as "average" — on the published scale, benchmark-matching performance is 60.
- The transparent ledger keeps both scales (e.g. raw 57.0 → published 65.6,
displayed 66) on the dossier profile and the /leaders "Why this rank?" drawer.
Stewardship (new, separate lens). Answers "did the leader preserve, improve or
erode strong conditions inherited at the start of the tenure?" — never blended into
currentFormOverall, the ranking, or OVERALL_WEIGHTS. Level/stock indicators only
(WGI Government Effectiveness, Voice & Accountability, Control of Corruption, V-Dem
free/fair + inverted executive corruption, innovation stock where available); flow
metrics are excluded. A metric is eligible only when the inherited baseline ≥ 75 on
its normalized scale — the level gates eligibility, never the score (a 90 baseline
earns no more than an 80). Score = clamp(50 + (leaderΔ − worldΔ) × 3.0) with the same
baseline-year resolution and year tolerance as the contribution engine, published
through the same calibration (60 = preserved relative to global movement). Gates:
≥ 2 eligible sourced groups, the 6-month tenure floor, and at least one genuinely
post-entry observation — else null ("No data"), never zero. Kernel:
scripts/lib/leaderStewardshipScore.mjs; pipeline:
scripts/compute-leader-stewardship.mjs; registry rows added for the composite and
its four groups.
MINOR: adds a published display calibration (rank-preserving; raw model untouched)
and a new, separate Stewardship metric.
5.1.0 — 2026-07-27 — Vision returns as an innovation-contribution (former leaders)
v5.0.0 shipped with the leader Vision dimension unscored (null) — the deferral was
right but the reason was wrong: the WIPO patent series is already per-million (not raw
counts), so the real problem was that Vision blended absolute levels while the global
innovation frontier rises steeply, making almost every leader read as declining, and
that mixing patents (coverage ends ~2021) with tertiary enrolment (runs to 2025) created
a discontinuity when patents dropped out (India read a fake collapse to 0).
- Vision is now a percentile-rank contribution, consistent with the WGI dimensions:
each year, patents-per-million and tertiary enrolment are ranked across all countries;
Vision is the change in that innovation rank over the tenure, net of the world (50 =
neutral). A country holding a top rank reads neutral (not penalised by the rising
frontier); one that climbs the field reads positive.
- Tied to the patent window (composition stays constant). Because patents lag ~3
years, active leaders have no fresh endpoint and read "No data" (no-stale-as-current);
only former leaders whose mandate sits inside the patent window are scored (~347).
Merkel 30 (Germany lost innovation ground as Asia surged), Mujica 79 (Uruguay climbed).
MINOR: restores a dimension; re-derives Vision for former leaders only.
5.0.0 — 2026-07-26 — Leader scores measure CONTRIBUTION, not the country's level
Until now a leader's Governance/Economy/Politics/Integrity read the absolute level of the
country they run — active leaders overlaid the live World Bank / WGI level, formers the
term-window mean of the same. But a country's standing is a property of the nation, shared by
whoever holds the office: it made Merkel score 82 ("Germany is rich"), not for anything she did,
and — worse — a new leader inherited the predecessor's numbers the day they took office (the
successor and the departed leader read the same country). The score answered the wrong question.
- Every leader dimension is now a CONTRIBUTION. For each country indicator we take the
trajectory over the tenure —
S[end] − S[inauguration−1] — and subtract the world's move over
the same window (the counterfactual: a global recession no longer sinks everyone's score). The
result maps to 0–100 where 50 = neutral (kept pace with the world), >50 improved the
country's standing, <50 declined. WGI dimensions are percentile ranks, so the world term is
near-flat and the rank delta is already world-relative; it does real work on the raw-rate econ
series. scripts/compute-leader-contribution-form.mjs + scripts/lib/leaderContributionScore.mjs.
- Same measurement for active and former — the read-time absolute-level overlay is removed, so
a sitting leader and a departed one are directly comparable (open vs closed window), and the
succession paradox is gone: a successor's contribution starts from THEIR inauguration, so they
inherit nothing. Merkel 82→55, Mujica 69→50 (maintained already-strong countries); Modi's
economic/governance gains show alongside his democratic decline (pol 41) the level model hid.
- A 6-month tenure floor + ≥2-dimension coverage floor. A leader with too short a tenure, or
whose indicator series has not yet reached their term, has no measurable trajectory and is
Not yet rated — a sitting head of state keeps their dossier but shows no number (active), a
former with no sourced basis has no card. This subsumes the "no score for brand-new leaders" gate.
- The difficulty multiplier and the Context-Adjusted Leaders insight are retired. Contribution
is already country-neutral, so adjusting a leader's score for "national difficulty" double-counts;
difficultyAdjustedOverall, difficultyMultiplierFor, and the whole context-adjusted ranking
(catalog entry, generator, facts, methodology) are removed.
- Vision is temporarily unscored for leaders (bake null) pending a per-capita-normalised
contribution pass (v2); Crisis Response and Communication keep their existing tenure/person
pipelines; Diplomacy stays active-only; Defense is no longer overlaid.
MAJOR: re-derives and reorders every leader ranking; removes an insight type.
4.0.0 — 2026-07-26 — No score is ever authored: the curated historical-leader model is removed
NationsHelm's first law is that every value is sourced or derived, never invented. One
surface still broke it: ~20 "ICON" leaders (Lincoln, Churchill, Gandhi, Mandela, Napoleon,
Lee Kuan Yew, …) were scored from a hand-authored 11-dimension editorial model
(historicalScores, the "historical-leader-v1" formula) — a Legacy Rating and Peak-Career
Rating computed from curated numbers, not sourced indicators. That is an authored score, and
authored scores are now eliminated entirely.
- The curated
historicalScores model is gone. No leader is scored from editorial
dimension values. A former or historical leader is rated only from sourced/derived
tenure data — the coverage-weighted overall of their tenure-windowed indicators, adjusted
for tenure (diminishing returns) and macro luck (computeLegacyScore). If a mandate
predates the sourced-data window, the leader is Unrated (Legacy AND Peak both null),
never assigned an authored number.
- Leaders whose mandate ended before 1990 are removed from the dataset. They cannot be
sourced (the indicator panels begin in the mid-1990s), so 13 pre-1990 ICON records were
deleted rather than shown Unrated: Churchill, Lincoln, Washington, Atatürk, Bismarck, FDR,
Julius Caesar, Alexander the Great, Napoleon, de Gaulle, Gandhi, Bolívar, Theodore Roosevelt.
- Post-1990 leaders keep only what is sourced. Angela Merkel and José Mujica retain a
rating (real tenure-windowed current form); Lee Kuan Yew, Deng Xiaoping, Margaret Thatcher,
Nelson Mandela and Václav Havel lose their curated Legacy/Peak and read Unrated unless a
sourced tenure pass can rate them.
- Peak-Career Rating no longer has a separate authored ceiling; the displayed Peak falls
back to the finalized tenure record. The methodology page's "historical editorial model"
section and the per-leader "Score Attributes" breakdown are removed.
- Leader search indexation no longer keys on the curated
historicalScores signal (its
only discriminator for the former/historical class). Former/historical mandate pages are now
noindex, follow; only active leaders with a sourced Leadership Rating are indexable.
MAJOR: removes rated leaders from headline Legacy/Peak rankings and deletes records.
3.0.0 — 2026-07-26 — Quality of Life gains two pillars: Basic Living Conditions and Environment
Quality of Life was three pillars — Safety, Healthcare, Education. Its public description
claimed it covered "health, safety, environment and living standards," which the formula did
not measure (no environment, no living-standards input; the FAQ/JSON-LD also silently omitted
Education). This makes the claim true: it adds living conditions and environment for real, and
corrects the copy to name only what is scored.
- QoL is now five equal pillars (20% each): Safety, Healthcare, Education, Basic Living
Conditions, Environment — the equal-weighted mean of the present pillars (renormalised;
≥half-of-groups coverage floor unchanged, now ≥3 of 5).
- New pillar: Environment. A single sourced signal of lived air quality — PM2.5 mean
annual exposure (World Bank / WHO
EN.ATM.PM25.MC.M3, µg/m³), inverted so cleaner air scores
higher, domain [5, 75] (WHO Air Quality Guideline → hazardous ceiling). 195/203 nations, all
2023. This is the signal that reflects, e.g., that India's and the Gulf's air quality is among
the world's worst — a QoL fact the three-pillar model missed entirely.
- New pillar: Basic Living Conditions. A
weighted group, renormalised over present inputs:
- Basic sanitation — World Bank / WHO-UNICEF JMP
SH.STA.BASS.ZS (share using at least
basic sanitation), weight 0.40, domain [30, 100].
- Electricity access — World Bank
EG.ELC.ACCS.ZS, weight 0.30, domain [40, 100].
- Clean cooking access — WHO via World Bank
EG.CFT.ACCS.ZS, weight 0.30, domain
[20, 100].
- Group floor ≥2 of 3 (
GROUP_MIN_METRICS): below two present inputs the pillar is "No
data", so a lone near-universal reading (electricity is ~100% almost everywhere) can't stand
in for the whole pillar. 200/203 nations qualify (Taiwan, Kosovo, Vatican excepted).
- Why basic, not safely-managed, sanitation. Safely-managed sanitation (
SH.STA.SMSS.ZS) is
a higher rung but only 142/203 nations report it; scoring on it would judge reporting nations
against a harsher bar than non-reporters, and imputing the missing values is banned
(no-synthetic). Basic sanitation is the rung all 199 covered nations share, so the pillar
scores everyone on one scale. Safely-managed is ingested display-only for dossier context.
- Poverty stays out of the score. Extreme-poverty headcount (
SI.POV.DDAY) has a fresh
reading (≤3y) for only ~62/203 nations (median vintage 2021), so scoring it would render stale
values under a current label (no-stale-as-current). Ingested display-only as dated
historical context.
- Weighted within-group aggregation is now supported (
aggregateGroupScore renormalises over
present weights); the pillar mean at the category level stays flat (25% each).
- Copy corrected. The nation FAQ / FAQPage JSON-LD now names the actual scored groups
(derived from the category, not hand-typed) instead of the inaccurate "environment and living
standards" claim.
MAJOR: reorders the "Highest Quality of Life" ranking and shifts Overall for nations whose
sanitation/electricity/cooking access diverges from their prior three-pillar QoL.
2.10.0 — 2026-07-23 — Bloc taxon opened: type-derived, not a hand-picked allowlist
The Geopolitics "blocs" signal no longer scores a hand-picked list of ~30 orgs. That list
was arbitrary, silently incomplete (it omitted Council of Europe / OSCE / WTO, so Ukraine read
"No bloc memberships on record" despite deep Euro-Atlantic integration), and its gaps fed the
2.9.0 fake-zero. The taxon is now open and derived from the source:
- Every membership is ingested, not a fixed list. We take all of a nation's current
Wikidata bloc memberships (deduped by entity), record the full count, and keep the subset that
are geopolitical/economic alignment blocs — a 30-org allowlist no longer decides what counts.
- What counts as a bloc is decided by the org's own type, not by hand. An org is scored if
its Wikidata type is an alignment type (military alliance, regional organization, trade bloc,
customs/economic/monetary union, supranational union, geopolitical group, cartel, …) within a
size band (≥4 members — drops bilateral/trilateral vanity arrangements; ≤120 — universal bodies
carry no signal), plus a small explicit supplement for significant blocs Wikidata under-types
(OSCE, Council of Europe, SCO, OECD, OAS, OIC, Francophonie, Pacific Islands Forum). This yields
35 scored blocs; universal UN-system bodies (UN/WHO/WTO/ITU…) and technical/functional IGOs
(development banks, hydrographic org, treaty regimes) are shown in the total but not scored —
they don't discriminate alignment.
- Why not raw count or IDF. Empirically: raw membership count saturates (every state is in
dozens of UN-system bodies); IDF/rarity-weighting ranks backwards (a 4-member Five Eyes
outweighs NATO/EU); a pure size band admits technical bodies (Germany scored 44 on dev-banks +
hydro org). Type + size + supplement is the combination that isolates alignment blocs.
- The score is a diminishing curve, not a linear count. The sub-score is the count of scored
blocs on
100·(1−e^(−n/4)) — never saturates (n=1→22, 4→63, 9→90), replacing the old count×20
(which capped at 5 blocs). It is null only when a nation has no membership data at all (a
territory Wikidata doesn't cover) — renormalised out; a nation with memberships but no
alignment bloc (North Korea: UN-system only) scores a real 0, never a fabricated one.
- The card copy is retired. The Global Influence card shows scored blocs plus a total; "No
bloc memberships on record" is gone.
Score impact. The change re-scores the Geopolitics sub-score across the cohort. It feeds
Strategic Position, not Overall, so headline rankings and the Risk board are unaffected (confirmed
by a clear snapshot diff). Representative readings: Germany 86, France 89, US 83, Russia 83,
Switzerland 71. The headline lift is Ukraine — Geopolitics 13→63 (GUAM/OSCE/CoE/CIS-FTA,
previously read as "blocless"), with China 53 (SCO/BRICS/G20); the headline correction is
North Korea — 13→0 (UN-system only, so a real 0 rather than the old fake 13), Vatican 0.
Micronesia / Marshall Is. / Palau now carry the Pacific Islands Forum (a Wikidata membership gap,
still hand-patched).
Supersedes 2.9.0 (the fake-zero null-fix): the null-vs-0 handling is now expressed through the
full membership count, and the empty-list ambiguity is gone because the taxon is comprehensive.
2.9.0 — 2026-07-23 — Bloc membership is null, never a weighted zero
An empty tracked-bloc list is no longer scored as a real 0 inside the Strategic Position
Geopolitics component or the Global Influence metric-category. Both now route the bloc
signal through one shared helper that returns null for an empty list, and renormalise over the
signals that are actually present:
- The fake-zero. The old score multiplied a bloc count by 20, so an empty list became a hard 0
that entered Geopolitics at 40% weight. Because an empty list is a structurally-valid value
(not null), it slipped past every missing-data guard — the "missing is null, never a fabricated
fallback" rule was violated in silence. Ukraine (in no tracked exclusive bloc — its Council of
Europe / OSCE / WTO memberships were out of the tracked scope) scored Geopolitics 13,
dragging Strategic Position to 46.
- The fix. Empty → null → renormalised out. Geopolitics still requires ≥1 sourced
quantitative signal (soft power or GDP share) — a bloc list alone can't assert a score
(Taiwan: no formal bloc, real weight), so the "no quantitative signal → null" guard is
unchanged. The weight ladder (0.4/0.3/0.3, with the 0.57/0.43 two-signal fallbacks) is kept
verbatim — only a null signal now drops out — so every present-bloc nation is byte-identical
to before.
- Coverage repair (data). Micronesia, Marshall Is., and Palau — full Pacific Islands
Forum members the Wikidata fetch silently dropped and the manual patch missed — are added to
the manual supplement and backfilled into the nation profile; they now carry PIF instead of
"No bloc memberships on record".
- Not changed (documented follow-ups). The bloc ingest contract still measures an aggregate
coverage floor and excludes zero-bloc nations from its payload, so it remains blind to a single
nation dropping to zero — a per-entity/known-member guard is the recurrence fix. The tracked-org
set (30 exclusive blocs) still excludes integration bodies (Council of Europe, OSCE, WTO); "No
bloc memberships on record" copy is scope-accurate only for exclusive blocs. (2.10.0 supersedes
this by opening the taxon.)
Score impact. Confined to the empty-tracked-bloc set — every present-bloc nation is
byte-identical. The 22 nations with an empty list get an honest, renormalised Geopolitics
(or "No data") instead of a laundered wrong number: Ukraine Geopolitics 13→22, Strategic Position
46→48, with similar lifts for Georgia, Serbia, Bosnia, Taiwan, North Korea, and the
microstates/territories. No Overall or Risk-board movement.
2.8.0 — 2026-07-23 — Violence & Safety re-anchored to UCDP conflict thresholds
The Stability Violence & Safety sub-signal no longer inverts per-capita deaths against the
worst country in the cohort. It is now min(perCapita, bandCap):
- perCapita — deaths per million on a log curve to a FIXED anchor (50 dpm → 0). Government
Stability is state-continuity, which is relative to population, so 623 organized-violence deaths
in a 1.4B state (an insurgency) is not scored as a war, while the same count in a micro-state is.
- bandCap — UCDP's OWN intensity thresholds cap the score so an absolute armed conflict can't
read as "safe" even in a huge country (and 1 death ≠ 0): 0 → 100 · 1–24 → ≤90 · 25–999
(UCDP armed conflict) → ≤60 · 1000+ (UCDP war) → ≤15. Thresholds inherited, not invented.
- Fixed anchors, not a cohort max: a country's safety no longer moves because an unrelated
country's war changed the maximum.
- Worse-of the two readings: the blend takes the lower of the finalized-annual (GED) and
current-year (CED) safety, so a calm year-to-date partial can no longer launder over a country
that was at war last year (the Iran "96 / Low political violence" bug → now "Active conflict", 15).
Score impact. Stability drops for conflict-affected nations (Iran 44→31, Syria 34→20, Russia
48→34, Mexico 53→39, CAR 45→23…); nations with zero organized-violence deaths are unchanged (safety
100). The Overall headline board is stable (only RK 36–40 shuffle ≤4); Risk-top-15 gains Togo and
Niger. The QoL active-conflict cap (D6) is unaffected — it still reads the raw per-million counts.
2.7.0 — 2026-07-22 — Diplomatic Conduct (leader Diplomacy dimension)
A leader's Diplomacy dimension now overlays from Diplomatic Conduct, a
performance-under-test model replacing the volume-dominated Diplomatic Signal. Two axes like
Crisis Response: Test Severity (context — hostility of the external environment, from UCDP
active-conflict intensity + conflictual event share + sanctions received) and Conduct (the
scored blend), with severity amplifying the conduct deviation so strong conduct under fire is
worth more.
- Conduct components (renormalized over present weight, null below half): cooperative ratio
20% · restraint 20% (inverse of NET material force projected — QuadClass-4 initiated minus
received, size-normalized — the leader-as-actor signal) · coalition breadth 15% · agreements &
mediation 15% (CAMEO 045/046/057/036 as initiator) · sanctions balance 10% (imposed − received)
· engagement 10% · leader foreign-media tone 10%. Sourced from directed GDELT event data.
- Why it changed: the old signal was 40% engagement volume + 30% cooperative share, so it
measured diplomatic capacity (big active powers topped out) not conduct, and a belligerent
leader projecting force abroad scored high. Restraint (net force initiated) is the fix; NET
(initiated − received) separates an invaded defender who fires back from an unprovoked aggressor.
- Known limits (documented): a symmetric war dilutes the aggressor's net (Russia's counter-
attacked footprint), and proxy warfare isn't attributed to its sponsor (Iran) — GDELT records
events, not who started a war. The prior Diplomatic Signal is retained on the record but
deprecated.
Score impact. Leader Diplomacy re-scores across the active cohort. Zelenskyy holds (86,
restraint 89 — invaded); Trump 90→75, Putin 76→58 (with traits), Netanyahu 81→59 (restraint 3).
Diplomatic Conduct is a proxy — maximum confidence "medium".
2.6.0 — 2026-07-19 — D6: Quality-of-Life active-conflict hard cap
Quality of Life is hard-capped at 40 for any nation that is an active organized-violence
party, correcting a structural blind spot: the Safety group's conflict metrics are
population-scaled (deaths per million), so a large nation at war reads "safe" (Iran's armed-
conflict deaths scored 93; Mexico's an average that didn't tank QoL), and where the primary
homicide series is absent the Safety group nulls out entirely, leaving QoL as Healthcare +
Education only (Iran QoL 80). Neither reflects that a war zone is not a high-quality-of-life
place.
- The trigger requires two UCDP readings. Still active this year — current-year deaths per
million > 0 — AND at meaningful annual scale — finalized deaths per million ≥ 10.
Both are freshness-gated, so a resolved conflict cannot trip it. Requiring both keeps genuine
wars (Ukraine, Russia, Iran, Israel, Syria, Mexico, Colombia, Myanmar, Pakistan, Lebanon,
Cameroon) while sparing one-off localized violence a bare "any death this year" rule over-caps
(Brazil 20 deaths, Thailand 7, Guatemala 1).
- The cap is a
min(), not an average — high Healthcare/Education cannot renormalise it away.
The category carries the pre-cap value and a capped flag so the UI shows "80 → 40, capped:
active conflict" rather than an unexplained number.
- Transparency (later metadata-only republish, 0 value moves). The capped value and its
pre-cap number are threaded through the snapshot projection and rendered on the category card as
a "capped — active conflict" chip ("80 → 40"), so the score never reads as an unexplained
contradiction of the visible group scores. The two UCDP conflict metrics document the cap in the
registry; the methodology page gains a "Why is a country's Quality of Life capped when it's at
war?" entry.
- Not in this release. A matching active-conflict diplomacy penalty is implemented in code
but NOT yet activated in data — it is being reworked so leader-level violence is captured even
when a war is fought off the leader's own soil (location-based UCDP misses it). Will land in a
later version once settled.
Score impact. 11 nations' QoL drops to 40; Overalls fall 2–10 (Russia 58→48, Iran 49→41,
Mexico 51→45, Israel 64→60, Ukraine 49→46, …). Shipped ON after the diff review.
2.5.0 — 2026-07-16 — Group D metric-semantics: net debt (D2) + unemployment gate (D3)
Two Group-D semantics options, signed off after review and shipped ON (the semantics flags were
inert stubs — this release actually implements them). D1 (public-spending band-optimum) stays
OFF — a contestable normative band, not an error correction.
- D2 — Debt/GDP reads NET where the IMF publishes it. The metric now scores from IMF
general-government net debt (2024, 84 nations) where available, else keeps the World Bank
gross reading. Net uses a domain sharing the gross 150%-of-GDP worst-case ceiling but
floored at 0, so net-creditor states clamp to 100 (Norway net −149% → 100; Australia gross 58 →
net 32; Brazil 82 → 61). Nations the IMF does not net (Singapore — sovereign assets in
GIC/Temasek) keep gross with the "Debt / GDP" label; net-scored nations render "Net debt / GDP".
Flat-mean Fiscal Health (3 metrics) already caps any single reading's weight. 25 nations swap
gross→net, 59 gain net where they had no gross, 43 keep gross.
- D3 — Unemployment gated on labour-productivity presence. In high-informality / subsistence
economies a near-zero measured unemployment (Solomon Islands 1.44% → 100) is an artifact;
where labour productivity is not sourced, unemployment is dropped and renormalised out of
Labor Market rather than inflating it. Developed economies (productivity present) are unchanged.
Score impact. 76 Economy movers, 34 Overall movers (all ±1–3). The top of the ranking
reshuffles within the near-tied leaders — Denmark 85→86 takes #1 from Norway; Luxembourg 81→82 and
Ireland/Estonia rise into the top-15; Japan 81→80 (its high net debt now counted). D3 lowers Cuba
Economy 41→29, Solomon Is 60→58, Samoa/Tonga/PNG −2. Momentum is a separate historical pipeline
and is unaffected.
2.4.1 — 2026-07-16 — Diff-review revisions
- A1 core-category rule — the ≥4 present categories must now include Economy AND Quality
of Life. Nulls North Korea's Overall (no sourced Economy; it was building one from governance
- QoL + innovation + stability); keeps the Pacific microstates that have real Economy + QoL.
- A3 War-null fix — a state with no measurable military (derived military score = 0: no-army
microstates and force-count data gaps) no longer scores the War scenario
0. War is null
(renormalised out) below a measurable-military floor — absence is not "certain defeat".
Score impact. North Korea's Overall nulls. Saint Vincent falls from the #1 riskiest nation to
#5; the homepage Risk Signal top-3 becomes Yemen/Haiti/Syria. Every conflict state (measurable
military) is unaffected.
2.4.0 — 2026-07-16 — Data-quality remediation (Groups A–F)
Aggregation integrity (A)
- A1 An Overall now requires ≥4 of the 5 categories present (was: renormalise over
any present set). Solomon Islands 75→50; Tonga/Grenada/San Marino corrected; nothing
lost its Overall net (A4/A5/A6 restored the categories that should score).
- A2 Per-category coverage floors: ≥50% of a category's groups present and ≥2
sourced metrics. Worst-of Safety with no sourced homicide asserts only a real conflict
threat, never a false-100.
- A3 Risk/Resilience gated on the nation carrying an Overall — data-sparse
Gabon/Malawi/Libya/Hong Kong excluded from Risk; conflict states top the list.
- A4 Stability category = the 5-signal Government Stability blend (weighted registry
groups), replacing the lone WGI Political-Violence series.
- A5 Innovation category now scores the Oxford GARI AI-readiness index (195 nations).
- A6 Governance coverage measured over groups, not the sparse raw-metric count —
full-WGI Switzerland/Qatar/San Marino now score Governance.
Formula & consistency (B)
- B1 Difficulty-Adjusted score reconciled onto the single continuous multiplier
(×1.00 at nation overall 70, clamped [0.92, 1.18]); methodology + registry + tooltip
now agree; the phantom multiplier definition retired.
- B2 Same-page contradictions fixed (water-scarcity on null, Peak Strengths reading
the displayed stats, election-type vs free-fair-index labelling).
Coverage (C) — Taiwan V-Dem/V-Party join repaired via the canonical crosswalk (data
lands on next ingest); dead GDELT media modules collapse and the false "~173 tracked
hourly" claim retracted; leaked military honorifics stripped from leader names.
Infrastructure (F) — declarative registry fields (weight/status/band); canonical
entity crosswalk + audit; leader-page ISR vintage aligned; data-quality CI gate.
Deferred (documented, not shipped): D1–D3 metric-semantics flags (OFF, pending
sign-off); F3 ingest contracts / F4 versioned snapshot / F6 anomaly detection (designed).
Score impact. Solomon Islands Overall 75→50; Tonga/Grenada/San Marino Overalls corrected;
data-sparse Gabon/Malawi/Libya/Hong Kong drop out of Risk and conflict states rise to the top of
the Risk board; Switzerland/Qatar/San Marino now score Governance.
≤ 2.3.x — pre-remediation
Continuous difficulty multiplier (was tiered); FSI dropped from Government Stability;
frozen-indicator gating; momentum rebuilt on real history; RNG purged. See git history.