Method

Methodology

This page documents the structures behind every data surface on the site. The contract is simple: every number is sourced, every judgement is labelled as a judgement, and every projection is anchored to something real. The page is organised around six objects that the site actually implements, with links to the live pages where each is visible.

Epistemic stance

Trend reports and foresight documents orient a conversation. They are useful, and this site does not compete with them. The difference is structural: a trend narrative cannot be wrong, and this site is built so that it can be.

Four properties carry that distinction:

  • Claim-level citations. Load-bearing claims carry inline references to a named source, not a bibliography at the end of the document. Every data page carries a collapsible Sources dropdown listing every source, numbered and linked.
  • Claim-level epistemic status. Content is tagged ● measured, ◐ inferred, or ○ projected at the claim, not at the chapter.
  • Re-runnable evidence. The data pipelines, sources and licences behind each figure are documented, so a sceptic can re-derive the numbers rather than re-read the argument. Where possible we test our own inferences against independent measurements (the mine-water worked example).
  • Resolvable claims. Statements that can be wrong get a criterion and a date, and are publicly resolved, misses included, on the Forecast Lab ledger.

1. Entity

An entity is a named thing the site tracks: a country, a company, a facility, a product, a regulation, a risk, a water body, a bloc. Each has a canonical slug and lives in the relations graph. The registry files (countries.json, facilities.json, companies.json, etc.) are the source of truth.

Entity types currently in the registry: countries (175), products, regulations, facilities, companies, water bodies, blocs, and risks. Each entity can be inspected via the graph's ?focus= deep link (e.g. country:thailand).

2. Claim

A claim is an assertion the site makes. Every claim belongs to exactly one of three types, and one of three evidentiary statuses.

Claim types

  • Descriptive states what is. "Thailand imported $70.8bn from China in 2023."
  • Causal asserts that one thing moves another, through a named mechanism. "EU ETS raises the marginal cost of fossil-fired electricity." Causal claims carry an identification class (see below).
  • Predictive says what will happen, with a criterion and a date. These live on the Forecast Lab ledger.

Evidentiary status

  • ● Measured: sourced data. An observation, a figure from a named source. Carries an inline citation to the source list.
  • ◐ Inferred: this analyst's reading. States the claim, then links the basis (the evidence the reading rests on).
  • ○ Projected: a forward or potential statement. Anchored to a named, real starting point (a real capacity, a measured value).

Identification class (causal claims only)

Causal edges in the relations graph carry an identification tag that says how the causal arrow was earned. Correlation-only is inadmissible.

statutoryThe link is written in law. The formula is the mechanism (e.g. CBAM carbon cost = EUA price x grid intensity x kWh/t).
forward-testA pre-registered test in the Forecast Lab ledger backs the link. The prediction was written before the data that could resolve it.
natural-experimentA documented intervention or exogenous event moved the driver, and the responder followed in measured data.
mechanismA written physical, legal or economic pathway connects cause to effect. No severe test yet, but the pathway is named and inspectable.

Live examples: the mine-water page carries a forward-test edge (discharge covariation, registered before the observation window) and a natural-experiment edge (the 2015 discharge rerouting as exogenous shock).

3. Observation

An observation is a measured data point behind a claim. Observations live in sourced data modules (src/data/<domain>/) and carry their source IDs so that the collapsible Sources dropdown can link back to the primary. Build-time fetch scripts pull from external APIs (Eurostat COMEXT, UN Comtrade, EPA, IMF PortWatch, SYKE, Ember) and write deterministic JSON snapshots.

The site never asserts a number without naming its source. Where a number comes from a scheduled pipeline, the pipeline metadata records the API, the query, and the retrieval date.

4. Dependency

A dependency is a typed, directed relationship between two entities. The relations graph holds 19 predicate types (e.g. supplies, depends_on, raises_cost_of, located_in, member_of). Some are hand-authored (relations.json), most are derived mechanically from the entity registries by deriveRelations.cjs, and each derived triple carries a derived field naming the registry file it was expanded from.

Cost edges are a special class: sourced transfer functions connecting a price driver to a cost outcome (e.g. EU ETS allowance price to wholesale electricity cost, electricity cost to green hydrogen cost, CBAM to steel import cost). Each carries the formula, the source, and the uncertainty range. These are inspectable on the graph page.

A depends_on edge is derived only for genuinely one-sided critical dependence: a large import share (≥25%) that the importing country barely balances with exports back (coverage < 0.5). This keeps the arrow sparse: a depends_on edge means something.

5. Model

A model is a computable relationship between observables. The site currently carries two kinds:

  • Trade signal models (PDI_max, PDI_CN): composites of partner share and its 24-month trajectory. These are experimental, not yet calibrated against realised disruptions (see trade signals).
  • Cost transfer functions: the cost edges described above. Each is a sourced formula mapping an input price to an output cost, with named parameters and uncertainty.

Models are tools, not conclusions. Each must name its inputs, state its assumptions, and link to the evidence that constrains its parameters. A model that cannot be re-run from published data is off-brand.

6. Forecast

A forecast is a prediction with a criterion, a date, and a publicly committed resolution. The Forecast Lab is the ledger. Each entry records:

  • The prediction, written before the data that could resolve it.
  • The falsifier: what outcome would prove the prediction wrong.
  • The resolution date.
  • The result, including misses, published when the date arrives.

The point is accountability. Foresight reports cannot be wrong; these predictions can be, and their track record is public. The mine-water covariation test (registered June 2026, resolves May 2027) is the reference example.

Trade signals (COMEXT)

The trade signals layer is built from monthly Eurostat COMEXT snapshots (dataset ds-059331). Partner shares are computed against each reporter's total imports in the SITC section: extra-EU imports for the EU reporter, total goods imports for Finland. Both denominators are fetched from Eurostat alongside the partner series. For series predating the July 2026 data upgrade the denominator falls back to the sum of the tracked partner groups.

SITC Rev.4 sections (0 through 9) are broad categories intended for macro-structure analysis rather than product-level sourcing conclusions.

PDI_max (topShare x (1 + ΔtopShare)) and PDI_CN (CNShare x (1 + ΔCNShare)) are experimental composites designed to amplify "high and worsening" dependence signals. They have not been calibrated against realised supply disruptions.

Data limitations

  • Monthly trade data may be revised by the source agency after publication.
  • All values are nominal EUR (no inflation or seasonal adjustment).
  • SITC sections are broad; they support structural signals, not product-level sourcing conclusions.
  • Comtrade annual data lags 1 to 2 years; some reporters do not report at all (Russia post-2022, several conflict states).
  • Causal edges with a "mechanism" identification class have no severe test yet. The identification tag makes this visible, not hidden.
  • PDI composites are experimental and uncalibrated.
  • Country scores (compliance, geopolitical, attractiveness) are periodically reviewed but not continuously updated.