Fuel Origin

Methodology / Reference data sources

Reference data sources

Where the hand-compiled reference data comes from: the refinery list, the Strait of Hormuz route classes, the event timeline, the ports, pipelines and chokepoints on the map, and the names of station-price regions. This is the compilation record (REFERENCE_DATA_SOURCES.md): the pages that were opened, the method, the disagreements between sources, and the cells left empty on purpose.

Each section is dated and describes the data as it stood that day; a later section says when it supersedes an earlier one. Working notes (to-do lists, review notes, database bookkeeping) are not shown. Names such as CLAUDE.md or docs/BRIEF.md refer to the project’s internal rules and brief; the public method is on the Methodology page.

Compiled: 2026-09-21 Applies to: everything in data/reference/ Binding rule: CLAUDE.md §1 — never fabricate. UNKNOWN is a legitimate, preferred result. Every non-empty cell in these files traces to a page or API endpoint that was actually fetched on 2026-09-21. Nothing here comes from model memory. Where a value could not be verified the cell is left empty (NULL), never filled with a plausible-looking number.

How this was compiled#

  1. Candidate sources were located by web search, then every fact-bearing page was opened and read. Only opened pages are cited.
  2. Priority order follows docs/BRIEF.md §Source hierarchy: Tier 1 official (Eurostat, EIA, IEA, European Commission, national ministries, ISO/IANA registries) → Tier 2 operator and industry-association disclosures → Tier 3 journalism, used only for dated events and labelled as such.
  3. Where two sources disagree, both values are recorded in the row's notes or in the relevant section below, per docs/BRIEF.md §Reconciliation. Disagreements are never silently averaged or resolved.
  4. Coordinates may come from OpenStreetMap/Nominatim (cited) — coordinates only, never capacity, ownership or status.

Known environment limitations of this pass#

  • www.eia.gov/international/analysis/... pages are JavaScript-rendered and return no content to a fetcher. The equivalent static paths do work and were used: https://www.eia.gov/international/content/analysis/countries_long/<Country>/ and .../countries_long/<Country>/background.htm. For Russia, Libya and Nigeria only the PDF country analysis briefs exist at .../pdf/<name>.pdf.
  • consilium.europa.eu returned HTTP 403 and eur-lex.europa.eu returned empty bodies, so EU sanctions regulation article numbers and application dates were not verified and are deliberately not recorded.
  • bp.com, noc.ly (Libyan NOC) and britannica.com returned HTTP 403 throughout.

1. countries.csv#

What it is. 31 rows: the 27 EU member states plus the United Kingdom, Norway, Switzerland and Iceland with eu_member = false, so that geographic expansion (docs/BRIEF.md §Geographic scope) is a data change rather than a schema change. Covers dataset A. COUNTRIES in docs/BRIEF.md §Core datasets.

Full provenance is in the sidecar countries.SOURCES.md. Summary of URLs consulted:

FieldSourceURL
iso2, iso3UN Statistics Division, M49 standard country codeshttps://unstats.un.org/unsd/methodology/m49/overview/
nameEurostat demo_pjan geo dimension labels; UNSD M49 for the UK(see population row)
eu_member, eurozoneEuropean Commission, "EU countries and the euro"https://economy-finance.ec.europa.eu/euro/eu-countries-and-euro_en
eurozone (cross-check)ECB euro-area map page — found stale, see belowhttps://www.ecb.europa.eu/euro/intro/html/map.en.html
currencyISO 4217 Table A.1 (SIX, ISO 4217 Maintenance Agency), XML published 2026-09-17https://www.six-group.com/dam/download/financial-information/data-center/iso-currrency/lists/list-one.xml
timezoneIANA Time Zone Database zone.tabhttps://data.iana.org/time-zones/tzdb/zone.tab
timezone (cross-check)IANA zone1970.tabhttps://data.iana.org/time-zones/tzdb/zone1970.tab
population (EU27+NO/CH/IS)Eurostat demo_pjan, population on 1 January, sex=T, age=TOTALhttps://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/demo_pjan?format=JSON&lang=EN&sex=T&age=TOTAL&lastTimePeriod=1
population (2026 availability check)same dataset, time=2026 — returned zero valueshttps://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/demo_pjan?format=JSON&lang=EN&sex=T&age=TOTAL&time=2026
population (UK)ONS, "Provisional population estimate for the UK: mid-2025"https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates/bulletins/provisionalpopulationestimatefortheuk/mid2025

Reconciliation — euro area size. Three independent sources agree the euro area has 21 members in 2026 (Bulgaria joined 1 January 2026): the European Commission page; the ISO 4217 list published 2026-09-17, which records BULGARIA → EUR; and the Eurostat geo dimension, which carries the aggregate label "EA21 Euro area – 21 countries (from 2026)" alongside the retired "EA20 … (2023-2025)". The ECB's own euro-area map page still read "20 countries" and described Bulgaria as expected to join when fetched on 2026-09-21. We follow the three-source majority and record the disagreement rather than resolving it silently.

Gaps left empty: none. All 31 rows carry a population, a source URL and a reference period.

Caveats that must not be ignored downstream:

  • Eurostat uses EL for Greece and UK for the United Kingdom, not the ISO GR/GB used in this file. Any join to a Eurostat extract must map them.
  • Population reference dates differ. EU27 + NO/CH/IS are 1 January 2025 (the latest published; 1 January 2026 was confirmed unpublished). The UK is a provisional mid-year estimate at 30 June 2025. population_period carries the actual date per row; do not aggregate the column without grouping on it.

2. hormuz_route_classification_v1.csv and hormuz_country_summary_v1.csv#

What they are. The versioned geographic route methodology required by docs/BRIEF.md §Hormuz route classification and CLAUDE.md §3 (hormuz_route enum). The classification unit is the export terminal or pipeline outlet, never the country — Saudi Arabia's Red Sea terminals are not Hormuz-exposed while its Gulf terminals are, and collapsing that to a country label would be wrong.

  • hormuz_route_classification_v1.csv — 59 rows, 18 origin countries.
  • hormuz_country_summary_v1.csv — 18 rows, one per origin country.
  • methodology_version = 1.0; verified_at = 2026-09-21.

Method#

  1. The class describes geography, not operating status and not sanctions. A terminal that is shut, mothballed, sanctioned or idle keeps the route class its location implies. Operating status and sanctions go in notes.
  2. The Strait of Hormuz is the sole outlet of the Persian Gulf. A terminal inside the Persian Gulf is therefore REQUIRES_HORMUZ; a terminal outside it cannot require the strait and is DOES_NOT_REQUIRE_HORMUZ. This is what makes the non-Gulf rows certain rather than estimated, even where the exact water-body wording is only medium confidence.
  3. A country is MIXED when it has terminals in both classes (Saudi Arabia, UAE, Iraq, Iran).
  4. In the country summary, min_share_requiring_hormuz / max_share_requiring_hormuz are filled only from cited capacity or cited observed-share figures. Where no cited split exists the row carries min=0, max=1 and basis = "UNKNOWN: no cited terminal split".

Sources consulted#

Chokepoint and bypass geography

Gulf producers

Non-Gulf suppliers

Reconciliation — capacity figures that disagree#

ItemValue AValue BTreatment
UAE ADCOP (Jebel Dhanna → Fujairah)1.8 million b/d — EIA UAE brief; IEA1.5 million b/d — EIA Today in Energy 61002 (2023)Both recorded in the row rationale. Likely a genuine capacity expansion between 2023 and 2025 rather than an error, but no opened source states the expansion, so neither is discarded.
Saudi East-West / Petroline5 million b/d design, temporarily expandable to 7 — EIA, IEA5–7 million b/d — EIA Today in Energy 65504Consistent; the 7 figure is explicitly a temporary expansion, recorded as such.
Combined Saudi + UAE bypass capacity4.7 million b/d — EIA chokepoints page~2.6 million b/d available during a disruption — EIA 65504; 3.5–5.5 million b/d available — IEAThese measure different things (nameplate vs spare/available). Not reconciled into one number; the distinction is recorded here instead.
Iran Goreh-Jask1.0 million b/d nameplate~0.3 million b/d operable (mid-2024)Both recorded; the summary floor uses the operable figure.

Derived min/max shares and how they were computed#

  • Iraq — the only clean cited capacity split. From a single source (EIA Iraq): southern Persian Gulf export capacity ≈ 3,400 thousand b/d (mid-2024); Iraq–Türkiye pipeline to Ceyhan 145 thousand b/d. min = 3400/(3400+145) = 0.959; max = 1.000 because the ITP was shut from March 2023 (restarting 2025-09-27).
  • Iran — a cited floor. EIA: total crude loading capacity "more than 8.0 million b/d" (chiefly Kharg, inside the Gulf); Goreh-Jask ≈ 300 thousand b/d operable. min = 8000/(8000+300) = 0.964, and because 8.0 is itself a lower bound the true share can only be higher. max = 1.000 — EIA records one cargo via Jask in July 2021 and none since.
  • Saudi Arabia — an upper bound only. EIA: Yanbu's share of seaborne exports "reached a record 18% in the second quarter of 2024", so at most 82% required Hormuz that quarter. This is an observed quarterly share, not a capacity share. No opened source bounds the minimum, so min = 0.
  • UAE — min=0, max=1, basis "UNKNOWN: no cited terminal split". ADCOP capacity (1.8 million b/d) and ADNOC's own Murban export availability (1,580–1,610 thousand b/d for Oct 2025 – Sep 2026) are both cited in the basis, but no opened source splits actual loadings between Fujairah (outside Hormuz) and Jebel Dhanna / Das / Zirku (inside).
  • Kuwait, Qatar, Bahrain — 1/1. All terminals are inside the Persian Gulf; EIA states only Saudi Arabia and the UAE operate pipelines that circumvent the strait, and the IEA lists these three among the producers that would lose their primary route.
  • Oman and all non-Gulf suppliers — 0/0, by geographic construction.

Confidence flags carried in the notes column#

  • Libya — the only terminal list found is an EIA 2015 archive PDF; the current EIA Libya brief lists no export terminals, and the Libyan NOC site returned HTTP 403. The Gulf of Sirte → Mediterranean link is not stated by a Tier-1 opened source. MEDIUM.
  • Nigeria — EIA says only "the coast of southern Nigeria"; neither "Atlantic" nor "Gulf of Guinea" is used about the terminals themselves. MEDIUM.
  • Algeria — neither EIA nor Sonatrach used the word "Mediterranean"; it is inferred from "Algeria's northern coastline". MEDIUM.
  • Brazil — weakest row in the file. No opened page states "Atlantic Ocean" for a Brazilian crude export terminal, and much Brazilian crude loads from offshore FPSOs that could not be tied to a named terminal. MEDIUM on the terminal, certain on the route class.
  • Kazakhstan — the CPC operator's own English pages never name Novorossiysk, the marine terminal or the Black Sea; the geography rests on EIA.
  • UK Flotta — deliberately not recorded: no page confirming it was opened.

Event context (recorded here, not in the route class)#

EIA reports that crude and petroleum liquids through the Strait of Hormuz averaged 4.9 million b/d in Q2 2026, down from 21.6 million b/d in Q4 2025 before the conflict began, and that Q2 2026 saw large Middle East production shut in (https://www.eia.gov/todayinenergy/detail.php?id=67865). Iraq's Kirkuk–Ceyhan route was revived over the same period. None of this changes any route class, which is geographic by design — but any exposure model built on this reference data must treat 2026 flows as disrupted rather than normal.


2b. hormuz_*_v1.csv — v1 extension 2026-09-22#

Why. EU crude-import data carried ~45 origin/partner countries with no core.hormuz_country_profile row. Under docs/HORMUZ_METHOD.md an origin with no profile contributes s ∈ [0, 1] and its whole volume lands in unknown_share. Germany's June 2026 Hormuz upper bound was therefore 13.6% while its actual Gulf-origin volume was 0.3% — the range was being driven almost entirely by Angolan, Guyanese and Congolese barrels that cannot physically approach the strait. This pass adds cited export points and country bounds for those partners.

What changed.

FileBefore (2026-09-21)After (2026-09-22)
hormuz_route_classification_v1.csv59 rows, 18 origin countries125 rows, 62 origin countries (+66 rows)
hormuz_country_summary_v1.csv18 rows63 rows (+45, one per new partner)

methodology_version stays 1.0 on every row: the classification method did not change. The docs/HORMUZ_METHOD.md bump to 1.0.1 was an editorial fix to §3.2 Case B and changed no stored value. New rows carry verified_at = 2026-09-22; the 2026-09-21 rows are untouched.

Of the 45 new country rows: 41 DOES_NOT_REQUIRE_HORMUZ 0/0, 3 MIXED [0, 1] (EG, TR, IL), 1 UNKNOWN [0, 1] (LR).

Method used for this extension#

  1. Geography is the criterion, and it is the loading point's geography. Any terminal on the Atlantic, Mediterranean, Red Sea, Gulf of Aden, Black Sea, Baltic, North Sea, Adriatic, Aegean, Caspian, Gulf of Guinea or in the Americas is DOES_NOT_REQUIRE_HORMUZ. None of the 45 countries has a Persian Gulf coastline.
  2. A cited position can settle the class even when the sea is uncited. Several terminals are named and located by a Tier 1–3 source that never writes a body of water (Port of Galeota at 10°15′N/61°38′W; Puerto Rosales at Punta Alta; Gamba and Oguendjo in Gabon; Porto Romano at Durrës; the Port of Antwerp; Muuga Harbour). For these, water_body is left NULL rather than guessed and the rationale states that the cited position is what answers the §2 test. This is deliberately different from inventing a sea name.
  3. Country-level water bodies are used where terminal-level ones do not exist, and are flagged as such per row — notably for Angola, Congo-Brazzaville, Gabon and Equatorial Guinea, where EIA's terminal tables give a block or a province but never a sea.
  4. Wikipedia / wiki-class sources are used only to place an already-established terminal on a named sea, never for capacity, status or existence of a flow, and every such row says so in notes. Rows resting on a wiki for the water body: Puerto José (VE), Sèmè-Kpodji (NE), La Skhira (TN), Fredericia (DK), Gdańsk (PL), Cap Lopez (GA), Omišalj (HR), Pivdennyi (UA). In every one of those cases the route class is unaffected, because the alternative reading is still not the Persian Gulf.

The three MIXED rows and the one UNKNOWN — and a method question for the lead#

Egypt — MIXED [0, 1]. Egypt's own loading points are outside the Gulf (Ayn Suknah on the Red Sea, Ras Shukheir on the Gulf of Suez, Sidi Kerir on the Mediterranean). But Egypt is the land bridge for Gulf crude. EIA: "The SUMED pipeline … transports crude oil north through Egypt between the ports of Ain Sukhna and Sidi Kerir and has a capacity of 2.5 million b/d"; "The Suez Canal and the SUMED Pipeline are strategic routes for Persian Gulf crude oil …"; "Petroleum exports from Persian Gulf countries … accounted for 85% of Suez Canal northbound traffic." Barrels that reached Ain Sukhna from in-Gulf terminals did transit Hormuz on the inbound leg; Saudi barrels loaded at Yanbu on the Red Sea did not. No opened source quantifies that split, so the country bound is the uninformative [0, 1] rather than an assumed zero.

METHOD DEVIATION, stated openly. The task brief asked for the Sidi Kerir outlet itself to be marked MIXED. docs/HORMUZ_METHOD.md §2 forbids MIXED on a single export point and parse_hormuz_classification rejects it, so the row carries UNKNOWN, which yields the same [0, 1] bound and is treated by compute_direct_exposure on exactly the same terms (profile is None or hormuz_route == 'UNKNOWN' → s ∈ [0,1], counted into unknown_share). The open question for the lead: §2's test — "whether a barrel transits it is determined by where it was loaded" — has no answer for a re-export point, where the barrel was loaded twice. Sidi Kerir and Ashkelon are both of this kind. v1 records them as UNKNOWN with the reasoning in rationale; a v1.1 might want an explicit RE_EXPORT_POINT concept, or a second column for the inbound leg.

Israel — MIXED [0, 1]. Israel has no citable crude production at any acceptable tier (IEA 403, CIA World Factbook sunset) and no evidence of crude exports at any tier; its State Comptroller calls Israel a crude importer. What is citable is a transit role: EAPC states its 254 km line links the Eilat oil port on the Red Sea with the Ashkelon oil port on the Mediterranean and was built "to serve the transit of crude oil from oil producing sources in the Persian Gulf to customers in Europe." EAPC frames that as the historical function and the line is now bidirectional; no opened page establishes current Gulf-origin volumes.

Türkiye — MIXED [0, 1], and this is the conservative choice, not the evidential one. Every cited Turkish export point is outside the Gulf, and — decisively — the crude that transits Türkiye arrives overland: EIA places the Ceyhan terminal on Turkey's Mediterranean coast and describes it as the outlet for Iraqi Kurdish and Caspian crude via the BTC and Iraq–Türkiye pipelines, which never enter the Gulf. On the physical evidence Türkiye would be DOES_NOT_REQUIRE_HORMUZ 0/0. It is left at [0, 1] only because Türkiye is a consignment-basis partner and no opened source excludes re-export of crude that reached Turkish ports by sea from Gulf loadings. A reviewer may reasonably overrule this to 0/0; the effect is small (TR is 4.5 Mt of EU crude imports since 2015).

Liberia — UNKNOWN [0, 1], the one genuine unknown. The National Oil Company of Liberia states plainly that "Liberia is not currently producing oil". Crude recorded against LR as a trade partner is therefore not of Liberian physical origin — Liberia's prominence in tanker data is a flag-of-convenience ship-registry artefact and must never be read as production. The physical origin is not determinable from the partner code, so the bound stays [0, 1] and the volume stays inside unknown_share, which is the honest outcome.

Why the pure EU trading hubs are 0/0 rather than MIXED — stated so it can be overruled#

NL, BE, DE, FR, PL, HU, LT, EE, MT, CY, GR, HR, AL, RO, IT, GE and UA all carry DOES_NOT_REQUIRE_HORMUZ 0/0 with the consignment caveat written into basis, not MIXED [0, 1]. The reasoning:

  • The exposure series is computed from the origin-basis dataset (Eurostat nrg_ti_oilm) wherever it exists. On an origin basis a re-export from Rotterdam or Antwerp is attributed to the country that produced the crude, so these partners appear only as producers, and as producers every cited loading point of theirs is outside the Gulf.
  • None of them has a cited Gulf transit role. Egypt (SUMED) and Israel (EAPC) do; Türkiye's is overland. Croatia is the closest call — the IEA records Middle Eastern crude arriving at Omišalj by sea and moving on to Hungary — but that is an inbound flow continued by pipeline, not a seaborne re-export, so it does not make Croatian loadings Gulf-derived.
  • Treating all of them as MIXED [0, 1] would widen every pilot country's upper bound by the full hub volume, and would be a fabricated pessimism — the mirror image of the fabricated optimism that assuming 0 for an unknown origin would be.

A separate, real caveat. For the latest periods the trade data available is consignment-basis (Comext) rather than origin-basis, because nrg_ti_oilm lags by a month. choose_partner_role prefers ORIGIN and falls back to CONSIGNMENT, and compute_direct_exposure already caps confidence at MEDIUM for a non-ORIGIN role. The argument above holds only for the origin-basis series; in the consignment months the hub rows are doing more work than the evidence supports, and that is the single strongest reason a reviewer might overrule the paragraph above.

Sources consulted in this pass#

Every URL below was opened on 2026-09-22 unless it is listed under "could not be opened".

Americas — EIA Mexico CAB PDF; API Campeche (Cayo Arcas); ASIPONA Dos Bocas; ASIPONA Salina Cruz; Trans Mountain Westridge terminal regulations PDF; Canada Energy Regulator market snapshot; Government of Newfoundland and Labrador; EIA Today in Energy 62103 and 66884 (Guyana, Argentina); EIA Venezuela CAB PDF 2024; Venezuelan Ministry of Petroleum; EIA Colombia executive summary PDF; Ocensa; National Energy Corporation of Trinidad and Tobago (Port of Galeota guide PDF); Trinidad Ministry of Energy; Trinidad and Tobago Energy Chamber; Puerto Rosales port consortium; Province of Buenos Aires; Oiltanking Ebytem public-information PDF; Techint (VMOS / Punta Colorada).

Atlantic Africa — EIA Angola 2013 and 2005 archive PDFs; Chevron/CABGOC corporate responsibility report PDF; EIA Equatorial Guinea CAB (Internet Archive snapshot 2011-02-01); Trident Energy; Oil & Gas Journal (Cameroon, Kole/Moudi); SNH Cameroon; EIA Gabon CAB (Internet Archive snapshot 2008-06-18); TotalEnergies (Cap Lopez divestment); EIA Congo-Brazzaville 2005 archive PDF and current brief; TotalEnergies Congo; US Department of Commerce DRC country commercial guide; Perenco DRC drilling PDF.

Sahel / West Africa / Sudan — COTCO (Cameroon Transportation System); offshore-technology (Chad–Cameroon); US Department of Commerce Chad guide; NS Energy (Niger–Benin pipeline); Petroleum Commission Ghana; NS Energy (Jubilee); Eni (OCTP Ghana; Baleine Côte d'Ivoire); Oxford Business Group (Côte d'Ivoire); PETROCI; Ivorian Ministry of Energy; Policy Center for the New South (Senegal); MODEC (Sangomar); National Oil Company of Liberia; EIA Sudan and South Sudan background.

Egypt / North Africa / Levant — EIA World Oil Transit Chokepoints; EIA Today in Energy 40152 and 12371; EIA Egypt CAB PDF; sumed.org; shipnext and Kadmar (Ras Shukheir); Tunisian Ministry of Energy and Mines; shipnext (La Skhirra); EIA Yemen CAB PDF; IHO / Yemen Maritime Affairs Authority country report PDF (2007); findaport (Ash Shihr); Port of Aden; Global Energy Monitor (Marib–Ras Isa); EIA Syria current brief and 2011 archive PDF; EAPC (engarchive.eapc.co.il); Israel State Comptroller report PDF.

Türkiye / Caspian / Black Sea — EIA Türkiye 2023 and Turkey CAB PDFs; BOTAŞ crude oil and petroleum operations pages; findaport (Port of Botas); EIA Caspian Sea regional brief PDF 2025; Turkmen state oil and gas portal; US Department of Commerce Turkmenistan guide; GOGC (WREP; oil activities); Kulevi Oil Terminal; KazTransOil (Batumi); EIA Ukraine short brief PDF; Global Energy Monitor (Odesa–Brody); Oil Terminal SA Directors' Report 2025 PDF; OMV Petrom.

EU producers and hubs — Danish Energy Agency; Ørsted (Danish Oil Pipe); ADP Fredericia; UNMIG/MASE national hydrocarbon production 2024 PDF; Taranto Port Authority (two pages); TotalEnergies Tempa Rossa; TAL/SIOT Trieste; Port of Rotterdam (crude oil; why Rotterdam); Vopak MOT; MOT NV; NLOG/TNO natural resources 2024 PDF; BVEG annual report; Wintershall Dea Mittelplate; SDES (French energy key figures, petroleum chapter); Vermilion Energy France; Naftoport; Port of Gdańsk; PERN; ORLEN Petrobaltic.

Smaller EU / Balkan partners — JANAF safety report PDF hosted by the Croatian ministry; eldmarc (Port of Omišalj); INA annual report 2024 PDF; Gruppo PIR (La Petrolifera Italo Albanese); US Department of Commerce Albania guide; Albpetrol; offshore-technology (Patos-Marinza; Vlora storage); IEA Hungary 2022 review PDF; MOL; IEA Greece 2023 review PDF; HEREMA; greekhydrocarbons.gr; Offshore Magazine (Prinos/BP offtake); VTTI Vasilikos; trade.gov Cyprus energy resource guide; Cyprus Hydrocarbons Service; USGS Minerals Yearbook 2012 Malta PDF; IEA Lithuania 2021 review PDF; ORLEN Lietuva; IEA Belgium 2022 review PDF; Port of Tallinn (liquid bulk; Muuga); Port of Sillamäe (port; terminals); IEA/OECD Estonia 2023 review PDF.

Wiki-class pages opened, used for a water body only and flagged per row — Wikipedia: Puerto José, Niger–Benin Oil Pipeline, Skhira, Fredericia, Port of Gdańsk, Cape Lopez, Jadranski naftovod, Muuga Harbour. Global Energy Monitor: Marib–Ras Isa Oil Pipeline, Odesa–Brody Oil Pipeline, Adria Oil Pipeline.

Could not be opened, and therefore not cited — iea.org HTML country pages (HTTP 403 throughout; the IEA review PDFs on iea.blob.core.windows.net and oecd.org do work and were used instead); bp.com (403, so no BTC/Ceyhan or Supsa citation is claimed); transmountain.com (403; the operator's docs.transmountain.com PDF was used); energean.com (403); woodside.com (403); janaf.hr and portofantwerpbruges.com (JavaScript-only shells); continentalshelf.gov.mt, transport.gov.mt, era.org.mt, gov.cy, lexology.com (403); akbn.gov.al and evos.eu (untrusted TLS chain); albeiti.org (DNS failure); ommp.nat.tn and etap.com.tn (SSL verification failure); mts.gov.eg (SSL); puertobahiablanca.com (connection refused); neuqueninforma.gob.ar (DNS); alexelasillamae.ee (no longer resolves); pdvsa.com, ukrtransnafta.com, ukrnafta.com (403); EIA's JavaScript-rendered international/analysis/country/{TCD,GAB,GNQ,TTO} pages (no text). EIA publishes no country analysis brief at all for Cameroon, DR Congo, Ghana or Trinidad and Tobago.

Disagreements recorded rather than resolved#

ItemABTreatment
Chad's export portKribi (COTCO, the operator; offshore-technology)Douala (trade.gov)Kribi recorded; the trade.gov reading logged as a probable error. Same water body either way.
SUMED ownershipMubadala Energy (current EIA chokepoints page)Arab Petroleum Pipelines Co (APP), the usual attributionNeither recorded. Ownership is not a field this file needs.
Būtingė directionimport and export, 14 Mt/a export capacity (ORLEN Lietuva)import-only since 2006 (IEA)Both recorded: capability BOTH, observed IMPORT.
Ras Isa's seaRed Sea (IHO / Yemen Maritime Affairs Authority)Gulf of Aden (a commercial shipping agent)IHO preferred. Route class unaffected.
DRC production25,000 b/d, all exported (trade.gov)19,500 b/d combined (Perenco)Both noted; no volume ingested from this row.
Ash Shihr's seaGulf of Aden (IHO, by adjacency)Arabian Sea (Wikipedia; shipping agent)Genuinely ambiguous; recorded as Gulf of Aden with the ambiguity in notes. Route class unaffected.

Premise corrections found during this pass#

  • INA's Adriatic offshore acreage in Croatia is gas, not crude; Croatian crude is onshore.
  • Greek Prinos production did not simply cease: suspended around May 2025, restarted February 2026 at roughly 1 kb/d. Status, not a route class.
  • Lithuanian domestic crude goes to the chemical industry, not the Mažeikiai refinery (IEA).
  • Cap Lopez (Gabon) moved from TotalEnergies to Perenco, closing 2021-12-09.
  • The Sillamäe heavy-fuels/shale-oil terminal slot is held by Puma Energy Baltics, not Alexela; alexelasillamae.ee no longer resolves.
  • Trieste/SIOT is an import terminal. Italian crude leaves Trieste by the TAL pipeline to Austria and Germany, not by ship. Taranto is Italy's genuine seaborne crude loading point.
  • Germany and France yield no citable crude export point at all; their 0/0 rests on country geography plus cited production locations, and that is said in basis rather than implied.

Extension compiled 2026-09-22. Every URL in this section was fetched on that date. The 2026-09-21 sections above are unchanged and their own footer still applies to them.

Lead review of the v1 extension (2026-09-22)#

  • Türkiye overruled to DOES_NOT_REQUIRE_HORMUZ 0/0 (was MIXED [0,1], flagged by the researcher as "conservative, not evidential"). Both cited Turkish export points are Mediterranean outlets of overland pipelines (BTC, Iraq–Türkiye, Batman–Dörtyol); no opened source shows seaborne Gulf crude being re-exported from Turkish ports. The consignment-basis caveat remains in basis.
  • Egypt (MIXED [0,1], SUMED/Sidi Kerir) and Israel (MIXED [0,1]) stand as proposed. Liberia stays UNKNOWN.
  • Re-export points (Sidi Kerir, Ashkelon) carry UNKNOWN at export-point level because §2 of docs/HORMUZ_METHOD.md forbids MIXED on a single point; this is logged as the open question for method v1.1.

2c. hormuz_*_v1.csv — product-origin extension 2026-09-22#

Why. §2b closed the gap for crude origins. Refined-product imports (D2) arrive from a different and much longer list of partners, and almost none had a core.hormuz_country_profile row. Under docs/HORMUZ_METHOD.md an origin with no profile contributes s ∈ [0, 1] and its whole volume lands in unknown_share, so D2 for the pilot countries was being driven by countries that cannot physically approach the strait: Finland's January 2025 upper bound was 59.4%, and every point of it was Swedish product.

What changed.

FileBefore (after §2b)After (§2c)
hormuz_route_classification_v1.csv125 rows, 60 distinct origin countries178 rows, 85 distinct origin countries (+53)
hormuz_country_summary_v1.csv63 rows104 rows (+41)

methodology_version stays 1.0 — the method did not change. New rows carry verified_at = 2026-09-22. No pre-existing row was edited; the 2026-09-21 and §2b rows are untouched.

Of the 41 new country rows: 25 DOES_NOT_REQUIRE_HORMUZ 0/0 and 16 UNKNOWN [0, 1] (Sierra Leone, plus 15 partners deliberately not researched).

Effect on D2, period 2025-01, origin basis:

Reportermin %max % before → afterpointunknown % before → after
DE1.6528.036 → 2.188—6.384 → 0.537
FR11.46534.683 → 22.892—12.118 → 0.326
NL4.23517.233 → 4.416—12.818 → 0.001
PL020.874 → 0.127—20.874 → 0.127
FI059.389 → 0.0000.00059.389 → 0.000
EE016.543 → 0.0000.00016.543 → 0.000

FI and EE move from PARTIAL to COMPUTED. The residual unknown is exactly the honest leftovers: DE 0.537% is Sierra Leone, FR 0.326% the Dominican Republic, PL 0.127% Kyrgyzstan. D1 (crude) was re-checked and is unchanged.

The conceptual point this section exists to record#

D2 asks where the product was loaded, not where its crude came from. docs/HORMUZ_METHOD.md §D2 says so, and it is the easiest thing here to get wrong.

  • Jordan is the clean illustration. The Jordan Petroleum Refinery Company states its Zarqa refinery runs on "crude oil received in Aqaba port tanks". That crude may well have come from the Gulf, by sea or by land. But Jordan has no Persian Gulf coastline and Aqaba — on the Gulf of Aqaba, an arm of the Red Sea — is its only seaport, so a product cargo leaving Jordan did not transit Hormuz: DOES_NOT_REQUIRE_HORMUZ, 0/0. The Gulf feedstock is D3 (indirect supply exposure), reported separately and UNKNOWN in Phase 1 for want of third-country intake composition. Folding the feedstock into D2 would double-count it and fabricate a number.
  • The same reasoning, and only the same reasoning, is why India, Singapore, Korea and Malaysia are 0/0 for D2 despite running heavily on Gulf crude.
  • A name trap worth writing down: the Gulf of Kutch, on which Jamnagar and Vadinar sit, is not the Persian Gulf. Sikka Ports & Terminals' own page names no sea at all; the Gulf of Kutch attribution is wiki-sourced, and the class rests on India having no Persian Gulf coastline.

Gulf refinery terminals — what was already covered, and the two that were not#

Checked row by row. The 2026-09-21 pass had already classified most Gulf product outlets correctly: Ras Tanura (BOTH, REQUIRES), Juaymah LPG (PRODUCTS, REQUIRES), Yanbu — which covers YASREF — (BOTH, DOES_NOT_REQUIRE), Jazan / Jeddah / Duba (PRODUCTS, DOES_NOT_REQUIRE), Mina al-Ahmadi (BOTH, REQUIRES), Mina Abdullah and Al-Zour (PRODUCTS, REQUIRES), Ras Laffan and Mesaieed (REQUIRES), Sitra and KBSP (REQUIRES), Ruwais refinery jetties (PRODUCTS, REQUIRES), Sohar, Ad Duqm and Mina al-Fahal (BOTH, DOES_NOT_REQUIRE). Two were missing:

Jubail added, with a recorded disagreement. Aramco's own Ports and Terminals page lists no Jubail terminal, so the outlet is cited from the refiner and the port instead: Saudipedia places SATORP "headquartered in Jubail 2 Industrial City" with "a 25-kilometer pipeline and a petroleum coke transport system linking the refinery and export facilities at King Fahd Industrial Port in Jubail"; satorp.com gives "465,000 BPD"; EIA lists SATORP at 460 thousand b/d. For geography, the Wikipedia page gives 27°01′N 49°40′E — inside the Persian Gulf — while its own infobox says "Red Sea", which is wrong and contradicts the coordinates on the same page. Per the §2b convention that a cited position can settle the class when the sea is uncited, the coordinate carries the class, the wiki sea name is explicitly rejected, and water_body is left NULL rather than guessed. mawani.gov.sa returned HTTP 405 and rcjy.gov.sa refused the connection.

Fujairah products added as a separate export point. The existing Fujairah row is the ADCOP crude outlet. The products and bunkers side is a different facility: "Its strategic location on the Gulf of Oman, just outside the Strait of Hormuz…", "Fujairah Oil Tanker Terminals (FOTT) handles the Port's liquid bulk cargo", "one of the world's three largest bunkering hubs". It is a separate slug, not an edit to the crude row, because core.export_point.slug is unique and the loader would otherwise supersede the crude classification instead of adding to it.

Method used for this extension#

  1. Geography decides, and it is the loading point's geography. None of the countries researched here has a Persian Gulf coastline, so no loading point of theirs can be inside the Gulf. The premise is stated per row rather than implied.
  2. Landlocked and inland sites are classified at the refinery, because that is where the product leaves the classified system: Slovnaft Bratislava ("up to 80% of production is exported", by rail, road and a Danube river port — an inland waterway, not a sea route), OMV Schwechat (OMV calls it a "Binnenraffinerie"), ORLEN Unipetrol Litvínov and Kralupy, Varo Cressier, Repsol Puertollano, NIS Pančevo (Danube km 1153), Mozyr and Naftan. The Danube and the IKL/TAL/Druzhba pipelines are recorded in the rationale, never as a sea.
  3. water_body is left NULL wherever no opened page names one. This is the §2b convention and changes no class: the alternative reading is never the Persian Gulf.
  4. Wiki pages are used only to name a sea for an already-established facility, flagged per row. Rows resting on a wiki for the water body: Lysekil/Brofjorden (Skagerrak), Porvoo/Kilpilahti (Gulf of Finland), Sines (Atlantic), Koper (Adriatic), Jamnagar and Vadinar (Gulf of Kutch), Pulau Bukom (Straits of Singapore), Ulsan (East Sea), Daesan/Seosan (Yellow Sea), Zhenhai (East China Sea), Changxing Island (Bohai Sea), Maoming (South China Sea), Port of Aqaba (Gulf of Aqaba). In every case the route class is unaffected.
  5. Consignment hubs are 0/0 with the caveat in basis, not MIXED [0,1] — Gibraltar, Latvia, Slovenia, Morocco, Singapore, Spain — following the §2b decision for NL/BE and reversible on the same terms. Every such row names the caveat in its own basis, so the judgement is visible in the data, not buried here.
  6. A facility that could not be verified was left out. Writing one in from memory would have been the one thing CLAUDE.md §1 forbids.

Provenance of this section: two passes, and which is which#

This section merges a compiler pass and three helper research passes, all on 2026-09-22. Sources the compiler opened itself are cited plainly. Sources opened only by a helper pass are cited and the row's notes say so, so a reader can tell first-hand verification from relayed verification. Twelve of the helpers' findings — the ones that overturn a gap or supply a class- relevant fact — were re-opened and confirmed by the compiler: LUKOIL Neftohim Burgas, EIA South Korea, S-Oil Onsan, Unipetrol Litvínov, NIS Pančevo, ANCAP La Teja, Petronor Bilbao, Sikka Ports & Terminals, Enerdata Slovenia, Tanger Med, the OGJ Bukom sale, and Luka Koper.

That re-check found a correction. The first draft of this pass described the Port of Koper terminal as a petroleum liquid-bulk terminal. The operator's own terminal page says it is "specialized for handling and warehousing of chemicals, minerals and vegetable oils" and does not name petroleum products. The row was rewritten and now asserts only that Koper is Slovenia's one cited liquid-cargo outlet.

Gaps closed since the first draft of this section#

The first draft recorded eight countries as NO CITABLE EXPORT POINT, resting on country geography alone. The helper passes closed seven of them:

CountryNow citedThe URL that was missing
BGLUKOIL Neftohim Burgas + Rosenets terminalthe operator lives on neftochim.lukoil.com, not neftochim.bg
KRUlsan, Onsan, Yeosu, DaesanEIA's path is countries_long/South_Korea/, not Korea_South/
RSNIS Pančevo 4.8 Mt/a + Danube port km 1153nis.rs/en/activity/crude-refining/
BYMozyr and Naftanthe Belarusian government's own trade page
MATanger Med + Mohammedia; SAMIR shut 2015operator pages; Morocco has no refinery
UYANCAP La Teja, bahía de MontevideoANCAP's own article on the October 2025 restart
IEIrving Oil Whitegate marine terminal, Cork Harbourthe Irish EPA licence PDF
CNZhenhai, Hengli Dalian, Maomingstill the weakest: no operator page, geography all wiki

Two findings that change how a number should be read, both recorded in the rows:

  • Uruguay. ANCAP states La Teja resumed refining on 10 October 2025 — after the 2025-01 period used in the pilot run — and that its output supplies the domestic market. The 0.8 Mt recorded against UY in EU statistics is therefore not explained by the opened source.
  • Morocco and Slovenia have no refinery at all. Enerdata: "As the country's only refinery ceased operating in 1998, the country imports all its oil products" (SI). Tanger Med's own activities are "trading (transshipment), import of refined products, and bunkering" (MA). The 18.3 Mt against SI and 1.2 Mt against MA cannot be their own refining.

Disagreements recorded rather than resolved

ItemABTreatment
Litvínov capacity5.4 Mt/a — Unipetrol RPA, opened by the compiler5.8 Mt/a — an ORLEN Unipetrol press release relayed by a helper, not opened by the compilerBoth recorded in the row
S-Oil refining capacity669,000 b/d — S-Oil's own page83 + 519 = 602 thousand b/d — EIA Table 2, two Ulsan entriesBoth recorded; no opened source explains the gap
Slovnaft capacity5.5 – 6 Mt/a — the operator's own range—Stored as the range; never collapsed to a midpoint
King Fahd Industrial Port sea27°01′N 49°40′E, Persian Gulf"Red Sea" — the same wiki page's infoboxCoordinate used; infobox rejected as an error

Countries left UNKNOWN, and why#

Sierra Leone (SL) — UNKNOWN [0, 1], the one researched unknown. 0.5 Mt since 2015 and 13 kt of German product imports in January 2025 alone, so an assumed 0 is not acceptable. Tier-3/4 reporting describes the Kissy facility in Freetown as a petroleum import and storage jetty, rebuilt in the 2020s, not a refinery, and Sierra Leone's Petroleum Directorate presents the country as being at the exploration stage. If so, the EU volume recorded against SL is a flag-of-convenience or transhipment artefact — exactly what Liberia's crude turned out to be in §2b — and the physical origin is not determinable from the partner code. That reasoning is MEDIUM confidence on Tier-3/4 sources: not enough to assert 0, not enough to assert 1. Bound stays [0, 1]. (A page opened under the same "Kissy" name, kissyindustry.com, turned out to be a palm-oil producer — "Sierra Leone's first indigenous company to transform locally grown palm oil into high-quality vegetable oil" — and was discarded rather than mistaken for a petroleum terminal.)

Fifteen partners deliberately not researched — UNKNOWN [0, 1], basis "not researched: < 0.5 Mt over 2015-2026". KP 0.4, CU 0.4, CL 0.2, BS 0.2, TG 0.2, BA 0.1, HK 0.1, LB 0.1, LU 0.1, IS 0.1, MU 0.1, UZ 0.1, DO 0.1, BJ 0.1 (Mt, origin basis, 2015-2026), plus KG (Kyrgyzstan), which is not in that ranking but appears in the pilot data as an origin of Polish product imports in January 2025 (~1 kt) and is recorded rather than left silently absent. Nothing is asserted about any of them. A row that says "nobody looked" is more useful than a row that says 0.

Facilities still NOT recorded — read this before trusting a country's 0/0#

Not recordedCountryWhy
Tarragona site-level geographyESno site or port page opened by either pass; the row rests on Repsol's list of complexes alone
Nynas Nynäshamn and GothenburgSEUNVERIFIED by both passes
Any Chinese operator pageCNsinopecgroup.com refused the connection; all three Chinese rows rest on EIA for the export fact and wiki for the geography
18 of Japan's 21 refineriesJPEIA gives no terminal-level detail to distinguish them; three are recorded as representative and the rest named in the rationale
Zarqa from a second sourceJOthe refinery rests on JPRC alone
Whether Rosenets is the product export outletBGthe operator describes it only as the inbound crude route

Sources consulted in this pass#

Opened by the compiler, 2026-09-22:

Gulf — Aramco Ports and Terminals https://www.aramco.com/en/what-we-do/operations/ports-and-terminals · Saudipedia SATORP https://saudipedia.com/en/satorp-refinery · SATORP https://www.satorp.com/en/ · EIA Saudi Arabia https://www.eia.gov/international/content/analysis/countries_long/Saudi_Arabia/ · Wikipedia King Fahd Industrial Port (Jubail) — coordinates only, sea name rejected https://en.wikipedia.org/wiki/King_Fahd_Industrial_Port_(Jubail) · Fujairah Ports Authority https://fujairahport.ae/business-activities/oil/ · https://www.fujairahport.ae/about-us/

Europe — Repsol Spain https://www.repsol.com/en/about-us/where-we-work/repsol-worldwide/europe/spain/index.cshtml · Petronor Port of Bilbao https://petronor.eus/en/facilities/petronor-in-the-port-of-bilbao/ · VARO/Preem manufacturing hubs https://www.varopreem.com/en/business/manufacturing-hubs/ · Neste Porvoo https://www.neste.com/about-neste/how-we-operate/production/porvoo-refinery · Galp https://www.galp.com/corp/en/about-us/what-we-do/industrial-and-midstream · OMV Refining https://www.omv.com/en/our-business/downstream/ds-refining · Slovnaft https://slovnaft.sk/en/about-us/our-company/profile/ · Unipetrol RPA Litvínov https://www.unipetrolrpa.cz/en/AboutUs/Processing-refinery/Pages/Refinery-Litvinov.aspx · ORLEN Unipetrol press release https://www.orlenunipetrol.cz/en/Media/PressReleases/Pages/20260306-TZ_OrlenUnipetrol-Kralupy_zarazka-EN.aspx · Vitol Terminal Latvia https://www.vtl.lv/en/ · Gibraltar Port Authority https://www.gibraltarport.com/bunkering · Luka Koper liquid cargoes terminal https://www.luka-kp.si/en/terminal/liquid-cargoes-terminal/ and https://luka-kp.si/eng/ · Enerdata Slovenia https://www.enerdata.net/estore/energy-market/slovenia/ · Port of Cork https://www.portofcork.ie/ and https://www.portofcork.ie/our-location/ · NIS https://www.nis.rs/en/activity/crude-refining/ and https://nis.rs/ · LUKOIL Neftohim Burgas https://neftochim.lukoil.com/en/About/GeneralInformation · LUKOIL refining https://www.lukoil.com/Company/BusinessOperation/Refining

Asia, Middle East, Americas, Africa — Reliance https://www.ril.com/businesses/energy/refining-marketing · Sikka Ports & Terminals https://www.sptl.co.in/business.html · EIA India https://www.eia.gov/international/content/analysis/countries_long/India/ · JTC Jurong Island https://www.jtc.gov.sg/jurongisland · OGJ, Shell concludes Singapore sale https://www.ogj.com/general-interest/companies/article/55279025/shell-concludes-sale-of-singapore-downstream-refining-chemicals-park · EIA South Korea https://www.eia.gov/international/content/analysis/countries_long/South_Korea/ · S-Oil https://www.s-oil.com/en/energy/OilRefining.aspx · EIA China https://www.eia.gov/international/content/analysis/countries_long/China/ · EIA Japan https://www.eia.gov/international/content/analysis/countries_long/Japan/ · EIA Malaysia https://www.eia.gov/international/content/analysis/countries_long/Malaysia/ · EIA Indonesia https://www.eia.gov/international/content/analysis/countries_long/Indonesia/ · Jordan Petroleum Refinery Company https://www.jopetrol.jo/EN/Pages/Refining · Tanger Med hydrocarbon terminal https://www.tangermedport.com/en/activities/hydrocarbon/ · ANCAP La Teja restart https://www.ancap.com.uy/20908/1/refineria-de-la-teja-retomo-operacion.html and https://www.ancap.com.uy/ · Kissy Industry — opened and discarded, a palm-oil company https://kissyindustry.com/?page_id=6755

Opened by a helper research pass and relayed with its quote; cited in the rows, with notes saying they were not re-opened by the compiler: Moeve San Roque environmental declaration https://www.moeveglobal.com/stfls/corporativo/FICHEROS/Declaraciones_medioambientales/declaracion-2019-san-roque-cepsa.pdf · Junta de Andalucía La Rábida declaration https://www.juntadeandalucia.es/medioambiente/portal/documents/20151/4076239/003_dma.pdf · Repsol A Coruña https://acoruna.repsol.es/es/sobre-complejo/nuestras-instalaciones/index.cshtml · Repsol Cartagena press release https://www.repsol.com/en/press-room/press-releases/2022/repsol-starts-construction-of-spains-first-advanced-biofuels-plant-at-its-cartagena-refinery/index.cshtml · St1 refinery https://st1.com/about-us/company-info/areas-of-operation/st1-refinery · Irish EPA Whitegate licence https://epawebapp.epa.ie/licences/lic_eDMS/090151b2806899b0.pdf · Gibraltar Port general information https://www.gibraltarport.com/bunkering/general-information · Galp Sines reactors press release https://www.galp.com/corp/en/media/press-releases/press-release/id/1575/galps-sines-refinery-receives-reactors-for-advanced-biofuels-production · Freeport of Ventspils https://www.portofventspils.lv/en/port-services/terminals/vitol-terminal-latvia/ · Freeport of Riga https://rop.lv/en/node/95 · OMV Schwechat https://www.omv.at/de/schwechat and https://www.omv.com/en/media/press-releases/2012/omv-schwechat-refinery-1-000-accident-free-days · Unipetrol RPA Kralupy https://www.unipetrolrpa.cz/en/AboutUs/Processing-refinery/Pages/Refinery-Kralupy.aspx · Danube port of Pančevo https://www.danube-logistics.info/danube-ports/profiles/port/6/82 · BTA, Rosenets terminal licence https://www.bta.bg/en/news/economy/511213-bulgarian-ports-infrastructure-company-licensed-to-operate-rosenets-oil-terminal · Belarus MFA petrochemicals https://belgium.mfa.gov.by/en/bilateral_relations/trade_economic/exports/petrochemicals/ · OFAC action 2011-08-11, address only, never the route class https://ofac.treasury.gov/recent-actions/20110811 · Warsaw Institute, Belarusian fuels via Russian ports (MEDIUM, notes only) https://warsawinstitute.org/belarus-begins-shipping-fuels-russian-ports/ · Arab Reform Initiative, SAMIR shutdown (Tier-3) https://www.arab-reform.net/publication/the-samir-refinery-shutdown-and-the-challenges-of-managing-moroccos-energy-supply/ · Marsa Maroc Mohammedia https://www.marsamaroc.co.ma/en/ports-and-terminals/mohammedia-port · ExxonMobil Singapore https://corporate.exxonmobil.com/locations/singapore · Port of Aqaba (Tier-3) https://www.globalsecurity.org/military/facility/port-aqaba.htm · Sierra Leone Kissy jetty (Tier-3/4) https://sierraloaded.sl/news/after-42-years-kissy-refinery-jetty-start-operations/ · Sierra Leone Petroleum Directorate https://pd.gov.sl/ · ANCAP refining https://www.ancap.com.uy/2155/1/refinacion.html

Wiki pages, water body only, flagged per row — Preemraff Lysekil, Brofjorden, Preemraff Gothenburg, Port of Kilpilahti, Port of Sines, Port of Koper, Vadinar Refinery, Vadinar, Pulau Bukom, Jurong Island, Ulsan, Seosan, Zhenhai District, Port of Ningbo-Zhoushan, Hengli Petrochemical, Changxing Island (Dalian), Maoming, Port of Aqaba.

Could not be opened, and therefore not cited — cms.preem.com (DNS); preem.com refineries page (404); nayaraenergy.com (403); shell.com.sg Bukom pages and shell.com's 2024 release (navigation shells, no body); neftochim.bg, mnpz.by, naftan.by, sinopecgroup.com, rcjy.gov.sa (connection refused); lukoil.bg (404); burgasport.bg (DNS); mawani.gov.sa (405); satorp.com.sa (DNS); varoenergy.com (expired certificate, before the redirect to varopreem.com was followed); gov.ie foreshore notice (403); upa.or.kr (404); gscaltex.com (maintenance page); moeveglobal.com/en/activities/refining (opened, no site-level content); EIA countries_long/Korea_South/, countries_long/Morocco/, countries_long/Bulgaria/ (404 — EIA publishes nothing at those paths); EUR-Lex, for the Belarus regulation text (unreachable to both passes, so no sanctions source is cited). PDFs fetched but unparseable: Irving Oil's Whitegate spec sheet, Reliance's Jamnagar SEZ sales update; the Port of Cork Masterplan 2050 exceeded the fetch size limit.


Section 2c compiled 2026-09-22 by a compiler pass merging three helper research passes. Every URL in it was fetched on that date by the compiler or by a helper, and which is which is stated above and in each row's notes. Every failure to fetch one is recorded rather than worked around. The §2, §2b and §5 sections are unchanged.


2d. hormuz_country_summary_v1.csv — commodity split, 2026-09-22#

What that means for the file. hormuz_country_summary_v1.csv gains a commodity_scope column as its second field. 104 rows → 113 rows. No existing row's class, bounds, basis or source URL was edited; the only change to them is the new column.

scoperowswhich countries
BOTH95every country whose bound rests on geography alone — no cited export point of theirs lies inside the Persian Gulf, so the same bound holds for crude and for products
CRUDE9AE, BH, EG, IL, IQ, IR, KW, QA, SA — the existing row, numbers unchanged
PRODUCTS9the same nine countries, newly derived (below)

The nine split countries are exactly those selected by a rule, not by hand: a country is split when hormuz_route_classification_v1.csv cites at least one of its export points as REQUIRES_HORMUZ (AE, BH, IQ, IR, KW, QA, SA), or when its summary class is already MIXED (adds EG, IL — transit/consignment roles whose [0, 1] was reasoned about crude moving through SUMED and the EAPC line).

How each PRODUCTS bound was derived#

Only from export points that hormuz_route_classification_v1.csv cites as loading products (commodity = PRODUCTS or BOTH). The crude bound is never carried across: docs/HORMUZ_METHOD.md §D2 states that a product's origin is where it was refined and loaded, which is a different set of terminals from the crude ones. Each PRODUCTS row's basis names the terminals it used and says in so many words that the crude bound is not carried over.

PRODUCTS classmin / maxderived from
SAMIXED0 / 1Product outlets fall on both sides. Inside the Gulf: Ras Tanura, Juaymah LPG Terminal, King Fahd Industrial Port Jubail (SATORP). Outside: Yanbu, Jazan, Jeddah, Duba. No opened source gives the volume split. The crude figure 0.82 is not reused — it is EIA's share of seaborne crude loading at Yanbu.
AEMIXED0 / 1Inside: Ruwais refinery jetties. Outside: Port of Fujairah (FOTT). No cited split.
KWREQUIRES_HORMUZ1 / 1Every cited product outlet is inside the Gulf: Mina al-Ahmadi, Mina Abdullah, Al-Zour. Kuwait has no coastline outside the Gulf. Agrees with the crude row because the geography, not the commodity, decides it.
QAREQUIRES_HORMUZ1 / 1Mesaieed, Ras Laffan. Same reasoning.
BHREQUIRES_HORMUZ1 / 1Sitra Wharf, Khalifa Bin Salman Port. Same reasoning.
IQUNKNOWN0 / 1No cited product export point at all — all four cited Iraqi outlets are commodity CRUDE. The crude bound [0.959, 1] is a ratio of crude export capacity (Basra terminals vs the Kirkuk–Ceyhan crude pipeline) and says nothing about product loadings.
IRUNKNOWN0 / 1No cited product export point. The crude bound [0.964, 1] is the Kharg-vs-Jask crude loading capacity floor.
ILUNKNOWN0 / 1No cited product export point; the two cited outlets are the crude terminals of the EAPC line.
EGUNKNOWN0 / 1See the deliberate refusal below.

A deliberate refusal: Egypt was not collapsed to 0/0#

The mechanical rule "every cited product point is DOES_NOT_REQUIRE_HORMUZ → 0/0" would have given Egypt 0/0, because its one product-capable cited outlet (Ras Shukheir, a commodity BOTH row) is on the Gulf of Suez. That collapse is not applied, and the rule carries an explicit census condition: a country is only collapsed to 0/0 or to 1/1 when at least one of its cited outlets is recorded as commodity PRODUCTS — i.e. cited as a product outlet. A terminal cited for its crude role does not establish that it is the country's only product outlet.

Narrowing Egypt from [0, 1] to 0/0 would have been the one direction of error that matters here: it would understate D2 exposure on the strength of a terminal list that was never a census. The crude row's own basis says the bound is [0, 1] because Egypt is the land bridge for Gulf crude and no opened source quantifies the split; nothing in this pass changes that, for either commodity.

Citations on the new rows#

Each PRODUCTS row carries the union of the geography_source_url values of the product outlets it used. Where a country has no cited product outlet (IQ, IR, IL), the row carries the URLs of its crude row instead, and the basis says why: those are the pages actually opened for that country's export geography, cited so the absence of a product outlet can be checked — not to carry a crude number across. No row was loaded without a basis and a URL.

One inherited tertiary citation is flagged in the row itself: Saudi Arabia's product row includes https://en.wikipedia.org/wiki/King_Fahd_Industrial_Port_(Jubail), inherited from the classification row for that terminal. It establishes the terminal's location only; the route class does not rest on it alone (Aramco's own ports page and the EIA chokepoints note are also cited).

What this does and does not change#

  • D1 is unchanged by construction. Every profile D1 used before is still selected, either as CRUDE or as BOTH. Verified row by row over EU-27 × 2015-01…2026-07.
  • D2 changes only where a Gulf origin actually supplied product. An origin that now holds only a CRUDE profile is absent from the D2 lookup, so its volume is bounded at [0, 1] and counted into unknown_share — never at its crude bound, and never at zero.
  • The hub question from §2c is still open. NL, BE, PL, EE, DE, FR, SG, MA, GI, LV, SI keep BOTH at 0/0, because their basis is pure geography: no cited export point of theirs is inside the Gulf. That is correct for D2 as docs/HORMUZ_METHOD.md defines it — product refined in Singapore from Gulf crude is D3, not D2 — but §2c's warning that these rows carry more weight in D2 than in D1 stands, and it is a coverage question, not a scope question.

Section 2d compiled 2026-09-22. The nine PRODUCTS rows are derived mechanically from hormuz_route_classification_v1.csv as it stood on that date; no new page was fetched for this pass, and no URL is cited here that was not already cited by a classification row or by the country's own crude row in §2b/§2c.


3. refineries.csv#

What it is. Crude oil refineries (plus recently closed and converted sites, carrying their status) in the six pilot countries of CLAUDE.md §6 — DE, FR, NL, PL, FI, EE. Covers dataset F. REFINERIES in docs/BRIEF.md §Core datasets, including the brief's requirement to track ownership history and status rather than assuming a static list.

Superseded in scope by §3b (2026-09-22), which extends the file to the rest of the EU and adds countries_no_refinery.csv. Everything in §3 still describes the 33 pilot rows, which §3b did not edit; the unit policy and the coordinate policy below apply to the whole file.

33 rows — DE 14, FR 9, NL 6, PL 2, FI 2, EE 0 (a confirmed zero, see below). By status: 27 OPERATING, 4 CONVERTED, 1 MOTHBALLED, 1 UNKNOWN. last_verified = 2026-09-21 on every row.

Unit policy — read this before using capacity_bpd#

capacity_bpd is populated only where a source itself published barrels per day. Where the only published figure is mass per year (Mt/a), capacity_bpd is left EMPTY and the figure is kept in capacity_original + capacity_unit_original. This is deliberate: converting tonnes per year to barrels per day requires a density factor that depends on the crude slate, and CLAUDE.md §3 forbids a universal tonne-barrel constant "when grade matters". Inventing a factor here would turn an operator's fact into our guess. A conversion, if ever needed, belongs in a pipeline step that records conversion_factor and conversion_method.

Consequence: capacity_bpd is empty for most European sites, because European operators publish Mt/a. Do not treat those blanks as zero or as missing data — the capacity is present in capacity_original.

Where an operator published both units (bp Rotterdam: 400,000 bbl/day and 19 Mt/yr; Petroineos Lavéra: 210,000 bpd = 10 Mt/a), both are recorded and there is no conversion.

Coordinates#

Per the brief, coordinates may come from OpenStreetMap — and only coordinates, never capacity, ownership or status. Every lat/lon sourced from OSM (Nominatim/Overpass, queried 2026-09-21) is flagged in that row's notes. These should be classified INFERRED_HIGH at best when ingested, with the source recorded as OSM.

Two rows deliberately carry empty coordinates:

  • Port-Jérôme-Gravenchon (FR) — the OSM centroid (49.4752211, 0.5528246) reverse-geocodes to Quillebeuf-sur-Seine in Eure (27), on the opposite bank of the Seine from the site's commune in Seine-Maritime (76). Rather than ingest a coordinate that contradicts the stated commune, it is left NULL for manual QA.
  • VPR Energy Rozenburg (NL) — no OSM feature found under any name variant tried.

Coordinate sources recorded for ten rows, 2026-09-28#

A check of the map's citations on 2026-09-28 found ten rows whose notes named no public source for the coordinates: the eight French rows of this section, HOLBORN Hamburg (the operator's Google Maps link was described but its URL not recorded) and ExxonMobil Antwerp (§3b; the EEA register was named for the site's status only). No coordinate was changed. Each row's notes now carries a sentence beginning "Coordinates …" that names the source, which the map cites instead of this repository. The five schematic pipelines drawn to these refineries (cim-le-havre-gonfreville, donges-vern, ndo, rapl, spmr-la-mede-puget in infrastructure_geo_v1.csv) take their citation from the refinery row, so they now cite the same public source.

The eight French rows are OpenStreetMap coordinates. Each stored pair is exactly (0 m) the Nominatim centroid of a named OSM feature tagged landuse=industrial + industrial=refinery, looked up again on 2026-09-28, so they are coordinate-only evidence like the other OSM rows:

RowOSM featureEEA point (reporting year 2024) vs stored
gonfreville-normandieway 31356020~2.7 km NNW, off site
dongesrelation 10378272~8.2 km NW, off site
feyzinrelation 16304690~1.5 km ENE, off site
laverarelation 21224838~2.2 km E, off site (2016-2021 readings also off site)
fos-sur-merway 154044995~0.5 km NE, off site (2016-2017 reading on site, ~70 m)
grandpuitsway 64265381~4.4 km E, off site (2016-2017 reading on site, ~380 m)
la-mederelation 21222758~4.1 km E, off site (2016-2021 readings on site, ~390-720 m)
sara-antillesway 35389033~1.0 km NE, off site (2017-2021 reading on site, ~125 m)

The EEA Industrial Emissions Portal (via the DiscoData SQL API, §3b) was checked first for all eight. For France its 2022-2024 points are not on the refinery sites: every one falls outside the OSM site outline, some by several kilometres, and several moved away from an earlier on-site reading. They look like administrative or postal locations of the operating company, not the plant. The EEA point is therefore recorded in each row's notes as a cross-check, with the distance, and not used. Donges, Grandpuits, La Mède, Gonfreville and Lavéra are flagged there as unresolved discrepancies between the two sources.

HOLBORN Hamburg and ExxonMobil Antwerp are cited to the EEA register. Holborn's pair is the one in the Google Maps place link on https://www.holborn.de/ (re-opened 2026-09-28; the link carries 53.4770211, 9.9517431); the EEA facility Holborn Europa Raffinerie GmbH is registered 13 m away. ExxonMobil Antwerp's pair is identical to the EEA installation ExxonMobil Petroleum & Chemical_raffinaderij (reporting years 2019-2024), which lies inside the OSM outline of way 25218100 Esso Belgium. The portal's front end has no per-facility page that could be opened, so the rows record the installation name and register id instead of a facility URL.

Sources consulted, by country#

France

Netherlands

Poland

Finland

Germany — 14 rows

Operator sources: https://www.miro-ka.de/unternehmen · https://www.pck.de/unternehmen · https://www.mvl-schwedt.de/ueber-uns · https://totalenergies.de/ueber-uns/standorte/raffinerie-leuna · https://ruhroelrefinery.com/ · https://www.klesch.com/our-businesess/ · https://www.shell.de/ueber-uns/standorte/rheinland/medieninfos-und-downloads/zeitenwende-shell-in-wesseling-roholfrei-neue-zukunftsweisende-produktionsanlagen-entstehen.html · https://www.shell.de/ueber-uns/standorte/rheinland.html · https://www.omv.de/de/unternehmen/raffinerie-burghausen · https://www.omv.de/de/unternehmen/pipeline · https://gunvorgroup.com/moving-energy/investments/refineries/gunvor-refinery-ingolstadt/ · https://gunvor-raffinerie-ingolstadt.de/das-unternehmen/historie/ · https://www.bayernoil.de/unternehmen · https://www.bayernoil.de/unternehmen/standorte · https://www.bayernoil.de/unternehmen/anteilseigner · https://www.bayernoil.de/unternehmen/historie · https://www.bp.com/de_de/germany/home/wo-wir-sind/raffinerie-lingen/ueber-uns/daten-und-fakten.html · https://www.bp.com/de_de/germany/home/wo-wir-sind/raffinerie-lingen/ueber-uns/historie.html · https://www.heiderefinery.com/key-facts-and-history/ · https://www.heiderefinery.com/our-business/ · https://www.heiderefinery.com/part-of-klesch-group/ · https://www.holborn.de/unternehmen · https://www.holborn.de/leistungen · https://www.nynas.com/globalassets/about-us/financials/nynas-annual-and-sustainability-report-2025-final.pdf · https://www.nynas.com/en/about/production-supply/

Corporate events: https://www.bp.com/press-and-publications/press-releases/bp-completes-sale-of-gelsenkirchen-refinery-to-klesch-group · https://www.ajot.com/news/shell-invests-to-repurpose-german-energy-and-chemicals-park-rheinland

Industry association cross-check (stale — see warning below): https://en2x.de/maerkte/raffinerien-und-produktion/ · https://en2x.de/wp-content/uploads/2023/04/en2x-statistiken-raffineriekapazitaeten-kapazitaetserhebung-2022.xlsx

Warning: the en2x refinery capacity list is a 31.12.2022 snapshot and is demonstrably stale#

en2x is the German petroleum industry association and publishes the most convenient national refinery capacity table. The only edition still downloadable is RAFFINERIEKAPAZITÄTEN 2022, unit "in 1000 t", as of 31 December 2022. The /service/statistiken/raffineriekapazitaeten/ page now redirects to the en2x homepage and is absent from its sitemap; roughly 27 probed URL variants for 2023–2025 editions returned soft-404 HTML rather than a spreadsheet.

It is stale in at least four concrete, checkable ways:

  • it still lists Nynas Harburg at 1.825 Mt — the plant has not operated since mid-2022;
  • it still lists Wesseling crude capacity at 7.3 Mt — crude distillation there ended in March 2025;
  • it still shows Ruhr Oel as "BP Europa SE: 100 %" — bp sold it in August 2026;
  • it lists "Rosneft Deutschland" shareholdings without noting the federal trusteeship.

It is therefore used in refineries.csv only as a cross-check, never as the sole current source, and every row that uses it carries capacity_source_date = 2022-12-31 and a warning in notes. Two rows (Shell Godorf, and the historic figures for Wesseling and Nynas) depend on it because no operator publishes a current figure — those are flagged as indicative, not current.

Findings that contradict common assumptions#

These were checked precisely because the research brief asserted the opposite, and all four turned out differently:

  1. bp no longer owns Gelsenkirchen. bp completed the sale of Ruhr Oel / Gelsenkirchen to the Klesch Group on 3 August 2026 (intention announced 19 March 2026). bp explicitly retains five refineries, including Lingen — Lingen did not move with Gelsenkirchen.
  2. It is Wesseling, not Godorf, whose crude refining stopped. Shell's press release of 14 March 2025 announces the shutdown of the Wesseling D500 crude distillation unit and states plainly that "Die Rohöl-Verarbeitung in Köln-Godorf bleibt in Betrieb." A brief that says Godorf closed has it inverted. Corroborated by Shell's January 2024 FID announcement.
  3. Nynas Harburg is not operating. Nynas' own 2025 annual report: "The Harburg site is currently mothballed, with all hydrocarbons removed and tanks cleaned"; "the site's closure in 2022"; "hasn't been in operations since mid-2022". Nynas' live site lists only three plants — Nynäshamn, Gothenburg, Eastham — Harburg absent. Recorded as MOTHBALLED.
  4. Heide is not insolvent and is not closing. It is operating, and its owner Klesch expanded in 2026 by buying Gelsenkirchen. The Klesch/Germany litigation that does exist is an ICSID arbitration (ARB/23/49) over the EU solidarity contribution — a tax dispute, not insolvency. https://www.italaw.com/cases/10931 · https://investmentpolicy.unctad.org/investment-dispute-settlement/cases/1320/

Russian-linked shareholdings under German federal trusteeship#

Three German refineries carry Rosneft Deutschland stakes held under Bundesnetzagentur trusteeship: MiRO (24.00 %), PCK Schwedt (37.5 %) and BAYERNOIL (28.57 %). The existence of the trusteeship is verified from the operators' own sites (MiRO: "seit 16. September 2022 unter Treuhand der BNetzA"; BAYERNOIL: "steht derzeit unter Treuhandverwaltung durch die Bundesnetzagentur"). The current order's validity period is UNVERIFIED — bundesnetzagentur.de returned 404 on the pages tried — and is therefore not recorded.

Related and material for crude-origin modelling: PCK Schwedt's supply route changed. It was historically fed by the Druzhba pipeline from Russia; since 1 January 2023 it is supplied mainly via the Rostock–Schwedt line, plus Druzhba-system volumes arriving from Gdańsk and from Kazakhstan. Independently attested from the Polish side by PERN, which describes the Druzhba western section as running Płock → Schwedt tank park and feeding both PCK Schwedt and TotalEnergies Spergau.

Deliberate gaps in the German rows#

  • Rotterdam–Rhine (RDO) pipeline connections are NOT populated for the Rhine-Ruhr refineries (Gelsenkirchen, Godorf, Wesseling). No opened page from bp, Klesch, Ruhr Oel or Shell names any crude pipeline or port for these sites. The connection is widely assumed but was not verifiable, so the fields are empty. Do not fill them from the assumption.
  • Commissioning years are empty for PCK Schwedt, Gelsenkirchen, Godorf, OMV Burghausen, Heide and Nynas Harburg — the operator pages state none and none was inferred.
  • Gelsenkirchen Horst site coordinates are not recorded; geocoding the Horst address returned an unrelated building. Only the Scholven coordinates are given.
  • Godorf-only crude capacity after the Wesseling shutdown is not published by Shell; the 9.3 Mt figure carried is the 31.12.2022 en2x value and pre-dates the shutdown.
  • Whether Shell is divesting its PCK stake was not established — flagged as an open question.

Double-counting guards#

Two German entries describe multi-site operations whose published capacity is a combined figure. To keep site-level geography without inflating national totals:

  • BAYERNOIL — ~10 Mt/a is published for Neustadt and Vohburg together ("wie eine einzige Raffinerie"). The capacity sits once on bayernoil-neustadt; bayernoil-vohburg carries empty capacity by design, which is a modelling choice, not missing data.
  • Ruhr Oel Gelsenkirchen — the Scholven and Horst sites are recorded as a single row, because bp and Klesch publish one combined capacity (~12 Mt/a and 265,000 bbl/day).

Anyone summing capacity_original for Germany must read these two notes first.

Estonia — confirmed ZERO crude refineries, not missing data#

Estonia contributes no rows to refineries.csv. That absence is a confirmed zero, not an unknown, and the distinction matters under CLAUDE.md §1 ("Missing is NULL. Zero means confirmed zero."). No placeholder row was created, because a row in a refinery table asserts that a refinery exists.

Verified against two Tier-1 IEA reviews:

Do not confuse Estonia's oil-shale industry with crude refining. Viru Keemia Grupp (Kohtla-Järve) and Enefit / Eesti Energia (Narva) produce shale oil from oil shale — a different feedstock and a different process. VKG's own pages describe the main product as "shale oil (heavy fuel oil) made from oil shale", mostly exported. https://www.vkg.ee/en/about-us/ · https://www.vkg.ee/en/shale-oil/ · https://www.enefit.com/en/ These belong in a separate facility class (e.g. SHALE_OIL_PLANT) if ever modelled, never in the crude refinery table. Their coordinates and capacities could not be verified on any page opened and are therefore not recorded.


3b. refineries.csv — EU-wide extension, and countries_no_refinery.csv, 2026-09-22#

Why. §3 stopped at the six pilot countries of CLAUDE.md §6. But §6 also says the architecture is all-EU from day one and that the pilot limits only which countries we run and QA first. A refinery table that stops at DE/FR/NL/PL/FI/EE makes every EU-27 aggregate silently wrong: an Italian or Spanish barrel has nowhere to land, and a country with no rows is indistinguishable from a country with no refineries. This pass closes both halves of that — the rows, and the cited zeros.

What changed.

FileBefore (2026-09-21)After (2026-09-22)
refineries.csv33 rows, 5 countries with rows (DE 14, FR 9, NL 6, PL 2, FI 2)90 rows, 21 countries (+57)
countries_no_refinery.csvdid not exist5 rows (CY, LV, LU, MT, SI)

New rows by country: IT 16, ES 10, SE 5, GR 4, RO 4, BE 3, CZ 3, DK 2, HR 2, PT 2, AT 1, BG 1, HU 1, IE 1, LT 1, SK 1. New rows by status: 44 OPERATING, 5 CONVERTED, 5 CLOSED, 1 IDLE, 1 UNKNOWN. Whole file now: 71 OPERATING, 9 CONVERTED, 6 CLOSED, 2 UNKNOWN, 1 IDLE, 1 MOTHBALLED.

last_verified = 2026-09-22 on every new row. No 2026-09-21 row was edited — the diff is 57 insertions and zero deletions.

Two cross-checks run against every country in this pass#

Neither is a capacity source. Both are Tier 1, both were run directly rather than recalled, and both are recorded here rather than per row because they apply to the whole extension.

Eurostat refinery intake — the test that makes a zero a measured zero#

nrg_cb_oilm ("Supply and transformation of oil and petroleum products — monthly data"), with nrg_bal = RI_OBS ("Refinery intake - observed"), siec = O4100_TOT ("Crude oil"), unit = THS_T ("Thousand tonnes"). Dataset last updated 2026-09-10; fetched 2026-09-22 at

https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/nrg_cb_oilm
  ?format=JSON&lang=EN&nrg_bal=RI_OBS&siec=O4100_TOT&unit=THS_T&sinceTimePeriod=2008-01&geo=<ISO2>
CountryObservationsRangeNon-zero months
CY1982008-01 → 2026-070
LU1982008-01 → 2026-060
LV1982008-01 → 2026-060
MT1862009-01 → 2026-060
SI1982008-01 → 2026-060

The values are reported 0.0, not missing — the observation exists in every month. That is exactly the distinction CLAUDE.md §1 draws between "zero means confirmed zero" and "missing is NULL", and it is why these five countries get a CONFIRMED_ZERO note rather than silence.

The control that shows the test can fail. The same query over the last 12 months for every country in this pass that does get rows returns non-zero intake in all of them: IT 54,153 kt, ES 55,299, BE 28,570, GR 22,324, SE 15,361, RO 9,181, LT 8,596, AT 8,252, PT 7,699, DK 7,500, CZ 7,111, BG 5,829, SK 5,192, HU 3,714, IE 2,690, HR 2,589. Sixteen countries with rows, sixteen non-zero series; five countries with a cited zero, five all-zero series. No country falls between.

EEA Industrial Emissions Portal — a site register, never a capacity#

docs/DATA_SOURCES.md §K.4 records the EEA Industrial Emissions Portal as CC-BY and usable as the site register / join key. The portal's own front end is a JavaScript shell, but its DiscoData SQL API answers directly and was queried on 2026-09-22:

https://discodata.eea.europa.eu/sql?query=
  SELECT countryCode, installationName, IEDAnnexIMainActivity, x_4326, y_4326, status, reportingYear
  FROM [IED].[latest].[ProductionInstallation]
  WHERE IEDAnnexIMainActivity LIKE '1.2%'

IED Annex I activity 1.2 is "Refining of mineral oil and gas". It was used in this pass for existence, operator, permit status and coordinates only. It publishes no capacity and none was taken from it. Where an EEA coordinate is used, the row's notes names the installation, its reporting year and https://industry.eea.europa.eu/. Unlike an OpenStreetMap coordinate this is a Tier-1 regulatory record, so it does not carry the OSM caveat — but it is still a coordinate and nothing more.

Four limitations found while using it, every one of which matters downstream:

  1. Reporting granularity differs by country. BE, BG, DK, ES, GR, HR, HU, IE, IT, LT, PT, RO, SE and SI report roughly one installation per refinery; DE (161 rows), PL (86) and SK (16) report one installation per process unit ("Atm. Ofen (Top 5)", "Claus-Anlage 4", "HYDROKRAK"). A count of 1.2 installations is not a count of refineries.
  2. It is incomplete and its "latest" extract mixes reporting years (2017–2024 depending on the installation). An absence in this register is not evidence of absence and was never used as one.
  3. It contains misclassifications. Latvia's only IED 1.2 installation is SIA "Rigas satiksme" — Riga's municipal public-transport operator. Estonia's is the Paldiski distillation terminal (Alexela / Nord Terminals). Neither is a crude refinery.
  4. status is a permit state, not an operating state. Croatia's Sisak installation is functional for reporting year 2024 although INA's own annual report says the refinery was permanently closed in 2020; Spain's REFINERIA TENERIFE is functional although Moeve closed it; Italy's Livorno installation is functional although Eni announced the topping plant shutdown. In every one of those cases the operator's own words were preferred and the register reading was recorded alongside, never silently dropped.

Concawe was not used at all#

docs/DATA_SOURCES.md §K.2 records Concawe's refinery map as the only complete EU list and as non-commercial-only with an anti-scraping term. Its undocumented JSON endpoint was not called in this pass and no Concawe figure appears in any row. An open endpoint is not a licence. FuelsEurope (§K.3) is derived from Concawe and was likewise not used.

Unit policy — unchanged, and now the single biggest reason for an empty cell#

§3's rule stands: capacity_bpd is populated only where the source itself published barrels per day. It is filled on 15 of the 57 new rows. The units actually published, verbatim from the sources, are Mt/a (25 rows), kbpd (10), bpd (3), t/a (1), t/day (1) and Mbbl/a (1).

Three notes on how the cells were written:

  • The number and its unit are the publisher's; only the unit's spelling is normalised to the token vocabulary the file already uses (Eni prints kbbl/d, MOL prints mtpa, OMV prints "Millionen Tonnen Rohöl pro Jahr" — all become Mt/a or kbpd with the number untouched). The publisher's verbatim sentence is kept in notes, which is where exact wording belongs.
  • kbpd → bpd is filled; Mt/a → bpd is not. The first is an exact decimal rescale inside one dimension (×1000), the same move the file already makes for VPR Rozenburg. The second needs a crude-slate density and is never performed.
  • Two rows deliberately leave capacity_bpd empty although a barrel figure exists. St1 Gothenburg publishes "30 million barrels of crude oil per year, or 11,500 tonnes per day" — barrels per year and tonnes per day, never barrels per day; converting would require a stream-day assumption. Crossbridge Fredericia publishes "10,000 tons daily". Both are recorded in their published units.

Sources consulted, by country#

Every URL below was opened on 2026-09-22. Where a PDF is cited, WebFetch returned raw binary for it and the file was downloaded and text-extracted locally before quoting — that applies to every IEA review, every annual report and the CORES workbook.

Italy (16 rows) — Eni site pages for Sannazzaro, Taranto, Livorno, Gela and Venezia-Porto Marghera (eni.com/en-IT/actions/global-activities/Italy/...) and the Eni press releases on the Gela bio-refinery (2019) and the Livorno conversion (2024-01); isab.com; sonatrachitalia.it/azienda; raffineriadimilazzo.it/en/who-we-are/; iplom.it/azienda.php; almapetroli.com/en/operations/; italianapetroli.it (the group's refining page and the release on acquiring Esso's Italian refining assets); the national capacity table UNEM UNEM_25_appendice_statistica.pdf (sourced to MASE, explicitly "al 1° gennaio 2024") and the 2022 edition; IEA Italy 2023 Energy Policy Review (iea.blob.core.windows.net/assets/71b328b3-.../Italy_2023_EnergyPolicyReview.pdf, Table 9.1, the government-supplied 11-refinery list in kb/d); ERG's release on the Rome refinery conversion; Staffetta Quotidiana and Gazzetta di Mantova for the Cremona and Mantova dismantling decisions; Il Sole 24 Ore on the ISAB ownership change.

Spain (10 rows) — the spine is CORES (Corporación de Reservas Estratégicas de Productos Petrolíferos, the Tier-1 corporation under MITECO): cores.es/en/spanish-refinery-capacity and its refinery-capacity.xlsx, a per-refinery crude-distillation series 1984–2025 headed "Unit: thousands of tonnes", "Figures to 31st December", "Updated 30-07-2026", which also carries commissioning years and a note on Tenerife's non-operation. It was downloaded and parsed directly. (The AOP list named in the research brief no longer exists: aop.es is now a redirect stub reading "AOP es ahora AICE" with no refinery table.) Also: Repsol complex pages for A Coruña, Puertollano and Tarragona; petronor.eus/en/facilities/; Moeve's environmental declarations for San Roque and La Rábida, its "Cepsa is becoming Moeve" release and its release closing the Tenerife refinery; bp's Castellón page and its 2021 environmental declaration PDF; asesa.es/en/welcome/.

Portugal (2 rows) — galp.com industrial-and-midstream page; Galp's release "Galp to concentrate refining operations in Sines"; Galp's Matosinhos page. DGEG (Direção-Geral de Energia e Geologia) was opened and is cited only as a register: despite being the Tier-1 national source it is stale, still listing Matosinhos as operating at 5.5 Mton/ano, so no status or capacity was taken from it.

Greece (4 rows) — HELLENiQ Energy Annual Report 2025 (annualreport2025.helleniqenergy.com) and its corporate refining page; Motor Oil Hellas Full-Year Financial Report 2025 and Annual Report 2024 PDFs (moh.gr/wp-content/uploads/...).

Romania (4 rows) — OMV Petrom's refining-and-marketing and Petrobrazi pages; the Bucharest Stock Exchange regulated filing RRC ... Annual Financial Report 2025 ENG for Rompetrol Rafinare (used because rompetrol.com and kmginternational.com return 403 — and it is the better source: it carries Petromidia's capacity, its 1979 ADU commissioning, the ~40 km Oil Terminal S.A. pipeline from Constanța and the statement that Vega no longer processes crude); Serbia-Energy for the Petrotel-Lukoil insolvency filing.

Bulgaria (1 row) — neftochim.lukoil.com General Information and History (English and Bulgarian); BTA and France 24 for the special-manager appointment; Fakti.bg for throughput.

Croatia (2 rows) — INA Annual Report 2024 PDF and Q4 2025 financial report; INA's announcements on completing the Rijeka upgrade and on starting full-capacity fuel production; the JANAF PDF hosted at api.janaf.hr for the Omišalj–Urinj subsea crude pipeline.

Austria, Czechia, Hungary, Slovakia (6 rows) — omv.at/de/schwechat and OMV's 2022 press release confirming full operation after the crude-unit damage; ORLEN Unipetrol's Litvínov and Kralupy site pages, its group "About us" page and its March-2026 Kralupy turnaround release; PARAMO's own press release discontinuing crude processing and its history page; MERO ČR (the Czech crude pipeline operator) IKL and Družba pages; molgroup.info production-sites and logistics pages; slovnaft.sk company profile; transpetrol.sk.

Sweden, Denmark, Lithuania, Ireland, Belgium (12 rows) — varopreem.com/en/business/ manufacturing-hubs/; st1.com/.../st1-refinery; nynas.com/en/about/production-supply/ and the Nynas Annual and Sustainability Report 2025; crossbridge.dk/en/profile; klesch.com/our-businesess/ and Equinor's 2021 release on selling its Danish refining business; ORLEN Lietuva's refinery and "Terminal and Pipelines" pages; irvingoil.com/en-CA/discover-irving/operations; TotalEnergies' Antwerp platform page; ExxonMobil's Belgium operations page; Gunvor's own case study "Preparing remediation after refinery shutdown"; IEA Belgium 2022 Energy Policy Review PDF.

Closures, conversions and control changes found in this pass#

Every one of these is a fact the row would have got wrong if the site list had been taken from an older summary.

SiteFinding
INA Sisak (HR)INA Annual Report 2024, p.202: "Sisak Refinery was permanently closed in 2020 and is currently undergoing conversion to an alternative use." The EEA register still shows the installation functional for 2024 — a live permit, recorded alongside. CONVERTED.
Rompetrol Vega, Ploiești (RO)Operator's own BVB filing: "At present, the refinery does not process crude oil anymore, but only medium distilled products, resulted from Petromidia Refinery." CONVERTED; its 395 kt throughput is non-crude feedstock and is deliberately kept out of the capacity columns.
Petrotel-Lukoil, Ploiești (RO)Offline since October 2025; maintenance complete but restart blocked by sanctions; a state supervisor since 2026-02-12; insolvency filed August 2026 explicitly as restructuring to stay restartable. IDLE — not CLOSED, because nothing cited says the plant will not restart.
LUKOIL Neftohim Burgas (BG)Still operating, but under state-appointed special management after the US sanctions on Lukoil: special administrator Rumen Spetsov appointed 2025-11-14 under an emergency seizure law; by 2026-08-26 the special commercial manager is Evgeni Simeonov and throughput is rising with crude secured to end-September 2026.
PARAMO Pardubice (CZ)Crude distillation discontinued by a decision announced 2 July 2012 — not 2022, as circulating summaries say. MERO ČR independently dates the end of Družba supply to Pardubice to 2012. The 2022 date most likely comes from the separate 2021–22 ORLEN OIL synergy that ended finished lubricants. CONVERTED — the site still makes asphalts and process oils.
Gunvor Petroleum Antwerp (BE)Gunvor's own case study: "Gunvor ceased refining operations in Antwerp amidst the COVID-19 crisis"; "The site was fully shutdown on 31 December 2022." Site shares went to Vopak in 2023. CLOSED. The EEA register independently carries it as notRegulated from 2023. Note this is a different asset from Gunvor Energy Rotterdam, whose status remains UNKNOWN (§3).
Fredericia (DK)Not a Klesch refinery. Shell → Postlane Partners → Crossbridge Energy, effective 1 July 2021. The EEA register's own name history (A/S Dansk Shell 2020 → Crossbridge Energy A/S 2021 → Crossbridge Energy Fredericia A/S 2024) corroborates it.
Kalundborg (DK)A second Danish refinery, bought by Klesch from Equinor. Register history: Statoil Refining Denmark → Equinor Refining Denmark → Kalundborg Refinery A/S.
Preem (SE)Preem no longer exists as an owner. VARO Energy completed the acquisition in January 2026; the group is VAROPreem and every preem.com URL 404s. Both Swedish sites are recorded under VAROPreem.
St1 Refinery, Gothenburg (SE)A third, genuinely separate Gothenburg refinery alongside Preem's and Nynas'. It was missing from the brief and would have been missing from the dataset.
Moeve (ES)Cepsa rebranded to Moeve in 2024; both San Roque and La Rábida are recorded under the new name with the rebranding release cited.
Moeve Tenerife (ES)CLOSED, on Moeve's own release headed "Cepsa closes its oil refinery in Tenerife", 23 May 2022. The widely repeated "closed in 2015" could not be verified anywhere and appears in no cell. The EEA register still shows REFINERIA TENERIFE as functional through 2024; both readings are in the row.
Galp Matosinhos (PT)Galp's own page: "A refinaria encerrou em maio de 2021", with the units being demolished to Q4 2026. Recorded CLOSED rather than CONVERTED, because the surviving logistics park is a separate adjacent asset, not a conversion of the refinery; the row says so, so the call can be flipped. The EEA register carries Petrogal-Refinaria do Porto as disused from 2022.
Sonatrach Augusta and SARPOM Trecate (IT)Two operating Italian refineries that were not in the brief at all. Augusta is the former Esso Italiana site (same EEA coordinates, operator changes from Esso in 2018 to Sonatrach from 2019); Trecate is SARPOM, now in IP Italiana Petroli. Omitting them would have understated Italian capacity by roughly 17 Mt/a.
Eni Gela and Eni Venezia-Porto Marghera (IT)Both converted to bio-refineries. Porto Marghera is the sharper case: Eni says fully converted in 2014, while the IEA Italy 2023 table still lists it at 70 kb/d among "11 operational refineries". Adjudicated in the operator's favour with an explicit double-counting guard in the row.
IES Mantova, Tamoil Cremona, Raffineria di Roma (IT)All CLOSED, each with a dated source — the Mantova dismantling authorisation, the Cremona conversion and the TotalErg board decision on Rome.
Saras / Sarlux (IT)Vitol's acquisition confirmed by UNEM's own footnote ("Raffineria acquisita da Vitol nel 2024").

Disagreements recorded rather than resolved#

26 of the 57 new rows carry a DISAGREEMENT marker in notes, which the loader reads as an unresolved reconciliation and which caps that row's confidence at LOW (docs/CONFIDENCE.md §2). The substantive ones:

ItemValue AValue BTreatment
Eni Livorno (IT) — the single most consequential open question in this passEni, 2024-01-29: "Eni has stopped importing crude oil and initiated the shutdown of the ... Topping plant"UNEM/MASE still lists 4.2 Mt/a as at 1 Jan 2024 and 2,943 kt of 2024 throughput; the EEA register shows the installation functional for 2024status = UNKNOWN, capacity empty. Both readings are in the row. This is the highest-value manual follow-up in the extension. Resolved 2026-09-27: CONVERTED on Eni's Fact Books 2024 and 2025 (§3e).
Slovnaft Bratislava (SK)MOL Group: "124,000 bpd (6.1 mtpa)"Slovnaft's own profile: "5.5 – 6 million tonnes of crude oil, annually"Both retained; the MOL figure is in the capacity cells because it is a single precise value with both units printed together.
ORLEN Unipetrol (CZ)Per-site pages: Litvínov 5.4 Mt + Kralupy 3.3 Mt = 8.7 MtGroup page: "7.5 million tons of crude oil" combined conversion capacityPer-site figures used; the group figure flagged on both rows. No page reconciles "processing" with "conversion" capacity.
ORLEN Lietuva Mažeikiai (LT)ORLEN Lietuva's own refinery page: 10 Mt/a design capacityORLEN's 2023 Integrated Report: 10.2 Mt/aBoth retained; the site's own page used.
HELLENiQ Aspropyrgos (GR)Annual Reports 2024 and 2025: 146 kbpdCorporate page (2022 data): 148 kbpdBoth retained; the dated annual-report figure used.
Rompetrol Petromidia (RO)5.32 Mt raw material/yr5 Mt/yr — inside the same filing, whose pages carrying 5.32 still bear a "financial year 2020" running headerBoth retained in notes.
Kalundborg (DK)Equinor: legal transfer completed 31 December 2021Klesch: "Acquired from Equinor in 2022"Both retained.
Petronor Muskiz (ES)Operator: 12 Mt/aCORES: 11 Mt/aBoth retained; CORES in the cell.
Moeve La Rabida (ES)Moeve EMAS declaration 2025: 10 Mt/aCORES: 11.2 Mt/aBoth retained; CORES in the cell.
Repsol Tarragona (ES)Repsol: 9.5 Mt/a of materia primaCORES: 9 Mt/a of crudeBoth retained — they measure different things, and neither page says so.
Italy, every rowOperator pagesUNEM (MASE-sourced, as at 2024-01-01) and the IEA Italy 2023 government table in kb/dUNEM used for the Mt/a capacity cells; the IEA kb/d list retained per row as reference, never mixed into the capacity columns.

countries_no_refinery.csv — the cited zeros#

Six EU member states now carry a CONFIRMED_ZERO note on core.country.metadata.refineries: Estonia (§3, unchanged, verified_at 2026-09-21) plus CY, LV, LU, MT and SI from this pass. The loader reads the new file through parse_countries_no_refinery and writes it with exactly the mechanism Estonia already used; a row with no statement, or whose only citation is a wiki/OSM host, is rejected rather than loaded, and if a country ever acquires a refinery row the loader refuses to overwrite it and records a conflict instead.

ISO2Strongest statementPublisher
CY"In April 2004, Cyprus Petroleum Refinery Ltd. closed the country's petroleum refinery at Larnaca and began to convert its tank farm to a fuel import and storage center."USGS, Minerals Yearbook 2004, The Mineral Industry of Cyprus
LV"There is no domestic oil production nor refinery in Latvia. The country, therefore, relies exclusively on oil imports for its domestic consumption."IEA, Latvia 2024 Energy Policy Review
LU"It does not have any crude oil production or oil refining capacity. The country imports 100% of its oil products supply..."IEA, Luxembourg 2020 Energy Policy Review
SI"As the country's only refinery ceased operating in 1998, the country imports all its oil products."Enerdata, Slovenia Energy Information (data year 2025) — Tier 3, see below
MTNo statement exists. The zero rests on the Eurostat series. Since 2026-09-27: "In Malta, there are no petroleum refining activities, hence this category is reported as NO in the NIR submission, for all timeseries." (§3e)Eurostat nrg_cb_oilm; since 2026-09-27 Government of Malta, GHG National Inventory Document, April 2025 (Climate Action Authority o.b.o. the Ministry for the Environment, Energy and Public Cleanliness)

Two of these are weaker than the others, and the file says so in its own caveat column.

  • Malta was the weakest row in the file (superseded 2026-09-27, see §3e: it now quotes the Government of Malta's own inventory statement; the text below records the 2026-09-22 state). No opened page states in words that Malta has no crude refinery. Malta's final updated NECP 2021-2030 (381 pp, grepped in full) mentions refining/crude only in connection with the Directive 2009/119/EC stocks obligation; the USGS Minerals Yearbook Malta chapters list only limestone quarries and salt pans and never use the word "refinery"; the EEA register returns nothing for MT. All of that is negative evidence. What carries the row is Eurostat's reported 0.0 in all 186 months — which is a measured zero, not an absence of data, and is exactly what CLAUDE.md §1 licenses. A Maltese regulator or ministry statement would upgrade it and should be sought. USGS's "no identified mineral fuel resources" is about resources in the ground and must never be quoted as if it said "no refinery".
  • Slovenia: the fact of zero is solid, the cessation year is not. The only narrative source that could be opened is a commercial vendor, and a conflicting year (2000) circulates on another vendor page that was not opened. nafta-lendava.si fails TLS hostname validation against a *.hitrost.net certificate and the STA article "Nafta Lendava Refinery Operates Again" returns HTTP 403 — which looked like a live contradiction until the matching 24ur.com report of a Lendava restart after a crude-supply failure was opened and found to be dated 13 October 1998. It belongs to the 1998 story and is not evidence of a modern restart. Slovenia's only EEA IED 1.2 installation is gas refining at the Petišovci field, status disused. Do not treat 1998 as a verified date.

Gap register for the 57 new rows#

Empty fieldRowsWhy
capacity_bpd42The publisher printed tonnes, not barrels. Not missing data — see the unit policy above.
connected_ports40No opened page names one. Most are inland or pipeline-fed sites (Schwechat, Litvínov, Pardubice, Duna, Bratislava) where the marine entry point is well known but was never stated by an opened source. Assuming Trieste for a TAL-fed refinery would be exactly the Rotterdam–Rhine mistake §3 refused to make.
connected_pipelines / connections_source_url38 / 33Same rule. Notably Petrobrazi has none — conpet.ro refused the connection (ECONNREFUSED), so nothing about the Romanian crude network was citable. Since 2026-09-27 Petrobrazi, Petrotel-Lukoil and Petromidia carry CONPET connections cited to CONPET's 2025 annual report on bvb.ro (§3e).
capacity_source_date33The page carries no date. Operator "about us" pages are almost never dated; the dated sources in this pass are CORES (2025-12-31), UNEM (2024-01-01), the annual reports and the stock-exchange filings.
commissioned_year30No opened page states one, or the only year found was a site-origin date rather than a refinery commissioning date, or it appeared only in a search snippet. Never inferred.
capacity_original / capacity_unit_original / capacity_source_url16Thirteen are sites that no longer distil crude, where a capacity would be misleading. Three are genuine gaps: LUKOIL Neftohim Burgas (see below), Nynas Nynäshamn and Nynas Gothenburg — Nynas publishes no capacity on any page and none appears in its 2025 Annual and Sustainability Report, which was downloaded and grepped. Since 2026-09-27 Burgas carries a permit-ceiling capacity (9 000 000 t/a) and Livorno is CONVERTED; the two Nynas capacities are still UNVERIFIED (§3e).
owner9The legal owning entity was not stated on an opened page (HELLENiQ's three sites, OMV Petrom, the Romanian and Croatian rows). The operator is recorded; the owner is not guessed.
latitude / longitude2Tamoil Cremona and Raffineria di Roma (Pantano di Grano) — closed sites for which no citable coordinate was found.
operator1Gunvor Antwerp — the site is closed and no current operator exists to record.

The one gap worth naming on its own#

(Closed 2026-09-27, see §3e: the row now carries the 9 000 000 t/a permitted maximum of the refinery installation from the operator's IED annual report published by the Bulgarian Executive Environment Agency, a permit ceiling rather than a crude nameplate. The paragraph below records the 2026-09-22 state.)

LUKOIL Neftohim Burgas has no capacity figure, and it is the largest refinery in the Balkans. The operator's General Information and History pages in English and Bulgarian print no crude capacity; neftohim.bg no longer resolves (DNS failure) and lukoil.bg 404s. This was re-checked independently and confirmed: neftochim.lukoil.com/en/About/GeneralInformation carries no capacity, no Nelson complexity and no ownership figure. Secondary sources circulate 7 Mt/a and 9.5 Mt/a — a 36% spread — so nothing was ingested. A Bulgarian ministry or regulator publication is the route to closing this.

Sites deliberately omitted rather than guessed#

Each of these was found in the EEA register or in a brief and then left out, because no opened source established that it distils crude. They are recorded here so nobody has to rediscover them.

  • MOL Zala / Zalaegerszeg (HU) — EEA MOL Nyrt. Olajfinomító, functional 2024. MOL's own press release speaks only of rubber-bitumen plants and MOL's canonical production-sites list omits Zala. No citable basis for an OPERATING row and none for a CONVERTED row either.
  • MOL Tiszaújváros (HU) — MOL's own page calls it a petrochemical complex with ethylene, polymer and butadiene capacities and no crude distillation.
  • Bulgarian secondary sites — Ins Oil, the Pleven/Plama entries (where the register contradicts itself: the same coordinates appear as functional and as decommissioned), Polisan (Ruse) and Mega grup. None could be shown to distil crude.
  • RAFO Onești and Steaua Română Câmpina (RO) — no Romanian source for either closure was opened; the EEA status alone is too thin to assert one.
  • Molve and Ivanić Grad (HR), Gasstation (AT), MOL's gázfeldolgozó and földgáztisztítás (HU), O&GD Central (HU) — all IED 1.2, all gas processing or NGL fractionation, none a crude refinery. IED activity 1.2 is "refining of mineral oil and gas", which is why the register cannot be used as a refinery list without reading each row.
  • ORLEN Unipetrol Kolín (CZ) and the Svatava waste-oil units (CZ); an unnamed Slovak site at 48.8125, 19.4346 whose distillation installations are decommissioned — no page identifying the operator was opened.
  • BASE POSEIDON (ES), EEA activity 1.2 near Palos de la Frontera — could not be shown to distil crude.
  • Vitol/BRC Antwerp (BE) and UAB "NAPC" (LT) — not established as crude refineries.
  • ATPC-APC (BE), EEA decommissioned 2023 — never identified.

Section 3b compiled 2026-09-22. Every URL in it was fetched on that date, and every failure to fetch one is recorded in the gap register rather than worked around. Notable access failures: conpet.ro (connection refused), neftohim.bg (DNS), lukoil.bg (404), rompetrol.com and kmginternational.com (403), moh.gr HTML (403, though its own report PDFs serve fine), nafta-lendava.si (TLS hostname mismatch), english.sta.si (403), molbitumen.com (DNS), omv.com locations page, transpetrol.sk/en/ and ORLEN Unipetrol's contacts page (all 404); bp.com (403 on both the Spanish Castellón page and its EMAS PDF, which is why that row has no operator capacity, port or pipeline). WebFetch could not read any of the PDFs used here — every PDF fact was extracted locally after downloading the file.


3c. infrastructure_geo_v1.csv — cited geography for the map, 2026-09-23#

What it is. Coordinates for the port / terminal and pipeline stubs the refinery loader created from refineries.csv (named, no location, needs_enrichment = true), for the export points in core.export_point, and for five oil transit chokepoints. Loaded by reference_core.load_infrastructure_geo into core.geo_feature / core.geo_feature_version (migration 0041), read by GET /api/map/layers and drawn on /map.

Binding rules applied. Every coordinate was read in this pass from a page or API response that was actually fetched on 2026-09-23 (verified_at on every row). Nothing is from model memory. A row with no citable coordinate is kept with empty lat/lon/geometry_wkt and a LEFT_OUT: note, and is not loaded: empty beats guessed. Wikidata, Wikipedia and OpenStreetMap establish a coordinate only (§3 "Coordinates"), never capacity, owner or status, and load as INFERRED_HIGH, confidence ≤ MEDIUM.

Columns. entity_type (PORT | PIPELINE | CHOKEPOINT | EXPORT_POINT), slug, core_slugs (the core stub slugs this row geolocates, ;-separated), name, lat, lon, geometry_wkt (LINESTRING(lon lat, …), pipelines only), schematic, commodity_class (pipelines, only as the cited source states it), coordinate_basis (EEA_REGISTER, OFFICIAL, PORT_AUTHORITY, OPERATOR, UNLOCODE, REFERENCE_REFINERY, WIKIDATA, WIKIPEDIA, OSM), source_url (the page establishing what and where the feature is), coordinate_source_url (the page(s) the numbers were read from, |-separated, in vertex order for lines), verified_at, notes (country=XX; or countries=DE;IT; first, then what the point actually represents).

Counts#

entity_typerowsloadedleft out
CHOKEPOINT550
PIPELINE5651 (all schematic = true)5
PORT43376
EXPORT_POINT17816612
total28225923

The four CONPET pipeline rows (two drawn, two left out) were added on 2026-09-27 and carry that verified_at; see §3e.

The 12 EXPORT_POINT rows left out are the documented LEFT_OUT: gaps (FPSO fields, Juaymah, Ras Shukheir, Whiffen Head, Moudi, Hungary). Every one of the 178 classified export points has exactly one row here, drawn or left out (tests/python/test_reference_links.py).

Coordinate basis of the loaded rows: Wikidata 111 (incl. the two CONPET lines, whose weakest vertex is the Wikidata port point), OSM 111, refinery coordinate already cited in refineries.csv 17, EEA register 10, operator page 8, Wikipedia 2. For a pipeline the basis is its weakest vertex. No UN/LOCODE coordinate is used: service.unece.org and unece.org returned Cloudflare HTTP 403 to every client tried.

Pipelines are schematic — read this before looking at a line#

A pipeline is drawn as straight segments through its cited start, end and any named intermediate station (pumping station, tank farm, junction) that an operator or official page names. It is never the surveyed route, and the database refuses a LINESTRING that is not flagged schematic (ck_geo_feature_version_line_schematic). Stations only a search snippet mentioned were not drawn (e.g. the RRP Rozenburg pump station, Würmlach as a TAL vertex, the SPSE leg to Karlsruhe, which SPSE itself says is no longer operational). Many vertices are town or locality centroids (border crossings, pumping-station towns) and each is flagged in the row's notes.

Systems drawn: TAL (three sections + OMV Steinhöring–Burghausen and Burghausen–Feldkirchen), IKL, Druzhba CZ / SK (PS1–PS5 + Bučany–Kátov branch) / HU / PL east and west, Friendship I–Adria, JANAF (Omišalj–Sisak, Sisak–Virje–Gola, Gola–Százhalombatta, Omišalj–Urinj), AWP, Pomeranian, Schwedt–Leuna, Rostock–Schwedt, Schwedt–Seefeld, NWO, NDO, RRP (to Venlo, L7, L8), RAPL, SPSE, SPMR La Mède–Puget, Antifer–Le Havre and the CIM links, LHP, Donges–Vern, Cartagena–Puertollano, Casablanca–Tarragona, the A Coruña and Petronor terminal links, COVA–Taranto, Iplom Multedo–Fegino–Busalla, Rosenets–Burgas, Constanța–Petromidia, Gorm–Filsø–Fredericia, Mittelplate–Brunsbüttel, Brunsbüttel–Hemmingstedt, Būtingė–Mažeikiai, Biržai–Mažeikiai, and (added 2026-09-27) the CONPET import crude subsystem Oil Terminal Constanța → Petrobrazi and → Petrotel-Lukoil (endpoints only: CONPET names seven pumping stations but not their order).

Principal route sources: tal-oil.com, mero.cz / ikl-en.mero.cz / druzba-en.mero.cz, transpetrol.sk, molgroup.info, tehnika.lzmk.hr and api.janaf.hr, setec.at (AWP; OMV's surveying contractor, not the operator — OMV's own AWP page now redirects), pern.pl, pck.de, mvl-schwedt.de, nwowhv.de, holborn.de, rrp.nl (incl. the DOC4122C Schutzanweisung PDF), rapl.nl, spse.fr, spmr.fr, cim-ccmp.com, trapil.com, operator refinery pages (Repsol, Petronor, Eni, Iplom, Lukoil Neftochim, Rompetrol annual report on bvb.ro, ORLEN Lietuva, Ørsted, heiderefinery.com — the last read through the fetch tool after HTTP 403 to a direct request).

Chokepoints#

Source: EIA, World Oil Transit Chokepoints, static page https://www.eia.gov/international/content/analysis/special_topics/World_Oil_Transit_Chokepoints/ ("Last Updated: March 3, 2026"; the /international/analysis/… URL is a JavaScript shell and wotc.pdf returned 404). Table 1 flows (million b/d, crude oil and petroleum liquids, 1H 2025) are copied into the notes as printed: Hormuz 20.9, Suez Canal + SUMED 4.9, Bab el-Mandeb 4.2, Danish Straits 4.9, Turkish Straits (Dardanelles) 3.7. The points come from Wikidata (a strait is a passage; one point marks it). The Turkish Straits point is the Dardanelles because EIA labels its row that way; the Bosporus and Sea of Marmara alternatives are in the notes. Bab el-Mandeb reverse-geocodes to Djibouti (country=DJ).

What a point represents#

Most points are not berths. Many are the port, the refinery site, an island, or a town centroid (Ras Tanura, Mesaieed, Primorsk, Port Sudan for Bashayer, Moanda for the offshore Muanda loading, …); one is a field rather than its FPSO (Jubilee). All three Novorossiysk rows share one coarse Wikidata port point (about 0.13° precision); the CPC buoys are not located. Offshore single-point moorings (Būtingė, Midia, San Roque, Taranto buoy field, Tarragona, Huelva) are never located: the point is the onshore terminal. Aliases of one facility share one coordinate on purpose (the four Ceyhan rows, three Gdańsk/Naftoport stubs, Fos-sur-Mer = Marseille-Fos, Rotterdam = Port of Rotterdam, the two Supsa, Fujairah, Aqaba and Koper rows, …) and the notes say so.

Four non-EU export points (Jamnagar, Vadinar, Aqaba JPRC terminal, Jurong Island) had no page identifying the facility other than the coordinate record itself; their source_url is that Wikidata item and the notes say so.

Left out, and why (23)#

  • Proxy objects rejected by the lead (3): Juaymah crude SPM and Juaymah LPG (the only locatable object was the "Juaymah Cogen Gas Power Plant"), Ras Shukheir (only the airport). A different object standing in for a terminal is a guess, not a location.
  • Distance only, no position (3): the Spanish monobuoys at Tarragona ("3 km offshore"), Huelva ("about 10 km") and Algeciras ("one mile").
  • Not found anywhere (4): Muelle Torre Arenillas (Huelva), Terminal marítimo El Pantalán (Tarragona), Holborn's own Hamburg harbour, Whiffen Head (Newfoundland Transshipment).
  • FPSO / field rows with no field or FPSO coordinate (6): the aggregated Angola deepwater row (separate Wikidata points exist for Dalia, Kizomba A, Greater Plutonio and Kuito if the row is ever split), Baleine, Ceiba/Okume, Zafiro, Stabroek, Sangomar (the Wikidata "Sangomar" hits are a marine protected area and a sandspit).
  • Wrong-object hits (1): Moudi (an inland village and a river, not the terminal).
  • Not a place (1): "No crude export point: Hungary is landlocked".
  • Pipelines with no cited endpoints (3): the NATO/ODC network (named, no endpoints serving Lavéra or Feyzin), Moeve San Roque's line "to the CLH installations" (the CLH site is not named), ExxonMobil Rotterdam's unnamed Maasvlakte/Europoort feeders.
  • Pipelines whose stations are named but not located (2, added 2026-09-27): CONPET's Ghercești–Ploiești component (seven named pumping stations, "via pipelines to the Petrobrazi refinery") and the Țicleni–Ploiești Lines I and II (about 250 km, "to the Ploiești refineries", end refinery not stated). No opened source locates the stations.

Disagreements recorded rather than resolved#

Coordinates (the row's notes name both; neither averaged): Omišalj EEA vs Wikidata (≈1.3 km; EEA used), Sines page coordinate vs article text (page used), Sillamäe EEA vs Wikidata (EEA used), Naantali Wikidata vs the EEA Neste terminal, Midia OSM vs EEA, Rostock Wikidata port vs OSM Ölhafen, Changxing Island Wikidata 39.91 N vs the OSM island polygon 39.56 N (OSM used), Hound Point (the Wikidata item is a Fife settlement; the OSM terminal pier was used). Route facts kept in notes only, never loaded as numbers: JANAF 622 km vs 631 km; Rostock–Schwedt 203 km vs 206 km (both on pck.de); SPSE Saint-Quentin-Fallavier département 69 (spse.fr) vs Isère.


3e. Refinery follow-ups resolved, 2026-09-27#

The open items from §3b "What would most improve the extension next" (points 1, 2, 3, 4, 7 and 8). Every source below was fetched on 2026-09-27; every PDF was downloaded and text-extracted locally (Bulgarian PDFs need pdftotext -enc UTF-8, or the Cyrillic comes out empty). Each changed row carries last_verified / verified_at 2026-09-27 and quotes its source verbatim in notes / caveat. The same pass re-opened conpet.ro, neftohim.bg and the Nynas pages: conpet.ro still times out, which is why CONPET is cited from its stock-exchange filing.

ItemResultSource
Eni Livorno (eni-livorno)UNKNOWN → CONVERTED; capacity stays emptyEni Fact Book 2024: lubricants "until February 2024"; "Starting from the second quarter of 2024, it's in operation only the gasoline line … processing Virgin Naphtha". Eni Fact Book 2025 (PDF created 2026-05-06): no Livorno capacity in "Refining system in 2025", footnote "The conversion process into a biorefinery is undergoing"; the biorefinery is "(Under construction)". Both on eni.com.
LUKOIL Neftohim Burgascapacity 9 000 000 t/a (t/a, dated 2026-03) — a permit ceiling, not a crude nameplateOperator's statutory 2025 annual report under integrated permit KR 6-N2/2015 (updated by Decision 6-N2-I0-A4/2023), published by the Bulgarian Executive Environment Agency (eea.government.bg), §3.1.9: maximum capacity of the installation "Rafineriya" (IED 1.2, 4 AD + 1 AVD units and the conversion units) 9 000 000 t/y; 2025 production 4 961 492 t. The 2021 report gives the same ceiling.
Nynas Gothenburgstays OPERATING; crude distillation now confirmed; capacity UNVERIFIEDRäddningstjänsten Storgöteborg Seveso page (updated 2025-11-26): crude oil is distilled there for bitumen, distillates and fuels. Nynas 2025 report: "very little downtime at our Gothenburg and Nynäshamn facilities".
Nynas Nynäshamnstays OPERATING; capacity UNVERIFIEDSödertörns brandförsvarsförbund Seveso page confirms the distillation unit. No capacity on nynas.com, the 2025 report, the Naturvårdsverket register or either Seveso page; the Länsstyrelsen Stockholm decision of 2026-03-19 returned 404.
Malta (countries_no_refinery.csv, MT)statistics-only row → stated zeroGovernment of Malta, GHG National Inventory Document, April 2025 (ref. CAA/03/2025, Climate Action Authority o.b.o. the Ministry for the Environment, Energy and Public Cleanliness), p.49: "In Malta, there are no petroleum refining activities, hence this category is reported as NO in the NIR submission, for all timeseries"; p.100: "all fuel is imported". Read from the Climate Policy Radar copy: unfccc.int answered with a bot challenge, so the April 2026 edition's wording is UNVERIFIED. No import terminal is named, so none was recorded.
CONPET networkconnections on Petrobrazi, Petrotel-Lukoil and Petromidia; 4 pipeline rows in infrastructure_geo_v1.csvCONPET S.A. Annual Report 2025 (Bucharest Stock Exchange filing, file dated 25-03-2026): network about 3,800 km, about 2,200 km operational; import subsystem "from the Oil Terminal Constanta to the refineries in Ploiești (Petrobrazi and Lukoil), Arpechim-Pitești terminal and Petromidia refinery"; the Ghercești–Ploiești component to Petrobrazi; Țicleni–Ploiești Lines I and II to "the Ploiești refineries". Also: Petrotel-Lukoil "was not resumed at the end of the planned overhaul (December 1st, 2025)", which corroborates its IDLE status.

Readings the Livorno result supersedes. Unem's 4.2 Mt/a (MASE data) is dated 1 January 2024, before the February 2024 stop. Its 2,943 kt of 2024 throughput includes semi-finished feed, which fits Eni's virgin-naphtha line. The EEA functional flag is a permit state (§3b, EEA limitation 4). The Unem Data Book 2026 prints per-refinery capacity only for 2007 and adjudicates nothing. Eni's 2024 figure of 14 kbbl/d describes the pre-February-2024 lubricants set-up, so it is not recorded as a capacity.

Why Burgas is recorded despite the caveat. It is the first operator-reported and regulator-published figure for the site. It sits in the capacity cells in its published unit, as Petromidia's "5.32 million tons raw material/year" does, and the row's notes say it is a permit maximum for the whole refinery installation (crude intake vs total feed not stated), not a crude-distillation nameplate. The circulating 7 Mt/a and ~9.5 Mt/a figures are still unrecorded. Bulgaria's country total now reads 9 Mt/a.

CONPET rows in detail.

  • refineries.csv gains these stubs on the refinery rows:
    • Petrobrazi: conpet-import-crude-oil-transport-subsystem, conpet-domestic-crude-oil-and-condensate-transport-subsystem-ghercesti-ploiesti-component and conpet-ticleni-ploiesti-main-pipelines-line-i-and-line-ii.
    • Petrotel-Lukoil: the import subsystem and the Țicleni lines.
    • Petromidia: the import subsystem, kept separate from the Oil Terminal S.A. pipe that Rompetrol names, because neither filing says the two share a line.
    • Petrobrazi and Petrotel also link to the existing constanta-port stub, as the start of the import subsystem.
  • infrastructure_geo_v1.csv:
    • Drawn: conpet-import-constanta-petrobrazi and conpet-import-constanta-petrotel, schematic straight lines from the Wikidata Q822981 port point to the EEA refinery coordinates (INFERRED_HIGH, MEDIUM).
    • LEFT_OUT: conpet-ghercesti-ploiesti and conpet-ticleni-ploiesti.
  • Not recorded: the rich-gas links, which now reach Petrobrazi by rail, and the 11 km Hurezani/Căpreni condensate section, whose route is not described.

4. Consolidated gap register#

Every gap below is an empty cell we chose not to fill, with the reason. Under CLAUDE.md §1 these are the most important rows in this document: they are the difference between a defensible dataset and a complete-looking one.

countries.csv — 31 rows#

No empty cells. The only caveats are comparability ones, already stated: Eurostat's EL/UK codes, and the UK's different population reference date.

refineries.csv — 33 rows#

Empty fieldRows affectedWhy
capacity_bpd21Source published Mt/a only. Not missing data — see the unit policy above. A tonne→barrel factor would be our invention.
commissioned_year16Operator pages state no commissioning year, or the only year found was on a non-primary site (Lavéra 1933, Porvoo 1965) or could not be tied to the site in a quotable sentence (Gonfreville 1933). Never inferred.
connected_pipelines11No opened page names one. Includes the deliberate refusal to assume a Rotterdam–Rhine (RDO) link for Gelsenkirchen, Godorf and Wesseling.
capacity_original, capacity_unit_original, capacity_source_url7Four are sites that no longer refine crude (Grandpuits, La Mède, Wesseling, Naantali, Nynas Harburg) where a capacity would be misleading; one is a deliberate double-counting guard (BAYERNOIL Vohburg); one is a genuine gap (ExxonMobil Rotterdam — ExxonMobil publishes nothing, and the third-party figures found were on pages returning HTTP 403 that were never opened).
connected_ports7Not stated on any opened page — notably Leuna/Spergau (inland, pipeline-fed) and the Rhine-Ruhr sites.
latitude / longitude2Port-Jérôme-Gravenchon — the OSM centroid reverse-geocodes to the wrong commune, across the Seine; recording it would assert a contradiction. VPR Rozenburg — no OSM feature found.
owner1Shell Pernis — the exact legal entity was not verified on an opened page (Shell's own site is JavaScript-rendered and exposed only title and meta).
capacity_source_date8Either the capacity itself is empty, or the source page carries no date (North Sea Port's Zeeland Refinery page).

One status = UNKNOWN: Gunvor Energy Rotterdam. The operator's live page (retrieved 2026-09-21) still describes the site as producing at 75,000 b/d, while trade press reports a halt from 25 November 2024 and a permanent closure in December 2024 plus terminal wind-down. No Gunvor press release resolving this could be located. Both source sets are attached to the row. This is the single highest-value manual follow-up in the dataset — a Dutch permit or register check would settle it.

hormuz_route_classification_v1.csv — 59 rows / hormuz_country_summary_v1.csv — 18 rows#

No empty cells: every row carries a water body, a route class, a rationale and a geography source URL. What is bounded rather than empty:

  • min/max share for the UAE is 0/1 with basis "UNKNOWN: no cited terminal split" — ADCOP capacity and ADNOC's own Murban export availability are cited, but no opened source splits actual loadings between Fujairah (outside Hormuz) and the in-Gulf terminals.
  • Saudi Arabia's min is 0 — only an upper bound (0.82) is supported by a cited figure.
  • Medium-confidence water-body wording for Libya, Nigeria, Algeria and Brazil, and the operator-vs-EIA gap for Kazakhstan, are flagged per row in notes. In every case the route class is unaffected, because none of those terminals is in the Persian Gulf.
  • EU sanctions application dates are not recorded at all: consilium.europa.eu returned HTTP 403 and EUR-Lex returned empty bodies, so the ban dates and regulation article numbers could not be verified. Only what the European Commission's own energy-sanctions page states is recorded, and only in notes, never in the route class.
  • UK Flotta is absent by choice — no page confirming it was opened.

Compiled 2026-09-21. Every URL in this document was fetched on that date. If you are reading this more than a few months later, treat status and ownership fields as needing re-verification — this pass alone found four ownership or status changes that older summaries still had wrong.


5. events.csv — event timeline, compiled 2026-09-22#

Five rows. Every row is a timeline marker: a slug, a type from the core.event CHECK in migration 0002, a UTC start (and an end where one is published), and a description made of quotations from sources that were opened on 2026-09-22. core.event's own table comment is the rule this file obeys — "An event row never asserts that it caused a price move" — so no description here contains a statement about prices caused by the event. Where a description carries a number, the number is a quotation with its publisher and date attached.

Loaded by packages/database/oilroutes_database/reference_events.py into core.event, core.event_version (revision-aware) and core.event_asset_link. A row with an empty source_urls is rejected, not loaded.

The rows#

slugtypestart (UTC)end (UTC)statusdata_class / confidence
hormuz-2026HORMUZ_DISRUPTION2026-02-28—ONGOINGVERIFIED / HIGH
de-tankrabatt-2022TAX_CHANGE2022-06-012022-08-31ENDEDOFFICIAL / OFFICIAL
eu-russia-crude-embargo-2022EMBARGO2022-12-05—ONGOINGOFFICIAL / OFFICIAL
eu-russia-products-embargo-2023EMBARGO2023-02-05—ONGOINGOFFICIAL / OFFICIAL
ru-invasion-ukraine-2022WAR2022-02-24—ONGOINGOFFICIAL / OFFICIAL

How each start date was established#

hormuz-2026 — 28 February 2026#

Two independent agencies publish the same onset date, which is why this row is VERIFIED / HIGH (docs/CONFIDENCE.md §1 row 3, §2 row 2) rather than the LOW a single Tier-2 record would earn:

Transit volumes, quoted in the description because the reference researcher's note in §2 ("Event context") asked for the citation:

A date disagreement recorded rather than resolved. On the US-Iran memorandum of understanding that sought to resume traffic, EIA gives two different dates in two of its own publications: Today in Energy of 15 July 2026 says "On June 17, the United States and Iran signed a Memorandum of Understanding (MOU)", while the press release of 7 July 2026 says "the June 18 memorandum of understanding (MOU)" (https://www.eia.gov/pressroom/releases/press590.php). Both dates are in the row's description. Neither affects start_time.

No end date. EIA's September 2026 STEO still describes flows through the strait as "constrained and variable", and the August 2026 STEO records renewed attacks on tankers from 7 July 2026. end_time is therefore NULL and status = ONGOING, not an assumed reopening on the MOU date.

What was not used. The EIA World Oil Transit Chokepoints page (last updated 2026-03-03) and the IEA Strait of Hormuz factsheet (last updated February 2026) were both opened and neither mentions the 2026 disruption; they carry only pre-conflict flow levels. Trade-press timelines (S&P Global, Lloyd's List and similar) place the effective halt of transits one to two days after 28 February; they are Tier-3 leads under docs/BRIEF.md and were not used to set a date.

de-tankrabatt-2022 — 1 June to 31 August 2022#

  • Deutscher Bundestag, record of 19 May 2022, "Dreimonatige Senkung der Energiesteuer auf Kraftstoffe verabschiedet": the reduction runs 1 June to 31 August 2022 and cuts the energy-tax rate by 29.55 ct/litre on Benzin and 14.04 ct/litre on Dieselkraftstoff. https://www.bundestag.de/dokumente/textarchiv/2022/kw20-de-energiesteuersenkungsgesetz-894664
  • The act itself: Gesetz zur Änderung des Energiesteuerrechts zur temporären Absenkung der Energiesteuer für Kraftstoffe (Energiesteuersenkungsgesetz) of 24 May 2022, BGBl. I 2022 p. 810. https://dejure.org/BGBl/2022/BGBl._I_S._810
  • Cross-checked against the primary tax series this project already holds. core.tax_rate rows sourced from the European Commission Weekly Oil Bulletin duties-and-taxes file (source_id = ec_wob_duties_and_taxes) carry German excise on EURO_SUPER_95 at 0.6545 EUR/L before, 0.3590 EUR/L effective 2022-06-01 and 0.6545 EUR/L again effective 2022-08-31; on DIESEL, 0.4704 -> 0.3300 -> 0.4704 EUR/L on the same dates. The differences are 29.55 ct/L and 14.04 ct/L — the Bundestag figures to the cent.

Trap, recorded so nobody repeats it. The current Bundesfinanzministerium FAQ (bundesfinanzministerium.de/Content/DE/FAQ/energiesteuersenkung.html) and the Bundeskartellamt Tankrabatt page were both fetched on 2026-09-22 and describe a different, later German measure — a two-month reduction of 14.04 ct/L on both Benzin and Diesel running 1 May to 30 June 2026, under the Zweites Gesetz zur Änderung des Energiesteuergesetzes (BGBl. I 2026 Nr. 116). Those pages are not a citation for the 2022 measure and were not used as one. The 2026 measure is itself a candidate TAX_CHANGE event; it is not in this file because it has not been verified to the standard above.

eu-russia-crude-embargo-2022 and eu-russia-products-embargo-2023#

Both are the sixth EU sanctions package, adopted 3 June 2022 — Council Regulation (EU) 2022/879 amending Regulation (EU) No 833/2014 — with two different in-force dates, which is why they are two rows (core.event_version carries one start_time per event).

Access limitation. eur-lex.europa.eu answered HTTP 202 with an empty body to every form of the request on 2026-09-22 (bot wall), and the Council press release at consilium.europa.eu answered HTTP 403, so the regulation text itself could not be opened. The two dates therefore rest on the two Commission/Eurostat pages that were opened. The Council URL is recorded in the row for the reader and is flagged in notes as not opened. Verifying the dates against the regulation text is the first thing to do when EUR-Lex is reachable.

Derogations mean reported Russian imports do not fall to zero (pipeline crude for certain member states; Bulgaria and Croatia). This is in the description, because a reader looking at analytics.origin_share after 2022-12-05 will otherwise expect a zero.

ru-invasion-ukraine-2022 — 24 February 2022#

  • European Council, special meeting of 24 February 2022, EUCO 18/22, opened and read in full: "European Council conclusions on Russia's unprovoked and unjustified military aggression against Ukraine"; "The European Council condemns in the strongest possible terms the Russian Federation's unprovoked and unjustified military aggression against Ukraine." The document is headed and dated 24 February 2022. https://data.consilium.europa.eu/doc/document/ST-18-2022-INIT/en/pdf
  • UN General Assembly resolution A/RES/ES-11/1 ("Aggression against Ukraine", adopted 2 March 2022) is recorded as a second reference, but its body could not be retrieved on 2026-09-22 — docs.un.org returned a navigation shell and documents.un.org returned HTTP 404 — so it is not relied on. https://docs.un.org/en/A/RES/ES-11/1

Section 5 compiled 2026-09-22. Every URL in it was fetched on that date, and every failure to fetch one is recorded above rather than worked around.


6. station_regions.csv — official names of the station-price regional codes, 2026-09-27#

Loaded by packages/database/oilroutes_database/reference_station_regions.py into core.station_region (migration 0059), read by GET /api/station-prices/{slug} through public_api.station_region. 263 rows: FR 100 (postcode areas 01–95 and 971–974, 976), IT 111 (110 sigle of the 2026 list + SU), ES 52. Every row carries the URL of the official file it was read from (name_source_url, and for France match_source_url); the loader rejects an uncited row. Source verification (URL, licence, date) is in docs/DATA_SOURCES.md §S.

Files read on 2026-09-27 (sha256 of the bytes downloaded):

FilePublishersha256
v_departement_2026.csv (COG millésime 2026)INSEE513900ca23edc682ef9b912d7bfc317129eac3a7d71ff19bc22b40ea4838e6eb
laposte-hexasmal/raw (Base officielle des codes postaux, data of 2026-09-08, ISO-8859-1, ;)La Postef921ac020ca3b9efebd8f0d01782555fb70d63d1ae36535109c67e4a74bd6e22
Elenco-comuni-italiani.xlsx (updated 21 Feb 2026)ISTAT83842076860450f7e482daecea6b7a769f5f93d0bf5b0d48802b44896d7a26d5
Elenco-comuni-italiani.csv (Last-Modified 26 Jan 2024; used for SU only)ISTAT57eaf945182fc64fa05f80f1a5fb2a84cff55ebde2af6e3947a731776e7809e0
Sardinia reform codes zip (in force 1 Jan 2026)ISTAT6fb4b421a165c26ebc855d2793ef95ae1e65eceb9ea067aa51a4c3f613e503ca
cod_provincia.htm (Relación de provincias con sus códigos, ISO-8859-15)INEf26be07b88d4004c713dc94185c26ed6c35d831e9e3ef83960fd251a4f813fde

How each column was filled (mechanically, no hand-typed names):

  • France. region_code is the postcode area exactly as migration 0058 builds it (first two characters of the postcode; three for 97x/98x). region_name is INSEE's LIBELLE for the département with the same number. The correspondence was counted, not assumed: for every row of the La Poste base, the commune's INSEE code gives its département and the postcode gives its area. SAME = the area holds exactly that département's communes; PARTIAL = it also holds communes of another département and/or some of the département's communes have a postcode in another area (25 metropolitan areas, one to seven communes each; the note names the other département and the count, never a guess); COMBINED = area 20, which holds the communes of both 2A Corse-du-Sud and 2B Haute-Corse; 971 also holds Saint-Barthélemy and Saint-Martin (overseas collectivities, not départements). data_class = CALCULATED for France because the correspondence is our count over La Poste's file; the names themselves are INSEE's.
  • Italy. region_code is the sigla automobilistica (the registry's Provincia field); region_name is ISTAT's "Denominazione dell'Unità territoriale sovracomunale (valida a fini statistici)" for the communes with that sigla (one name per sigla, checked); official_code is ISTAT's three-digit code. SU is not in the 2026 list: its name and code (111) are from ISTAT's 2024 file and its abolition, and where its communes went, from ISTAT's Sardinian reform file (53 to Cagliari, 28 Medio Campidano, 24 Sulcis Iglesiente, 1 Ogliastra, 1 Nuoro).
  • Spain. region_code = official_code = INE's two-digit code (the ministry's IDProvincia); region_name is INE's "Literal", verbatim (so "Coruña, A", "Balears, Illes", "Palmas, Las", "Rioja, La").

Not included, on purpose: French postcode areas 975 (Saint-Pierre-et-Miquelon), 980 (Monaco), 986–988 (Pacific collectivities) — none is a département, none appears in the prix-carburants feed today; if one ever does, it is shown as a bare code. INE's page states no date of last update, so none is shown.

Caveats a reader should know: a postcode area is the delivery office's area, not the administrative boundary; Italian sigle are what the station registry says, and a Sardinian station may carry a pre-2026 code (the SS, CA and NU rows say so); ISTAT keeps GO, PN, TS and UD (former provinces of Friuli-Venezia Giulia) for statistics only, and those rows say so.

Credit lines shown on the page: "Source : Insee" (INSEE legal notice, verbatim), "Source : La Poste" (Licence Ouverte requires the source to be named), "Fonte: Istat" (CC BY 4.0 requires attribution; ISTAT prescribes no wording), "Elaboración propia con datos extraídos del sitio web del INE: www.ine.es" (INE legal notice, verbatim).

7. fi_port_names_digitraffic.csv — names of Finnish port codes, 2026-09-27#

189 rows: every location whose country is "Finland" in the ssnLocations list of the Digitraffic Marine port-call API, GET https://meri.digitraffic.fi/api/port-call/v1/ports (fetched 2026-09-27, response sha256 6bce8dcc0c760e4c618a31301e8a472c0196ceb30e964a79d606b6d748820820, list dataUpdatedTime 2022-08-12). Columns: locode and location_name verbatim (the API's own ASCII spelling, e.g. "Skoldvik (Kilpilahti)"), country, source_url, retrieved_at. Same publisher and licence as the port calls it names (Fintraffic, CC BY 4.0; credit "Source: Fintraffic / digitraffic.fi, license CC 4.0 BY"). Used only to name the arrival port of an observed voyage (docs/AIS.md §10); a code without a row is shown as the bare code, never given a guessed name. One code is deliberately shown as the code although it has a row: FIANK (list: "Anjala", an inland locality; Portnet tanker calls under it carry port area "ANK / Ei tiedossa" and precede Sköldvik calls).